【问题标题】:How to control one of multiple instances of a prefab?如何控制预制件的多个实例之一?
【发布时间】:2015-07-21 17:41:15
【问题描述】:

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

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

【问题讨论】:

    标签: unity3d multiple-instances


    【解决方案1】:

    您的代码中的问题是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

    【讨论】:

    • @filran,很高兴能帮助一位程序员 :)
    • 现在,切换场景后,定向光似乎不起作用。
    【解决方案2】:

    你可以做一个游戏对象数组。

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

    【讨论】:

    • Bryan,我创建了一个数组,但是单击不适用于一个实例,而是适用于所有实例。 void Update () { foreach( GameObject i in instances ){ i.GetComponentInChildren().Click(); } }
    • 您是否在每个预制件上附加了处理 onclick(或 on touch)事件的脚本?在每个预制件的脚本中,您是否使用了“this”关键字。而不是数组,只需实例化每个预制件并确保每个预制件都有自己的脚本,该脚本具有 onclick 定义。
    • 布莱恩,对不起,我是初学者。我将发布我的代码。
    【解决方案3】:

    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 () {
    
    	}
    }

    【讨论】:

    • 创建一个名为“clickingscript”的新脚本(或任何你想命名的脚本)。在脚本中添加你的变量,点击部分你需要这一行:void OnMouseDown(){ //do something }。我不确定 Click() 是否正确。在统一编辑器中将脚本附加到预制件。
    • Bryan,我用 Collider 进行了测试并且正在工作。无论如何,非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2020-03-02
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-05
    • 1970-01-01
    相关资源
    最近更新 更多