C# 如何引用游戏对象';在不事先知道脚本名称的情况下创建objectscript?

C# 如何引用游戏对象';在不事先知道脚本名称的情况下创建objectscript?,c#,unity3d,C#,Unity3d,我觉得我一次看的方向太多了。基本上,我有一个驯兽师对象/脚本,她可以与她目前正在处理的任何动物对抗敌人。因此,动物对象可能是许多对象中的一个。我可以很容易地指定动物对象本身,但是如果我事先不知道她将要处理什么动物,我就不知道如何引用该动物对象的脚本。例如,Lion对象会有一个包含Lion统计信息的Lion脚本,dog对象会有dog脚本,等等。可以通过inspector面板直接分配对象,或者给对象一个标记,但我不知道如何引用您不知道名称的脚本: public class Player : Mono

我觉得我一次看的方向太多了。基本上,我有一个驯兽师对象/脚本,她可以与她目前正在处理的任何动物对抗敌人。因此,动物对象可能是许多对象中的一个。我可以很容易地指定动物对象本身,但是如果我事先不知道她将要处理什么动物,我就不知道如何引用该动物对象的脚本。例如,Lion对象会有一个包含Lion统计信息的Lion脚本,dog对象会有dog脚本,等等。可以通过inspector面板直接分配对象,或者给对象一个标记,但我不知道如何引用您不知道名称的脚本:

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;
    }
公共类玩家:单行为{
公共猎物动物;
int-hpMax;
智力攻击;
智力防御;
整数速度;
int-hpCurrent;
字符串animalName;
无效开始()
{
var animalObject=Animal.GetComponent();
//下面的作品都没有
hpMax=animalObject.hpMax;
hpCurrent=hpMax;
攻击=animalObject.attack;
防御=动物对象防御;
速度=animalObject.speed;
animalName=animalObject.animalName;
}

让所有动物从基类继承

动物科学 Cat.cs 然后,当从
Player
引用这些类时,只需使用基本类型
Animal

public class Player : MonoBehaviour {

    public Animal myAnimal;

    void Start() {
        myAnimal.doSomething(); //meows
    }
}
在本例中,我希望通过inspector分配
myAnimal
。要通过代码分配,请执行以下操作:

myAnimal = someGameobject.GetComponent<Animal>();
myAnimal=someGameobject.GetComponent();
当然,需要注意的是,所有的动物都应该有相同的接口。你需要将每个动物的实现细节隐藏在你定义的基础接口中。关于如何做到这一点以及为什么这样做很好,有很多资源。这是非常重要的面向对象的东西,所以很值得学习


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

让您的所有动物从基类继承

动物科学 Cat.cs 然后,当从
Player
引用这些类时,只需使用基本类型
Animal

public class Player : MonoBehaviour {

    public Animal myAnimal;

    void Start() {
        myAnimal.doSomething(); //meows
    }
}
在本例中,我希望通过inspector分配
myAnimal
。要通过代码分配,请执行以下操作:

myAnimal = someGameobject.GetComponent<Animal>();
myAnimal=someGameobject.GetComponent();
当然,需要注意的是,所有的动物都应该有相同的接口。你需要将每个动物的实现细节隐藏在你定义的基础接口中。关于如何做到这一点以及为什么这样做很好,有很多资源。这是非常重要的面向对象的东西,所以很值得学习


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

让您的所有动物从基类继承

动物科学 Cat.cs 然后,当从
Player
引用这些类时,只需使用基本类型
Animal

public class Player : MonoBehaviour {

    public Animal myAnimal;

    void Start() {
        myAnimal.doSomething(); //meows
    }
}
在本例中,我希望通过inspector分配
myAnimal
。要通过代码分配,请执行以下操作:

myAnimal = someGameobject.GetComponent<Animal>();
myAnimal=someGameobject.GetComponent();
当然,需要注意的是,所有的动物都应该有相同的接口。你需要将每个动物的实现细节隐藏在你定义的基础接口中。关于如何做到这一点以及为什么这样做很好,有很多资源。这是非常重要的面向对象的东西,所以很值得学习


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

让您的所有动物从基类继承

动物科学 Cat.cs 然后,当从
Player
引用这些类时,只需使用基本类型
Animal

public class Player : MonoBehaviour {

    public Animal myAnimal;

    void Start() {
        myAnimal.doSomething(); //meows
    }
}
在本例中,我希望通过inspector分配
myAnimal
。要通过代码分配,请执行以下操作:

myAnimal = someGameobject.GetComponent<Animal>();
myAnimal=someGameobject.GetComponent();
当然,需要注意的是,所有的动物都应该有相同的接口。你需要将每个动物的实现细节隐藏在你定义的基础接口中。关于如何做到这一点以及为什么这样做很好,有很多资源。这是非常重要的面向对象的东西,所以很值得学习


为了解决您在评论中的顾虑,Unity不会做任何奇怪的事情,它应该可以编译(除非我的一些语法不好)。您应该在假设它们不起作用之前进行测试:)

“参考那个动物对象的脚本”-这是什么意思?什么“脚本”你在说什么?你很可能想要一个父类或接口,不同的动物从中继承,例如:
接口HostileAnimal{void Attack();}公共类Lion{public void Attack(){“do work”}公共类Bear{public void Attack(){“do work”}
这样一来,你就可以从同一个成员调用,同一个方法可以产生不同的效果;不同的伤害、速度等等。这有意义吗?@GrawCube每个动物对象都有一个脚本,它引用了该动物的统计数据。动物对象本身只是一个空对象,所以脚本确实是我唯一需要的东西,但你不能只是重复就我所知,请直接使用脚本。@calebB我知道如何在C#中实现这一点,但我无法在unity中找到它。父类是否需要附加到堆栈中的对象,或者在预设上?这样,在获取游戏对象时,animalObject可能会作为通用对象或其他类型的对象返回,即使它确实是一个对象