Unity代码编写标准流程
1) 建议按照执行流程写代码,这样减少忘记写功能的可能性。
**2)复杂的类型的初始化赋值:**不要在初始化中赋值。应该设为private,因为不用在窗口中赋值,所以在start()中初始化
常规问题
一些Unit bug
脚本死锁问题:
改写脚本参数后,执行效果没有及时更新,此时应该及时移除脚本,再重新挂上去。
[Serializable]
ClassA脚本不直接给物体,去掉MonoBehaviour
但是,ClassA这个脚本要在其它脚本ClassB使用,
而且要在unity属性窗口访问ClassA这个脚本的字段【赋值】
就给ClassA加[Serializable]!
[HideInInspector]
脚本的字段很多:
【类型简单】有的在属性窗口赋值:
【类型复杂】有的不适合在属性窗口赋值:一般Start中赋值
没必要在属性窗口出现!
改成private不出现了,可是也无法在其它类中访问。
希望:不在属性窗口出现,但在其它类中可以访问
加 [HideInInspector]
概念问题
关于Unity3D中gameObject和GameObject的区别
//大写开头GameObject 与gameObject的区别
//大写开头GameObject 是类,是class, 是苹果类,apples
//小写开头gameObject 具体的个体,是对象,是这个苹果,apple
//查找游戏物体GameObject
GameObject.Find("apple");// 返回一个GameObject的对象
GameObject myApple= GameObject.Find("apple");//所以应该写成这样
//当然也可以写成这样,要根具需要
GameObject.Find("apple").GetComponent<Transform>(); //查找到游戏物体后获取该游戏物体的Transform组件,返回值是Transform类型的组件
Transform myTransform = GameObject.Find("apple").GetComponent<Transform>();//定义接收上例的返回值
~这两个相比,gameObject好理解一点,就是你脚本挂着的那个物体。这个实例化过程是Unity帮你实现的,不用在写代码实例化。this.gameObject默认函数,脚本一创建直接就get到了。
例如,有一个A物体。你给它挂载一个脚本里写this.gameObject。那就等于是直接获取(实例化)A这个物体了,你直接可以引用它下面挂载的属性。
GameObject不是对象,通常需要获取一个对象,就像你定义一个public GameObject A;
那么属性里就会出现一个可托选的框,那就是Unity告诉你,你定义的这个物体是哪个物体要你选择,无论你拖拽也好,脚本里获取也好,都是要给A赋予对象的。
这是一个强大的引擎,里面很多函数,都可以简化,this.gameObject就是简化实例化的一个函数.
获取GameObject对象的三个途径
1.使用public修饰符定义变量,不用在初始化。可以在unity编辑器中直接拖拽。即可绑定。
public GameObject obj;
2.使用Find函数查找,性能很差,尽量在Start()方法中使用。只能获取激活(active)的对象
obj = GameObject.Find('Cube");
3.使用gameObject获取,尽量在Awake()或Start()方法中使用。
obj = this.gameObject;
obj = gameObject;
两种方式二选一。this.gameObject和gameObject指同一个对象(即脚本绑定的GameObject)。