首页 > 解决方案 > 没有脚本的 Unity gameObject 正在达到碰撞方法

问题描述

所以我正在学习基础游戏开发课程,目前正在使用 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);
        }

控制台输出

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

标签: c#unity3d

解决方案


你的问题似乎是这里的这个功能

private void OnCollisionEnter2D(Collision2D collision)

每当任何对撞机(附加了对撞机组件的游戏对象 - 游戏对象不需要附加任何脚本)与您的玩家相交时都会运行

这段代码在这里

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

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

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

推荐阅读