[英]How to make my child object correctly rotate around the parent?
我以前有下面的代码,我用它来将我的 object 定位到我的 controller 上正确的模拟摇杆所在的位置(使用统一输入系统)。
public void OnAim(InputAction.CallbackContext context)
{
aimDir = context.ReadValue<Vector2>();
}
void HandleRotation()
{
if (aimDir.magnitude >= 0.5f)
{
var aimAngle = Mathf.Atan2(aimDir.y, aimDir.x) * Mathf.Rad2Deg - 90f;
rb.rotation = aimAngle;
}
}
这是通过旋转整个父级来实现的,但是我现在想保持父级 object 旋转固定,同时只围绕它旋转子级 object。 我试图重写代码:
void HandleRotation()
{
if (aimDir.magnitude >= 0.5f)
{
var aimAngle = Mathf.Atan2(aimDir.y, aimDir.x) * Mathf.Rad2Deg - 90f;
shootPoint.transform.RotateAround(transform.position, new Vector3(0, 0, 1), aimAngle);
}
}
但这使得它不断旋转,而不是平稳地朝着我的右摇杆所面对的方向旋转。 我该如何解决?
首先,在这个:
var aimAngle = Mathf.Atan2(aimDir.y, aimDir.x) * Mathf.Rad2Deg - 90f;
你的 aimAngle 不是弧度而是度数,所以我认为你应该使用
rb.rotation = Qaternion.Eualar(aimAngle);
代替
rb.rotation = aimAngle;
在你的问题中,你可以创建一个空的游戏对象,把它放在你的子对象(你想旋转)的父对象中,然后把你的孩子 object 放在这个空的 object 中。然后旋转这个空的 object。这样,你有一个旋转child object 看起来像 parent turning 并且正在绕着它转。 此外,您也等待轮换父母。
这可以通过Vector3.RotateTowards()
和localPosition
来完成。 将shootPoint
游戏 object 附加到父游戏 object,将具有以下代码的脚本附加到父游戏 object,并为脚本提供对shootPoint
的引用。
public Transform shootPoint;
public float distance = 2f;
public float speed = 5f;
private Vector3 _pos;
private Vector2 _aimDir;
public void OnAim(InputAction.CallbackContext context) =>
aimDir = context.ReadValue<Vector2>();
private void Update()
{
if (_aimDir.magnitude >= float.Epsilon)
_pos = new Vector3(_aimDir.x, 0f, _aimDir.y).normalized;
shootPoint.localPosition =
Vector3.RotateTowards(
shootPoint.localPosition,
_pos * distance,
speed * Time.deltaTime,
0f);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.