繁体   English   中英

在对刚体施加力后,在 unity 2D 中,如何使其旋转以面向行进方向

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM