Questo script è relativamente semplice ma molto utile.
In molti tipi di giochi dovremmo avere una telecamera che segue il giocatore in modo “smooth”, cioè leggermente ritardato e fluido.
Che sia da dietro e che ruoti insieme al personaggio (come in un classico gioco in terza persona), oppure da una posizione più in alto e senza che la telecamera ruoti insieme al personaggio, questo script può fare al caso vostro.
Con questo script sarà possibile utilizzare diversi tipi di visuale, a seconda delle impostazioni che sceglierete.
Inoltre potrete scegliere il tipo di aggiornamento (UpdateSystem) per adattarlo al meglio all’aggiornamento del gioco.
La scelta di un UpdateSystem adeguato si rende necessario perché, per evitare leggeri ritardi ed effetti “flickering” della telecamera, l’aggiornamento dovrebbe essere sempre uguale a quello che usa il movimento del player.
Dunque, se per esempio il vostro player si muove tramite un rigidBody userà l’aggiornamento per la fisica (FixedUpdate) ed altrettanto dovrà fare la telecamera.
using UnityEngine;
public class CameraFollowCharacter : MonoBehaviour
{
[SerializeField]
private Transform target;
[SerializeField]
public Vector3 offsetPosition;
public float cameraTargetHeight;
public float cameraTargetHorizontal;
[SerializeField]
private Space SpaceType = Space.Self;
Vector3 LoockAtPoint;
public enum UpdateType { Update, FixedUpdate, LateUpdate };
public UpdateType updateSystem=UpdateType.LateUpdate;
[Range(1,5)]
public float smoothMovement=1;
//Nel caso si debba aggiornare in Update
private void Update()
{
if(updateSystem.Equals(UpdateType.Update))
Refresh(Time.deltaTime);
}
//Nel caso si debba aggiornare in FixedUpdate
private void FixedUpdate()
{
if (updateSystem.Equals(UpdateType.FixedUpdate))
Refresh(Time.fixedDeltaTime);
}
//Nel caso si debba aggiornare in LateUpdate
private void LateUpdate()
{
if (updateSystem.Equals(UpdateType.LateUpdate))
Refresh(Time.deltaTime);
}
//Il metodo che aggiorna le posizioni della telecamera
public void Refresh(float updateDelta)
{
if (target == null)
{
Debug.LogWarning("Ops, No Target !", this);
return;
}
//Se ruota insieme al target
if (SpaceType == Space.Self)
{
transform.position =Vector3.Lerp(transform.position, target.TransformPoint(offsetPosition) , smoothMovement * updateDelta);
}
else
{
transform.position = Vector3.Lerp(transform.position, target.position + offsetPosition, smoothMovement * updateDelta);
}
LoockAtPoint= Vector3.Lerp(LoockAtPoint,(target.position + (target.up * cameraTargetHeight) + (target.right * cameraTargetHorizontal)), (smoothMovement*updateDelta));
transform.LookAt(LoockAtPoint);
}
}
Sta a voi fare tutte le prove che volete, sistemando gli offsets e lo smooth ad hoc, per arrivare ad avere l’effetto che serve per il vostro gioco.
2 pensieri su “Camera che segue il Player”
Lo script che mi serviva! Ne cerco uno decente da giorni.
Grazie!
Lo script non mi funziona o almeno non fa quello che deve come nel video. Perchè?