Home Creators Posts Import Register Favorites Logout
haven't archived this post yet. have a subscription? use the importer!

Downloads

  • JackyControllerMegaAlpha.unitypackage

Missing 1 full-res photo, 1 file, as this post has not yet been imported.

Content

Dieser Artikel richtet sich an: Fortgeschrittene

Jeder der mit Unity ernsthaft etwas entwickelt hat weiß, dass man sehr viel selbst machen muss. Und jeder, der versuchte einen etwas komplexeren Spieler zu basteln weiß, dass es schnell verwirrend wird.

Nehmen wir als Beispiel einen Spieler der stehen (Idle), laufen (Walk) und springen (Jump) kann. Wir würden vielleicht mit Enums diese States definieren. Daher:
enum Playerstates {Idle,Walk,Jump}
Playerstates currentState = Playerstates.Idle;

In currentState würden wir festlegen was der Spieler gerade macht. Wenn er sich zur Seite bewegt und vorher idlet würden wir das laufen anfangen. Hier ein wenig Pseudo-Code (Code der nicht funktioniert, nur versinnbildlicht):


if(currentState==Playerstates.Idle) //wir stehen
{
 if(InputEingabeHorizontal!=0f) // wir drücken in eine Richtung
 {
   animation.play(walk);
   currentState = PlayerStates.Walk;
 }
}
if(currentState==Playerstates.Walk) // wir gehen
{
 if(InputEingabeHorizontal==0f) // wir drücken in KEINE Richtung   
 {
    animation.play(idle);
    currentState = PlayerStates.Idle;
    return; //breche ab, wir laufen nicht
 }
 rigidbody.velocity = new Vector3( InputEingabeHorizontal ,0f,0f); //bewege dich so schnell wie wir Horizontalen Input geben
}

Und das geht jetzt immer so weiter. Immer ein if mehr und dann noch die besonderen Fälle da reinquetschen, wie das Springen. Mega nervig, mega umständlich. Wie wäre es also, wenn man das vereinfacht?

Einige, die GamingClerks etwas länger verfolgten kennen sicher mein Mario64HD modifizieren Projekt. ( https://www.youtube.com/watch?v=O0IW7D3SaXU ) Das Projekt demonstrierte den "Super Character Controller"!
Roystan Ross ( https://roystanross.wordpress.com/super-mario-64-hd/ ) entwickelte den "Super Character Controller", der Unitys internen Character Controller komplett ersetzen kann, da er mist ist. Aber wer seinen eigenen Controller bauen will (so wie ich es aktuell mache) der findet dort auch die "Simple State Machine". Ein kleines Script, das mehr Arbeit abnimmt als man zuerst denkt.

Hier ein Beispiel, wir definieren wieder unsere States. Aber wenn wir das tun werden auch gleichzeitig Funktionen erstellt, die wir nutzen können.
Idle erstellt daher ein Idle_EnterState(), hier packen wir alles rein was passieren soll, wenn wir in Idle reinwechseln. Ebenso gibt es Idle_ExitState(), das wird ausgerufen, sollte das Idlen stoppen. Und mit Idle_FixedUpdate() und/oder Idle_Update() bestimmen wir, was in jeden Frame passieren soll.

Nehmen wir an, wir würden nun springen. Wir nutzen die Jump_EnterState() Funktion um dort alles vorzubereiten. Z.B.: Die Sprungstärke, die Sprunganimation, dem Script sagen, dass wir nicht mehr auf dem Boden sind. Und in Jump_Update() knallen wir alles rein, was wir für die Steuerung benötigen und nur mit dem Springen zu tun hat.

Im Screenshot seht ihr wie es in der Praxis aussieht. Und hey! Dank Patreon kann ich euch nun auch einfach das ganze Beispiel schicken!
Nutzt das UnityPackage und packt es in ein Unity2017.2 Projekt. Das JackyCharacterController Script ist alles was ihr genausten studieren solltet. Wichtig ist, dass eure Klasse nicht von MonoBehavior stammt sondern von "SimpleStateMachine". Daher beginnt das Script mit:
public class JackyCharacterController : SimpleStateMachine

Neulinge werden nur Bahnhof verstehen aber fortgeschrittene werden schnell wie ich in einen zustand kommen, wo man sich ein Leben ohne die SimpleStateMachine nicht mehr vorstellen kann!

Files

Previews only

Comments

No comments found for this post.