2014-03-13 100 views
3

我在學習Unity,並且我知道您可以將組件添加到對象中,因此,假設我在組件的「移動」對象中使用了Unity API做一些操作。Unity如何從另一個對象中引用對象

嗯,我還沒有理解的是,因爲團結工作與組分(它是一種基於組件的架構,如果我沒看錯)和代碼的架構是從我真的什麼不同用於處理......我如何從另一個對象引用一個對象?

舉一個例子Unity 4.3在2D中,如果我有一個精靈對象,並且我想讓另一個精靈對象跟隨第一個精靈對象,他必須知道第一個精靈對象的位置......好吧,我該如何引用第一個精靈對象,第二個?我知道一種方法是使用TAG,但我不認爲總是使用TAG是一個好主意,如果你需要引用很多對象,你肯定需要一種不同的方式

增加一個問題:this問題是關於如何引用實際存在的對象(通過IDE添加),但是如果以編程方式創建對象然後我需要引用它?

回答

4

有很多方法可以做到這一點,這一切都取決於情況以及如何組織項目。

您可以使用GameObject.Find(string)按名稱找到遊戲對象,您可以使用UnityEngine.Object.FindObjectsOfType(type)查找包含某個組件的對象(如您的示例)。請注意,出於性能原因,不建議在Update()方法中調用大多數(全部?)找到方法。

取決於你如何構建您的場景層次,你可以很容易地被相關的對象:在通過Transform API連接同一層次樹遊戲對象:Transform.parent將返回父遊戲對象的變換和Transform.GetChild(int)回報由索引定義的子元素的變換,並且Transform.Find(string)返回與名稱匹配的子變換(不遞歸)。

他們爲什麼通過Transform API連接?因爲變換是對象的物理表示,它的位置,縮放和旋轉。其他對象下的對象將遭受其父對象的相同更改。你提到一個對象「跟在」另一個對象上,所以如果你的意思是之後,這可以簡單地通過將跟隨者置於層次結構的後面來實現。

還有一種編輯方式:如果您在腳本中創建對象的公共引用,Unity將在編輯器中爲它創建一個條目。只需將您的腳本附加到場景中的遊戲對象的公共引用中,即可在「檢查器」窗口中看到引用。然後,您可以將任何其他與您的公共參考類型相匹配的對象拖放到Inspector中的此參考中,並且可以在腳本中使用它。

最後,你可以通過編程方式做到這一點:創建一個包含你的遊戲對象池靜態類,或者使用Singleton模式,無論你在正常的代碼做。

此外,UnityEngine.Object.Instantiate()將返回參考實例化的對象,所以你可以使用它。接下來,如果您剛剛實例化GameObject來訪問您的腳本,則還可以使用gameObject.GetComponent<YourScript>();像這樣:

public class MyScript : MonoBehaviour { 
    public void GameObject creator; 
    public void CreateClone() { 
     GameObject clone = Instantiate(this); 
     MyScript myScript = clone.GetComponent<MyScript>(); 
     myScript.creator = this; 
    } 
} 
相關問題