[英]In unity 2D after applying force to a rigid body how do I make it rotate to face the direction of travel
这一切都是新的。 我已经尝试按照我在此处找到的一些示例进行操作,但似乎都没有用。 我现在拥有的最好的是
rb.transform.up = rb.GetComponent<Rigidbody2D>().velocity.normalized;
但这会使刚体立即旋转到新的行进方向。 有没有办法让它旋转得更慢而不是在一帧中跳到新的行进方向?
任何帮助,将不胜感激:)
这是我用来施加力的代码,如果重要的话? 我是从一个教程中得到的,该教程基于拖动鼠标来施加力
public class DragNShoot : MonoBehaviour
{
public float power = 10f;
public Rigidbody2D rb;
public Vector2 minPower;
public Vector2 maxPower;
public TrajectoryLine tl;
Camera cam;
Vector2 force;
Vector3 startPoint;
Vector3 endPoint;
public void Start()
{
cam = Camera.main;
tl = GetComponent<TrajectoryLine>();
}
public void Update()
{
if (Input.GetMouseButtonDown(0))
{
startPoint = cam.ScreenToWorldPoint(Input.mousePosition);
startPoint.z = 15;
}
if (Input.GetMouseButton(0))
{
Vector3 currentPoint = cam.ScreenToWorldPoint(Input.mousePosition);
currentPoint.z = 15;
tl.RenderLine(startPoint, currentPoint);
}
if (Input.GetMouseButtonUp(0))
{
endPoint = cam.ScreenToWorldPoint(Input.mousePosition);
endPoint.z = 15;
force = new Vector2(Mathf.Clamp(startPoint.x - endPoint.x, minPower.x, maxPower.x), Mathf.Clamp(startPoint.y - endPoint.y, minPower.y, maxPower.y));
rb.AddForce(force * power, ForceMode2D.Impulse);
tl.EndLine();
}
}
}
这是轮换的脚本
public class FaceDirectionOfTravel : MonoBehaviour
{
public Rigidbody2D rb;
// Update is called once per frame
void Update()
{
rb.transform.up = rb.GetComponent<Rigidbody2D>().velocity.normalized;
}
}
如您所见,我刚刚获取了速度并将其应用于旋转,我猜这只是立即更改它以匹配,但我希望它明显旋转以匹配旋转。 我已经尝试了一些我在这里看到的 Slerp 示例,但似乎只是让它自由旋转。我一定是遗漏了一些非常明显的东西,所以我想在这里问一下。 谢谢。
编辑:所以我已经找到了一种方法来让它工作,方法是在我希望旋转的 object 之上创建另一个 object 并使用 Slerp 旋转顶部的 object 以缓慢旋转到与原始 object 相同的位置由于施加力而立即捕捉代码很简单
public class RotateSprite : MonoBehaviour
{
[SerializeField] private Rigidbody2D rbOfTarget;
[SerializeField] private Rigidbody2D rb;
private void Start()
{
}
// Update is called once per frame
void Update()
{
rb.transform.position = rbOfTarget.transform.position;
rb.transform.rotation = Quaternion.Slerp(rb.transform.rotation, rbOfTarget.transform.rotation, 30* Time.deltaTime);
}
}
如果有人知道更好的解决方案,请告诉我。 谢谢。
你的游戏是3D还是2D的? 你一直说它是二维的,但标签上说它是 3D,如果是二维的,你就不需要 Z position。如果它在 3D 中,你就必须将 rigidbody2D 更改为刚体。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.