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;
    }
}