Unity 2D中如何改变Rigidbody2D小球的90度移动方向
问题描述
我的游戏里的小球用Rigidbody2D组件,靠Velocity控制移动(speed设的3f)。我写了好几个旋转相关的函数,但只能让小球自己转起来,移动方向根本没变。怎么才能让小球的移动方向转90度?
相关代码:
randomX = Random.Range(-1f, 1f); randomY = Random.Range(-1f, 1f); dir = new Vector2(randomX, randomY).normalized; rb.velocity = (dir * speed);
注:因使用翻译工具,可能存在拼写错误。
解决方法
你之前只改了对象的transform旋转,那只是视觉上转了,物理移动的方向得靠改Rigidbody2D的velocity向量才行。给你两种常用的实现方式:
1. 顺着当前方向转90度
如果要让小球沿着现在的移动方向顺时针或者逆时针转90度,用Vector2的旋转特性就行:
- 顺时针转90度:新方向 =
new Vector2(当前方向.y, -当前方向.x) - 逆时针转90度:新方向 =
new Vector2(-当前方向.y, 当前方向.x)
代码示例:
// 拿顺时针转90度举例 Vector2 currentDir = rb.velocity.normalized; Vector2 newDir = new Vector2(currentDir.y, -currentDir.x).normalized; rb.velocity = newDir * speed; // 要是想让小球的朝向跟着移动方向走,同步一下旋转(可选) float angle = Mathf.Atan2(newDir.y, newDir.x) * Mathf.Rad2Deg; rb.transform.rotation = Quaternion.AngleAxis(angle, Vector3.forward);
2. 直接切到固定的90度方向
如果是要切换到上下左右这种固定的垂直/水平方向,直接定义目标向量就行:
// 比如切换到向上(也就是90度方向) Vector2 newDir = Vector2.up; rb.velocity = newDir * speed; // 同步朝向 float angle = Mathf.Atan2(newDir.y, newDir.x) * Mathf.Rad2Deg; rb.transform.rotation = Quaternion.AngleAxis(angle, Vector3.forward);
注意点
- 别光改
transform.rotation,那只是让小球看起来转了,实际移动方向还是原来的,必须改rb.velocity。 - 每次改方向后记得加
.normalized归一化,不然向量长度变了,小球速度也会跟着变。 - 要是想要平滑转向,可以用
Vector2.Lerp或者Rigidbody2D.MoveRotation配合,但直接改velocity是最直接的办法。
内容的提问来源于stack exchange,提问作者Boardwheelet
相关产品推荐
相关产品推荐

