Jump to content
Unity Insider Forum
Mark

Wir bauen uns ein Space Shoot em Up [Teil 2 - Camera]

Recommended Posts

Willkommen im 2ten Teil der Tutorial Reihe. In diesem Teil wollen wir uns näher mit der Kamera beschäftigen. Bisher zeigt diese immer nur starr auf den Ursprungspunkt der Szene. Besser wäre es wenn die Kamera immer unser Raumschiff verfolgen würde.

 

Wir beginnen damit indem wir ein neues Script schreiben. Erstellt daher wie im ersten Teil ein neues C# Script und nennt es "CameraController".

Dieses Script könnt ihr nun gleich dem "Main Camera" GameObject zuweisen, wie das geht wurde euch bereits im ersten Teil der Tutorial Reihe gezeigt.

 

Öffnet danach das Script um es editieren zu können.

 

Ihr solltet nun genau dies hier sehen:

using UnityEngine;
using System.Collections;

public class CameraController : MonoBehaviour {

// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {

}
}

 

Wir wollen das dieses Script immer auf unser Zielobjekt schaut. Deswegen geben wr dem Script eine Variable die uns ermöglicht per Inspektor dieses Zielobjekt zu setzen. Fügt daher folgendes hinzu:

 

public Transform Target;

 

Transform bedeutet dass hier eine Transform Komponente erwartet wird, jedes GameObjekt hat diese Komponente und uns interessiert auch nur das was in dieser Transform Komponente zu finden ist (die Position).

 

Wenn wir das Script nun speichern und nach Unity gehen können wir nun im Inspektor des ausgewählten "Main Camera" GameObjectes unser Camera Controller sehen und dort auch ein Platz in der wir unser "Target" angeben können. Klickt auf dieses Feld und wählt im darauf folgenden Dialog unser "Spieler Raumschiff" aus.

 

Wenn wir nun auf Play drücken passiert noch rein gar nichts, dies werden wir aber schnell ändern.

 

Geht dazu wieder in das "CameraController" Script und ändert void Update zu void LateUpdate.

LateUpdate wird so wie Update jeden Frame aufgerufen. Der Unterschied ist aber dass LateUpdate aufgerufen wird nachdem sowohl die Physik Berechnungen als auch alle anderen Updates durchgeführt wurden. Der Ideale Zeitpunkt also um unsere Kamera zu positionieren ohne dass es zu hässlichen Ruckeleffekten kommt.

 

Fügt nun in diese Methode folgendes hinzu:

 

if (!Target)
{
return;
}

 

!Target bedeutet dass wenn wir kein Target ausgewählt wurden der bool Wert true generiert wird. Einfach nur Target ohne das ! Symbol würde bedeuten dass true nur dann generiert wird wenn Target einen Wert hat. Wir wollen an dieser Stelle aber die Ausführung der LateUpdate Methode beenden wenn kein Target gewählt wurde, weswegen wir auf die Nicht Existenz des Targets prüfen und mit return die Methode wieder verlassen sollte Target nicht gesetzt sein.

Dies verhindert Fehler wenn wir mal in die Situation kommen in der unser Spieler Raumschiff verschwindet, weil es zb zerstört wurde.

 

Um die Kamera immer mit einer gewissen Distanz von unserem Target zu halten, fügen wir eine weitere public Variable ein:

 

public float Distance = 10.0f;

 

Hierzu gibt es nicht viel zu sage, da die Verwendung das Interessante ist.

Dazu erweitern wir die LateUpdate Methode ein weiteres mal, fügt unter die if Bedingung folgendes hinzu:

 

transform.position = Target.position - Distance * transform.forward;

 

Der Code berechnet eine Position der Camera relativ zum Target. Wir benutzen dazu die Position des Targets (Target.position) und verschieben diesen Wert mithilfe der Blickrichtung unserer Camera (transform.forward). Indem wir unsere Distance Variable mit der Blickrichtung multiplizieren setzen wir die Entfernung fest in der sich die neue Position zum Target befinden soll. Mit dem = weisen wir die neu berechnete Position unserer Camera zu (transform.position).

 

Wenn wir nun das Script speichern sollte es so aussehen:

 

using UnityEngine;
using System.Collections;

public class CameraController : MonoBehaviour {

public Transform Target;
public float Distance = 10.0f;

void Start()
{
}

void LateUpdate()
{
	if (!Target)
	{
		return;
	}

	transform.position = Target.position - Distance * transform.forward;
}
}

 

Wenn wir nun unsere Scene in Unity starten und unser Raumschiff bewegen wollen, sehen wir.. dass sich unser Raumschiff nur dreht aber nicht bewegt!

Dies liegt daran dass uns Anhaltspunkte zu dieser Bewegung fehlen, da die Camera ja nun immer auf unser Raumschiff schaut.

 

Um einen Anhaltspunkt zu erschaffen fügen wir ein neues GameObjekt in die Szene ein. Wir benutzen dafür den Menüpunkt: "GameObject"->"Create Other"->"Sphere"

Wählt die "Sphere" in Hierarchy Bereich aus und wählt eine Position im Inspektor aus welche in der Nähe unseres Raumschiffes liegt, dieses aber nicht überlappt. Wählt zB die Position: X = 0, Y = 0 und Z = 3.

 

Wenn wir nun die Scene erneut starten können wir sehen dass sich unser Raumschiff relativ zu dieser "Sphere" bewegt. Die Camera zeigt dabei immer fleißig auf unser Raumschiff. Hurra!

 

Im nächsten Teil der Reihe lösen wir den Code des PlayerControllers etwas auf und erstellen uns ein Script für den Antrieb des Schiffes.

 

Feedback ist gern gesehen.

 

 

Teil 3:

http://forum.unity-community.de/topic/7102-wir-bauen-uns-ein-space-shoot-em-up-teil-3-antrieb/

  • Like 8

Share this post


Link to post
Share on other sites

Sehr gut, alles verständlich, auch für einen Codeneuling (Außer, warum sich der Würfel nur mit der Kugel in der Scene bewegt)! Wann geht es weiter?

Share this post


Link to post
Share on other sites

Es gibt bereits den Dritten Teil, der vierte wird heute auch noch fertig werden (Waffen). Hier erstmal Teil 3:

 

http://forum.unity-community.de/topic/7102-wir-bauen-uns-ein-space-shoot-em-up-teil-3-antrieb/

 

Der Würfel bewegt sich übrigens auch ohne die Kugel, da wir aber keinerlei Anhaltspunkte zur Position und Bewegung innerhalb der Szene haben (die Kamera schaut immer genau auf den Würfel und zeigt damit keine Positionsveränderung an da wir keine Sterne oder ähnliches haben) haben wir einfach eine Sphere hinzugefügt um einen Bezugspunkt zu haben.

Share this post


Link to post
Share on other sites

Die Skybox ändert aber nur das gerenderte Bild wenn man die Kamera dreht, das machen wir ja noch nicht und bei Bewegungen hilft es uns auch nicht weiter.

Share this post


Link to post
Share on other sites

Super Tutorial. Habe grade Teil 1 & 2 durchgearbeitet und bin endlich mal der Meinung alles verstanden zu haben. :D

Ich habe aufgrund der Rückmeldungen hier im Forum alle Teile in Word zusammengeworfen, ein Inhaltsverzeichnis gemacht und alles ausgedruckt um es dann in Ruhe vor dem PC studieren zu können. Bisher ist alles super erklärt. Ich hoffe das zieht sich bis zum letzten Teil so durch.

Vielen Dank an Marrrk für diese umfangreiche Hilfe.

 

Ich werde mich wieder melden, sobald ich die nächsten Teile durchgearbeitet habe.

Share this post


Link to post
Share on other sites

Hallöchen und entschuldigt bitte das ich das hier noch mal raus hole :-)

 

Aber habe nen kleines Problem:

 

Wenn ich die "Main Camera" in "Inspector" offen habe und dann unter Script das "Target" auswählen will zeigt er Standard nur "None (Transform) an. Aber ich kann hier das "Spieler Raumschiff" nicht auswählen. Was mache ich da falsch oder geht das in der Neuen Version von Unity nicht mehr so einfach (Unity 5.0)

 

Danke schon mal für eure Hilfe.

 

EDIT: OK Hat sich erledigt Fehler gefunden -_- -_- -_- -_- <_< <_< <_< (es gibt nen kleinen Kreis neben dem Kästchen und da muss man drauf klicken dann gehts. Falls auch mal jemand so auf dem Schlauch steht wie ich)

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...