如何控制预制件的多个实例之一?

How to control one of multiple instances of a prefab?

我的 "game" 读取一个文件 XML,识别一些元素并在运行时实例化他。这个实例是一个预制件。 所以,我有一个带有创建实例的变量 "ins" 的循环:

ins = (GameObject)Instantiate (this.MyPrefab, position, Quaternion.identity);
例如,我想单击一个实例并更改其颜色,而不是所有实例。

您可以制作一系列游戏对象。

执行 foreach 循环并将每个实例添加到您的数组中。然后你可以执行 ins[0].DOSOMETHING 或者,更简单地说,让你正在实例化的预制件上面有一个脚本,然后接受鼠标点击或其他输入,这只会影响用户与之交互的 gameobject/prefab。

using UnityEngine;
using System.Collections;

public class Program : MonoBehaviour
{

 private Diagram diagram { get; set; }
 public string arquivoXMI;
 public GameObject ButtonDiagramGameObject;
 private const int SPACEX = 2;
 private GameObject ins;
 public ArrayList instances{ get; private set; }

 // Use this for initialization
 void Start ()
 {
  this.diagram = new Diagram (arquivoXMI);

  ButtonForEachSequenceDiagram ();
 }


 //BUTTON FOR EACH SEQUENCE DIAGRAM
 private void ButtonForEachSequenceDiagram()
 {
  instances = new ArrayList ();

  if (this.diagram.SequenceDiagrams.Count > 0) {
   float increment = (this.ButtonDiagramGameObject.transform.localScale.x / 2) + SPACEX;
   float position = 0;

   foreach( Sequence s in this.diagram.SequenceDiagrams )
   {
    float posBDx = position;
    float posBDy = this.ButtonDiagramGameObject.transform.position.y;
    float posBDz = this.ButtonDiagramGameObject.transform.position.z;

    Vector3 posButtonDiagram = new Vector3 (posBDx, posBDy, posBDz);
    ins = (GameObject)Instantiate (this.ButtonDiagramGameObject, posButtonDiagram, Quaternion.identity) ;
    ins.GetComponentInChildren<ButtonDiagram> ().NameDiagram ( s.Name );

    instances.Add(ins);

    position += increment;
   }
  }
 }
 

 // Update is called once per frame
 void Update ()
 {
  foreach( GameObject i in instances ){
   i.GetComponentInChildren<ButtonDiagram>().Click();
  }
 }
 
}





using UnityEngine;
using System.Collections;

public class ButtonDiagram : MonoBehaviour {

 public TextMesh Name;
 public GameObject MyCube;
 private string nameDiagram;
 private float random;

 // Use this for initialization
 void Start () {
//  random = Random.Range(-10.0f, 10.0f);
//  NameDiagram = random.ToString();
  Name.text = nameDiagram;

 }


 public void NameDiagram( string nome ){
  this.nameDiagram = nome;
 }


 public void Click(){
  if( Input.GetMouseButtonDown(0) )
  {
   Debug.Log("Click!");
  }
 }


 // Update is called once per frame
 void Update () {

 }
}

您的代码中的问题是 Update() 在每一帧中调用 Click()。因此,无论何时按下鼠标按钮,每个预制件的 if( Input.GetMouseButtonDown(0) ) 都会变为 true 并且它们都会处理点击事件,无论它们是否被点击。

解决方案是将 Collider 组件添加到您的预制件并在 ButtonDiagram class 中实施 OnMouseDown() 以检测鼠标在对象上的点击。像 :

public class ButtonDiagram : MonoBehaviour
{
    // rest of your code

    void OnMouseDown()
    {
        Debug.Log("Click!");
    }
}

Unity 的文档: http://docs.unity3d.com/ScriptReference/MonoBehaviour.OnMouseDown.html