2017-07-28 101 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