unity3d 以光标为顶点在抛物线中跳跃

bmp9r5qi  于 2023-05-01  发布在  其他
关注(0)|答案(1)|浏览(176)

我正在使用unity,我试图让一个对象(一个带有2D刚体和盒子碰撞器的球)以完美的抛物线跳跃,弧线的顶点是光标的位置。
我已经到了球会跳向正确的方向和东西的地步,但我不能想出如何让它波动的力量适当的基础上光标的位置。我试过几种不同的方法,这是我最接近的方法。有人能帮帮我吗?

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ballController : MonoBehaviour
{
    private bool isJumping = false;
    private Vector2 startPos;
    private Vector2 endPos;  
    private Vector2 vertex;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
        rb.gravityScale = 1.25f;
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0) && !isJumping)
        {

            startPos = rb.position;

            Vector2 cursorPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            
            vertex = new Vector2((startPos.x + cursorPosition.x) / 2f, Mathf.Max(startPos.y, cursorPosition.y) + 1f);

            endPos.y = startPos.y;
            endPos.x = startPos.x + (vertex.x * 2);

            Vector2 direction = startPos - vertex;
            float distance = Mathf.Clamp(Vector2.Distance(vertex, startPos), 0f, 1.5f);
            float forceMagnitude = distance * -500f;

            rb.AddForce((direction.normalized * forceMagnitude), 0f);
ovfsdjhp

ovfsdjhp1#

为了解决你的问题,你需要一些运动学方程,所以要学数学。
抛射体最大高度:

达到最大高度的时间:

最大射弹距离:

最大高度是起始位置和光标位置之间的增量y。最大距离是开始和光标位置之间的增量x的两倍。G是重力加速度,你可以很容易地从物理引擎中得到。
通过求解这些方程的速度分量,可以得到:



。由于我们可以免费获得最大距离的一半,因此我们可以将水平速度分量的公式调整为


现在我们可以用代码实现公式。我使用的不是d和h的两个浮点数,而是一个称为delta的Vector2。X轴是最大距离h的一半,Y是最大高度。除非你对重力做了一些奇怪的处理,否则g的y值很可能是负的。当你计算平方根时,这是一个问题,所以使用绝对值很重要。因为如果用户点击球的下方,代码将在根目录中失败,所以这也必须停止。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BallController : MonoBehaviour
{
  private Rigidbody2D rb;
  private bool isJumping;

  void Start()
  {
    rb = GetComponent<Rigidbody2D>();
    rb.gravityScale = 1.25f;
  }

  void FixedUpdate()
  {
    if (Input.GetMouseButtonDown(0) && !isJumping)
    {
      Vector2 cursorPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
      Vector2 delta = cursorPosition - rb.position;
      if (delta.y < 0)
      {
        isJumping = true;
        float adjustedGravity = Mathf.Abs(Physics2D.gravity.y) * rb.gravityScale;
        Vector2 velocity = Vector2.zero;

        velocity.y = Mathf.Sqrt(2 * delta.y * adjustedGravity);
        velocity.x = (delta.x * adjustedGravity) / velocity.y;
        rb.velocity = velocity;
      }
    }
  }
}

由于Unity中物理学的实现方式,您可能会注意到在大距离和长投掷持续时间下的小偏差。

相关问题