unity 小游戏 源码 unity小游戏源代码

火柴人回归精品unity3d游戏源码工程

火柴人回归 游戏源码工程

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(); // 游戏一开始便使m_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++) { // 如果目标不存在,跳过并继续执行for循环 if (!m_Targets[i].gameObject.activeSelf) continue; // 通过添加到平均值中,并在平均值中增加目标的数量。 averagePos += m_Targets[i].position; numTargets++; } // 检测目标数是否大于0若是便计算出平均的位置 if (numTargets > 0) averagePos /= numTargets; // 保持y值不变,坦克不会飞,所以y一定不能改变 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); // 将相机变焦大小初始值设为0 float size = 0f; // 遍历一遍相机照射目标 for (int i = 0; i < m_Targets.Length; i++) { // 如果目标不存在,跳过并继续执行for循环 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 = Find

  • 25
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值