移动端触摸实现火柴人曲线左右跳跃 现有脚本需优化
实现火柴人触摸任意区域的曲线跳跃切换
你当前的脚本依赖触摸屏幕区域来瞬间移动火柴人,要实现任意触摸触发曲线跳跃切换两侧的效果,可以按以下思路修改:
核心思路
- 预设左右两个固定位置,触摸屏幕任意区域时,切换火柴人到另一侧
- 用协程实现抛物线轨迹的平滑移动,替代瞬间位置改变
- 加一个状态锁,避免跳跃过程中重复触发
修改后的完整代码
using UnityEngine; public class StickmanJump : MonoBehaviour { // 左右两侧的目标位置(可在Inspector面板调整) [SerializeField] private Vector2 leftPos = new Vector2(-1.75f, 0); [SerializeField] private Vector2 rightPos = new Vector2(1.75f, 0); // 跳跃高度和完成跳跃的时间 [SerializeField] private float jumpHeight = 1.5f; [SerializeField] private float jumpDuration = 0.5f; // 是否正在跳跃的状态锁 private bool isJumping = false; void Update() { // 检测触摸开始事件,任意位置触摸都触发 if (Input.touchCount > 0) { Touch touch = Input.GetTouch(0); if (touch.phase == TouchPhase.Began && !isJumping) { // 判断当前位置,切换到另一侧 Vector2 targetPos = transform.position.x < 0 ? rightPos : leftPos; StartCoroutine(JumpToTarget(targetPos)); } } } // 协程实现抛物线跳跃逻辑 private IEnumerator JumpToTarget(Vector2 target) { isJumping = true; Vector2 startPos = transform.position; float elapsedTime = 0f; while (elapsedTime < jumpDuration) { elapsedTime += Time.deltaTime; // 计算进度(0到1) float progress = elapsedTime / jumpDuration; // 用正弦函数实现抛物线的高度变化(先上升后下降) float heightOffset = Mathf.Sin(progress * Mathf.PI) * jumpHeight; // 线性插值计算当前位置,加上高度偏移 Vector2 currentPos = Vector2.Lerp(startPos, target, progress); currentPos.y += heightOffset; transform.position = currentPos; yield return null; } // 确保最终位置精准落在目标点 transform.position = target; isJumping = false; } }
代码说明
- 目标位置配置:
leftPos和rightPos可以在Unity编辑器里直接调整,不用改代码 - 跳跃参数:
jumpHeight控制跳跃的最高点,jumpDuration控制跳跃的快慢,根据手感调整 - 触摸逻辑:只要检测到触摸开始,且不在跳跃状态,就触发切换跳跃
- 曲线轨迹:利用
Mathf.Sin生成抛物线的高度变化,结合线性插值实现平滑的位置过渡 - 状态锁:
isJumping避免跳跃过程中重复触发,防止位置混乱
使用注意
- 把脚本挂载到火柴人对象上
- 在Inspector面板设置好左右位置、跳跃高度和时间
- 测试时确保移动设备的触摸输入正常
内容的提问来源于stack exchange,提问作者Exby
相关产品推荐
相关产品推荐

