C# 除非在访问变量的方法中赋值,否则不赋值

C# 除非在访问变量的方法中赋值,否则不赋值,c#,unity3d,C#,Unity3d,Sheep继承自Animal类。相反,团结没有任何表现 如果我将animalName的声明移动到Attack()方法中,它会工作,但是由于某种原因,如果animalName位于类本身而不是被调用的方法中,它不会分配animalName public class Test : MonoBehaviour { public Animal Animal; void Update () { Animal.Attack(); } } 这是不起作用的动物物体

Sheep继承自Animal类。相反,团结没有任何表现

如果我将animalName的声明移动到Attack()方法中,它会工作,但是由于某种原因,如果animalName位于类本身而不是被调用的方法中,它不会分配animalName

public class Test : MonoBehaviour {

    public Animal Animal;

    void Update () {

        Animal.Attack();

    }
}
这是不起作用的动物物体

public class Sheep : Animal {

    string animalName = "wot";

    public override void Attack()
    {
        Debug.Log(animalName);
    }
}
以下是绵羊继承自的动物类别:

public abstract class Animal : MonoBehaviour {

public int hpMax;
public int power;
public int defense;
public int speed;
public string animalName ;

    abstract public void Attack();
}

尝试更改您的
Sheep
类,使其看起来像这样:

public class Sheep : Animal {

    public Sheep()
    {
        animalName = "wot";
    }

    public override void Attack()
    {
        Debug.Log(animalName);
    }
}

我们可以看看
Animal
是如何定义的吗?当我基于您不完整的示例编写一个完整的、可运行的Unity示例时,它工作得很好——也就是说,当我在调试器中查看
animalName
变量时,它在所讨论的语句中被正确初始化。。您可能误解了您的观察结果(例如,在错误的位置查找
Debug.Log()
…我注意到这不会显示在MonoDevelop中的“我的应用程序输出”窗口中),或者您未能共享一些重要的细节。@Peter Duniho在我的代码中,我有第二个Debug.Log()紧跟在一个不工作的日志之后,读取
Debug.Log(“test”)并且工作正常。如果我打开控制台,它是唯一出现的东西,如果我删除它,另一个Debug.Log()将继续不显示任何内容。@Peter Duniho,我道歉。@Asad我已经添加了动物超类中的代码。同样的问题。我甚至只是浏览并禁用了层次结构中的所有其他对象和脚本,但它仍然没有在控制台中显示任何内容。或者,一旦我在
Attack()
方法中分配
animalName
(比如,分配给“inAttack”),运行它以验证它是否以这种方式工作,并将其移回构造函数,下次运行程序时,它仍然在控制台中显示“inAttack”而不是“wot”,从
animalName
Attack()中分配时开始
当构造函数中分配了
animalName
时,好像Unity根本没有编译脚本。我想我可能知道发生了什么。如果在inspector中更改
Sheep
中的值,它似乎会忽略代码设置的内容。是这样吗?因为在我将脚本拖到一个空的游戏对象中之后,这些都被设置好了,我随后对脚本所做的任何更改似乎都无关紧要。@KeithWilson:这是可能的。不幸的是,Unity不能很好地复制/粘贴代码示例,但这仍然是需要的细节。在这种情况下,代替一个可复制的代码示例,对从头开始创建项目的每个步骤的完整描述可能会很有用(当然,提供和遵循这些步骤都很繁琐)。但是是的,如果您在inspector中设置了一个值,这将覆盖您在代码中设置的任何值。如果您不想更改inspector中的值,只需将字段设置为只读即可。