如何让设置为Kinematic的Rigidbody2D通过触摸实现移动?
解决Kinematic模式下Rigidbody2D无法移动的问题
嘿,别担心,新手遇到这种问题太正常啦!你的代码现在用的是AddForce()方法,但Kinematic模式的Rigidbody2D不会响应任何力的作用——这种模式下刚体完全由代码直接控制,不受物理引擎的力影响,所以AddForce()自然就失效了。
下面是适配Kinematic模式的修改版代码,既保留你的触摸控制逻辑,又能让角色和Dynamic物体正常碰撞:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Movement : MonoBehaviour { // 变量 public float moveSpeed = 5f; // 这里建议调小数值,直接设置速度不需要原有的大系数 public GameObject character; private Rigidbody2D characterBody; private float ScreenWidth; private float horizontalInput; // 存储触摸输入的方向 // 初始化 void Start() { ScreenWidth = Screen.width; characterBody = character.GetComponent<Rigidbody2D>(); // 强制设置为Kinematic模式,避免手动勾选遗漏 characterBody.isKinematic = true; // 如果不需要角色下落,把重力 scale 设为0 characterBody.gravityScale = 0f; } // 处理输入(Update适合处理输入事件) void Update() { horizontalInput = 0f; // 每次Update重置输入状态 // 遍历所有触摸点 for (int i = 0; i < Input.touchCount; i++) { Touch touch = Input.GetTouch(i); if (touch.position.x > ScreenWidth / 2) { // 触摸右半屏,向右移动 horizontalInput = 1.0f; } else if (touch.position.x < ScreenWidth / 2) { // 触摸左半屏,向左移动 horizontalInput = -1.0f; } } #if UNITY_EDITOR // 编辑器里用键盘测试 horizontalInput = Input.GetAxis("Horizontal"); #endif } // 处理物理移动(FixedUpdate适合处理物理相关操作) void FixedUpdate() { // 直接设置刚体速度,Kinematic模式下有效,同时保留y轴原有速度(比如重力) characterBody.velocity = new Vector2(horizontalInput * moveSpeed, characterBody.velocity.y); } }
关键改动说明:
- 替换
AddForce()为直接设置velocity:Kinematic刚体只会响应velocity或MovePosition()这类直接控制的方法,这样既保证移动,又能和Dynamic物体产生碰撞交互。 - 分离输入与移动逻辑:输入在
Update里处理,物理移动在FixedUpdate执行,这是Unity的最佳实践,避免帧率波动导致移动不流畅。 - 调整
moveSpeed数值:直接设置速度不需要原有的大系数(原300是给AddForce用的),建议从5左右开始测试调整。
额外检查项:
- 确保角色对象上有Collider2D组件(比如BoxCollider2D),否则无法和其他物体产生碰撞。
- 确认Rigidbody2D的
Is Kinematic选项已勾选,Gravity Scale根据游戏需求设置(平面移动就设为0)。
这样修改后,你的角色在Kinematic模式下就能正常通过触摸左右移动,同时和Dynamic物体产生碰撞啦!祝你第一款安卓游戏开发顺利😉
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

