C# 构造函数没有从对象读取值
我的C# 构造函数没有从对象读取值,c#,unity3d,C#,Unity3d,我的Player类的构造函数正在编译,但它实际上没有从Animal对象传输任何字段的值。Animal对象可用,因为我可以使用Debug.Log()通过添加的Update()函数检查它的每个值。对象是否不能在构造函数中访问 public class Player : MonoBehaviour { public Animal myAnimal; int hpMax; int power; int defense; Player(){ h
Player
类的构造函数正在编译,但它实际上没有从Animal
对象传输任何字段的值。Animal
对象可用,因为我可以使用Debug.Log()
通过添加的Update()
函数检查它的每个值。对象是否不能在构造函数中访问
public class Player : MonoBehaviour {
public Animal myAnimal;
int hpMax;
int power;
int defense;
Player(){
hpMax = myAnimal.hpMax;
power = myAnimal.power;
defense = myAnimal.defense;
}
}
这是进口的动物
(实际上是从动物
继承的羊
):
超类:
public abstract class Animal : MonoBehaviour {
public int hpMax;
public int power;
public int defense;
}
您需要创建该动物的对象 如果您从MonoBehavior继承,则无法通过new关键字创建它,因此需要在播放器构造函数中调用:
myAnimal = gameObject.AddComponent<Sheep>(); // You must have this gameObject somewhere
假设您正在inspector或其他地方设置
myAnimal
字段,您无法在Player
类的构造函数中访问它,因为它尚未设置。尝试在Awake
方法中执行此操作:
public class Player : MonoBehaviour {
public Animal myAnimal;
int hpMax;
int power;
int defense;
void Awake() {
hpMax = myAnimal.hpMax;
power = myAnimal.power;
defense = myAnimal.defense;
}
}
Player
类中的Animal
对象不会被初始化,因为它不是静态的
,因此它还不能存在。无论如何,将此设置为静态都是错误的
考虑将Animal
对象传递到构造函数-Player(Animal-Animal)
中,甚至在Player类Player.CreateFromAnimal(Animal-Animal)
上有一个静态方法,它返回一个新的Player
。此外,从Animal
中删除public access修饰符,因为这会破坏封装
通晓封装和面向对象编程。这将有助于设计类。当调用播放器构造函数时,myanimal字段将为空。我在进行更改时会出现以下错误:您试图使用“new”关键字创建MonoBehavior。这是不允许的。只能使用AddComponent()添加单行为。或者,您的脚本可以从ScriptableObject继承,也可以根本不继承基类。动物是否从MonoBehavior继承?是的。我已经包含了上面那个类的代码。这正是我所需要的!非常感谢你!当我说移除公共访问修饰符时,我的意思是让它成为public-get
和private-set
。
private animal myAnimal = new Sheep();
public class Player : MonoBehaviour {
public Animal myAnimal;
int hpMax;
int power;
int defense;
void Awake() {
hpMax = myAnimal.hpMax;
power = myAnimal.power;
defense = myAnimal.defense;
}
}