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
相关产品推荐
相关产品推荐

