Unity中GetComponent获取对象后Equals与==返回False的问题
问题原因分析
首先明确:GetComponent<ProtagonistActor>()不会返回新引用,它始终返回挂载在同一GameObject上的同一个组件实例,问题出在以下几个核心点:
1. Unity序列化系统的覆盖行为
你给_actorState标记了可序列化特性(比如[SerializeField]),Unity的序列化流程会在Awake方法执行前,自动创建一个ActorState的实例并赋值给_actorState。而你在ProtagonistActor的Awake里又手动new了一个新的ActorState覆盖了这个序列化实例,导致:
- Test2在Awake中获取的是Unity序列化生成的那个
ActorState实例 - 之后
ProtagonistActor的Awake替换成了新实例,两者自然是不同的引用,哈希码、字段值都会不一致
2. 脚本生命周期执行顺序问题
即使你没手动覆盖,如果Test2的Awake执行顺序早于ProtagonistActor的Awake,也可能出现问题:
- 假设你原本计划在
ProtagonistActor的Awake里初始化_actorState的字段值,但Test2先执行Awake并保存了_actorState引用,此时_actorState的字段还没被初始化,后续ProtagonistActor初始化字段后,Test2保存的旧实例字段值就和当前_actorState不一致了
3. 额外排查点
- 检查
ActorState是否实现了正确的Equals和GetHashCode方法:如果是自定义引用类型,默认的Equals比较的是引用,若你期望比较字段值,需要手动重写这两个方法 - 确认
ProtagonistActor是否被多次挂载在同一个GameObject上:如果有多个组件实例,GetComponent可能返回你预期外的那个(不过这种情况概率较低)
内容的提问来源于stack exchange,提问作者supernatural
相关产品推荐
相关产品推荐

