繁体   English   中英

如何从游戏对象中获取任何脚本组件

[英]How to get any script component from a Game Object

我的游戏中有很多不同的敌人。 这些敌人中的每一个都有不同的脚本。 当玩家击中敌人时,我希望其特定脚本中的健康变量减少。

我意识到我可以做这样的事情:

if(Target.getComponent<Enemy1script>()) Target.getComponent<Enemy1Script>().health -= Damage

然而,我的游戏中有很多不同类型的敌人,因此有很多不同的脚本,这意味着效率不高。 因为所有这些脚本都有一个共同的变量 ( health ),我想知道您是否可以访问它们的脚本组件?

例如:

Target.getComponent<Script>().health -= 1

解决方案

解决您的问题的方法是创建一个名为 Enemy 的基类,用于存储健康并可能包含一些虚拟行为函数。 对于每种不同类型的敌人,您的敌人类将从基本敌人类继承。

例如:

敌人.cs

public class Enemy : Monobehaviour {
    public int health;
};

EnemyType1.cs

public class EnemyType1 : Enemy {
    //Unique enemy behaviour goes here
};

这意味着您可以使用

target.GetComponent<Enemy>().health;

访问任何敌人的健康,而无需具体知道它是什么。

推荐

调用 GetComponent 非常耗费资源,所以我个人会做的是

target.SendMessage("applyDamage", damageToDo, SendMessageOptions.DontRequireReceiver);

然后在你的敌人班级你会有

public class Enemy : Monobehaviour {
    private int health;

    public void applyDamage(int amount) {
        health-=amount;
    }
};

unity 文档很好地解释了 SendMessage 是什么以及如何使用它。 总之,它尝试在附加到对象的任何脚本上调用该函数并将参数传递给它。 如果您需要发送多个参数,那么您将不得不创建一个结构并发送它。 SendMessage 中的最后一个参数意味着如果它碰到了没有该函数的东西,它不会导致游戏抛出异常并崩溃

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM