c# - 在 Unity 中沿其移动方向旋转对象
问题描述
我有一个 2D 对象,它简单地向前移动,直到它撞到另一个对象,其中物理材料导致对象从另一个对象反弹。
我不是最擅长绘图,但这里有一个我想要它做的说明:(球体中的箭头表示球体当前面向的方向)
我把它的物理部分写得很好,但是物理材料不会旋转游戏对象,所以实际结果看起来更像这样:
我知道你可以很容易地通过变换设置对象的旋转,但是你如何获得游戏对象的移动方向,然后将旋转设置为该方向?
解决方案
首先,你需要知道图像的局部方向应该是指向运动的方向。这取决于您的设置,并且该问题不包含足够的信息来准确了解。可能是Vector3.up
或Vector3.right
。当然,世界方向是从速度中得知的。
Vector3 worldDirectionToPointForward = rb2d.velocity.normalized;
Vector3 localDirectionToPointForward = Vector3.right;
然后,您希望围绕 z 轴旋转精灵,使局部方向指向该方向。您可以使用transform.TransformDirection
来找到球“指向”的当前方向,然后使用以下方法计算角度Vector3.SignedAngle
:
Vector3 currentWorldForwardDirection = transform.TransformDirection(
localDirectionToPointForward);
float angleDiff = Vector3.SignedAngle(currentWorldForwardDirection,
worldDirectionToPointForward, Vector3.forward);
然后,将其绕 z 轴旋转该量,使用transform.Rotate
.
transform.Rotate(Vector3.forward, angleDiff);
我会在与墙壁发生碰撞后这样做。另一种方法是将其放入 中LateUpdate
,尽管这可能会干扰其他单一行为中发生的LateUpdate
其他事情。但是,该LateUpdate
方法最容易演示,因此我将在此处进行演示:
void LateUpdate()
{
Vector3 worldDirectionToPointForward = rb2d.velocity.normalized;
Vector3 localDirectionToPointForward = Vector3.right;
Vector3 currentWorldForwardDirection = transform.TransformDirection(
localDirectionToPointForward);
float angleDiff = Vector3.SignedAngle(currentWorldForwardDirection,
worldDirectionToPointForward, Vector3.forward);
transform.Rotate(Vector3.forward, angleDiff, Space.World);
}
推荐阅读
- java - 从构造函数调用重写的方法。改用什么?
- c++ - 对 QComboBox 中的项目使用 Qt::UserRole 和 Qt::DisplayRole
- java - 正则表达式确定字符串是否包含超过 4 个数字
- android - 如何在移动设备上修复“应用程序意外停止”。应用程序统一运行,但不在 android 手机中
- .net - Bamboo 从 .../facades 中挑选一些 dll
- python - Getting final status of all radiobuttons and checkboxes at instant of window destroy
- artificial-intelligence - 为什么 Trust Region Policy Optimization 是 On-policy 算法?
- xquery - 如何修复 Marklogic 中的“服务器消息:RESTAPI-INVALIDCONTENT: (err:FOER0000) Invalid content:”?
- c# - 从 INNO 工具创建安装程序,Exe 没有运行?
- powershell - Powershell 从 SharePoint 文档库中删除文件