Jump to content
Unity Insider Forum

Verständnisfrage zu Scripts!


coco07

Recommended Posts

Hey Community,

 

ich habe gestern angefangen mit Unity zu arbeiten. Dazu muss ich sagen, dass ich seit 2 Jahren aktiv(mehr als 5 Stunden täglich) in Java programmiere und sehr viele Erfahrungen sammeln konnte, gerade was die Spieleprogrammierung und auch Entwurfsmuster angeht.

In Unity bringt mir diese Erfahrung leider rein gar nichts. Ich verstehe die Zusammenhänge zwischen den Objekten in der Szene und den Scripts leider überhaupt nicht(nichtmal ansatzweise)...

 

Für mich sieht das so aus, als wenn man in der Szene die Welt(das Spiel) schon komplett zusammenbauen muss(statisch). Dann schreibt man sich Scripts, um das Verhalten dieser Objekte darzustellen.

 

In Java habe ich mir Klassen geschrieben, welche ein komplettes Objekt(Zustand u. Verhalten) repräsentiert. Dann brauche ich nur noch die passenden Zustände wählen und Methoden auf diesem Objekt aufrufen.

In Unity schreibe ich ein Script und ziehe es auf ein Objekt in der Szene -> 10 unterschiedliche Verhaltensregeln = 10 verschiedene Scripts?

 

Wenn ich jetzt beispielweise ein Level in Java schrieb, dann beinhaltete dieses Level Referenzen auf in dem Level vorhandenen Objekten. Somit konnte ich die eigentliche Logik in der bspw. Level-Klasse implementieren und dieses Level aus verschiedenen Objekten zusammenbauen. In Unity muss ich jedem Objekt sein eigenes Verhalten gleich mitgeben? Wo bestehen denn die Beziehungen zwischen den Objekten? Kann ich die gleiche Herangehensweise wie in Java auch mit Scripts in Unity umsetzen oder muss ich mich daran gewöhnen?

 

Jetzt werden manche denken, ich wäre wohl kein richtiger Programmierer, denn dieser könnte sich die Antworten im Netz selbst heraussuchen. Ich habe gesucht ohne Ende und finde immer nur Argumente dafür, dass meine Vermutungen stimmen.

 

Lieg ich im Grunde richtig oder denke ich komplett falsch? Wäre echt sehr dankbar für eine kurze Einleitung oder Aufklärung über den Zusammenbau in einer solchen Engine.

 

MfG

Coco07!

Link zu diesem Kommentar
Auf anderen Seiten teilen

In deinem Java Programm hast Du doch bestimmt auch Komponenten, wie zum Beispiel einen Button, der eine Methode wie OnClick bereitstellt. Diese Methode würdest Du doch sicher nicht ins Hauptprogramm umsetzen wollen.

 

Ganz ähnlich ist das in Unity. Die Objekte regeln ihre Eigenschaften und Methoden selber. tatsächlich hat aber beinahe jedes Unity Spiel auch mindestens ein übergeordnetes Script - oft "Gameplay" genannt, das alles regelt, was sich nicht allein durch das Zusammenspiel der Komponenten ergibt.

 

Für 10 unterschiedliche Verhalten schreibt man natürlich nicht 10 Scripte, sondern nur eines, dass zwischen diesen 10 Verhalten wechseln kann, wenn es entsprechende Methodenaufrufe, Parameter-wechsel oder was auch immer erhält.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das ganze ist natürlich etwas anders als in "Java".

Ich gehe mal davon aus, dass du in Java deine Engine selbst geschrieben hast, nachdem du keine erwähnst und Objekt/Scenemanagement ansprichst.

Unity nimmt dir viel deiner Arbeit bereits ab.

 

Für mich sieht das so aus, als wenn man in der Szene die Welt(das Spiel) schon komplett zusammenbauen muss(statisch). Dann schreibt man sich Scripts, um das Verhalten dieser Objekte darzustellen.

 

In gewisser Weise stimmt das. Was du im Editor "zusammenbaust" wird abgespeichert und beim Spielstart/Scenenwechsel aufgerufen. Sozusagen modelierst du in Unity den Urzustand einer Scene wenn du sie ladest. Das Verändern der Scene und der einzelnen Objects wird per Scripts/Components übernommen (Dazu gleich mehr).

 

In Java habe ich mir Klassen geschrieben, welche ein komplettes Objekt(Zustand u. Verhalten) repräsentiert. Dann brauche ich nur noch die passenden Zustände wählen und Methoden auf diesem Objekt aufrufen.

 

Wieder ist der Schritt kleiner, als du denkst. In "Java" ist es eine einzelne Klasse, die das alles beinhaltet. Hier sind es mehrere. Deine Scripts (Variablen bestimmen den Zustand, Methoden das Verhalten) bestimmen das Object zusammen mit bereits vorhandenen Components (z.B. Transform, was einfach ein nicht entfernbares Script ist). Ein GameObject beinhaltet auch die Referenzen auf alle ihm zugewiesenen Scripts. Und die Scene beinhaltet alle Referenzen auf die Objects der Scene. So erhältst du eine Baumartige Struktur, in der du dich bewegen kannst.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hey Hirk,

 

erst einmal vielen Dank für deine Antwort.

 

In deiner Antwort gehst du offensichtlich auf GUI Komponenten ein, welche bereits existieren. Wie aber sieht das mit neuen Komponenten ein, welche ich selbst erzeugen möchte? Beispielweise würde ich in Java eine Klasse haben, welche sich Character nennt und viele Daten und Objekte miteinander vereint. Dazu gehört zum Beispiel eine Waffe(eine eigene Klasse), ein Inventar(eine eigene Klasse) usw. Dieses kann ich in Unity nicht umsetzen, da würde ich dann in der Szene ein Inventar-Objekt erzeugen(empty) und ein Script draufhauen, welches eigentlich total unnötig ist. Genau wie mit Eigenschaften, welche zum Start des Spiels gesetzt werden müssen, denn dafür muss ich ein Script schreiben und es entweder auf wieder ein neu erzeugtes Objekt(empty) hauen oder sinnlos auf die Kamera setzen. Das sind all so Sachen, die für mich nicht richtig durchdacht erscheinen und man hätte sinnvoller gestalten können.

 

Zum Beispiel möchte ich gerne dynamisch zur Laufzeit verschiedene Objekte ins Spiel bringen und verschieden sich bewegen lassen, verschiedene Physik zuweisen und von gerade passierenden Spielerverhalten beeinflussen lassen. Ist das möglich? Mir kommt das so vor, als würde man keine neuen Klassen schreiben, welche einen Zustand und Verhalten präsentieren, sondern nur beschreiben soll, was das in der Szene vorhandene Objekt in jedem Frame machen soll.

 

Ich denke mal, es ist schwer zu verstehen, woraus ich hinaus will. Vielleicht versteht es der ein oder andere :)

 

MfG

Coco07!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Zum Beispiel möchte ich gerne dynamisch zur Laufzeit verschiedene Objekte ins Spiel bringen und verschieden sich bewegen lassen, verschiedene Physik zuweisen und von gerade passierenden Spielerverhalten beeinflussen lassen. Ist das möglich? Mir kommt das so vor, als würde man keine neuen Klassen schreiben, welche einen Zustand und Verhalten präsentieren, sondern nur beschreiben soll, was das in der Szene vorhandene Objekt in jedem Frame machen soll.

Dynamisch Objekte erzeugen geht mit Instantiate(). Wenn du beispielsweise einen Gegner spawnen willst, baust du vorher den Gegner in Unity zusammen. Du erzeugst ein leeres Gameobject, fügst das 3D-Modell als Child hinzu, evtl. PartikelEffekte, bestimmst, welche Animationen der Gegner ausführen kann und welche Geräusche er von sich gibt. Anschließend bekommt der Gegner alle Scripts, die er haben muss, also z.B. Health, Attack, Walk, Jump, was immer. Daraus erzeugst du dann ein Prefab, was heißt, du speicherst den Gegner so ab, wie du ihn konfiguriert hast (anschließend kannst du ihn aus der Game Hierarchy löschen).

 

Wenn du jetzt z.B. im LevelManager den Gegner mit Instantiate() erzeugst, erstellst du praktisch eine Kopie des Prefab in der Szene. Damit das funktioniert, gibst du dem LevelManager das Prefab als Referenz mit. Damit kannst du von diesem Gegner beliebig viele Kopien erstellen. Jeder dieser Gegner hat seine eigenen Scripte als Komponenten dabei.

 

Hier mal ein kleines Stückchen Code:

 

public class LevelManager : MonoBehaviour
{
public GameObject enemy;
void Update()
{
	if (Input.GetKey(KeyCode.E)
 	   Instantiate(enemy, Vector3.zero, Quaternion.identity);
}
}

Wenn du diesen Code an die MainCamera hängst, musst du nur noch dein Enemy-Prefab auf die "enemy"-Variable der Komponente ziehen. Im Spiel wird dann bei jedem Druck auf die Taste "E" ein Gegner an der Position 0,0,0 erzeugt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...