问题描述
我在Unity上乱七八糟,试图为基于物理的箭头创建脚本。
我的弧线正确,但在整个飞行过程中仍保持直线上升。
我正在尝试使用Quaternion.LookRotation
来根据速度(R = 0 at V = Vinitial,R = 90 at V = 0,and R = 180 at V = -Vinitial)
来更改其旋转度,但是我一直无法弄清楚我将使用什么公式。
任何帮助将不胜感激。
编辑
在回复的帮助下,我得以按预期工作。如果有人偶然发现此寻求帮助,我的最终代码将如下所示:
private void Update()
{
if (ForceSet)
{
ForceSet = false;
initialVeLocity = rb.veLocity;
EndAngleOffset = .33f * rb.veLocity.y;
}
if (stuckTarget == null)
{
Vector3 Forward;
Vector3 Upward;
if (rb.veLocity.y > 0)
{
Forward = new Vector3(rb.veLocity.x,-((-initialVeLocity.y + rb.veLocity.y - EndAngleOffset) * (-initialVeLocity.y + rb.veLocity.y - EndAngleOffset)),rb.veLocity.z);
Upward = new Vector3(0,1,0);
}
else
{
Forward = new Vector3(rb.veLocity.x,((initialVeLocity.y + rb.veLocity.y + EndAngleOffset) * (initialVeLocity.y + rb.veLocity.y + EndAngleOffset)),-1,0);
}
rb.rotation = Quaternion.LookRotation(Forward,Upward);
}
(将发射力施加到“箭头”时,ForceSet设置为true)
解决方法
如果您有权访问箭头Rigidbody
组件,则可以访问其velocity
属性,并将其rotation
设置为等于其velocity
。
我建议在使用Rigidbody
方法对Rigidbody
的变换进行修改时。这样可以确保使用Unity的物理系统正确更新值。
using UnityEngine;
public class ArrowBehaviour : MonoBehaviour
{
private Rigidbody rigidbody;
private void Awake()
{
rigidbody = GetComponent<Rigidbody>();
}
private void Update()
{
rigidbody.rotation = Quaternion.LookRotation(rigidbody.velocity,Vector3.up);
}
}
根据情况,您可能需要将Update
更改为FixedUpdate
。
编辑:
我修复了以上代码中的错误;那就是您在凌晨2点写的内容。我会再试一遍,看看是否适合您。
在理想的世界中,您将预先计算箭头的路径,以便可以对所需的箭头执行任何程序动画。
您还可以计算X旋转来代替,这会伪造效果。
using UnityEngine;
public class ArrowBehaviour : MonoBehaviour
{
[SerializeField] private float lookMagnitude = 45.0f;
[SerializeField] private float velocitySensitivity;
private Rigidbody rigidbody;
private void Awake()
{
rigidbody = GetComponent<Rigidbody>();
}
private void Update()
{
// Determine how much we want to fake the rotation by.
var lookStrength = Mathf.InverseLerp(-velocitySensitivity,velocitySensitivity,rigidbody.velocity)
var targetEulerAngles = new Vector3(
Mathf.Lerp(-lookMagnitude,lookMagnitude,lookStrength),transform.localEulerAngles.y,transform.localEulerAngles.z
);
// Rotate the transform
transform.localEulerAngles = targetEulerAngles;
// Alternatively,interpolate to the target angle.
/* transform.localEulerAngles = Vector3.Lerp(
* transform.localEulerAngles,* targetEulerAngles,* Time.deltaTime * rotationSpeed
* );
*/
}
}
,
只要获得变换旋转并将其设置为等于Quaternion.LookRotation(velocity)