c# - Unity - 通过抵消重力创造一辆气垫车
问题描述
我希望实现一种创建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 class 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
推移慢慢修改来实现,也许通过使用正弦函数。
推荐阅读
- php - 我第一次调用控制器并通过路由查看,但它显示这样的错误
- mongodb - 循环内的mongodb insertOne
- awk - 使用 wget/curl 命令从 Nexus Repository Manager OSS 3.30.0-01 下载最新的快照工件
- java - 如何在 Java 中更新/修改文件时读取文件?
- c++ - (C++) 从文件输出问题中读取用户名和密码
- live-streaming - 如何获得通过 pi 控制器连接的触摸屏的实时屏幕视图
- acumatica - 在 Acumatica 中通过 SubID 链接 GLTranR 和 SeegmentValue
- asp.net-web-api - IIS 10.5 不在 HTTP 请求中传输编码块(上传操作)
- c# - 表格 td 单元格超出并移至 pdf 的下一行,excel 将其放在新行单元格上,同时使用 aspose.pdf 将 pdf 转换为 excel
- vb.net - 如何在 DataGridView 中显示圆形图像?