相机总是在Unity3d的播放器后面

时间:2017-04-30 17:41:49

标签: c# unity3d camera

我现在正在努力戒烟一段时间。我有GameObject,是一个球体,它是我在3D地形上的玩家。我有一个相机,它始终与播放器保持固定的距离,跟随脚本下方的位置:

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;
}

到目前为止一切顺利。然而我真正想要的是相机随着播放器一起旋转,所以它总是看向球体移动的方向,但总是以相同的固定距离留在玩家后面,这样玩家总是可以在相机视图中看到

有很多可用的脚本,但到目前为止我所看到的onces的问题是相机确实随着播放器一起旋转,但是因为播放器实际上是一个滚动的球体,所以相机视图正在滚动并转向好。

我到目前为止找到的最好的脚本是下面的,但是这个脚本和其他脚本一样有问题,相机随播放器滚动。

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);
}

有人可以帮我这个吗?

3 个答案:

答案 0 :(得分:3)

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);
    }
}

答案 1 :(得分:1)

您需要根据球体移动方向移动相机位置 -

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;
}

编辑2:要修复闪烁的相机,请尝试此操作 -

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;
    }
}

答案 2 :(得分:0)

我的解决方案(基于@ brennon-provencher答案)具有平滑度和自动偏移量:

public class CameraFollow : MonoBehaviour
{
    public GameObject target;
    public float speed = 5;

    Vector3 offset;

    void Start()
    {
        offset = target.transform.position - transform.position;
    }

    void LateUpdate()
    {
        // Look
        var newRotation = Quaternion.LookRotation(target.transform.position - transform.position);
        transform.rotation = Quaternion.Slerp(transform.rotation, newRotation, speed * Time.deltaTime);

        // Move
        Vector3 newPosition = target.transform.position - target.transform.forward * offset.z - target.transform.up * offset.y;
        transform.position = Vector3.Slerp(transform.position, newPosition, Time.deltaTime * speed);
    }
}