【发布时间】:2015-07-21 17:41:15
【问题描述】:
我的“游戏”读取文件 XML,识别一些元素并在运行时实例化他。这个实例是一个预制件。 所以,我有一个带有创建实例的变量“ins”的循环:
ins = (GameObject)Instantiate (this.MyPrefab, position, Quaternion.identity);
【问题讨论】:
标签: unity3d multiple-instances
我的“游戏”读取文件 XML,识别一些元素并在运行时实例化他。这个实例是一个预制件。 所以,我有一个带有创建实例的变量“ins”的循环:
ins = (GameObject)Instantiate (this.MyPrefab, position, Quaternion.identity);
【问题讨论】:
标签: unity3d multiple-instances
您的代码中的问题是Update() 在每一帧中调用Click()。因此,每当您按下鼠标按钮时,if( Input.GetMouseButtonDown(0) ) 对每个预制件都变为 true,并且它们都会处理点击事件,无论它们是否被点击。
解决方案是在您的预制件中添加一个 Collider 组件并在 ButtonDiagram 类中实现 OnMouseDown() 以检测对象上的鼠标点击。类似的东西:
public class ButtonDiagram : MonoBehaviour
{
// rest of your code
void OnMouseDown()
{
Debug.Log("Click!");
}
}
Unity 的文档: http://docs.unity3d.com/ScriptReference/MonoBehaviour.OnMouseDown.html
【讨论】:
你可以做一个游戏对象数组。
执行一个 foreach 循环并将每个实例添加到您的数组中。然后你可以做 ins[0].DOSOMETHING 或者更简单,让你正在实例化的预制件上有一个脚本,然后接受鼠标点击或其他输入,这只会影响用户与之交互的游戏对象/预制件。
【讨论】:
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 () {
}
}
【讨论】: