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