2017-04-30 4 views
0

Ich habe Probleme mit diesem für einige Zeit jetzt verlassen. Ich habe GameObject, eine Kugel, die mein Spieler auf einem 3D-Terrain ist. Ich habe eine Kamera, die immer auf einem festen Abstand von dem Spieler, es folgt, wo er mit folgenden Skript geht:Kamera immer hinter Spieler in Unity3d

public GameObject player; 
private Vector3 offset; 


// Use this for initialization 
void Start() { 
    offset = transform.position - player.transform.position; 


} 

void LateUpdate() { 

    transform.position = player.transform.position + offset; 
} 

So weit so gut. Was ich eigentlich will, ist, dass die Kamera mit dem Player rotiert, also immer in die Richtung schaut, in der sich die Kugel bewegt, aber immer im selben festen Abstand hinter dem Player bleibt, so dass der Player immer in der Kameraansicht sichtbar ist .

Es gibt viele Skripte, aber das Problem mit den Onces, die ich bisher gesehen habe, ist, dass die Kamera tatsächlich mit dem Player rotiert, aber weil der Player tatsächlich eine rollende Kugel ist, rollt und dreht sich die Kameraansicht auch.

Das beste Skript, das ich bisher gefunden habe, ist unten, aber dieses hat das selbe Problem wie die anderen Onces, die Kamera rollt mit dem Player.

public Transform target; 
public float distance = 3.0f; 
public float height = 3.0f; 
public float damping = 5.0f; 
public bool smoothRotation = true; 
public bool followBehind = true; 
public float rotationDamping = 10.0f; 

void Update() { 
    Vector3 wantedPosition; 
    if(followBehind) 
     wantedPosition = target.TransformPoint(0, height, -distance); 
    else 
     wantedPosition = target.TransformPoint(0, height, distance); 

    transform.position = Vector3.Lerp (transform.position, wantedPosition, Time.deltaTime * damping); 

    if (smoothRotation) { 
     Quaternion wantedRotation = Quaternion.LookRotation(target.position - transform.position, target.up); 
     //Quaternion ownRotation = Quaternion.RotateTowards; 
     transform.rotation = Quaternion.Slerp (transform.rotation, wantedRotation, Time.deltaTime * rotationDamping); 
    } 
    else transform.LookAt (target, target.up); 
} 

Kann mir bitte jemand helfen?

+0

Ist Ihr _Camera_ 'GameObject' ein Kind der Sphäre? – Hristo

+0

Nein. Ich habe das versucht, aber es hatte das gleiche Ergebnis. – HB1963

+0

Haben Sie versucht, die 'smoothRotation' Funktion zu entfernen (in Ihrem Fall die' if' Anweisung)? – Hristo

Antwort

1

Sie benötigen eine Kameraposition zu bewegen, basierend auf Kugel Bewegungsrichtung -

public GameObject player; 
private Vector3 offset; 

float distance; 
Vector3 playerPrevPos, playerMoveDir; 

// Use this for initialization 
void Start() { 
    offset = transform.position - player.transform.position; 

    distance = offset.magnitude; 
    playerPrevPos = player.transform.position; 
} 

void LateUpdate() { 

    playerMoveDir = player.transform.position - playerPrevPos; 
    playerMoveDir.normalize(); 
    transform.position = player.transform.position - playerMoveDir * distance; 

    transform.LookAt(player.transform.position); 

    playerPrevPos = player.transform.position; 
} 

Edit 2: flackernde Kamera zu beheben, versuchen Sie dies -

void LateUpdate() { 
    playerMoveDir = player.transform.position - playerPrevPos; 
    if (playerMoveDir != Vector3.zero) 
    { 
     playerMoveDir.normalize(); 
     transform.position = player.transform.position - playerMoveDir * distance; 

     transform.position.y += 5f; // required height 

     transform.LookAt(player.transform.position); 

     playerPrevPos = player.transform.position; 
    } 
} 
+0

Thx Mukesh. Fast da. Die Kamera folgt dem Spieler und bleibt immer zurück. Leider aus irgendeinem Grund flackert die Kameraansicht jetzt. Irgendeine Idee? – HB1963

+0

Flackert die Kamera immer oder nur wenn sich die Kugel nicht bewegt? –

+0

Hallo Mukesh, Kamera flackert immer. Es sieht so aus, als ob es eine Ansicht aus zwei verschiedenen Zoomstufen zeigt. – HB1963

1
using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 

public class CameraFollow : MonoBehaviour { 

    public GameObject player; 
    public float cameraDistance = 10.0f; 

    // Use this for initialization 
    void Start() { 
    } 

    void LateUpdate() 
    { 
     transform.position = player.transform.position - player.transform.forward * cameraDistance; 
     transform.LookAt (player.transform.position); 
     transform.position = new Vector3 (transform.position.x, transform.position.y + 5, transform.position.z); 
    } 
}