【问题标题】:Activating SetActive(false) Objects in Unity在 Unity 中激活 SetActive(false) 对象
【发布时间】:2021-03-11 04:23:15
【问题描述】:

在我正在制作的游戏中,我想在触发时使用 (SetActive(false)) 重新激活已设置为非活动的游戏对象。我的方法不起作用。 我的代码-

如何解决这个问题。 ?

private void OnTriggerExit(Collider coin)
    {
        if (coin.CompareTag("coinHolder"))
        {
            coin.SetActive(true);
            Debug.Log(coin.name);

        }
    }```

【问题讨论】:

  • 这不会立即触发吗?一旦你停用对象 afaik OnTriggerExit 应该被调用,所以它总是会在启用和禁用之间切换

标签: c# unity3d gameobject


【解决方案1】:

禁用游戏对象时不会调用 Unity 生命周期方法。为了克服这个问题,重新安排你的游戏对象层次结构,使使用这个功能的部分始终处于活动状态。例如:

Main object (Always active)
├── Visible object (Deactivatable)
    └── Collider with main logic (Deactivatable)
└── Non-visible object (Always active)
    └── Dummy collider (Always active) (that would trigger OnTriggerExit)

【讨论】:

    【解决方案2】:

    一旦您停用游戏对象 (̶o̶r̶ ̶c̶o̶m̶p̶o̶n̶e̶n̶t̶)̶,就不会再向该对象发送消息!

    这样的方法:

    • 开始
    • 更新
    • OnTriggerEnter
    • OnCollisionEnter
    • 等等...

    将不再被调用。

    编辑:正如评论中提到的@derHugo。如果您禁用了 Component,将调用 OnTriggerExit,但如果您禁用了 GameObject,则不会!这是因为您禁用了 Collider(与游戏对象),这不会导致 OnTriggerExit;

    为此,您需要分离逻辑表单显示,并且只禁用渲染器(网格渲染器或图像),并启用您的组件(单行为)!

    【讨论】:

    • Trigger events will be sent to disabled MonoBehaviours, to allow enabling Behaviours in response to collisions .. 我想实际上这应该以循环的形式调用,因为一旦对象被停用,OnTriggerExit 也会被调用。然后在再次激活它之后,调用OnTriggerEnter 再次停用它等等
    • @derHugo 你是对的,我忘记了(我会编辑我的答案)但他可能禁用了导致这种行为的 GameObject。 Disabled GameObject = Disabled collider = No OnTriggerExit 因为没有碰撞器
    猜你喜欢
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 2021-07-23
    相关资源
    最近更新 更多