【问题标题】:Camera always behind player in Unity3dUnity3d中的相机总是落后于玩家
【发布时间】:2017-04-30 17:41:49
【问题描述】:

我现在正在为此苦苦挣扎一段时间。我有 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;
}

到目前为止一切顺利。但是我真正想要的是相机随着玩家旋转,所以它总是看着球体移动的方向,但总是在玩家身后保持相同的固定距离,这样玩家在相机视图中总是可见的.

有很多可用的脚本,但是到目前为止我所看到的一次的问题是相机确实会随着玩家旋转,但是因为玩家实际上是一个滚动的球体,所以相机视图正在滚动和转动好吧。

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

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

谁能帮我解决这个问题?

【问题讨论】:

  • 你的相机 GameObject是球体的孩子吗?
  • 没有。我试过了,但结果是一样的
  • 您是否尝试过删除smoothRotation 函数(在您的情况下为if 语句)?
  • 是的,也有结果是相机仍在旋转并且还丢失了播放器对象

标签: c# unity3d camera


【解决方案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);
    }
}

【讨论】:

  • 自 2020 年 8 月 6 日起生效。简短而甜蜜的答案!
【解决方案2】:

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

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

【讨论】:

  • 谢谢穆克什。就快到了。摄像机跟随玩家并始终留在后面。不幸的是,由于某种原因,相机视图现在正在闪烁。有什么想法吗?
  • 相机是一直闪烁还是仅在球体不移动时闪烁?
  • 嗨 Mukesh,相机总是在闪烁。看起来好像是从两个不同的缩放级别显示视图。
  • 尝试检查玩家移动是否记录为Vector3.zero,因为在这种情况下,摄像机位置将与玩家位置相同。我已经更新了编辑部分来回答这个问题。
  • 嗨 Mukesh,离开了一段时间。这做到了。非常感谢。最后一个问题。相机现在处于玩家水平,我怎样才能让它看起来“越过玩家的肩膀”,漂浮在玩家的上方和后方?
【解决方案3】:

我的解决方案(基于@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);
    }
}

【讨论】:

  • 如果您希望相机跟随,这很好。就我而言,我总是希望相机从物体的右侧看物体”Vector3 newPosition = target.transform.position - target.transform.right * offset.x - target.transform.up * offset.y;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-18
  • 1970-01-01
  • 2019-07-20
  • 1970-01-01
  • 2015-12-12
相关资源
最近更新 更多