Unity C#技术问询:按指定步数将物体移向目标点
Unity实现按指定步数移动物体到目标点
核心思路
不用手动创建大量路径点,利用**向量线性插值(Lerp)**就能直接计算出对应步数的位置——本质是把起点到终点的距离按总步数拆分成比例,输入的步数占总步数的百分比就是物体在路径上的进度。
实现步骤
1. 编写控制脚本
创建一个C#脚本(比如命名为StepMover),挂载到需要移动的物体上:
using UnityEngine; using UnityEngine.UI; public class StepMover : MonoBehaviour { public Transform startPoint; // 路径起点(拖拽场景中的物体赋值) public Transform endPoint; // 路径终点(拖拽场景中的物体赋值) public int totalSteps = 100; // 总步数(默认设为100) public float moveSpeed = 3f; // 平滑移动速度(可选,瞬间移动可删除) public InputField stepInputField; // 输入步数的UI输入框(拖拽赋值) private Vector3 _targetPosition; void Start() { // 初始位置设为起点 transform.position = startPoint.position; _targetPosition = startPoint.position; } void Update() { // 平滑移动到目标位置(不需要平滑的话可以删掉这个Update逻辑) transform.position = Vector3.MoveTowards(transform.position, _targetPosition, moveSpeed * Time.deltaTime); } // 绑定到UI按钮的点击事件,点击后移动到指定步数 public void MoveToAssignedStep() { // 处理输入无效的情况 if (!int.TryParse(stepInputField.text, out int targetStep)) { Debug.Log("请输入有效的步数数值"); return; } if (totalSteps <= 0) { Debug.Log("总步数不能为0"); return; } // 计算进度比例,限制在0-1之间(防止步数超出范围) float progress = Mathf.Clamp01((float)targetStep / totalSteps); // 计算目标位置 _targetPosition = Vector3.Lerp(startPoint.position, endPoint.position, progress); } }
2. 场景设置
- 在场景中创建两个空物体,分别命名为
StartPoint和EndPoint,拖拽到脚本对应的startPoint和endPoint字段。 - 添加一个UI输入框(InputField)和按钮(Button),把输入框拖拽到脚本的
stepInputField字段,然后给按钮绑定StepMover脚本的MoveToAssignedStep方法。
3. 测试运行
- 设置总步数(比如100),在输入框中输入步数(比如50),点击按钮,物体就会移动到路径中间位置并停留。
注意事项
- 如果需要瞬间到位,直接把Update里的平滑移动逻辑删掉,在
MoveToAssignedStep里直接给transform.position赋值即可。 - 2D场景下,把
Vector3换成Vector2,对应位置用transform.position的x/y轴即可。 - 用
Mathf.Clamp01确保输入的步数超出范围时(比如输入150),物体只会停在终点位置;输入负数则停在起点。
内容的提问来源于stack exchange,提问作者Mr.Kees
相关产品推荐
相关产品推荐

