【问题标题】:Unity gameObject without a script is reaching a collision method没有脚本的 Unity gameObject 正在达到碰撞方法
【发布时间】:2020-04-21 14:35:16
【问题描述】:

所以我正在学习基础游戏开发课程,目前正在使用 Unity 开发游戏。直到现在我更新了我的统一版本时,我的游戏运行良好。为了让玩家真正受到伤害,我有一个方法,只有在脚本显式调用时才能达到。不知何故,没有附加脚本的地面损坏了我的播放器。

我已经发布了下面的代码。

这是播放器脚本的一部分

3 references
public void Hurt(int dmg, string yep)
    {
        HP -= dmg;
        Debug.Log($"took {dmg} damage from{yep}. You now have {HP} HP left");
        if (HP <= 0)
        {
            SceneManagement.Death();
        }
    }

这是附加到我的火焰对象的脚本的一部分

private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.tag != "FlameTurret" && collision.gameObject.tag != "flame")
        {
            player.GetComponent<PlayerController>().Hurt(damage, collision.gameObject.tag);
             Destroy(this.gameObject);
        } 
    }

这个附在敌人发射的射弹上

if (collision.gameObject.CompareTag("Player"))
        {
            if (!called)
            {
                collision.gameObject.GetComponent<PlayerController>().Hurt(damage, collision.gameObject.tag);
                called = true;
            }
        }

这是附在一个敌人身上

if (collision.gameObject.CompareTag("Player"))
        {
            if (!called)
            {
                collision.gameObject.GetComponent<PlayerController>().Hurt(damage, collision.gameObject.tag);    
                called = true;
            }
            Destroy(this.gameObject);
        }

Console output

带有“Ground”标签的东西都没有脚本,除了我发布的方法应该引用我的 Hurt() 方法,但地面仍然会损坏我的播放器。任何帮助将不胜感激!

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    你的问题好像是这里的这个函数

    private void OnCollisionEnter2D(Collision2D collision)
    

    将在任何碰撞器(附加碰撞器组件的游戏对象 - 游戏对象不需要附加任何脚本)与您的玩家相交时运行

    这里是代码

     if (collision.gameObject.tag != "FlameTurret" && collision.gameObject.tag != "flame")
    

    只要碰撞的对象不具有"FlameTurret"或"flame"的标签,我认为你的地面没有标签,就会通过。
    在我看来,你的游戏中的所有东西都会对你的玩家造成伤害,除了的火焰有点奇怪......这是一个错误吗?
    无论哪种方式,一个简单的解决方法是用environment 之类的东西标记你的地面,然后在你的OnCollisionEnter2D() 下添加,检查一下

     if (collision.gameObject.tag == "environment"){
        return; // do nothing
    }
    

    【讨论】:

    • 抱歉,我不清楚,这些碰撞在不同的对象下。我将编辑我的帖子以使其更清晰
    • @Handensaken 啊,我明白了,如果您注释掉每个调用 Hurt() 的地方(或者最好使用断点和堆栈跟踪),您能否确定您的三个调用中的哪一个正在发生当地面对玩家造成伤害时?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多