You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

使用方式

  1. 将脚本拖到主相机上,在Inspector面板中把玩家1、玩家2的对象拖入对应变量
  2. 调整moveDuration数值:数值越大,相机移动越慢
  3. 在回合结束的逻辑中调用切换方法:比如玩家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);
    }
}

使用方式

  1. 同方法一,挂载脚本并赋值玩家对象
  2. 调整smoothSpeed:推荐0.1-0.2区间,数值越小相机移动越慢越平滑
  3. 回合结束时调用对应的切换方法即可

注意事项

  • 保持相机Z轴不变:2D相机默认Z轴为-10,不要修改这个值,否则会导致物体显示异常
  • 固定轴跟随:如果是横版游戏不需要跟随Y轴,可将目标位置的Y值设为相机初始Y值,比如targetPosition = new Vector3(player2Transform.position.x, transform.position.y, transform.position.z);
  • 测试验证:可以给玩家对象添加显眼的Sprite,方便观察相机移动是否准确

内容的提问来源于stack exchange,提问作者Casseia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 00:27:45