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的方式的话,也可以在不赋值的情况下做
正确的事情,类似的还有比如另外的具体操作的类什么的,也可以实现。
想来想去,自己钻到牛角尖了。

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

绣花腿代码

这次的内容纯粹是用来消磨乘车时间想出来的,基本上没有太大的实际用途,因此,华而不实,对这类无喜好的可以退出了。

功能:字符串遍历,比如给定一个字符串”abc”,依次输出’a’,’b’,’c’。

代码一:我最常看到的:

       #include 
       int main(int argc, char *argv[])
       {
               char* str = "abc";
               int i = 0;
               for( i = 0; i < strlen(str); i++)
               printf("%c\n", str[i]);
      return 0;
     }
       

上述代码的一个问题是,总是调用strlen函数(不考虑优化),于是有了下面的变种:

继续阅读绣花腿代码

迷失多线程:不用汇编模拟实现简单可控多线程

之前提供了一个在BREW等Arm和X86上的模拟多线程,核心部分是用汇编写的,里面的关键是栈的切换。今天偶尔清闲一下,突然想能不能不用汇编来实现,有些人一听汇编就头大了。于是就用了一下午来研究下如何操作。代码并不多,只是因为我在linux下写的,只能使用gdb来调试,而我对gdb非常不熟悉,所以弄起来非常的慢,大部分的时间都是靠仔细的分析代码来找错误的原因和地方的,浪费了不少精力,期间还在白纸上来描述流程,写部分实现,分析。就这些年的集中精力来说,可以说也花费了不少脑细胞了。

闲话不说了,苦也受过了,先看代码:

继续阅读迷失多线程:不用汇编模拟实现简单可控多线程

语言陷阱:C/C++的宏替换

C/C++的宏非常不错,非常强大,我自己用的也非常顺手。自己的代码刚开始写的时候其实到处都是宏,然后根据需要,切换为C++,切换为Java,一会排成一字,一会排成人字。但使用却必须要小心些了,比如下面的语句:

       #define abs(x) (x)<0?0-(x):(x)
       #define rand(x) abs(rand()%x)
       

继续阅读语言陷阱:C/C++的宏替换

语言陷阱:变量声明

前两周太忙了,从上周才稍微缓和些,也正是那段时间,背写了大量的代码,自然免不了错误的。但有些错误,在一定程度上,应该是可以避免的,比如下面的代码:

       int main(int argc, char* argv[]){
int* t = (int*)t;
for (int i = 0; i < 4; i++) {
t[i] = 0;
}
return 0;
}

       

继续阅读语言陷阱:变量声明