打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Unity相机平滑跟随

简介


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.然后把代码拖到摄像机上,记得把需要跟随的角色也拖过去



然后就没有然后了,不出意外地话应该就能达到以下效果了


如有问题,肯定是你打开方式不对,也可以留言咨询 ╮(╯▽╰)╭


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Unity Mathf 数学运算(C#)
Roll a ball
[unity3d]鼠标点击地面人物自动走动(也包含按键wasd&space控制)
关于Unity 2d动画实现
[Unity UGUI]各种优化效果
Unity获取麦克风音量(实现音效波浪效果)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服