Jump to content
Unity Insider Forum

Array Ärger


Kojote

Recommended Posts

Hi, ich hab gerade bisschen Ärger mit nem Array und kann mir das nicht erklären.

Geht um folgenden Aufruf, ich möchte einige Daten in meinem Objekt Manager speichern:

            LD_SP_Save_Data_Object_Manager.Instance.characterList.Add(new LD_SP_Save_Data_Player(
                        TMPPlayerNameText.text,
                        System.DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss"),// Nur angegeben fuer den Konstruktor, Wert wird nicht genutzt
                        100,                                                // Nur angegeben fuer den Konstruktor, Wert wird nicht genutzt
                        100,                                                // Nur angegeben fuer den Konstruktor, Wert wird nicht genutzt
                        gender,
                        blendShape.blendShapes,
                        HSV_Body,
                        HSV_Eye,
                        HSV_Nose,
                        matChanger.CurrentMaterialIndex(0),
                        new Vector3(0, 0, 0),                                 // Nur angegeben fuer den Konstruktor, Wert wird nicht genutzt
                        new Quaternion(0, 0, 0, 0),                           // Nur angegeben fuer den Konstruktor, Wert wird nicht genutzt
                        1
                    ));

            //LD_SP_Menue_Loadscreen.Instance.LoadFirstScene();
        }

Nun sollte eigentlich der Konstruktor aufgerufen werden:

        public LD_SP_Save_Data_Player(string name, string time, int vit, int mana, int gender, float[] bodyShape, float[] bodyColor, float[] eyeColor, float[] noseColor, int bodyMaterial, Vector3 pos, Quaternion rot, int scene) {
            playerName = name;
            playTime = time;
            playerVitaility = vit;
            playerMana = mana;
            playerGender = gender; // 0 = Female | 1 = Male

            playerBodyShape = new float[bodyShape.Length];
            bodyColor = new float[playerBodyColor.Length];
            eyeColor = new float[playerEyeColor.Length];
            noseColor = new float[playerNoseColor.Length];

            Array.Copy(bodyShape, playerBodyShape, bodyShape.Length);
            Array.Copy(bodyColor, playerBodyColor, bodyColor.Length);
            Array.Copy(eyeColor, playerEyeColor, eyeColor.Length);
            Array.Copy(noseColor, playerNoseColor, noseColor.Length);
            playerBodyMaterial = bodyMaterial;
            playerPos = pos;
            playerRotation = rot;
            sceneID = scene;
        }

Kommt mir aber mit dem Fehler:

NullReferenceException: Object reference not set to an instance of an object
Lions_Dream_SP.LD_SP_Save_Data_Player..ctor (System.String name, System.String time, Int32 vit, Int32 mana, Int32 gender, System.Single[] bodyShape, System.Single[] bodyColor, System.Single[] eyeColor, System.Single[] noseColor, Int32 bodyMaterial, Vector3 pos, Quaternion rot, Int32 scene) (at Assets/Scripts/LD_SP_Save_Data_Object_Manager.cs:157)
Lions_Dream_SP.LD_SP_Menue_Create_Character.EnterWorld () (at Assets/Scripts/LD_SP_Menue_Create_Character.cs:320)
UnityEngine.Events.InvokableCall.Invoke () (at C:/buildslave/unity/build/Runtime/Export/UnityEvent.cs:166)
UnityEngine.Events.UnityEvent.Invoke () (at C:/buildslave/unity/build/Runtime/Export/UnityEvent_0.cs:58)
UnityEngine.UI.Button.Press () (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Button.cs:66)
UnityEngine.UI.Button.OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData) (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Button.cs:108)
UnityEngine.EventSystems.ExecuteEvents.Execute (IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData) (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:50)
UnityEngine.EventSystems.ExecuteEvents.Execute[IPointerClickHandler] (UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.EventFunction`1 functor) (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:261)
UnityEngine.EventSystems.EventSystem:Update()

Ich versteh den Fehler nicht, schein ein Problem bei dem Array.Copy zu sein, aber versteh nicht wo. Arrays sind richtig geschrieben und initialisiert.

Hat wer ne Idee?

Nebenfrage, muss man das Zielarray initialisieren oder übernimmt das die Methode Copy?

Grüße von Kojote

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mal abgesehen davon, dass das echt schräg aussieht, kannst Du mit dem Visual Studio Debugger durch den Code steppen und sehen, wo der Haken ist. :)

vor 19 Minuten schrieb Kojote:

Nebenfrage, muss man das Zielarray initialisieren oder übernimmt das die Methode Copy?

Ja, muss man. Doku s.u.

https://docs.microsoft.com/de-de/dotnet/api/system.array.copy?view=netframework-4.8

Link zu diesem Kommentar
Auf anderen Seiten teilen

@devandart Was sieht schräg aus, mein Code? Würde mich jetzt mal interessieren, bin für Verbesserungen gern offen, ist doch nur ein Konstruktor mit Objektinitialisierung. Die Parameterliste ist recht lang, aber die Werte müssen ja auch irgendwie an den Konstruktor weiter gegeben werden.

Fehler gefunden, hab die Variablen Bezeichner verhaun und damit falsch initialisiert.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Super, dass du den Fehler lösen konntest! :)

Das war mehr subjektiv gemeint. Z.B. kann es gefährlich/verwirrend werden, wenn Du direkten Zugriff auf die CharacterList hast (meine Meinung). Dort könntest Du dann auch, wenn schon ein Manager existiert, auch sowas wie "CreateCharacter(alle Parameter)" als Methode machen, die einen fertigen Character zurückgibt und das ganze zur Liste hinzufügen macht der Manager intern. Aber das ist nur so eine Idee. :) Zudem übergibst du als Parameter "int gender" und schreibst im Konstruktor, wofür welcher Int-Wert steht. Da könntest du z.B. ein Enum

public enum Gender { Male = 0, Female = 1 }

nutzen, welches du übergibst. Dann werden auch falsche Int-Werte durch Schreibfehler vermieden. Und ich persönlich finde Eine_Tolle_Klasse nicht schön, sondern würde CamelCase EineTolleKlasse schreiben. Aber solange du alleine arbeitest ist das egal.
 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...