通过脚本变量
找到相关GameObject的最直接的方法是在脚本中添加一个公共GameObject变量:
public class SphereScript : MonoBehaviour
{
public CubeScript cube;
//其他代码
}
这个变量将会像其他变量一样在Inspector中可见:
现在可以从场景或层次结构面板拖动对象赋值到此变量上。GetComponent函数和组件(Component) 访问变量对这个对象和其他对象一样可用,所以可以使用如下代码:
void Update()
{
cube.CubeFunction();
}
此外,如果在脚本中声明组件类型的公共变量,则可以拖动任何带有该组件的GameObject。这将直接访问组件而不是GameObject本身。
public Transform playerTransform;
在处理具有永久连接的单个对象时,使用变量将对象链接到一起是最有用的。您可以使用数组变量来链接几个相同类型的对象,但是连接仍然必须在Unity编辑器中进行,而不是在运行时进行。在运行时定位对象通常很方便,Unity提供了两种基本的方法,如下所述。
找到GameObject的子对象(Child)
有时,游戏场景会使用许多相同类型的游戏对象,如敌人、路标和障碍物。这些可能需要由一个特定的脚本跟踪,该脚本对它们进行监视或作出反应(例如,所有的路标点可能都需要对寻路脚本可用)。使用变量来链接这些GameObjects是可能的,但是如果每个新的waypoint都必须被拖到脚本上的一个变量上,那么设计过程就会变得单调乏味。同样的,如果一个waypoint被删除了,那么必须删除对缺失GameObject的变量引用就很麻烦了。在这种情况下,通过将一组GameObject设置为某个GameObject的子对象来管理它们通常会更好。子gameobject可以通过父对象的Transform组件来检索(因为所有gameobject都隐含有一个Transform):
using UnityEngine;
public class WaypointManager : MonoBehaviour {
public Transform[] waypoints;
void Start()
{
waypoints = new Transform[transform.childCount];
int i = 0;
foreach (Transform t in transform)
{
waypoints[i++] = t;
}
}
}
你也可以通过 Transform.Find()方法来定位到特定名称的子对象:
transform.Find("Gun");
当一个对象有一个可以在游戏过程中添加和删除的子对象时,这将非常有用。一个可以拿起放下的武器就是一个很好的例子。
通过Name(名称)或Tag(标签)查找游戏对象
只要你有一些信息来识别游戏对象,你总是可以在场景层次结构的任何地方找到游戏对象。单个对象可以通过GameObject.Find()方法来检索:
GameObject player;
void Start()
{
player = GameObject.Find("MainHeroCharacter");
}
对象或对象集合也可以使用 GameObject.FindWithTag和 GameObject.FindGameObjectsWithTag来检索标签:
GameObject player;
GameObject[] enemies;
void Start()
{
player = GameObject.FindWithTag("Player");
enemies = GameObject.FindGameObjectsWithTag("Enemy");
}