using UnityEngine;
using System.Collections;
public class SmoothCamera:MonoBehaviour{
private GameObject player;
public Vector3 XiangCha;
private CameraSmoothUpdate posFollow;
void Start()
{
posFollow = new CameraSmoothUpdate(0.65f, 0.65f);
}
void LateUpdate()
{
if (player == null) { FindPlayer(); return; }
transform.position = posFollow.Update(player.transform.position+XiangCha, Time.deltaTime);
}
void FindPlayer()
{
player = GameObject.Find("Player");
}
}
public class CameraSmoothUpdate {
private Vector3 targetPosition;
private Vector3 position;
private Vector3 velocity;
private float smoothingTime;
/// <summary>
/// 预测时间
/// </summary>
private float prediction;
public CameraSmoothUpdate(float smoothingTime):this(smoothingTime,1f) {}
public CameraSmoothUpdate(float smoothingTime, float prediction)
{
targetPosition = Vector3.zero;
position = Vector3.zero;
velocity = Vector3.zero;
this.smoothingTime = smoothingTime;
this.prediction = prediction;
}
public Vector3 Update(Vector3 targetPositionNew,float deltaTime)
{
Vector3 targetVelocity = (targetPositionNew - targetPosition) / deltaTime;//每个deltaTime移动的距离
targetPosition = targetPositionNew;
float d = Mathf.Min(1, deltaTime / smoothingTime);//获取??
velocity = velocity * (1 - d) + (targetPositionNew + targetVelocity * prediction - position) * d;
position += velocity * Time.deltaTime;
return position;
}
public Vector3 Update(Vector3 targetPositionNew,float deltaTime,bool reset)
{
if(reset)
{
targetPosition = targetPositionNew;
position = targetPositionNew;
velocity = Vector3.zero;
return position;
}
return Update(targetPositionNew, deltaTime);
}
public Vector3 GetPosition() { return position; }
public Vector3 GetVelocity() { return velocity; }
}
平滑的2D摄像机
最新推荐文章于 2023-09-11 10:01:55 发布