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

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

  • 相关阅读:
    JAX-RS:@PathVariable @RequestParam @ModelAttribute等参数绑定注解详解
    关于重定向RedirectAttributes的用法
    数据库事务的四大特性以及事务的隔离级别
    电脑打开任务管理器出现卡顿
    IDEA: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value
    git学习命令
    python 输入 与如何查看文档 小结
    python formatters 与字符串 小结 (python 2)
    Hibernate 配置文件与实体类
    python编码问题 与 代码换行问题
  • 原文地址:https://www.cnblogs.com/coldcode/p/4797666.html
Copyright © 2011-2022 走看看