Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

20.08.2015, 01:00

(C#|Unity) Instatiate will einfach nicht

Hi

Ich beherrsche C# und arbeite seit kurzem mit Unity, meine Frage ist ziemlich basic und wurde schon auf diversen Foren gestellt, die dort gefundenen Antworten wollen aber nicht funktionieren. Ich versuche, mithilfe der Instantiate-Methode aus einem Prefab zur Laufzeit Objekte zu erstellen und habe dafür zwei Objekte: Spieler mit dem Script "sSpieler" und den Prefab und Objekt oerSchwert. Nachfolgend das Script einmal in aufs wesentliche gekürzter, einmal vollständiger Form:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//gekürzt:
using UnityEngine;
using System.Collections;

public class sSpieler : MonoBehaviour {

    public GameObject oerSchwert;
    


    
    void Update () {
    
        if (Input.GetKeyDown (KeyCode.Space)) {
            
            GameObject schwertpawn = (GameObject)Instantiate(oerSchwert, new Vector3(0,2,0), transform.rotation);
        }


        
        
        }


    }
}


C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
//vollständig:
using UnityEngine;
using System.Collections;

public class sSpieler : MonoBehaviour {

    // Use this for initialization
    void Start () {
        newPosition = this.transform.position;
        direction = 1;
        InBewegung = false;
    }

    
    Vector3 newPosition;
    byte direction;
    bool InBewegung;
    public GameObject oerSchwert;
    //public Transform spawnPoint;


    // Update is called once per frame
    void Update () {
    
        newPosition = this.transform.position;

        if (Input.GetKeyDown (KeyCode.Space)) {
            //GameObject _schwert = (GameObject)
                //Instantiate(oerSchwert, new Vector3(0,0,0),Quaternion.identity);
            GameObject schwertpawn = (GameObject)Instantiate(oerSchwert, new Vector3(0,2,0), transform.rotation);
        }


        if (Input.GetKey (KeyCode.W)) {
            direction = 1; InBewegung = true;
        }
        if (Input.GetKey (KeyCode.S)) {
            direction = 3; InBewegung = true;
        }
        if (Input.GetKey (KeyCode.A)) {
            direction = 4; InBewegung = true;
        }
        if (Input.GetKey (KeyCode.D)) {
            direction = 2; InBewegung = true;
        }

        if (InBewegung) {
            if (direction == 1) {
                newPosition.y += 0.1f;
            }
            if (direction == 3) {
                newPosition.y -= 0.1f;
            }
            if (direction == 4) {
                newPosition.x -= 0.1f;
            }
            if (direction == 2) {
                newPosition.x += 0.1f;
            }
        }


        this.transform.position = newPosition;
        InBewegung = false;
    }
}


Ja, mir ist der Tippfehler beim Namen des neuen Objektes auch aufgefallen, aber das ist ja für den Code egal und würde ich es jetzt ändern und dabei irgendwo vergessen, könnte man meinen, da wäre der Fehler, daher mache ich das wenn das Problem gelöst ist.

Ich überlege auch, Unity zu neuinstallieren, da es de facto funktionieren sollte.

Drücke ich die Leertaste zur Laufzeit, erhalte ich folgende Fehlermeldung:

Zitat

The variable oerSchwert of sSpieler has not been assigned. You probably need to assign the oerSchwert variable of the sSpieler script in the inspector.

Mir erschließt sich auch der Sinn dessen, aber in vergleichbaren Fällen war das offenbar nicht nötig und Versuche meinerseits ergaben nur weitere Fehler. Entweder übersehe ich irgendetwas oder ich muss Unity neuinstallieren.

Danke, falls der Fehler an mir liegt und es jemand weiß!

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

2

20.08.2015, 01:05

Da steht doch, was zu tun ist. Entweder teilst du ihm oerSchwert im Inspektor mit(Prefab auf den Slot ziehen) oder du machst das irgendwo im Skript - er muss ja schließlich wissen, was er da genau instantiaten soll.
WIP Website: kevinheese.de

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

20.08.2015, 06:44

Entweder übersehe ich irgendetwas oder ich muss Unity neuinstallieren.
Neuinstallation hat noch nie Compile-Fehler gefixt.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

4

20.08.2015, 08:57

KeksX hat genau recht. Du solltest dir die Tutorials nochmal gründlich anschauen!

Instantiate (3min Video).

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

5

20.08.2015, 11:43

Es wurde ja bereits geschrieben, dass über den Inspector das richtige Prefab zugewiesen werden muss.

Abgesehen davon solltest du die Update-Methode des 2. Codeausschnitts überarbeiten. Statt mit einer Zahl zu speichern, in welche Richtung der Spieler laufen soll, solltest du einen Vektor verwenden. Weiterhin solltest du nicht auf Tasten der Tastatur abfragen, sondern auf Achsen (standardmäßig Input.GetAxis("Horizontal") und Input.GetAxis("Vertical")) oder Buttons (bspw. Input.GetButtonDown("Fire1")). Die Bewegungsrichtung könnte dann mittels new Vector2(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical")) ermittelt werden, welcher direkt der Position am Transform zugewiesen werden kann. Dadurch entfallen die Variablen newPosition, direction und InBewegung.
Selbst wenn du die bisherige Vorgehensweise beibehältst, solltest du keine Membervariablen, sondern lokale Variablen verwenden. So müsstest du dann InBewegung nicht jedes Mal resetten. Solltest du deine Vorgehensweise mit der Richtung beibehalten wollen, solltest du zumindest eine Enumeration dafür anlegen.
Der Variable oerSchwert wurde die Sichtbarkeit public nur zugewiesen, damit sie im Inspector sichtbar (und zuweisbar) ist. Stattdessen solltest du die Variable eher mit [SerializeField] versehen:

C#-Quelltext

1
2
[SerializeField]
private GameObject schwertPrefab;
Und es ist nicht ersichtlich, was das s vor sSpieler und das oer vor oerSchwert zu suchen hat. Soll das eine Art von ungarischer Notation sein? Wenn ja: das solltest du lieber sein lassen.


@BlueCobold:
Es ging nicht um Compiler-Fehler, sondern um einen Laufzeitfehler. Dennoch ließe sich der Fehler nicht durch eine Neuinstallation beheben, wie du bereits geschrieben hast.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Werbeanzeige