Um ein Script in Unity zu erstellen, geht man im Inspector im unteren Teil wieder auf den Button "Add Component" und wählt "New Script. Nun kann man noch die Programmiersprache auswählen und das Script erstellen. Es erscheint von nun an bei den Assets. Ein Doppelklick hier auf die Datei und MonoDevelop wird geöffnet (In der Unity Version 4.3 kommt es hierbei zu Problemen und MonoDevelop lässt sich nicht starten. Ein Update behebt den Fehler).
Die Variablen (Aim, Health, Movement Speed, Game Over und Sip Health) wurden von uns im Script erstellen und erscheinen, wie im Screenshot zu sehen, auch in der Unity Umgebung.
Da wir unseren Animationen bereits in Blender verschiedene Bezeichnungen gegeben haben, mussten wir für jeden Charakter ein einzelnes Script schreiben. Bei dem geringen Umfang war das kein Problem. Aber trotzdem der Tip: Schon zu Beginn des Projekts überlegen, wie das Script ungefähr aussehen soll. Dementsprechend schon in Blender die Animationen identisch benennen.
Mein Script sah dann so aus:
Zur Erklärung:
- anim vom Typ Animation belegen wir mit unseren Animationen
- Die Variable healt wird mit 100 gefüllt und soll sich mit jedem Schlag um 10 verringern.
- Die Variable movementSpeed haben wir festgelegt und auf 10 gesetzt, damit die Charaktere etwas schneller sind.
- gameOver ist ein Textfeld und wird bei Spielende angezeigt.
- dispHealth ist ebenfalls ein Textfeld und zeigt die Healthangabe beider Charaktere in der jeweiligen oberen Ecke.
An dieser Stelle soll gesagt werden, dass sich die offiziellen Unity Tutorials als sehr hilfreich herausgestellt haben. Ein Video-Tutorial zum Thema Collider habe ich hier nachfolgend als Beispiel eingestellt.
Weiter in der Erklärung des Scripts.
void OnTriggerStay (Collider collider)
{
if (Input.GetKeyDown ("f") && health >= 0) {
health -= 10;
}
Den dritten Box-Collider haben wir auf Trigger gestellt. Kommt dieser Collider in Kontakt mit dem Collider des Gegners, ist folgende If-Anweisung möglich: Drückt der Gegner die "f" Taste auf der Tastatur wird die Healthvariable um -10 verringert pro Tastendruck.{
if (Input.GetKeyDown ("f") && health >= 0) {
health -= 10;
}
void OnCollisionExit (Collision collision)
{
//Bei Berührung mit einem anderen Rigidbody entstehen Krafteinwirkungen die wir nach der Collision elliminieren
rigidbody.velocity = Vector3.zero;
}
{
//Bei Berührung mit einem anderen Rigidbody entstehen Krafteinwirkungen die wir nach der Collision elliminieren
rigidbody.velocity = Vector3.zero;
}
Nach der Collision werden alle Kräfte (forces) des Vectors3 (3D Vector in Unity) auf 0 gestellt. Das ist nötig, weil sich die Modelle aufgrund des Rigidbodies sonst weiterbewegen. In unserem Falls sind sie nach einer Berührung langsam nach hinten gerutscht.
void Update ()
{
dispHealth.text = "Dominator: " + health.ToString () + " HP";
//KO-Bedingung
if (health <= 0) {
Time.timeScale = 0;
gameOver.text = "Rageland gewinnt!";
{
dispHealth.text = "Dominator: " + health.ToString () + " HP";
//KO-Bedingung
if (health <= 0) {
Time.timeScale = 0;
gameOver.text = "Rageland gewinnt!";
In void Update haben wir die Anweisung, dass wenn die Healthvariable kleiner gleich O ist der timeScale auf 0 gesetzt wird und gamOver aufgerufen wird. Das hat zufolge, dass das Spiel gestoppt wird und das gameOver Textfeld erscheint. Das Besondere hierbei, die Healthanzeige des Gegners ist sozusagen im eigenen Script.
} else if (Input.GetKey ("j")) {
//Positionsänderung erfolgt anhand der vergangenen animationszeit * Bewegungsgeschwindigkeit
//Crossfade als Animationsanweisung sorgt dafür, dass die Übergänge zwischen den Animationen erstellt werden
anim.CrossFade ("Armature|Rueckwaerts");
transform.position += new Vector3 (movementSpeed * Time.deltaTime, 0, 0);
} else if (Input.GetKey ("h")) {
anim.CrossFade ("Armature|Vorwaerts");
transform.position += new Vector3 (-1 * movementSpeed * Time.deltaTime, 0, 0);
} else if (Input.GetKey ("l")) {
anim.CrossFade ("Armature|Jab");
//Positionsänderung erfolgt anhand der vergangenen animationszeit * Bewegungsgeschwindigkeit
//Crossfade als Animationsanweisung sorgt dafür, dass die Übergänge zwischen den Animationen erstellt werden
anim.CrossFade ("Armature|Rueckwaerts");
transform.position += new Vector3 (movementSpeed * Time.deltaTime, 0, 0);
} else if (Input.GetKey ("h")) {
anim.CrossFade ("Armature|Vorwaerts");
transform.position += new Vector3 (-1 * movementSpeed * Time.deltaTime, 0, 0);
} else if (Input.GetKey ("l")) {
anim.CrossFade ("Armature|Jab");
Ist das nicht der Fall gelten folgende Else-Anweisungen. Der Tastaturbefehl "j" dient zur Bewegung Rückwärts, solange die Taste gedrückt wird. Gleichzeitig wird die entsprechende Animation (hier: Armature|Rueckwaerts) abgespielt. Die Multiplikation movementSpeed*Time.deltaTime löst aus, dass sich der Charakter um 10 Pixel pro Sekunde auf der X-Achse bewegt. Mit der Taste "h" kann man ihn vorwärts bewegen, mit "l" wird der Schlag ausgeführt.
} else {
anim.CrossFade ("Armature|Fightposition");
}
anim.CrossFade ("Armature|Fightposition");
}
Wird nichts gedrückt, wird die Animation "Armature|Fightposition" abgespielt. Wie hier zusehen ist, haben wir bei allen Animationen einen CrossFade hinzugefügt. Das sorgt für eine weicheren Übergang zwischen den einzelnen Animationen.
Keine Kommentare:
Kommentar veröffentlichen