You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中if语句意外创建GameObject问题求助

为啥Unity里你写的if条件会凭空创建GameObject?

兄弟,问题出在你写的new GameObject()上——这玩意儿可不是用来做比较的!只要代码执行到它,就会立刻在场景里生成一个全新的GameObject实例,不管它是在if判断里还是别的地方。

先拆解下你这段代码的坑:

if (touchedTarget == true && Targeter[1] == new GameObject()) { 
    _destination = Targeter[1].transform; 
}

这段代码的执行顺序是:

  1. 先检查touchedTarget是不是true
  2. 如果第一个条件成立,就会先执行new GameObject()创建一个新对象,然后拿这个新对象和Targeter[1]做引用对比
  3. 但这俩永远不可能相等啊!一个是你数组里已有的对象,一个是刚生成的全新对象,引用地址完全不一样,所以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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:15:41