如何控制预制件的多个实例之一?
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
我的 "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