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.然后把代码拖到摄像机上,记得把需要跟随的角色也拖过去
这里写图片描述
然后就没有然后了,不出意外地话应该就能达到以下效果了
这里写图片描述

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值