想要在运行时更改摄像机的正交大小,如果玩家和敌人之间的距离大于某个值?



我正在用unity3d制作一个游戏。我正在使用一个小地图,我想用正射功能更改我的小地图相机的大小。如果玩家和敌人之间的距离大于某个值,那么小地图相机的大小会更大,如果距离小于某个值,那么尺寸会更小,如果我们将相机大小限制为某个最大值,我如何使用 Mathf.clamp 函数做到这一点?

此视频正在解决您想要的相同问题。这是对您有所帮助的链接。

https://www.youtube.com/watch?v=llEJtLuQyPM&index=3&list=PLclF8feY8EKLw5Un6Z2Syt2_35qsdpnHt

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);
}

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;
}

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);
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();
}
}

最新更新