首先,我不知道这是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的方式的话,也可以在不赋值的情况下做
正确的事情,类似的还有比如另外的具体操作的类什么的,也可以实现。
想来想去,自己钻到牛角尖了。
最后,浪费了各位看官的感情,以后分析问题还是老实些比较好,今天
太急躁了。