如何在事先不知道脚本名称的情况下引用游戏对象的对象脚本?
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 没有做任何奇怪的事情,这应该可以正常编译(除非我的某些语法错误)。你应该在假设它们不起作用之前先测试它们:)
我觉得我一次看的方向太多了。基本上,我有一个训练师 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 没有做任何奇怪的事情,这应该可以正常编译(除非我的某些语法错误)。你应该在假设它们不起作用之前先测试它们:)