首先声明target为需要跟随的物体
public Transform target;
声明跟随距离,以及跟随距离的增长速度,使用鼠标滚轮可以拉伸镜头
public float viewDistance = 8f;
public float viewDistanceMoveSpeed = 1f;
声明缓动系数
public float springRatio = 0.05f;
然后在LateUpdate函数里编写代码,因为摄像机追踪需要发生在物体移动后。
首先鼠标滚轮可以拉伸镜头
viewDistance += Input.GetAxis("Mouse ScrollWheel") * viewDistanceMoveSpeed;
之后使用Vector3.MoveTowards将相机移动到目标地点。目标地点的坐标计算过程如下。
target.transform.forward得到目标物体当前朝向的前方在世界坐标系下的方向,和Vector.foraward是不同的。之后用目标物体减去这个值,就是当前目标物体所朝方向的后方。
然后摄像机需要稍稍在y轴方向向上移动,可以给人一种略微俯视的感觉。
最后增加进缓动系数来移动摄像机
this.transform.position = Vector3.MoveTowards(transform.position,
target.transform.position - target.transform.forward * viewDistance + Vector3.up *viewDistance*0.5f,
(moveSpeed + distance * springRatio) * Time.deltaTime);
最后当摄像机离物体过进的时候,可以隐藏物体,这个在许多游戏中都有类似的实现
bool visible = Vector3.Distance(this.transform.position, target.transform.position) > 1;
target.GetComponent<MeshRenderer>().enabled = visible;
完整代码如下
using UnityEngine;
public class CameraTrack3D : MonoBehaviour
{
public Transform target;
public float moveSpeed = 3;
public float viewDistance = 8f;
public float viewDistanceMoveSpeed = 1f;
public float springRatio = 0.05f;
void LateUpdate()
{
viewDistance += Input.GetAxis("Mouse ScrollWheel") * viewDistanceMoveSpeed;
var distance = Vector3.Distance(this.transform.position, target.transform.position);
this.transform.position = Vector3.MoveTowards(transform.position,
target.transform.position - target.transform.forward * viewDistance + Vector3.up *viewDistance*0.5f,
(moveSpeed + distance * springRatio) * Time.deltaTime);
this.transform.LookAt(target.position + target.forward * 10);
bool visible = Vector3.Distance(this.transform.position, target.transform.position) > 1;
target.GetComponent<MeshRenderer>().enabled = visible;
}
}
将此代码挂载到摄像机上,赋值要跟随的物体,同时编写方块的移动代码即可完成一个简易的3D缓动追踪相机
调整参数后可以得到如下效果