Tanks Unity Tutorial - Phase 3 Camera Control

xiaoxiao2021-02-28  140

YouTube地址:https://www.youtube.com/watch?v=llEJtLuQyPM

What should camera do:

1.Follow The tanks 

2.Resize to fit the tanks on screen <Keep an edge buffer>

Camera:

难点理解 :

Vector3 desiredPosToTarget = targetLocalPos - desiredLocalPos; size = Mathf.Max (size, Mathf.Abs (desiredPosToTarget.y));

Inspector 中显示的是 Local space position

通过camera的 size来控制镜头的缩放

using UnityEngine; public class CameraControl : MonoBehaviour { public float m_DampTime = 0.2f; // 移动相机到需要位置的时间 public float m_ScreenEdgeBuffer = 4f; public float m_MinSize = 6.5f; /*[HideInInspector] */public Transform[] m_Targets; private Camera m_Camera; private float m_ZoomSpeed; private Vector3 m_MoveVelocity; private Vector3 m_DesiredPosition; private void Awake() { m_Camera = GetComponentInChildren<Camera>(); } private void FixedUpdate() { Move(); Zoom(); } private void Move() { FindAveragePosition(); transform.position = Vector3.SmoothDamp(transform.position, m_DesiredPosition, ref m_MoveVelocity, m_DampTime); } /* * 找到2辆tank的中间点 */ 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; averagePos.y = transform.position.y; m_DesiredPosition = averagePos; Debug.Log("world ====" + m_DesiredPosition); } private void Zoom() { 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); Debug.Log("local ====" + desiredLocalPos); 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; size = Mathf.Max (size, Mathf.Abs (desiredPosToTarget.y)); size = Mathf.Max (size, Mathf.Abs (desiredPosToTarget.x) / m_Camera.aspect); } size += m_ScreenEdgeBuffer; size = Mathf.Max(size, m_MinSize); return size; } public void SetStartPositionAndSize() { FindAveragePosition(); transform.position = m_DesiredPosition; m_Camera.orthographicSize = FindRequiredSize(); } }

转载请注明原文地址: https://www.6miu.com/read-29743.html

最新回复(0)