Unity中物体被玩家碰撞后未移动至代码设定坐标如何解决
问题排查与解决步骤
- 确认脚本挂载对象是否正确
代码中transform.position修改的是脚本挂载物体的坐标,如果你想要移动隐形方块,请确保脚本挂在隐形方块对象上,而非玩家对象。如果脚本错挂到玩家身上,修改的就会是玩家坐标,而非方块坐标。
额外提示:你的函数名movePlayer语义是移动玩家,如果你实际要移动的是隐形方块,建议修改函数名避免后续逻辑混淆。 - 排查是否有其他逻辑修改物体坐标
在movePlayer方法中添加日志代码,确认赋值操作是否生效,以及赋值后坐标是否被其他逻辑覆盖:
运行后触发碰撞查看控制台输出:void movePlayer() { Vector3 targetPos = new Vector3(19.5f, 45.478f, 11f); Debug.Log("赋值前坐标:" + transform.position + ",目标坐标:" + targetPos); transform.position = targetPos; Debug.Log("赋值后立刻坐标:" + transform.position); }- 如果赋值后立刻的坐标就是错误的,说明赋值逻辑本身有问题,继续往下排查
- 如果赋值后立刻坐标正确,过一帧后变成错误坐标,说明有其他脚本/组件在修改该物体的位置,可以搜索项目中所有修改该物体
transform.position/transform.localPosition的代码逐一排查
- 检查物体是否挂载了Rigidbody刚体组件
如果你的隐形方块添加了刚体组件,直接修改transform.position会和Unity物理系统的计算冲突,导致坐标被物理引擎修正到错误位置,需要改成刚体的位置赋值方式:MeshRenderer visibility; Rigidbody rb; void Start() { visibility = GetComponent<MeshRenderer>(); visibility.enabled = false; rb = GetComponent<Rigidbody>(); } void movePlayer() { Vector3 targetPos = new Vector3(19.5f, 45.478f, 11f); // 清空刚体速度避免物理干扰 rb.velocity = Vector3.zero; rb.angularVelocity = Vector3.zero; rb.MovePosition(targetPos); } - 确认坐标类型是否匹配需求
代码中transform.position是世界坐标,如果你预期的19.5/45.478/11是相对于父物体的局部坐标,请把赋值语句改成transform.localPosition = new Vector3(19.5f, 45.478f, 11f);
内容的提问来源于stack exchange,提问作者Binnsy
相关产品推荐
相关产品推荐

