我正在使用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);
1条答案
按热度按时间ovfsdjhp1#
为了解决你的问题,你需要一些运动学方程,所以要学数学。
抛射体最大高度:
达到最大高度的时间:
最大射弹距离:
最大高度是起始位置和光标位置之间的增量y。最大距离是开始和光标位置之间的增量x的两倍。G是重力加速度,你可以很容易地从物理引擎中得到。
通过求解这些方程的速度分量,可以得到:
和
。由于我们可以免费获得最大距离的一半,因此我们可以将水平速度分量的公式调整为
。
现在我们可以用代码实现公式。我使用的不是d和h的两个浮点数,而是一个称为delta的
Vector2
。X轴是最大距离h的一半,Y是最大高度。除非你对重力做了一些奇怪的处理,否则g的y值很可能是负的。当你计算平方根时,这是一个问题,所以使用绝对值很重要。因为如果用户点击球的下方,代码将在根目录中失败,所以这也必须停止。由于Unity中物理学的实现方式,您可能会注意到在大距离和长投掷持续时间下的小偏差。