der automatische Geschützturm (Teil1)

In diesem ersten von mehreren Blogbeiträgen, erkläre ich, wie man in Unity3D einen automatischen Geschützturm aus einfachen geometrischen Figuren baut, der einem Ziel folgt sobald dieses in den Aktionsradius des Geschützturms eindringt. Wenn das Ziel den Aktionsradius verlässt, fährt der Geschützturm in seine Ausgangsposition zurück.

Mehrere Geschütztürme

 

Konstruktion der Kanone

Die Kanone besteht aus dem Rumpf, dem Sockel und dem Turm der die zwei Kanonenrohre trägt.
Erstellen Sie zunächst ein leeres GameObject und nennen dieses „Kanone“. Setzen Sie die Position des GameObjekts auf folgende Werte!

Werte für Position

  • X=0
  • Y=0
  • Z=0

 

Rumpf
Für den Rumpf der Kanone erstellen Sie einen Zylinder und benennen diesen „Rumpf“. Ziehen Sie dieses GameObjekt im ObjektInspektor in das GameObjekt „Kanone“. Übernehmen Sie die Werte wie unten angegeben!

Werte für Position

  • X=0
  • Y=0.3
  • Z=0

Werte für Maße

  • X=1
  • Y=0.3
  • Z=1

 

Sockel
Der Sockel ist der Fuss der Kanone auf dem der Rumpf steht. Legen Sie für diesen einen weiteren Zylinder an und nennen Sie diesen „Sockel“. Ziehen sie auch diesen Zylinder  im ObjektInspektor in das GameObjekt „Kanone“ und ändern Sie die Werte für Position und Größe wie angegeben.

Werte für Position

  • X=0
  • Y=0.02
  • Z=0

Werte für Maße

  • X=1.2
  • Y=0.02
  • Z=1.2

Der Sockel sollte sich nun am unteren Ende des Rumpfes befinden.

 

Geschützturm
Für den Geschützturm erstellen wir eine Sphere und ziehen diese im ObjektInspektor in das GameObjekt „Kanone“. Nachdem Sie die Werte wie unten angegeben geändert haben, sollte sich die Sphere auf dem Rumpf der Kanone befinden und nur die obere Hälfte sollte aus dem Rumpf herausschauen.

Werte für Position

  • X=0
  • Y=0.6
  • Z=0

Werte für Maße

  • X=1
  • Y=1
  • Z=1

 

Kanonenrohre
Wir erstellen als erstes ein Kanonenrohr das wir anschließend einfach duplizieren. Legen Sie also erneut einen Zylinder an und benennen diesen zu „Rohr-Links“. Ziehen Sie diesen im ObjektInspektor diesmal nicht in das GameObjekt „Kanone“ sondern in das GameObjekt „Turm“. Das ist wichtig da sich der Turm später inklusive der Kanonenrohren bewegen soll. Wie Sie unten sehen können, müssen in diesem Fall ein paar mehr Einstellungen vorgenommen werden.

Werte für Position

  • X=-0.15
  • Y=0
  • Z=1

Werte für Rotation

  • X=0
  • Y=270
  • Z=90

Werte für Maße

  • X=0.2
  • Y=0.6
  • Z=0.2

Duplizieren Sie nun das GameObjekt „Rohr-Links“ im ObjektInspektor und benennen Sie das neue GameObjekt um zu „Rohr-Rechts“. Passen  Sie hier nun nur die Position X an und ändern Sie die Werte wie folgt.

Werte für Position

  • X=0.15
  • Y=0
  • Z=1

Die beiden Kanonenrohre sollten nun parallel zum Boden aus dem Geschützturm ragen.

Geschützturm

 

So sieht der fertige Geschützturm aus.
Wenn Sie den Geschützturm auf einer bergigen Landschaft platzieren und der Untergrund nicht gerade ist, z.B. an einem Berghang, dann können Sie den Sockel in der Höhe ändern so dass die Kanone rundum einen festen Kontakt zum Boden hat.

 

C#-Script zum anvisieren eines Feindes
Das wäre geschafft, wir haben unsere erste, eigene Kanone gebaut. Nun wollen wir erreichen dass der Geschützturm mit den Kanonenrohren auf ein Objekt zielt sobald dieses in den Aktionsbereich der Kanone eindringt. Dazu legen wir im Projekt-Fenster einen neuen Ordner an den wir zu „Scripte“ umbenennen. In diesem Ordner erzeugen wir nun ein neues C# Script mit dem Namen LookAtTarget. Klicken Sie das Script im Projekt-Fenster doppelt an um dieses im voreingestellten Editor zu öffnen.

Sie können folgenden Code in das Script einfügen und dieses anschließend abspeichern.

using UnityEngine;
using System.Collections;

public class LookAtTarget : MonoBehaviour 
{	
	public Transform Ziel;		// Ziel das anvisiert werden soll sobald es sich der Kanone nähert
	public int rotateSpeed = 6; // Geschwindigkeit mit der die Kanone dem Ziel folgt
	public int radius = 5; 		// Aktionsradius der Kanone. Wenn das Ziel in den Aktionsradius eindringt, folgt die Kanone dem Ziel.

	void Start () 
	{

	}

	void Update () 
	{
		if(Ziel)
		{
			var rota = Quaternion.LookRotation(Ziel.position - transform.position);
			var dist = Vector3.Distance(Ziel.position, transform.position);

			// Wenn das Ziel in den Aktionsradius der Kanone kommt, Kanone auf Ziel ausrichten und dem Ziel folgen
			if(dist <= radius)
			{
				transform.rotation = Quaternion.Slerp(transform.rotation, rota, Time.deltaTime * rotateSpeed);
			}
			else // Ziel ist außerhalb des Aktionsradius, Kanone auf Startposition fahren 
			{
				transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(transform.position), Time.deltaTime * 1);	
			}
		}
	}

	// Gizmo um die Kanone zeichnen wenn diese selektiert wird um den Radius zum Ziel zu sehen
	void OnDrawGizmosSelected () 
	{
    	// Display the radius when selected
    	Gizmos.color = Color.red;
    	Gizmos.DrawWireSphere (transform.position, radius);
	}

}

 

Feind
Damit die Kanone auch etwas zum anvisieren hat, brauchen wir natürlich noch einen Player. Zum testen reichen dazu eine einfache Capsule und ein Script mit dem wir diese über das Spielfeld bewegen können. Erstellen Sie also zuerst eine Capsule und geben Sie dieser einen passenden Namen. Ich habe sie „Feind“ genannt. Erstellen Sie nun im Ordner „Scripts“ ein neues C# Script und nennen Sie dieses EnemyController! Wenn Sie das Script gespeichert haben, gehen Sie zurück in den unity3D Editor und ziehen Sie das Script auf Ihren Player.

using UnityEngine;
using System.Collections;

[RequireComponent(typeof(CharacterController))]

public class EnemyController : MonoBehaviour 
{
	public float speed = 3.0f;	

	// Use this for initialization
	void Start () {

	}

	// Update is called once per frame
	void Update () 
	{
		Move();
	}

	private void Move()
	{
		Vector3 moveHorizontal = Input.GetAxis("Horizontal") * Vector3.right * speed;
		Vector3 moveVertical = Input.GetAxis("Vertical") * Vector3.forward * speed;

		Vector3 moveAmount = moveVertical + moveHorizontal;

		this.GetComponent<CharacterController>().SimpleMove(moveAmount);
	}
}

 

Die Kanone zum Leben erwecken.
Stellen Sie sicher dass der Turm im Hierarchy-Fenster selektiert ist und ziehen Sie anschließend das Script „LookAtTarget“ in das Inspektor-Fenster. Nun müssen wir dem Script „LookAtTarget“ im Inspektor-Fenster noch das Ziel zuweisen das die Kanone anvisieren soll. Ziehen Sie dazu die Capsule die wir zuvor „Feind“ genannt haben, auf das Feld „Ziel“. Zusätzlich kann man nun noch die Geschwindigkeit mit der der Geschützturm dem  Feind folgen soll und den Aktionsradius, in dem der Feind erkannt werden soll angepasst werden.

Turret_7 Turret_6 Mehrere Geschütztürme Turret_4 Turret_3 Turret_2 Geschützturm Kanone

 

Testen Sie das Ganze, indem Sie in den WebPlayer klicken und sich den beiden Türmen nähern oder Sie sich von Ihnen fortbewegen. Die beiden Türme haben unterschiedlich große Aktionsradien und die Geschütztürme drehen sich in verschiedenen Geschwindigkeiten, in Richtung des Feindes.


 

Ankündigung

In Kürze werde ich hier noch weitere Teile zu diesem Beitrag veröffentlichen.

  • In Teil2 erfahren Sie, wie der Turm Raketen auf den Feind abschießen kann sobald dieser in den Aktionsradius des Turms eindringt.
  • Teil3 beendet diese Reihe und erklärt wie man Effekte hinzufügt. Was ist ein Spiel schon ohne die richtigen stimmungsvollen Geräusche, Explosionen, Rauch und Feuer?

 

Projektdateien herunterladen

 

Über Enrico S.

Programmierer, Webdesigner, Grafiker, Blogger, Screencaster, Arduino- und eMobility Enthusiast.

Kommentare geschlossen.