Wandering Camera Script in Unity

in #unity3d7 years ago

Gerade in First Person Shooter Spielen oder in Multiplayer Games gibt es oft eine Map-Vorschau in der sich die Kamera über das Map bewegt (Wandering Camera). Hier fokussiert die Kamera sogenannte "Focal Points" (Stellen in der Map welche deutlich zu erkennen sind). Ein solches Kamera Verhalten ist sehr leicht in Unity umzusetzen.

Funktionsweise des Scripts
Das Script definiert 4 Variablen. Davon ist eine Variable ein Array welches GameObjects beinhalten kann. Diese können leer sein, da diese lediglich dazu verwendet werden eine Position zu markieren - Ähnlich eines SpawnPoints. Die nächste Variable "CameraObject" definiert die Kamera welche sich durch die Szene bewegt. Dieses GameObject kann auch dynamisch zur Laufzeit geändert werden. Sofern das Script direkt als Komponente einem Kamera Objekt zugewiesen wird, muss die Kamera selbst hier verlinkt werden. Die nächste Variable CameraMoveSpeed bezeichnet die Geschwindigkeit mit der sich die Kamera bewegen soll, je höher der Wert desto schneller der Ablauf. Die letzte Variable ist die "CamtargetObject". Dieses Objekt stellt den Focal Point dar, z.B. einen Turm. Die Kamera bleibt während dem kompletten Ablauf diesem Punkt zugewendet. Auch das Target Object kann dynamisch zur Laufzeit geändert werden wenn der fokus auf ein anderes Objekt fallen soll. Das Script kann beliebig in euer Spiel eingebaut werden.

Hier das Wandering Camera Script zum Download bzw. kopieren:

using UnityEngine;
using System.Collections;

public class gmCameraSurround : MonoBehaviour {

public GameObject[] CameraMovePoints;
public GameObject CameraObject;
public float CameraMoveSpeed;
public GameObject CamtargetObject;

private int lastCamMPIndex = -1;
private int currentCamMPIndex = -1;

void Start () {
    if (CameraMovePoints.Length == 0) { Debug.Log("Not enough Camera Move Points to make cam-wandering");  }
    if (CameraObject == null) Destroy(this);
}

void Update()
{
    if (currentCamMPIndex < 0) { currentCamMPIndex = 0; }
    else
    {
        if (CameraObject.transform.position != CameraMovePoints[currentCamMPIndex].transform.position)
        {
            Vector3 dist = CameraMovePoints[currentCamMPIndex].transform.position - CameraObject.transform.position;
            Vector3 maxDist = new Vector3(10, 10, 10);
            if (dist.x > maxDist.x || dist.y > maxDist.y || dist.z > maxDist.z)
            {
                CameraObject.transform.position = Vector3.Lerp(CameraObject.transform.position, 
                                                               CameraMovePoints[currentCamMPIndex].transform.position, 
                                                               Time.deltaTime * CameraMoveSpeed);
                                                                
                CameraObject.transform.LookAt(CamtargetObject.transform);
            }
            else { NextCamIndex(); }
        }
        else { NextCamIndex(); }

    }
}

void NextCamIndex()
{
    currentCamMPIndex = (currentCamMPIndex + 1 > CameraMovePoints.Length-1) ? 0 : currentCamMPIndex++;
}

}