Jump to content
Unity Insider Forum
KaBau

Fehler CS0649: Field is never assigned to... default value null

Recommended Posts

Hi, ich erhalte seit längerem zu verschiedenen Scripten folgende Fehlermeldung (hier ein Beispiel):
"Assets\scripts\Lvl6\EnyB6CornerFireYes.cs(10,16): warning CS0649: Field 'EnyB6CornerFireYes.boltYes' is never assigned to, and will always have its default value null". Nach meinem Verständnis wird mir mitgeteilt, dass die Variable "boltYes" nicht zugewiesen ist oder sich nicht ändert und somit immer den Vorgabewert "null" behält.
OK, gelesen, aber es stört mich doch auch gar nicht. Die Variable (in diesem Fall das GameObjekt) selber ändere ich ja auch gar nicht, sondern schalte es nur an und aus.

Das dazugehörende Script:

public class EnyB6CornerFireYes : MonoBehaviour
{
    [SerializeField]
    GameObject fireYes;
    [SerializeField]
    GameObject boltYes;

    private void Start()
    {
        fireYes.SetActive(false);
        boltYes.SetActive(true);
    }

    private void Update()
    {
        if(fireYes == null)
        {
            Destroy(gameObject);
        }
    }

    private void OnTriggerEnter(Collider other)
    {
        if (other.name == "FireYesCollider")
        {
            fireYes.SetActive(true);
            boltYes.SetActive(false);
        }
    }

    private void OnTriggerExit(Collider other)
    {
        if (other.name == "FireYesCollider")
        {
            fireYes.SetActive(false);
            boltYes.SetActive(true);
        }
    }
}

In einem anderen Fall wird diese Fehlermeldung bei einer Float-Variable "maxHealth" geschrieben. Dort ändere ich diese Variable auch nicht, stimmt. Ich nutze die Variable nur, um einen Wert aus dem Inspector in das Script zu überführen:

[SerializeField] 
int maxHealth;
int currentHealth;
   
    private void Start()
    {
        currentHealth = maxHealth;
...

Wie kann ich diese (für mich unnötigen) Fehlermeldungen unterbinden, bzw. muss ich irgend etwas unternehemen, damit diese Fehlermeldungen nicht mehr auftauchen?

Share this post


Link to post
Share on other sites

Das sind ja keine Fehlermeldunge, denn dann wären sie rot. Das sind Hinweise, die immer dann kommen, wenn die Variable private ist. Das System erkennt halt, dass du eine Variable deklariert hast, die aber eigentlich für nix nütze ist. Das wäre bei public variablen zwar nicht anders, aber da das System nicht weiß ob evtl. von einem anderen Script aus etwas damit geschieht, kommt dann eben keine Meldung. So ganz intelligent ist die Meldung nicht, weil sie sowas wie SetActive nicht erkennt. Aber in deinem anderen Beispiel ist maxHealth, wenn du es wirklich nur in der Start zur Übergabe eines Wertes nutzt, auch wirklich sinnlos. Da kannst du auch gleich currentHealth mit dem richtigen Wert beschreiben.

Ob man das abschalten kann, weiss ich nicht. Aber selbst wenn nicht, die Meldungen kommen nur, wenn du ein Script bearbeitet hast und dann abspeicherst. Dabei werden all diese Dinge einmal überprüft und dir dann evtl. angezeigt. Danach kommt keine Meldung mehr. Die Meldung macht auch Sinn, da sie dir zu 95% dabei hilft Codeleichen zu entdecken.
 

  • Like 1

Share this post


Link to post
Share on other sites
vor 4 Stunden schrieb malzbie:

Da kannst du auch gleich currentHealth mit dem richtigen Wert beschreiben.

Ich nutze "maxHealth" noch um zu überprüfen, ob bei der Aufnahme eines Erste Hilfe Kasten "currentHealth" nicht über "maxHealth" steigt, sprich der im Inspector eingetragene Wert nicht überschritten wird.

vor 4 Stunden schrieb malzbie:

Dabei werden all diese Dinge einmal überprüft und dir dann evtl. angezeigt. Danach kommt keine Meldung mehr.

Leider erscheint nach jeder Änderung eines einzelnen Script diese Fehlermeldnungen für ALLE Scripte. Und da ich häufig damit Arbeite, dass ein GameObjekt ein anderes GameObjekt an- und ausschaltet, ist diese Liste sehr lang.
Gibt es zu diesem Vorgehen alternativ die Möglichkeit, dass ein Script in einem ausgeschaltetes GameObjekt doch irgendwie aktiv ist und verschiedenes überprüft?
Ist vielleicht ein eigenes Thema wert, aber würde mir bei vielen dieser Fehlermeldungen helfen.

Share this post


Link to post
Share on other sites

Ja, er compiliert alle Scripts, wenn du auch nur eines änderst. Ist halt so. Aber im Spiel kommt halt nix.
Du kannst der Console übrigens auch sagen, dass Meldungen nicht nicht sichtbar sein sollen. Musst dafür nur das mittlere Symbol ausklicken.

Du kannst außerdem das const Schlüsselwort verwenden, wenn dieses MaxHealth sich nie ändern wird. Das könnte bei dem einen Dingen die Meldung verhindern.

Share this post


Link to post
Share on other sites

Das ist ein Problem, das aktuell auch diskutiert wird. Der Roslyn-Compiler versteht nicht, dass das SerializeField-Attribut für die Bereitstellung eines Wertes zuständig ist und muss deshalb davon ausgehen, dass dein Feld niemals einen Wert erhält.

Bis die Sache geklärt ist (wenn das überhaupt irgendwann einmal passiert), kannst du einen Default-Wert zuweisen, dann verschwindet die Meldung.

[SerializeField]
private Type name = default;

"default" ist ein keyword, das für Initialisierung mit Standardwert verwendet wird. Ist "Type" "bool" wäre es false, bei "int" ist es 0, bei Referenztypen ist es "null" und so weiter. Es ist die etwas neuere Kurzschreibweise für "default(Type)".

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...