Innerhalb 20 Minuten ein Kugel-Spiel machen + Download (Patreon)
Content
Marble Blast hatte damals das "Kugel Genre" wieder auf erleben lassen und ich glaube, dass mein Smiley Jumper IRGENDWO davon inspiriert war. Aber wusstet ihr, dass ihr den Anfang von so einem Spiel dank der Cinemachine von Unity innerhalb von 20 Minuten selbst machen könnt?
Cinemachine ist ein Asset, was euch die komplette Arbeit bezüglich der Kamera abnehmen soll, seis nun Ingame oder in Zwischensequenzen. Daher nutzen wir das mal aus!
Erstellt ein neues Unity2018 Projekt, geht in den Assetstore und saugt euch ProBuilder, ProGrids und Cinemachine, alles natürlich umsonst. Wenn ihr dann einen Fehler bezüglich "PostProcessing" bekommt müsst ihr den PostProcessing Stack V2 von GitHub laden und den "PostProcessing" Ordner in euer Projekt ziehen.
Ok, bevor wir anfangen brauchen wir ein Level. Ich zwei Bereiche haben, verbunden durch einen langen Weg. Der Spieler kann sich frei umgucken, jedoch wenn er auf den langen Weg entlang geht soll die Kamera so sein wie z.B. in Crash Bandicoot, also sie fährt einen praktisch hinterher!
Das Level haben wir fix in ProBuilder erstellt (das Tutorial Video dazu kommt sehr bald, entschuldigt die lange Wartezeit bitte!). Als nächstes erstellen wir unter "GameObject->3D Object->Sphere" eine Kugel, platzieren sie an den Startpunkt vom Level und packen ein Rigidbody an das Objekt. Am besten benennt ihr sie direkt um! Das sieht dann so aus:
Kommen wir zum ersten spannenden Part: Klickt in der Menüleiste auf "Cinemachine->Create Freelook Camera" und gebt als "Follow" und "Look At" Target die Spielerkugel an.
Drückt Play und schon ist eure Third Person Orbit Kamera bereit mit der Maus geschwenkt zu werden! Ebenso seht ihr einen roten äußeren und blauen inneren Bereich. Sie bestimmen, ab wann die Kamera anfangen soll sich neu zu zentrieren. Wenn ihr mehr über diese Funktion erfahren wollt solltet ihr euch unbedingt die Unity Videos diesbezüglich ansehen!
Am besten ändert ihr direkt unter "Orbits" bei TopRig, MiddleRig und BottomRig den Radius auf etwas größeres wie "5", dann ist die Kamera nicht so nah dran!
Der Spielercode ist so simple, ihr werdet es nicht glauben!
public float GroundSpeed = 3.0f; // grundsätzliche Geschwindigkeit
public Transform DummyCamera; // Dummy, für die Berechnung
private Camera MyCamera; // Die aktuell verwendete Kamera
private Rigidbody MyRigidBody; //unser Rigidbody
private Vector3 cameraRelativeRight; // Unser Vorwärts-Vector für die Kugel
void Start () {
if(MyCamera==null)
{
MyCamera = Camera.main; // Camera.main gibt immer die erste aktive Kamera zurück
}
if(MyRigidBody==null)
{
MyRigidBody = GetComponent<Rigidbody>(); //Speicher eine Referenz zum Rigidbody ab
}
}
void Update () {
DummyCamera.transform.position = MyCamera.transform.position; // Setze die Dummy Kamera auf die Position der echten Kamera
DummyCamera.transform.eulerAngles = new Vector3(0, MyCamera.transform.eulerAngles.y, MyCamera.transform.eulerAngles.z); // Drehe den Dummy in die Richtung der echten Kamera, ohne rollen
cameraRelativeRight = DummyCamera.transform.TransformDirection(Input.GetAxis("Vertical") * GroundSpeed, 0, Input.GetAxis("Horizontal") * GroundSpeed * -1); // berechne den Vorwärts-Vektor
cameraRelativeRight.y = 0; // Entferne die Rotation auf der y Achse
MyRigidBody.AddTorque(cameraRelativeRight * (Time.deltaTime * 100)); // Lass das Rigidbody drehen!
}
Da ich faul bin nutze ich als Berechnung ein Dummy Objekt, damit ich "TransformDirection" nutzen kann. Diese Funktion berechnet uns einen Vektor, wie wir die Kugel rollen lassen sollen, damit sie, wenn man nach vorne drückt z.B. auch nach vorne rollt, je nach Kamera Blickrichtung!
Speichert diesen Code also in ein neues C# Script, heftet das euren Spieler an und erstellt ein leeres GameObject per "GameObject->Create Empty" und nennt es "DummyCamera". Wenn alles fertig ist sollte es so aussehen:
Drückt Play und ihr könnt euren Spieler bewegen! Damit er nicht so stark über den Boden rutscht solltet ihr den "Drag" und "Angular Drag" auf "1" setzen, das reicht für den Anfang. Ihr solltet mit den Einstellungen aber experimentieren, um die Spielbarkeit zu optimieren!
So, wir wollen jetzt eine zweite Kamera haben. Kein Problem! "Cinemachine->Create Dolly Camera with Track". Dies erstellt zwei GameObject, eine neue Kamera und einen DollyTrack. Wählt den DollyTrack aus und klickt das + an, um Knotenpunkte zu erstellen.
Wie eine echte Dolly-Kamera bewegt sich die virtuelle Kamera auf einer Schiene! Damit das auch automatisiert klappt klickt ihr auf die erstellte Kamera (heißt sicherlich so was wie "CM vcam1", füllt wieder die "Follow" und "Look At" Targets mit dem Spieler und bei "Body" klickt ihr auf "Auto Dolly" und aktiviert es!
Startet euer Spiel, behaltet die Dolly-Kamera weiterhin selektiert und klickt beim Cinemachine Virtual Camera Script oben auf den "Solo" Button, um sie zu aktivieren. Ihr werdet sehen, dass wenn ihr sie euch nähert die Kamera tatsächlich mitschwenkt! Sehr nah und sehr unschön, aber das passen wir ganz simple mit dem "Position Offset" Wert, bei den Auto Dolly Einstellungen ganz simple an. Probiert dort 1 oder -1 und schaut, was besser passt. Wenn alles klappt wird es Zeit etwas einzubauen, um die Kameras zu wechseln.. Zeit für einen Trigger!
Erstellt ein neues C# Script mit folgenden Inhalt:
public GameObject CameraToActivate; // Kamera, die wir aktivieren wollen
void OnTriggerEnter(Collider other) // wenn etwas den Trigger berührt passiert folgendes...
{
if (Cinemachine.CinemachineCore.Instance.GetActiveBrain(0).ActiveVirtualCamera.VirtualCameraGameObject != CameraToActivate) //ist die zu aktivierende Kamera NICHT die aktive Kamera?
{
Cinemachine.CinemachineCore.Instance.GetActiveBrain(0).ActiveVirtualCamera.VirtualCameraGameObject.SetActive(false); // Setze die aktive Kamera auf Inaktiv.
CameraToActivate.gameObject.SetActive(true); // Aktiviere die Kamera, die aktiviert werden soll.
}
}
Auch wieder kein Hexenwerk. Sobald irgendetwas den Trigger berührt (es gibt aktuell ja nur den Spieler) wir gecheckt, ob unser Trigger auch nicht die aktuell aktive Kamera triggern möchte. Wenn nicht, dann deaktiviere die aktuell aktive und aktiviere die Neue!
Also: Erstellt unter "GameObject->3D Object->Cube" einen Cube. Skaliert ihn, damit der Spieler auf jeden Fall dadurch laufen muss. Gebt ihm das Trigger Script und aktiviert unter Box Collider den "Is Trigger" Haken. Packt in "Camera To Activate" unseres Scripts die Dolly Kamera rein (ich habe sie in DollyKamera unbenannt). Den Meshrenderer könnt ihr deaktivieren oder entfernen. Am Ende soll das ganze so aussehen:
Drückt Play und bestaunt wie weich eure Kamera von der FreeLook Kamera zur Dolly Kamera wechselt! Cool!!!
Nächste Schritt ist klar, oder`? Dupliziert den Trigger und packt ihn ans Ende des Ganges. Dupliziert beide Trigger und packt sie jeweilt vor und nach den DollyKamera Triggern. Diese sollen ja wieder die FreeLook Kamera aktivieren! Am Ende habt ihr also 4 Trigger, an jeden Ende zwei!
Yeah!!! Damit habt ihr die Grundlagen gemeistert! Jetzt heißt es darauf aufbauen. Baut einen Cube und macht ein Script, dass es sich jeden Frame leicht drehen soll und baut so ein gemeines drehendes Hindernis! Macht Löcher und knifflige Passagen! Auf dieses Projekt kann man wunderbar aufbauen!
Und kleiner Tipp: Deaktiviert alle Virtual Cameras, die nicht die erste sind. Daher: Deaktiviert die Dolly Kamera, damit die FreeLook Kamera am Anfang immer aktiv ist!
Cinemachine ist ein sehr mächtiges Tool, daher empfehle ich jeden sich damit auseinander zu setzen. Irgendwann will man dann nicht mehr ohne!
Link zur WebPlayer Version
Link zum Download des Unity Projektes
Files
Previews only