Unity 2D相机平滑移动及回合制节奏游戏相机切换实现求助
Unity 2D相机平滑切换玩家视角实现方案
准备工作
- 创建一个C#脚本(比如
CameraFollowSwitcher),挂载到主相机上 - 在脚本中声明两个公开的
Transform变量,分别对应玩家1和玩家2的对象,方便在Unity编辑器中直接拖入赋值
方法一:协程实现固定时长平滑移动
适合需要精确控制移动时间的场景,逻辑直观,新手友好
using UnityEngine; using System.Collections; public class CameraFollowSwitcher : MonoBehaviour { public Transform player1Transform; public Transform player2Transform; public float moveDuration = 1.5f; // 相机完成移动的总时长,可根据需求调整 private Camera mainCamera; void Start() { mainCamera = GetComponent<Camera>(); // 初始状态让相机聚焦玩家1 transform.position = new Vector3(player1Transform.position.x, player1Transform.position.y, transform.position.z); } // 切换到玩家2视角的触发方法 public void SwitchToPlayer2() { StartCoroutine(MoveToTarget(player2Transform.position)); } // 切换到玩家1视角的触发方法 public void SwitchToPlayer1() { StartCoroutine(MoveToTarget(player1Transform.position)); } // 核心协程:控制相机平滑移动到目标点 IEnumerator MoveToTarget(Vector3 targetPos) { Vector3 startPos = transform.position; float elapsedTime = 0f; while (elapsedTime < moveDuration) { // 用Lerp计算当前帧的位置,Time.deltaTime保证移动速度不受帧率影响 transform.position = Vector3.Lerp(startPos, targetPos, elapsedTime / moveDuration); elapsedTime += Time.deltaTime; yield return null; // 等待下一帧继续执行 } // 确保相机最终准确停在目标点 transform.position = new Vector3(targetPos.x, targetPos.y, transform.position.z); } }
使用方式
- 将脚本拖到主相机上,在Inspector面板中把玩家1、玩家2的对象拖入对应变量
- 调整
moveDuration数值:数值越大,相机移动越慢 - 在回合结束的逻辑中调用切换方法:比如玩家1回合结束时,执行
FindObjectOfType<CameraFollowSwitcher>().SwitchToPlayer2();;玩家2回合结束时执行SwitchToPlayer1()
方法二:Update帧更新实现平滑跟随
适合不需要严格控制时长,追求自然平滑过渡的场景
using UnityEngine; public class CameraFollowSwitcher : MonoBehaviour { public Transform player1Transform; public Transform player2Transform; public float smoothSpeed = 0.125f; // 平滑系数,数值越小过渡越平缓 private Vector3 targetPosition; void Start() { // 初始聚焦玩家1 targetPosition = new Vector3(player1Transform.position.x, player1Transform.position.y, transform.position.z); } void Update() { // 每帧逐步向目标位置靠近 Vector3 smoothedPos = Vector3.Lerp(transform.position, targetPosition, smoothSpeed); transform.position = smoothedPos; } public void SwitchToPlayer2() { targetPosition = new Vector3(player2Transform.position.x, player2Transform.position.y, transform.position.z); } public void SwitchToPlayer1() { targetPosition = new Vector3(player1Transform.position.x, player1Transform.position.y, transform.position.z); } }
使用方式
- 同方法一,挂载脚本并赋值玩家对象
- 调整
smoothSpeed:推荐0.1-0.2区间,数值越小相机移动越慢越平滑 - 回合结束时调用对应的切换方法即可
注意事项
- 保持相机Z轴不变:2D相机默认Z轴为-10,不要修改这个值,否则会导致物体显示异常
- 固定轴跟随:如果是横版游戏不需要跟随Y轴,可将目标位置的Y值设为相机初始Y值,比如
targetPosition = new Vector3(player2Transform.position.x, transform.position.y, transform.position.z); - 测试验证:可以给玩家对象添加显眼的Sprite,方便观察相机移动是否准确
内容的提问来源于stack exchange,提问作者Casseia
相关产品推荐
相关产品推荐

