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

被折叠的 条评论
为什么被折叠?



