2D Racer Start Up Screen/Playerselect (Pt.5)
Heute geht es um ein Playerselect. Das „Crash Car Framework“ bringt hier ja 2 verschiedene Modelle in verschiedenen Farben. Davon werde ich mir 6 Stück zusammen basteln, 3 von jedem Modell in verschiedenen Farben. Ich habe das Basisauto genutzt und dort immer die Sprites ausgestauscht, Einstellungen verändert für unterschiedliches Fahrverhalten. Und für jedes Auto ein Prefab erstellt. Möglichkeiten gibt es viele so eine Playerselect anzugehen, einige Tutorials zeige ich dir im nächsten Absatz. Bei dem 2D Crash Racer werde ich den Playerselect in der gleichen Scene vom jeweiligen Level durchführen und keine Extra Scene dafür erstellen. Das Grundgerüst dafür werde ich heute erstellen.
Tutorials zum Playerselect:
OA by Unity3d.comHow setup Playerselect
Das nur als Beispiel wieviel Wege es gibt so ein Playerselect aufzusetzen. Jetzt zeig ich meine Lösung viel Spass dabei.
Als erstes wird wieder ein Widget im UIRoot erstellt das der Start Up Screen werden soll. Als Hintergrund Textur sollte es eine Vollbild sein. um dem Spieler klar zumachen das er noch ein Klick vom Spiel entfernt ist. Dort platziere deine erstellten Wagen als Buttons, nicht die Prefabs der Autos sondern nur die Texturen, es wird ja ein NGui Button. Als nächstes werden alle erstellten Prefabs der Autos in der Szene platziert. Ich nutze dafür ein Empty und setze alle Prefabs als Child davon. Die einzeln Autos platziere ich an Ihrer Startposition deaktievere bis auf eins alle. Das eine wird das „Default“ Auto.
Als Nachtrag wird noch ein neues Gameobject benötigt das sich „StartDestroyByVelocity“ nennt. Das beinhaltet ein BoxCollider2D als Trigger und ein Skript StartDestroyByVelocity.cs. Das wird für die Game Over Funktion des Speed Resets benötigt. Damit können wir steuern wann das Spiel die Funktion startet, damit keine Geschwindigkeit von null erlaubt ist. Platziern werde ich es am Anfang des Levels, in der Test Scene hab ich es auf der ersten Rampe platziert. Das StartDestroyByVelocity.cs ist schnell erstellt.
using UnityEngine; using System.Collections; public class StartDestroyByVelocity : MonoBehaviour { private CarDestroy carDestroy; void OnTriggerEnter2D (Collider2D other) { carDestroy = GameObject.FindGameObjectWithTag ("Roof").GetComponent<CarDestroy>(); if (other.gameObject.tag == "Car") carDestroy.isStarted = true; } }
So damit das nun erledigt ist kümmere ich mich um den Playerselct dazu wird ein neues Button Skript benötigt „PlayerSelectBtn.cs“. Und Änderungen in der CarGameManager.cs und CarDestroy.cs.
Für die Grafiken bediene ich mich wieder an dem Artwork von „Crash Racer Framework“. Benutzt habe ich die TransportBox als Button mit dem jeweiligen Auto darauf, für den Hintergrund die Transparente schwarze Grafik aus dem Artwork.
Die gösste Änderung findet in der CarGameManager statt mit der fange ich an. Ich werde ein neue Class schreiben in der ich die Variabeln platziere für eine bessere Übersicht im Inspector. Der StartUp Screen wird in der CarGameManager.cs gehändelt. Also werden wieder eine neue Funktion und Variablen benötigt. Beachte: das du beim gelieferten Code dazu etwas ändern musst, schiebe die Zeile target von der Start() in die LateUpdate() und erstelle in der LateUpdate() eine if Anweisung mit der bool startUp. Nicht abgebildet unten da es Code aus dem Paket „Crash Racer Framework“ ist.
public Cars car; [System.Serializable] public class Cars { public GameObject pickUpOrange; public GameObject pickUpBlack; public GameObject pickUpViolet; public GameObject hotRodGreen; public GameObject hotRodBlue; public GameObject hotRodRed; } [HideInInspector] public bool startUp; void Start () { ... startUp = true; .... } public void StartUp (int chooseCar) { if (chooseCar == 0)//Ist der default Wert. Als Sicherheit sollte was schiefgehen wird Player 1 erstellt. { car.hotRodBlue.SetActive (true); car.hotRodGreen.SetActive (false); car.hotRodRed.SetActive (false); car.pickUpViolet.SetActive (false); car.pickUpBlack.SetActive (false); car.pickUpOrange.SetActive (false); } if (chooseCar == 1) { car.hotRodBlue.SetActive (true); car.hotRodGreen.SetActive (false); car.hotRodRed.SetActive (false); car.pickUpViolet.SetActive (false); car.pickUpBlack.SetActive (false); car.pickUpOrange.SetActive (false); } if (chooseCar == 2) { car.hotRodBlue.SetActive (false); car.hotRodGreen.SetActive (true); car.hotRodRed.SetActive (false); car.pickUpViolet.SetActive (false); car.pickUpBlack.SetActive (false); car.pickUpOrange.SetActive (false); } if (chooseCar == 3) { car.hotRodBlue.SetActive (false); car.hotRodGreen.SetActive (false); car.hotRodRed.SetActive (true); car.pickUpViolet.SetActive (false); car.pickUpBlack.SetActive (false); car.pickUpOrange.SetActive (false); } if (chooseCar == 4) { car.hotRodBlue.SetActive (false); car.hotRodGreen.SetActive (false); car.hotRodRed.SetActive (false); car.pickUpViolet.SetActive (true); car.pickUpBlack.SetActive (false); car.pickUpOrange.SetActive (false); } if (chooseCar == 5) { car.hotRodBlue.SetActive (false); car.hotRodGreen.SetActive (false); car.hotRodRed.SetActive (false); car.pickUpViolet.SetActive (false); car.pickUpBlack.SetActive (true); car.pickUpOrange.SetActive (false); } if (chooseCar == 6) { car.hotRodBlue.SetActive (false); car.hotRodGreen.SetActive (false); car.hotRodRed.SetActive (false); car.pickUpViolet.SetActive (false); car.pickUpBlack.SetActive (false); car.pickUpOrange.SetActive (true); } }
Als nächstes erstelle ich das neue Skript PlayerSelectBtn.cs. In dieser verwende ich anstatt einer SendMessage eine BroadcastMessage, weil SendMessage keine inaktiven Gameobjekte verarbeiten kann. Wir erinnern uns das von den 6 Autos auch vor dem Start des Spiels immer nur eines aktiv ist die anderen inaktiv.
using UnityEngine; using System.Collections; public class PlayerSelectBtn : MonoBehaviour { public int createCar; private CarGameManager gameManager; void Start () { gameManager = GameObject.FindGameObjectWithTag ("GameController").GetComponent<CarGameManager>(); } void OnClick () { gameManager.startUp = false; gameManager.BroadcastMessage ("StartUp", createCar, SendMessageOptions.DontRequireReceiver); } }
Jetzt noch eine kleine Änderung in der CarDestroy.cs und die Spielerauswahl geht. Der warningText sollte eine Referenz bekommen damit keine Fehler entstehen.
void Start () { ... warningText = GameObject.Find ("WarningText").GetComponent<UILabel>(); .... }
Und so hab ich das ganze gestaltet.
Im nächsten Teil wird es dann um die Android/Mobil Controller gehen. Bis dahin viel Spass und Happy Developing.