Unity中if语句意外创建GameObject问题求助
为啥Unity里你写的if条件会凭空创建GameObject?
兄弟,问题出在你写的new GameObject()上——这玩意儿可不是用来做比较的!只要代码执行到它,就会立刻在场景里生成一个全新的GameObject实例,不管它是在if判断里还是别的地方。
先拆解下你这段代码的坑:
if (touchedTarget == true && Targeter[1] == new GameObject()) { _destination = Targeter[1].transform; }
这段代码的执行顺序是:
- 先检查
touchedTarget是不是true - 如果第一个条件成立,就会先执行
new GameObject()创建一个新对象,然后拿这个新对象和Targeter[1]做引用对比 - 但这俩永远不可能相等啊!一个是你数组里已有的对象,一个是刚生成的全新对象,引用地址完全不一样,所以if里的代码根本不会跑,但新的GameObject已经被创建出来了——这就是你看到的意外情况的根源。
那该怎么改?得看你原本的需求:
- 如果你是想判断
Targeter[1]是不是还没被赋值(为null),然后再创建对象,应该这么写:if (touchedTarget && Targeter[1] == null) { // 只有当需要的时候才创建对象 Targeter[1] = new GameObject(); _destination = Targeter[1].transform; } - 如果你是想判断
Targeter[1]是不是某个特定的目标对象,那得用标签、自定义组件这类标识来判断,而不是拿它和新创建的对象比:// 比如用自定义组件判断 if (touchedTarget && Targeter[1].GetComponent<TargetMarker>() != null) { _destination = Targeter[1].transform; } // 或者用标签判断 if (touchedTarget && Targeter[1].tag == "PlayerTarget") { _destination = Targeter[1].transform; }
最后提醒一句:在Unity里,绝对别在条件判断里写new GameObject()这种会产生副作用的代码——除非你明确要创建对象,不然轻则场景里多一堆垃圾对象,重则影响性能。
内容的提问来源于stack exchange,提问作者Oladam Une
相关产品推荐
相关产品推荐

