气垫bb霜和气垫cc霜的区别: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 个单位的高度。我该如何实现呢?简单地抵消其当前速度很容易,但是如何使其浮动向上到所需的高度?

1

简单地关闭重力比不断地对抗它要容易得多;这种频繁的调整可能是你弹跳的原因。在自行车激活时,你可以把对象的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来实现,也许是通过使用正弦函数。

1

悬停(本质上)是一种视觉效果

使对撞机延伸到车辆下方,以便当它停在地面上时,自行车看起来盘旋在所需的高度。物理引擎只做物理。它不关心这些对撞机是什么,它只是希望它们以物理上的方式表现,如果这意味着下降直到到达地面,那么让它们下降直到到达地面。利用物理引擎,而不是绕过物理引擎,然后尝试解决错误

1

首先,施加按向下速度缩放的阻尼力,然后施加按需要向上返回的距离缩放的附加力。跟踪您在此过程中施加的力 / 加速度,并将其限制在某个常数。

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");
}

本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处

(899)
Cod重铬酸盐法:为Blackberry生成COD文件
上一篇
Hpp和cpp:谷物 C++错误未解决的外部符号 cpphpp问题
下一篇

相关推荐

  • docker游戏服务器:如何使用Docker搭建高性能的游戏服务器

    Docker游戏服务器是一种将游戏服务器部署到容器中的方式,它可以帮助游戏开发者快速、轻松地部署游戏服务器,并且可以更轻松地扩展游戏服务器的容量。…

    2023-04-27 09:55:33
    0 42 62
  • win7玩cf卡顿怎么解决:解决Win7环境下CF游戏卡顿问题

    尝试更新系统:可能是由于系统缺少某些补丁或者更新导致CF卡顿,可以尝试在Windows Update中进行检查更新,并安装最新的补丁和更新。更新显卡驱动:可能是由于显卡驱动过旧或者不兼容导致CF卡顿,可以尝试更新显卡驱动,可以到显卡厂商官网下载最新的驱动进行安装。…

    2023-05-27 11:45:17
    0 20 19
  • cv糖醋排骨是弯的吗弯曲的美味

    cv糖醋排骨不是弯的,它是一种制作方法,通常用来制作排骨。代码:…

    2023-04-01 13:03:36
    0 53 19
  • java ee eclipse使用:如何使用Java EE Eclipse来开发Web应用

    示例示例Java EE Eclipse使用步骤:安装Eclipse IDE。…

    2023-10-12 04:51:32
    0 96 81
  • cookie如何使用:如何使用Cookie来改善用户体验

    Cookie是一种存储在客户端的小型文件,用于记录用户的信息,如访问时间、登录状态等。使用Cookie可以更好地为用户提供服务,比如保存用户的登录状态,记录用户的浏览历史记录等。…

    2023-05-07 02:18:11
    0 75 61
  • cv小敢:如何利用CV小敢提升职业技能?

    cv小敢(Computer Vision Tiny-YOLO)是一种轻量级的物体检测算法,它可以在资源受限的设备上运行,如嵌入式设备、智能手机等。它是基于YOLO(You Only Look Once)算法的一个变体,由Joseph Redmon和Ali Farhadi开发,旨在提高深度学习模型的性能,同时减少模型的大小和计算复杂度。…

    2023-02-09 13:08:59
    0 67 92
  • ubuntu如何编译c语言:在Ubuntu上编译C语言程序的步骤

    示例示例Ubuntu编译C语言的步骤如下:安装gcc编译器:…

    2023-09-08 12:39:20
    0 96 67
  • coremail论客邮箱Coremail论客邮箱

    Coremail论客邮箱是一款专业的企业邮箱服务,可以满足企业对安全、可靠性和高效性的要求。它拥有强大的安全性能,可以提供多种安全保护,包括防止邮件被窃取、拦截恶意邮件、防止跨站脚本攻击等。此外,它还支持多种企业级功能,如组织架构管理、收发邮件管理、文件共享管理、联系人管理等,可以帮助企业提高工作效率,提升企业形象。…

    2023-02-25 04:36:55
    0 43 46

发表评论

登录 后才能评论

评论列表(83条)