Unity相机随游戏对象的移动而移动及调整大小

本文介绍了一种使用Unity实现的平滑相机跟随方法,通过计算玩家角色的平均位置并利用SmoothDamp函数来平滑地调整相机位置。此外,还介绍了如何根据玩家之间的相对位置动态调整相机的缩放大小。
private void Move ()  //移动
        {
            // 求中点位置
            FindAveragePosition ();


            // 平滑移动相机
            transform.position = Vector3.SmoothDamp(transform.position, m_DesiredPosition, ref m_MoveVelocity, m_DampTime);
        }




        private void FindAveragePosition ()
        {
            Vector3 averagePos = new Vector3 ();
            int numTargets = 0;
            //把全部玩家的位置相加
            for(int i = 0; i < m_Targets.Length; i++)
            {
                if (!m_Targets[i].gameObject.activeSelf)
                {
                    continue;
                }


                averagePos += m_Targets[i].position;
                numTargets++;
            }
            //求平均得到中点
            if (numTargets > 0)
            {
                averagePos /= numTargets;
            }
            //y轴值不变
            averagePos.y = transform.position.y;


            m_DesiredPosition = averagePos;
        }        


        private void Zoom ()  //调整大小
        {
            // Find the required size based on the desired position and smoothly transition to that size.
            float requiredSize = FindRequiredSize();
            m_Camera.orthographicSize = Mathf.SmoothDamp (m_Camera.orthographicSize, requiredSize, ref m_ZoomSpeed, m_DampTime);
        }




        private float FindRequiredSize ()
        {
            // 获取中点位置的本地坐标
            Vector3 desiredLocalPos = transform.InverseTransformPoint(m_DesiredPosition);


            // 得到相机缩放的大小
            float size = 0f;


            // 遍历玩家位置
            for (int i = 0; i < m_Targets.Length; i++)
            {
                // 玩家不显示,跳过
                if (!m_Targets[i].gameObject.activeSelf)
                    continue;


                // 获取玩家位置的本地坐标
                Vector3 targetLocalPos = transform.InverseTransformPoint(m_Targets[i].position);


                // 获取中点到玩家本地坐标的距离
                Vector3 desiredPosToTarget = targetLocalPos - desiredLocalPos;


                // 先比较y坐标
                size = Mathf.Max(size, Mathf.Abs(desiredPosToTarget.y));
                //aspect相机的长宽比
                size = Mathf.Max(size, Mathf.Abs(desiredPosToTarget.x) / m_Camera.aspect);
                
            }


            // 增加边缘距离
            size += m_ScreenEdgeBuffer;


            //确保不超过最低值
            size = Mathf.Max (size, m_MinSize);


            return size;
        }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值