撰写了文章 发布于 2018-09-19 15:31:29
【代码日志】unity常用逻辑中一个个“灵异现象”的原理记录
前言:自从开始一步步尝试些代码,unity着实给了自己一系列难以理解的困难问题,以及无数作为初学者抓破头皮,有的甚至是查资料研究一整天也无法解释的“灵异现象”。这些奇怪的问题有的连怎么搜索都无从下手,国内的搜索引擎自然更加无能为力。为了便于以后跳过这些“坑”,我先一点点记录下来。
/*—————————————2016/12/23———————————————*/
1.明明在Awake、Start中设定了某GameObject的Active为false,或者使用GameObject.Find ()函数及其他查询设定GameObject状态,但是在运行过程中怎么都不生效,怎么都找不到应该找到的对象;重新建一个新的场景,写一个新的代码文件就没有问题。
答案:复杂的逻辑里面如果出现一些与其他脚本、场景高耦合的代码,如果当前无法生效(含多种情况,例如预留一些还没有写的对象位置却没有赋值,或者引用了一些值为null的参数/对象),那么有时候在Log里面会提醒空指针,但是有些时候却不提醒,因为代码的格式是对的,unity多数情况下是允许未赋值的对象存在在代码文件里的。
然而这个时候,在Awake、Start的初始化时,往往就会卡到那些未赋值的变量处,不再向下进行,这时候自然就会出现很多逻辑空指针的情况。所以,尽量保证一份干净的代码文件,不要提前预留不需要的变量,改变后暂时不需要的功能要么注释掉要么删掉。
2.手动在unity编辑模式下为Public的变量赋值,运行时出现报错【UnassignedReferenceException: The variable xxxxxx(Public变量)of MainMenuUI has not been assigned.】
答案:未分配引用异常。 通常是脚本中的public 类型字段,在游戏运行过程中,没有给予附加相对应的“预设”或者游戏对象所造成的。 即: 没有给脚本的公共字段添加参数造成的。
以上是通用解释,但是多数情况下即使是初学者也不会犯public字段不赋值的错误,所以这个时候,一定是自己挂了两个相同脚本在不同的组件上面导致出现了这个问题。所以有出现这个问题的童鞋,找找看看有没有挂两个一样的脚本。
感谢:Unity 中常见错误之一UnassignedReferenceException: The variable button of CityScript has not been assigned.
3.使用通用输入方法Input.GetKeyDown/GetMouseButtonDown等时,往往会出现同样的操作进行了2次甚至更多的现象,而且此时判断点击后再次点击的逻辑会无效。
答案:问题是出现在Update()的刷新频率上,由于帧刷新频率过快,键盘io相对较慢,所以会造成键盘按下的瞬间帧已然刷了多次,则GetKeyDown()自然会调用多次,出现上述情况。
解决之道:加个判别变量isButtonDown,这样就不会连续调用了。
if (Input.GetKeyDown(KeyCode.anyKey) && !isButtonDown)
{ isButtonDown = true; }
else if (Input.GetKeyDown(KeyCode.anyKey) && isButtonDown)
{ isButtonDown = false; }
感谢:Unity3d的坑系列之一 Input.GetKeyDown
强调一下,在这里的逻辑中,一定要使用if……else if的逻辑而不能使用if……if的逻辑。
4.使用NGUI的时候,当按下键盘按键的时候,鼠标会每帧强制回到屏幕中间,造成操作不便。
答案:
UICamera会默认将AutoHideCursor打开,解决办法是将UICamera脚本上的AutoHideCursor的Bool属性设为false即可关闭此效果。
wsedr 1年前
发布