mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-07-12 23:24:41 +00:00
Added helper functions for managing Game Objects
This commit is contained in:
parent
35c0860418
commit
d5b455a84c
1 changed files with 206 additions and 2 deletions
|
|
@ -202,7 +202,7 @@ function updateTSShapeLoadProgress(%progress, %msg)
|
||||||
{
|
{
|
||||||
// Check if the loading GUI is visible and use that instead of the
|
// Check if the loading GUI is visible and use that instead of the
|
||||||
// separate import progress GUI if possible
|
// separate import progress GUI if possible
|
||||||
if ( isObject(LoadingGui) && LoadingGui.isAwake() )
|
/* if ( isObject(LoadingGui) && LoadingGui.isAwake() )
|
||||||
{
|
{
|
||||||
// Save/Restore load progress at the start/end of the import process
|
// Save/Restore load progress at the start/end of the import process
|
||||||
if ( %progress == 0 )
|
if ( %progress == 0 )
|
||||||
|
|
@ -245,7 +245,7 @@ function updateTSShapeLoadProgress(%progress, %msg)
|
||||||
%textCtrl.setText(%msg);
|
%textCtrl.setText(%msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
Canvas.repaint(33);
|
Canvas.repaint(33);*/
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A helper function which will return the ghosted client object
|
/// A helper function which will return the ghosted client object
|
||||||
|
|
@ -952,3 +952,207 @@ function TestPManager::testObjectRemove(%doNotSave)
|
||||||
TestPManager.removeObjectFromFile(AudioSim);
|
TestPManager.removeObjectFromFile(AudioSim);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Game Object management
|
||||||
|
function findGameObject(%name)
|
||||||
|
{
|
||||||
|
//find all GameObjectAssets
|
||||||
|
%assetQuery = new AssetQuery();
|
||||||
|
if(!AssetDatabase.findAssetType(%assetQuery, "GameObjectAsset"))
|
||||||
|
return 0; //if we didn't find ANY, just exit
|
||||||
|
|
||||||
|
%count = %assetQuery.getCount();
|
||||||
|
|
||||||
|
for(%i=0; %i < %count; %i++)
|
||||||
|
{
|
||||||
|
%assetId = %assetQuery.getAsset(%i);
|
||||||
|
|
||||||
|
%assetName = AssetDatabase.getAssetName(%assetId);
|
||||||
|
|
||||||
|
if(%assetName $= %name)
|
||||||
|
{
|
||||||
|
%gameObjectAsset = AssetDatabase.acquireAsset(%assetId);
|
||||||
|
|
||||||
|
%assetQuery.delete();
|
||||||
|
return %gameObjectAsset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
%assetQuery.delete();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function spawnGameObject(%name, %addToMissionGroup)
|
||||||
|
{
|
||||||
|
if(%addToMissionGroup $= "")
|
||||||
|
%addToMissionGroup = true;
|
||||||
|
|
||||||
|
//First, check if this already exists in our GameObjectPool
|
||||||
|
if(isObject(GameObjectPool))
|
||||||
|
{
|
||||||
|
%goCount = GameObjectPool.countKey(%name);
|
||||||
|
|
||||||
|
//if we have some already in the pool, pull it out and use that
|
||||||
|
if(%goCount != 0)
|
||||||
|
{
|
||||||
|
%goIdx = GameObjectPool.getIndexFromKey(%name);
|
||||||
|
%go = GameObjectPool.getValue(%goIdx);
|
||||||
|
|
||||||
|
%go.setHidden(false);
|
||||||
|
%go.setScopeAlways();
|
||||||
|
|
||||||
|
if(%addToMissionGroup == true) //save instance when saving level
|
||||||
|
MissionGroup.add(%go);
|
||||||
|
else // clear instance on level exit
|
||||||
|
MissionCleanup.add(%go);
|
||||||
|
|
||||||
|
//remove from the object pool's list
|
||||||
|
GameObjectPool.erase(%goIdx);
|
||||||
|
|
||||||
|
return %go;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//We have no existing pool, or no existing game objects of this type, so spawn a new one
|
||||||
|
|
||||||
|
%gameObjectAsset = findGameObject(%name);
|
||||||
|
|
||||||
|
if(isObject(%gameObjectAsset))
|
||||||
|
{
|
||||||
|
%newSGOObject = TamlRead(%gameObjectAsset.TAMLFilePath);
|
||||||
|
|
||||||
|
if(%addToMissionGroup == true) //save instance when saving level
|
||||||
|
MissionGroup.add(%newSGOObject);
|
||||||
|
else // clear instance on level exit
|
||||||
|
MissionCleanup.add(%newSGOObject);
|
||||||
|
|
||||||
|
return %newSGOObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function saveGameObject(%name, %tamlPath, %scriptPath)
|
||||||
|
{
|
||||||
|
%gameObjectAsset = findGameObject(%name);
|
||||||
|
|
||||||
|
//find if it already exists. If it does, we'll update it, if it does not, we'll make a new asset
|
||||||
|
if(isObject(%gameObjectAsset))
|
||||||
|
{
|
||||||
|
%assetID = %gameObjectAsset.getAssetId();
|
||||||
|
|
||||||
|
%gameObjectAsset.TAMLFilePath = %tamlPath;
|
||||||
|
%gameObjectAsset.scriptFilePath = %scriptPath;
|
||||||
|
|
||||||
|
TAMLWrite(%gameObjectAsset, AssetDatabase.getAssetFilePath(%assetID));
|
||||||
|
AssetDatabase.refreshAsset(%assetID);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//Doesn't exist, so make a new one
|
||||||
|
%gameObjectAsset = new GameObjectAsset()
|
||||||
|
{
|
||||||
|
assetName = %name @ "Asset";
|
||||||
|
gameObjectName = %name;
|
||||||
|
TAMLFilePath = %tamlPath;
|
||||||
|
scriptFilePath = %scriptPath;
|
||||||
|
};
|
||||||
|
|
||||||
|
//Save it alongside the taml file
|
||||||
|
%path = filePath(%tamlPath);
|
||||||
|
|
||||||
|
TAMLWrite(%gameObjectAsset, %path @ "/" @ %name @ ".asset.taml");
|
||||||
|
AssetDatabase.refreshAllAssets(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Allocates a number of a game object into a pool to be pulled from as needed
|
||||||
|
function allocateGameObjects(%name, %amount)
|
||||||
|
{
|
||||||
|
//First, we need to make sure our pool exists
|
||||||
|
if(!isObject(GameObjectPool))
|
||||||
|
{
|
||||||
|
new ArrayObject(GameObjectPool);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Next, we loop and generate our game objects, and add them to the pool
|
||||||
|
for(%i=0; %i < %amount; %i++)
|
||||||
|
{
|
||||||
|
%go = spawnGameObject(%name, false);
|
||||||
|
|
||||||
|
//When our object is in the pool, it's not "real", so we need to make sure
|
||||||
|
//that we don't ghost it to clients untill we actually spawn it.
|
||||||
|
%go.clearScopeAlways();
|
||||||
|
|
||||||
|
//We also hide it, so that we don't 'exist' in the scene until we spawn
|
||||||
|
%go.hidden = true;
|
||||||
|
|
||||||
|
//Lastly, add us to the pool, with the key being our game object type
|
||||||
|
GameObjectPool.add(%name, %go);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function Entity::delete(%this)
|
||||||
|
{
|
||||||
|
//we want to intercept the delete call, and add it to our GameObjectPool
|
||||||
|
//if it's a game object
|
||||||
|
if(%this.gameObjectAsset !$= "")
|
||||||
|
{
|
||||||
|
%this.setHidden(true);
|
||||||
|
%this.clearScopeAlways();
|
||||||
|
|
||||||
|
if(!isObject(GameObjectPool))
|
||||||
|
{
|
||||||
|
new ArrayObject(GameObjectPool);
|
||||||
|
}
|
||||||
|
|
||||||
|
GameObjectPool.add(%this.gameObjectAsset, %this);
|
||||||
|
|
||||||
|
%missionSet = %this.getGroup();
|
||||||
|
%missionSet.remove(%this);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
%this.superClass.delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function clearGameObjectPool()
|
||||||
|
{
|
||||||
|
if(isObject(GameObjectPool))
|
||||||
|
{
|
||||||
|
%count = GameObjectPool.count();
|
||||||
|
|
||||||
|
for(%i=0; %i < %count; %i++)
|
||||||
|
{
|
||||||
|
%go = GameObjectPool.getValue(%i);
|
||||||
|
|
||||||
|
%go.superClass.delete();
|
||||||
|
}
|
||||||
|
|
||||||
|
GameObjectPool.empty();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
function switchCamera(%client, %newCamEntity)
|
||||||
|
{
|
||||||
|
if(!isObject(%client) || !isObject(%newCamEntity))
|
||||||
|
return error("SwitchCamera: No client or target camera!");
|
||||||
|
|
||||||
|
%cam = %newCamEntity.getComponent(CameraComponent);
|
||||||
|
|
||||||
|
if(!isObject(%cam))
|
||||||
|
return error("SwitchCamera: Target camera doesn't have a camera behavior!");
|
||||||
|
|
||||||
|
//TODO: Cleanup clientOwner for previous camera!
|
||||||
|
if(%cam.clientOwner == 0 || %cam.clientOwner $= "")
|
||||||
|
%cam.clientOwner = 0;
|
||||||
|
|
||||||
|
%cam.scopeToClient(%client);
|
||||||
|
%cam.setDirty();
|
||||||
|
|
||||||
|
%client.setCameraObject(%newCamEntity);
|
||||||
|
%client.setControlCameraFov(%cam.FOV);
|
||||||
|
|
||||||
|
%client.camera = %newCamEntity;
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue