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

Unity 2D如何实现平滑相机过渡?按钮触发相机平移优化

相机平滑左右平移实现方案

当前你的相机移动是瞬间完成的,要实现平滑过渡,推荐用Unity的协程或SmoothDamp方法,以下是两种实用方案:

方案一:协程控制线性平滑移动

这种方式能精确控制移动时长,逻辑直观:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraMover : MonoBehaviour
{
    public float moveAmount = 19.2f;
    // 移动总时长,单位秒,数值越大移动越平缓
    public float moveDuration = 0.5f;
    // 防止连续点击触发重复移动
    private bool isMoving = false;

    public void ButtonLeft()
    {
        if (!isMoving) StartCoroutine(MoveCamera(-moveAmount));
    }

    public void ButtonRight()
    {
        if (!isMoving) StartCoroutine(MoveCamera(moveAmount));
    }

    private IEnumerator MoveCamera(float xOffset)
    {
        isMoving = true;
        Vector3 startPos = Camera.main.transform.position;
        Vector3 targetPos = startPos + new Vector3(xOffset, 0, 0);
        float elapsedTime = 0f;

        while (elapsedTime < moveDuration)
        {
            Camera.main.transform.position = Vector3.Lerp(startPos, targetPos, elapsedTime / moveDuration);
            elapsedTime += Time.deltaTime;
            yield return null;
        }

        // 确保最终位置精准到位
        Camera.main.transform.position = targetPos;
        isMoving = false;
    }
}

关键说明:

  • moveDuration:直接控制移动快慢,按需调整数值
  • isMoving:避免用户连续点击导致的移动冲突
  • Vector3.Lerp:实现匀速平滑的位置过渡

方案二:SmoothDamp实现自然缓动效果

如果想要“先快后慢”的自然减速效果,用Vector3.SmoothDamp更合适:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraMover : MonoBehaviour
{
    public float moveAmount = 19.2f;
    // 平滑速率,数值越小移动越平缓,减速效果越明显
    public float smoothSpeed = 5f;
    private Vector3 targetPos;
    private bool isMoving = false;
    private Vector3 velocity = Vector3.zero;

    private void Update()
    {
        if (isMoving)
        {
            Camera.main.transform.position = Vector3.SmoothDamp(Camera.main.transform.position, targetPos, ref velocity, smoothSpeed);
            
            // 判定是否到达目标位置
            if (Vector3.Distance(Camera.main.transform.position, targetPos) < 0.01f)
            {
                Camera.main.transform.position = targetPos;
                isMoving = false;
            }
        }
    }

    public void ButtonLeft()
    {
        if (!isMoving)
        {
            targetPos = Camera.main.transform.position + new Vector3(-moveAmount, 0, 0);
            isMoving = true;
        }
    }

    public void ButtonRight()
    {
        if (!isMoving)
        {
            targetPos = Camera.main.transform.position + new Vector3(moveAmount, 0, 0);
            isMoving = true;
        }
    }
}

关键说明:

  • smoothSpeed:调整这个参数可以控制缓动的强度,数值大则移动快,减速更突兀;数值小则移动平缓,减速自然
  • 在Update中处理平滑逻辑,适配Unity的帧更新机制

额外提示

  • 两种方案都加入了移动状态判断,避免重复触发移动
  • 根据你的视差背景节奏,微调moveDuration或smoothSpeed参数,找到最适配的平滑度
  • 确保视差背景的跟随逻辑和相机平滑移动兼容,避免出现背景卡顿

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 22:42:24