先附上脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CmeraFollow : MonoBehaviour
{
public Transform m_playerTransform;
//设定一个角色能看到的最远值
public float Ahead;
//设置一个摄像机要移动到的点
public Vector3 targetPos;
//设置一个缓动速度插值
public float smooth;
void Start()
{
//获取当前角色的transform
//m_playerTransform = GameObject.Find("player").GetComponent<Transform>();
}
// Update is called once per frame
void Update()
{
//this.transform.position = new Vector3(m_playerTransform.position.x, gameObject.transform.position.y, gameObject.transform.position.z);
targetPos = new Vector3(m_playerTransform.position.x, gameObject.transform.position.y, gameObject.transform.position.z);
if (m_playerTransform.position.x > 0f)
{
targetPos = new Vector3(m_playerTransform.position.x + Ahead, gameObject.transform.position.y, gameObject.transform.position.z);
}
else
{
targetPos = new Vector3(m_playerTransform.position.x - Ahead, gameObject.transform.position.y, gameObject.transform.position.z);
}
transform.position = Vector3.Lerp(transform.position, targetPos, smooth * Time.deltaTime);
}
}
新手在开发过程中,很容易犯,也很常见的一个错误就是项目在运行过程中出现屏幕抖动的现象,这是什么原因呢?
原因分析
其中一个常见的原因就是你的摄像机跟随和人物的移动都写在了 Update 函数中,我们希望的是摄像机在人物移动后跟随,但 Update 更新之间的频率是不固定的,所以很难保证“摄像机会不会跑到了人物移动的前面的”现象,即所谓的屏幕抖动。
解决方案
解决方法就是把摄像机的跟随写到 LateUpdate 函数里,因为 LateUpdate 是在所有 Update 方法调用后被调用,这样就解决了人物在移动过程中,摄像机抖动的现象。
在脚本的整个生命周期中,Unity 主要提供了3种更新方法
- Update():每一帧执行时,都会立即调用此方法。
- LateUpdate():LateUpdate 是在所有 Update 方法调用之后被调用(语出圣典)。
- FixedUpdate():固定更新。默认情况下,系统每0.02秒调用一次。 具体的间隔时间可以在 TimeManager 中配置(详见文末)。
区别
总体来说,Update() 和 LateUpdate() 属于立即更新,更新之间的频率是不固定的,比如某一帧有一个耗时操作时,就会影响到下 一帧更新时间,所以对更新频率要求比较稳定的物理系统(如Rididbody)就不太适合在这里处理更新。
FixedUpdate() 虽然是固定更新,但是其实也是相对固定的,比如某一帧耗了好几秒,它依然会卡住。不过正常的程序会优化耗时操作,小范围的帧率波动是正常的,可以让它更新的时间间隔稍微长一点,这样它的更新是比较平滑的。
在实际的开发中,例如以秒为单位的倒计时,并不需要每一帧去判断时间,所以用 FixedUpdate 就再合适不过了。
|