销毁实例化克隆组件会破坏原始游戏对象组件吗?

时间:2021-01-18 02:45:28

标签: c# unity3d

也许我遗漏了一些明显的东西,但要保持简短。我有一个角色的工作代码。当您“破折号”时,我想通过克隆播放器、删除其不需要的组件然后应用着色器来留下后像类型的效果。问题是,一旦我实例化克隆,原始播放器就会停止运行(无法移动等)。它仍然拥有所有组件和一切正常,并且克隆确实删除了正确的组件。但它还是会断。一旦我删除那条线,它就恢复正常。有什么想法吗?

这是脚本中实例化克隆的唯一相关代码。

private void DodgeEffect()
    {        
        GameObject _DodgeSFX = Instantiate(gameObject, transform.position, transform.rotation );

        Destroy(_DodgeSFX.GetComponent<PlayerController>());        
        Destroy(_DodgeSFX.GetComponent<PlayerCombat>());
        Destroy(_DodgeSFX.GetComponent<WarpController>());
        Destroy(_DodgeSFX.GetComponent<Animator>());
    }

2 个答案:

答案 0 :(得分:0)

这是因为您正在制作游戏对象的副本。虽然 Instantiate() 返回一个游戏对象,但它也会返回您放入方法第一部分的任何内容。相反,在编辑器中创建一个与玩家不同的游戏对象,并将 _DodgeSFX 设为公开,以便您可以将副本放入插槽中。然后,只需实例化那个单独的游戏对象,您就不必通过脚本销毁组件(因为您在编辑器中删除了组件),节省时间

答案 1 :(得分:0)

好的,从一些测试来看,我认为它归结为 Unity.InputSystem 只允许一次启用每个 Input 的 1 个实例。当我实例化播放器的克隆时,它仍然会在这些组件被销毁之前通过启用/唤醒功能,并且由于该克隆上的输入从未被禁用,因此它成为“主要”输入。如果我将主要玩家的脚本设置为输入停用,然后再次激活,则一切正常。请注意,脚本仍然可以很好地处理主角,只是输入被破坏了。我仍然不确定为什么会这样,如果它是输入系统的限制,或者是故意的,似乎无法在任何地方找到这种体验的文档。