【问题标题】:Public function from another script isn't called in Unity2DUnity2D 中不调用来自另一个脚本的公共函数
【发布时间】:2020-10-12 21:10:27
【问题描述】:

我正在尝试为我的 2D 游戏制作攻击机制。它的工作原理如下:如果玩家站在敌人面前并按下空间,敌人就会死亡。为此,我在播放器脚本中写了这个:

    void Attack()
{
        Collider2D[] hitEnemies = Physics2D.OverlapCircleAll(AttackArea.position, AttackRange, EnemyLayers);
        foreach (Collider2D enemy in hitEnemies)
        {
            enemy.GetComponent<Enemy_1>().Death();
            
        }
  }

在敌人的脚本中:

    public void Death()
    {
        Destroy(gameObject);
    }

它完美无缺,但我想在游戏中制作另一种类型的敌人,所以我在玩家攻击脚本中为第二个敌人添加了这个(我提到“GunBoi”是第二个敌人脚本的名称,我将第二个函数命名为“Dead()”而不是“Death()”,因为我认为如果它们具有相同的名称,它将无法工作)

Collider2D[] hitEnemies2 = Physics2D.OverlapCircleAll(AttackArea.position, AttackRange, EnemyLayers);
        foreach (Collider2D enemy2 in hitEnemies2)
        {
            enemy2.GetComponent<GunBoi>().Dead();
        }

这在第二个敌人脚本中:

    public void Dead()
    {
        Destroy(gameObject);
    }

但是每当我尝试攻击第二个敌人时,什么都没有发生。当我尝试攻击第一个敌人时,它确实起作用并且敌人死了。有谁知道为什么会这样?

【问题讨论】:

  • I named the second function "Dead()" instead of "Death()" since I thought it wouldn't work if they had the same name 这根本不重要..名称主要是给你的;)只要它们被放置在不同的范围(在你的情况下是不同的类)它们可以有相同的name .. 后来这变成了没有任何名称的编译机器代码;)只是地址
  • 既然你的代码完全一样,听起来你应该有一个共同的基类或接口而不是两个完全独立的类......对象有什么不同?他们可能只是缺少对撞机组件吗?
  • 我已经检查过了,它们都附有刚体和对撞机。我所说的不同是指他们做完全不同的事情。第一个敌人应该移动,另一个应该留在一个地方并向玩家射击。我还想提一下,我使用了关于 2D 近战格斗的 brackeys 教程来帮助解决一些问题 (youtube.com/…)
  • 请确保使用正确的标签。您的代码在 c# ... unityscript 中是/曾经是一种 JavaScript 风格,类似于 Unity 以前使用的自定义语言,现在早已弃用

标签: c# function unity3d


【解决方案1】:

关于您的问题:您的代码是有序的。检查脚本是否已分配给敌人预制件。

现在,一个建议。如果你遵循它,你的问题可能会得到解决。

您说您为新敌人创建了一个新脚本,但它们都共享相同的机制:Death() 函数(而且,只要他们都是敌人,我相信他们会共享许多其他机制,例如生命值、伤害和其他传统的东西)。

在这种情况下,我认为最好的解决方案是将GunBoi的脚本继承自共同敌人的脚本。

复制一个功能完全相同但名称(不是很)不同的函数是一种不好的做法。如果您决定创建第三个敌人,则必须创建第三个函数来摧毁它,但同样要使用不同的名称。

【讨论】:

    【解决方案2】:

    很多事情可能是错误的,但乍一看,我至少会验证这两个:

    1. 是好层上的 GunBoi
    2. 他们有 GunBoi 组件吗

    我们缺少太多信息,无法为您提供更多帮助。

    但老实说,你应该尝试通过让两种敌人类型都有一个通用的敌人组件来重构它。没有理由必须两次执行碰撞逻辑。您希望编写尽可能少的代码。使用您的方法,您将不得不为每种新的敌人类型执行此操作,这既存在问题又容易出错。

    【讨论】:

    • 我已经确保两个敌人都在正确的层并且第二个敌人附加了 Gunboi 脚本。我决定做两次碰撞逻辑的原因是因为两个敌人完全不同。他们都有不同的脚本,做不同的事情。第一个敌人是为了在平台上散开,第二个敌人是为了留在一个地方向玩家射击。 (是的,我检查过,它们都附有刚体组件)。
    • 我还想提一下,我也尝试在第二个敌人脚本中添加public void Death(),而不修改攻击脚本,也没有添加第二个攻击逻辑,它只是没有工作
    猜你喜欢
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多