unity3d 中的一个误区

首先,我不知道这是unity3d的设计还是一个失误,我对unity3d并没有
达到精通的地步,所以,只能以自己认识上的一个失误来做标题。

其次,我对C#也没有像C/C++那样精通,因此,对于这个问题是unity3d
本身引起的还是C#引起的也不清楚。

首先,看下面的代码:

       using UnityEngine;
using System.Collections;

public class Right_Ctrl : MonoBehaviour {
	public GameObject[] small_ctrl;
	
	// Use this for initialization
	void Start () {
		float x = 0.2;
        float y = 0.2;
		for (int i = 0; i < small_ctrl.Length; i++) {
			 Instantiate(small_ctrl[i], new Vector3((x + i * 0.1,
													y,
													0.0f),
										  Quaternion.identity);
		}
		
	}
	
	// Update is called once per frame
	void Update () {
	
	}
	
	void OnGUI()
	{
	}
}

       

代码大致如此。每一个small_ctrl都是从Prefab中拖入的,场景中并不
存在。每一个small_ctrl的Prefab都添加了mobile中的Joystick插件,因
此,可以作为单独的按钮(设置了Touch Pad属性)来使用。

但上述的代码在监测clone出来的按钮的时候出现了麻烦,表现是无论
如何都没办法监测到按钮状态的变化。

修改的方式有两种:

第一种是比较笨的方法,就是在场景中添加每一个small_ctrl,然后修
改循环中的代码为如下的方式:

       small_ctrl[i].transform.position = new Vector3(x + i * 0.1,
													y,
													0.0f);
       

这种方式规矩很死,直接被我放弃了。因为我要的是动态的内容,每个
small_ctrl都必须是独立的,最后形成组积木的方式。于是,就有了第二
种方式:

       small_ctrl[i] = Instantiate(small_ctrl[i], new Vector3((x + i * 0.1,
													y,
													0.0f),
										  Quaternion.identity);
       

代码是有一点点变化的!!!,每一个small_ctrl由prefab clone出来
后,再覆盖掉自己所在位置的元素。如果没有那个赋值的话,就会存在问
题,如果有的话,就不会有问题了。

本来以为有问题的,写到这里突然想明白了,是自己的一个失误,为了防止再
次产生,还是接着记录下去,接着看我使用的代码:

       Right_Ctrl r = right_Ctrl.GetComponent();
		for (int i = 0; i < r.small_ctrl.Length; i++) {
			Joystick joy = r.small_ctrl[i].GetComponent();
			
			if (joy.isFingerDown) {
            //do something....
			}
		}
       

如果没有那个赋值操作的话,每个数组的元素都还是prefab,因此上述
代码没办法监测按钮按下,就像没有实例化一样。

同理,如果有赋值的话,每个数组的元素都将被替换为具体的实例,因
此可以监测到。

突然想到,如果使用Message的方式的话,也可以在不赋值的情况下做
正确的事情,类似的还有比如另外的具体操作的类什么的,也可以实现。
想来想去,自己钻到牛角尖了。

最后,浪费了各位看官的感情,以后分析问题还是老实些比较好,今天
太急躁了。

发布者

rix

如果连自己都不爱自己,哪还有谁来爱你