简介
unity中经常会用到固定视角的相机跟随,然后百度发现大家都是自己写的,然后偶也写咯一个,分享一下
PS: 由于刚学C#不久,才发现delegate这个东东,也不知道对性能影响大不大,但是看MS自己的界面库中各种使用,脑补了下估计可以用吧,就用了
Code
先上代码:
先是使用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编辑界面中调好
2.然后把代码拖到摄像机上,记得把需要跟随的角色也拖过去
然后就没有然后了,不出意外地话应该就能达到以下效果了
如有问题,肯定是你打开方式不对,也可以留言咨询 ╮(╯▽╰)╭