2017-07-28 62 views
0
  1. 我創建了一個GameObject並將其命名爲「sensor」。然後我添加了一個BoxCollider和一個腳本(script_sensor)到傳感器。從組件gameObject訪問容器gameObject

  2. 然後我又創建了另一個GameObject並將它命名爲「taxi」。我添加了一個腳本(script_taxi)來打車,並在腳本中創建了一個公共Collider2D

  3. 然後我將傳感器GameObject分配給的士的公共Collider2D

  4. 現在,我想從script_sensor訪問script_taxi

基本上,我怎樣才能訪問script_taxi(框1上的圖像),從script_sensor(框2)?

Check the image to understand better.

PS:當我垃圾郵件出租車預製件,每個傳感器對象應該能夠找到它自己的遊戲對象的容器(出租車)。

+0

如果出租車是傳感器的容器(傳感器是出租車的孩子),你可以使用'transform.parent.gameObject.GetComponent ();' – ryeMoss

回答

2

如果你想從script_sensor訪問script_taxi,你需要 script_sensor的一些類型的參考。然後您可以使用GetComponent。您也可以使用GameObject.Find的變體,但是這些調用可能很昂貴。

public class script_sensor : MonoBehavior { 
    [SerializeField] 
    private GameObject taxi; 

    private script_taxi taxiScript; 

    void Start() { 
     taxiScript = taxi.GetComponent<script_taxi>(); 
    } 

} 

此外,建議按照C# naming conventions

script_sensor => Sensor

script_taxi => Taxi

public Collider2D col; => [SerializeField] private Collider2D col;

+0

這裏有些東西不對...... C#命名約定並不完全適用於Unity腳本,材質,着色器等。這些是實際腳本的文件名,而不是代碼中的變量。除非你計劃對這些數據進行序列化,否則沒有理由做出「col」可序列化 - 它不會像這裏試圖完成的那樣,也不能串行化一個Unity Collider2D。 – ryeMoss

+0

我想你誤會了我。請檢查我附加的圖像。您可以在那裏看到傳感器對象已分配到的位置等。 – MossTeMuerA

+0

@ryemoss我建議的命名約定適用於其「類」名稱,不一定是文件名。此外,如果您只打算在該腳本中使用Collider2D對象,則不需要公開「Collider2D」對象。這是面向對象設計的核心原則之一。不知道爲什麼你不能序列化一個Collider2D,但它對我來說工作得很好。 –

0

或用GameObject.Find()找到出租車遊戲對象是這樣的:

script_taxi taxi; 

    void Awake() 
    {  
     taxi = GameObject.FindWith("taxi").GetComponent<script_taxi>(); 
    } 
+0

當我發佈出租車預製件時,每個傳感器對象應該能夠找到它自己的容器gameobject。這就是爲什麼這個解決方案不能幫助我。 – MossTeMuerA