mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-01-20 04:34:48 +00:00
Added helper functions for managing Game Objects
This commit is contained in:
parent
35c0860418
commit
d5b455a84c
|
|
@ -202,7 +202,7 @@ function updateTSShapeLoadProgress(%progress, %msg)
|
|||
{
|
||||
// Check if the loading GUI is visible and use that instead of the
|
||||
// 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
|
||||
if ( %progress == 0 )
|
||||
|
|
@ -245,7 +245,7 @@ function updateTSShapeLoadProgress(%progress, %msg)
|
|||
%textCtrl.setText(%msg);
|
||||
}
|
||||
|
||||
Canvas.repaint(33);
|
||||
Canvas.repaint(33);*/
|
||||
}
|
||||
|
||||
/// A helper function which will return the ghosted client object
|
||||
|
|
@ -952,3 +952,207 @@ function TestPManager::testObjectRemove(%doNotSave)
|
|||
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…
Reference in a new issue