【问题标题】:In unity 2D after applying force to a rigid body how do I make it rotate to face the direction of travel在对刚体施加力后,在 unity 2D 中,如何使其旋转以面向行进方向
【发布时间】:2022-11-21 00:46:35
【问题描述】:

这一切都是新的。我已经尝试按照我在此处找到的一些示例进行操作,但似乎都没有用。我现在拥有的最好的是

 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 示例,但似乎只是让它自由旋转。我一定是遗漏了一些非常明显的东西,所以我想在这里问一下。谢谢。

编辑: 所以我想出了一种方法来让它工作,方法是在我希望旋转的对象顶部创建另一个对象,并使用 Slerp 旋转顶部的对象,慢慢旋转到与必须捕捉的原始对象相同的位置立即由于施加力,代码很简单

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);
        

    }
}

如果有人知道更好的解决方案,请告诉我。谢谢。

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    您的游戏是 3D 还是 2D 的?你一直说它是 2D,但标签上说它是 3D,如果是 2D,你就不需要 Z 位置。如果是 3D,则必须将 rigidbody2D 更改为 rigidbody。

    【讨论】:

    • 它是二维的,对不起,我是这个网站的新手,所以可能标记有误。我没有看到只有 unity 或 unity2D 的选项,只有 unity3D