如何在事先不知道脚本名称的情况下引用游戏对象的对象脚本?

How to refer to a game object's objectscript without knowing the name of that script in advance?

我觉得我一次看的方向太多了。基本上,我有一个训练师 object/script,她用她目前正在处理的任何动物与敌人作战。因此,动物对象可能是众多对象之一。我可以很容易地分配动物对象本身,但如果我事先不知道她将处理什么动物,我就无法弄清楚如何引用该动物对象的脚本。例如,Lion 对象会有一个包含 lion stats 的 lion 脚本,dog 对象会有 dog 脚本等。可以通过检查面板直接分配一个对象,或者给一个标签,但我不知道如何引用您不知道名称的脚本:

public class Player : MonoBehaviour {

    public GameObject Animal;

    int hpMax;
    int attack;
    int defense;
    int speed;
    int hpCurrent;
    string animalName;

    void Start () 
    {
        var animalObject = Animal.GetComponent<"AnimalScript">();

        //none of the following works
        hpMax = animalObject.hpMax;
        hpCurrent = hpMax;
        attack = animalObject.attack;
        defense = animalObject.defense;
        speed = animalObject.speed;
        animalName = animalObject.animalName;
    }

让你所有的动物都继承自一个基地class。

Animal.cs

public abstract class Animal : MonoBehaviour {

    public int hp;
    public int damage;
    //etc

    abstract public void doSomething();
}

Cat.cs

public class Cat : Animal {
    public override void doSomething() {
        Debug.Log("I'm meowing for food even though my bowl is full!");
    }
}

然后当从 Player 引用这些 class 时,只需使用基类型 Animal

public class Player : MonoBehaviour {

    public Animal myAnimal;

    void Start() {
        myAnimal.doSomething(); //meows
    }
}

在这个例子中,我希望 myAnimal 通过 inspector 分配。要通过代码分配,请执行以下操作:

myAnimal = someGameobject.GetComponent<Animal>();

当然需要注意的是,你所有的动物都应该有相同的界面。您需要将每个动物的实现细节隐藏在您定义的任何基本接口中。有很多资源可以说明如何执行此操作以及这样做的好处。这是非常重要的 OOP 东西,所以学习起来很好。

为了解决您在评论中的顾虑,Unity 没有做任何奇怪的事情,这应该可以正常编译(除非我的某些语法错误)。你应该在假设它们不起作用之前先测试它们:)