使用Unity遇到的若干个坑

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

使⽤Unity遇到的若⼲个坑
先总结⼀下今天的收获:在⼀个脚本类中对其成员变量进⾏初始化时,什么时候在Awake()中,什么时候在Start()中是有讲究的。

1)当成员变量会被外部脚本引⽤时,尤其是该成员变量是⼀个⾃⼰定义的⾮脚本类必须⽤构造函数初始化的时候。

并且,被外部脚本引⽤指的是 “引⽤该变量的内部成员函数或属性被外部函数调⽤的时候”,该成员变量应该在Awake函数中进⾏初始化。

2)如果该成员变量只在⾃⾝所在的脚本类被引⽤时,则应该在Start函数中进⾏初始化。

今天遇到的第⼀个坑就是因为没有注意以上两点。

我在Start函数中使⽤构造函数初始化了⼀个Poker类,但是这个类的实例在⾃⾝的公有⽅法中,被外部其他脚本调⽤了。

这倒不是最重要的,因为之前我遇到过⼀次。

重要的是:在Update()函数中拷贝预设体,其Awake()函数在当前帧的Update中就会被⽴即调⽤,但是Start()函数则会在在下⼀帧执⾏。

第⼆个坑是这样的:我将⼀个共有函数绑定到NGUI的UIButton脚本⾥的OnClick事件中作为事件处理函数,在这个共有函数中使⽤了两个if语句,则当事件触发时函数不会被执⾏,但是我改为 if(){} else if(){}就可以执⾏,明明相同的逻辑却⼜不⼀样的结果,让⼈匪夷所思呀。

第三个坑是:在NGUI中有⼀个⼤坑,就是创建NGUI中的游戏对象时,如果你使⽤Instantiate()函数,创建的控件会⾮常的⼤,但是使⽤NGUITools.AddChild()函数时⽣成的控件⼤⼩就会正好合适。

【原因还不祥】
⼀下我将之前遇到的问题说⼀下,也是空引⽤异常的问题,和第⼀个坑差不多,其实也不能说是坑,⽽是⾃⼰对⾃⼰的逻辑没有考虑清楚,将各种类的相互引⽤考虑进来就会发⽣问题的。

之前已经实现了跑道的动态⽣成,今天要是实现的是在动态⽣成的跑道上的路点处随机产⽣提前准备好的陷阱预设体。

遇到的问题:因为之前在动态⽣成跑道时,顺便实现了另⼀个类,路点管理器类。

我们的陷阱就要在路点附近⽣成,所以,利⽤之前跑道上⾃带的路点是很好的选择。

但是,将道具⽣成器脚本类顺利加⼊到之前的代码还是⽐较繁琐的。

因为封装的函数太依赖于动态⽣成跑道和记录游戏⾓⾊附近的路点这两个逻辑,所以必须再次明⽩之前是如何设计⽣成跑道和如何计算路点的,并且这还不是最重要的。

最重要的问题是:在ElementsGenerator脚本类中维护⼀个List<Transform> waypointList来负责在当前跑道上所有路点处⽣成障碍物、陷阱。

由于是脚本类,所以并不存在构造函数这个概念,所以我就在 Awake()这个函数中创建waypointList,但是我明明已经创建了该列表,但是总是报空引⽤这样的错误。

我百思不得其解,最后,我明⽩了为什么
主要问题是:我在PlayMove这个脚本类中的Awake()函数中对作为单例出现在整个游戏场景中的跑道⽣成器进⾏了初始化:raceTrackGenerator.Init () 这⾥这个函数的初始化是在 waypointList之前执⾏的【不同脚本中的Awake函数执⾏顺序我不知道如何确定】。

主要问题的产⽣就是因为跑道⽣成器初始化时需要调⽤ElementsGenerator脚本类的GetWaypointList()函数,但是此时该函数必须的waypointList还没有创建出来。

相关文档
最新文档