unity中经常会用到固定视角的相机跟随,然后百度发现大家都是自己写的,然后偶也写咯一个,分享一下
PS: 由于刚学C#不久,才发现delegate这个东东,也不知道对性能影响大不大,但是看MS自己的界面库中各种使用,脑补了下估计可以用吧,就用了
先上代码:
先是使用if进行判断的版本,支持实时锁定xyz的位置
using UnityEngine;public class FixedFollowCamera : MonoBehaviour{ // 需要跟随的目标对象 public Transform target; // 需要锁定的坐标(可以实时生效) public bool freazeX, freazeY, freazeZ; // 跟随的平滑时间(类似于滞后时间) public float smoothTime = 0.3F; private float xVelocity, yVelocity, zVelocity = 0.0F; // 跟随的偏移量 private Vector3 offset; // 全局缓存的位置变量 private Vector3 oldPosition; // 记录初始位置 private Vector3 startPosition; void Start() { startPosition = transform.position; offset = transform.position - target.position; } void LateUpdate() { oldPosition = transform.position; if (!freazeX) { oldPosition.x = Mathf.SmoothDamp(transform.position.x, target.position.x + offset.x, ref xVelocity, smoothTime); } if (!freazeY) { oldPosition.y = Mathf.SmoothDamp(transform.position.y, target.position.y + offset.y, ref yVelocity, smoothTime); } if (!freazeZ) { oldPosition.z = Mathf.SmoothDamp(transform.position.z, target.position.z + offset.z, ref zVelocity, smoothTime); } transform.position = oldPosition; } /// <summary> /// 用于重新开始游戏时直接重置相机位置 /// </summary> public void ResetPosition() { transform.position = startPosition; }}
然后再来个delegate的版本,不支持实时锁定xyz的位置,具体性能升降也未知...但是感觉用着很不错的感觉
using UnityEngine;// 更新位置委托,用于减少判断次数,具体性能升降未知delegate void UpdatePosition();public class FixedFollowCamera : MonoBehaviour{ // 需要跟随的目标对象 public Transform target; // 需要锁定的坐标(无法实时生效) public bool freazeX, freazeY, freazeZ; // 跟随的平滑时间(类似于滞后时间) public float smoothTime = 0.3F; private float xVelocity, yVelocity, zVelocity = 0.0F; // 跟随的偏移量 private Vector3 offset; // 全局缓存的位置变量 private Vector3 oldPosition; // 记录初始位置 private Vector3 startPosition; private UpdatePosition JudgePosition; void Start() { startPosition = transform.position; offset = transform.position - target.position; // 分配事件 if (!freazeX) { JudgePosition += MoveX; } if (!freazeY) { JudgePosition += MoveY; } if (!freazeZ) { JudgePosition += MoveZ; } } void LateUpdate() { oldPosition = transform.position; JudgePosition(); transform.position = oldPosition; } private void MoveX() { oldPosition.x = Mathf.SmoothDamp(transform.position.x, target.position.x + offset.x, ref xVelocity, smoothTime); } private void MoveY() { oldPosition.y = Mathf.SmoothDamp(transform.position.y, target.position.y + offset.y, ref yVelocity, smoothTime); } private void MoveZ() { oldPosition.z = Mathf.SmoothDamp(transform.position.z, target.position.z + offset.z, ref zVelocity, smoothTime); } /// <summary> /// 用于重新开始游戏时直接重置相机位置 /// </summary> public void ResetPosition() { transform.position = startPosition; }}
1.首先把摄像机和需要跟随的角色位置在unity编辑界面中调好
如有问题,肯定是你打开方式不对,也可以留言咨询 ╮(╯▽╰)╭
联系客服