Unity基础---不同GameObject之间的交互

通过脚本变量

找到相关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");
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章