Using call() to call a variable method on a SimObject instance with arguments
There are times when we don't know the name of the method of a SimObject
instance while writing a script code. In these circumstances,
we need to be able to call the method of a SimObject
instance based on a variable. This recipe will show us how to use the SimObject
call()
method to execute another method, with possible passed-in arguments.
Getting ready
We will be adding a new TorqueScript function to a project based on the Torque 3D Full
template and try it out using the Empty Terrain
level. If you haven't already, use the Torque Project Manager (Project Manager.exe
) to create a new project from the Full
template. It will be found under the My Projects
directory.
Then start up your favorite script editor, such as Torsion, and let's get going!
How to do it...
We are going to write a TorqueScript function that will demonstrate how to programmatically call a
SimObject
method as follows:
Open the
game/scripts/server/game.cs
script file and add the following code to the bottom:function callSimObjectMethod1() { // Set up an array to hold the methods we // will call. %methods[0] = "getPosition"; %methods[1] = "getEulerRotation"; %methods[2] = "getScale"; // Iterate through the MissionCleanup SimGroup to retrieve // each SimObject. This holds the top level objects that // have been created since the game level has started. foreach (%obj in MissionCleanup) { // Print some information about the object in the group echo(%obj.getId() SPC %obj.getClassName()); // If the object derives from a SceneObject then call // our methods if (%obj.isMemberOfClass(SceneObject)) { for (%i=0; %i<3; %i++) { // Call the method and obtain its result. // Note: none of our methods require passing // an argument. %result = %obj.call(%methods[%i]); // Output the result to the console echo(" " @ %methods[%i] @ "(): " @ %result); } } } }
Start up our game under the
My Projects
directory and load theEmpty Terrain
level. Open the console using the tilde (~) key and enter the following at the bottom of the screen:callSimObjectMethod1();
In the console we will see the following output:
==>callSimObjectMethod1(); 4281 ScriptObject 4289 Camera getPosition(): -0.277961 -0.851682 243.342 getEulerRotation(): 0 -0 -0 getScale(): 1 1 1 4290 Player getPosition(): 0.595642 1.25134 240.748 getEulerRotation(): 0 -0 67.1649 getScale(): 1 1 1 4291 SimGroup
How it works...
Our example code first fills up an array with the methods we will call on the objects. It then loops though all the dynamically created objects in the scene
and if an object derives from the
SceneObject
class, call our methods on it using the SimObejct
call()
method.
The SimObject
call()
method has the following form:
result = SimObject.call( method, args… );
Here, the method
parameter is the method we want to call on the SimObject
instance, and the args…
parameter is actually an optional set of arguments to pass into method
. The call()
method returns the output as denoted by result
of the method call, if any.
If the given method does not exist on the SimObject
instance, an
empty string is returned. No error will be output to the console.
There's more...
If we are unsure whether a particular method exists on a SimObject
instance, we can use the isMethod()
method. It has the following form:
result = SimObject.isMethod( method );
Here the method
parameter is the method name to search for, and result
is either true
or false
depending on whether the method exists on the SimObject
instance or not.
See also
Using a variable to access methods or properties of a SimObject instance
Using call() to call a variable function with arguments