我希望实现一种创建 hoverbike 的方法。我目前悬停的代码是
readonly float yForce = 80;
Physics.Raycast(hoverbike.transform.position, Vector3.down, out hit);
Debug.Log(hit.distance);
if (hit.distance < 10 && hit.distance > 0)
{
if (hoverbike.velocity.y < 0.1)
{
hoverbike.AddForce(0, yForce, 0, ForceMode.Acceleration);
Debug.Log("applying force!");
}
}
这很有效,但效果不佳,车辆上下弹跳。我还尝试减去与自行车的y velocity
完全相同的力,但是车辆缓慢地向下漂移,并且没有上升到我想要的离地面 10 个单位的高度。我该如何实现呢?简单地抵消其当前速度很容易,但是如何使其浮动向上到所需的高度?
简单地关闭重力比不断地对抗它要容易得多;这种频繁的调整可能是你弹跳的原因。在自行车激活时,你可以把对象的y velocity
计算完全掌握在你自己手中,如下所示:
public cl Bike : MonoBehaviour
{
private Rigidbody hoverbike;
private bool isBikeActive = false;
[SerializeField] private float verticalSpeedMultiplier = 1f;
[SerializeField] private float hoverHeight = 10f;
[SerializeField] private float hoverTolerance = 0.5f;
[SerializeField] private float maximumVerticalVelocity = 10f;
private void Awake()
{
hoverbike = GetComponent<Rigidbody>();
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.Space)) { ToggleBike(); }
if (isBikeActive)
{
Physics.Raycast(hoverbike.transform.position, Vector3.down, out RaycastHit hit);
Vector3 modifiedVelocity = hoverbike.velocity;
if ((hit.distance > hoverHeight - hoverTolerance) && (hit.distance < hoverHeight + hoverTolerance))
{
modifiedVelocity.y = 0f;
}
else
{
modifiedVelocity.y = -(hit.distance - hoverHeight) * verticalSpeedMultiplier;
modifiedVelocity.y = Mathf.Clamp(modifiedVelocity.y, -maximumVerticalVelocity, maximumVerticalVelocity);
}
Debug.Log($"Distance from ground: {hit.distance}, Bike Velocity.y: {modifiedVelocity}");
hoverbike.velocity = modifiedVelocity;
}
}
private void ToggleBike()
{
isBikeActive = !isBikeActive;
hoverbike.useGravity = !isBikeActive;
}
}
现在,您的自行车将始终尝试向其下方物体上方的hoverHeight
点移动,直到它位于该点的hoverTolerance
范围内。它也将更平稳地朝着该点移动,离预期高度越远,移动速度就越快。
如果你希望自行车仍然上下摆动一点,这可以通过随着时间的推移慢慢修改hoverHeight
来实现,也许是通过使用正弦函数。
悬停(本质上)是一种视觉效果
使对撞机延伸到车辆下方,以便当它停在地面上时,自行车看起来盘旋在所需的高度。物理引擎只做物理。它不关心这些对撞机是什么,它只是希望它们以物理上的方式表现,如果这意味着下降直到到达地面,那么让它们下降直到到达地面。利用物理引擎,而不是绕过物理引擎,然后尝试解决错误
首先,施加按向下速度缩放的阻尼力,然后施加按需要向上返回的距离缩放的附加力。跟踪您在此过程中施加的力 / 加速度,并将其限制在某个常数。
readonly float yForce = 80f; // requires tuning
readonly float dampenFactor = 0.8f; // requires tuning
readonly float offsetFactor = 0.5f; // requires tuning
readonly float targetHeight = 10f
Physics.Raycast(hoverbike.transform.position, Vector3.down, out hit);
Debug.Log(hit.distance);
if (hit.distance < targetHeight && hit.distance > 0)
{
float availableForce = yForce;
// cancel out downward velocity
if (hoverbike.velocity.y < 0)
{
// Cap out upward force based on yForce
float cappedDampenForce = Mathf.Min(dampenFactor * -hoverbike.velocity.y,
availableForce);
// How much force is available for the offset?
availableForce -= cappedDampenForce;
hoverbike.AddForce(Vector3.up * cappedDampenForce, ForceMode.Acceleration);
Debug.Log("applied dampening force");
}
// Find upward force scaled by distance left to target height, and cap that amount
float cappedOffsetForce = Mathf.Min(offsetFactor * (targetHeight - hit.distance),
availableForce);
hoverbike.AddForce(Vector3.up * cappedOffsetForce, ForceMode.Acceleration);
Debug.Log("applied offset force");
}
本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处
评论列表(44条)