Cc气垫和bb气垫区别: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");
}

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

(514)
程序设计基础教材:代数结构与程序设计(algebraic structure)
上一篇
Creo后处理教程:忍者形成后处理(ninjamail)
下一篇

相关推荐

  • cvt变速箱结构图解:CVT变速箱的工作原理

    CVT变速箱是一种无级变速箱,它的结构由两个部分组成:输入轴和输出轴。输入轴由发动机驱动,输出轴将变速箱的输出转移到车轮上。输入轴上安装有一个可变的滑轮,它可以改变输入轴的传动比,从而改变变速箱的输出比。另外,输入轴上还安装有一个液压系统,它可以控制滑轮的位置,从而改变输入轴的传动比。…

    2023-04-02 04:00:04
    0 46 67
  • xcode代码格式化快捷键:使用Command + I快速格式化Xcode代码

    格式化的方法格式化的方法Xcode代码格式化快捷键:Option+Command+F…

    2023-07-13 12:44:06
    0 29 92
  • cv树洞柒夜事件CV树洞中的秘密与惊奇

    cv树洞柒夜事件是一个有趣的计算机视觉活动,它提供了一种新的方式来利用计算机视觉技术来探索和发现景观。它始于2020年7月,由一群热爱计算机视觉的研究者和开发者发起,他们希望通过使用机器学习技术来探索景观中的精彩之处。cv树洞柒夜事件的目标是使用机器学习技术来探索景观中的精彩之处,并利用这些发现来改善景观设计。参与者需要使用机器学习技术来探索景观,并利用这些发现来改善景观设计。参与者可以使用Python,OpenCV,TensorFlow等技术来完成任务,并将其发布在GitHub上。…

    2023-01-09 12:42:42
    0 20 29
  • win10怎么cmd打开设置:如何在Windows 10中使用CMD打开设置

    打开“开始”菜单,点击搜索框,输入cmd,然后按下回车键。在弹出的命令提示符窗口中,输入以下代码:start ms-:…

    2023-06-07 01:59:36
    0 65 53
  • win7安装cad2020:如何在Windows 7上安装AutoCAD 2020

    从官网下载CAD 2020的安装包,并双击安装文件;按照安装向导的提示,选择安装语言、安装位置和安装类型;…

    2023-09-28 00:41:59
    0 29 77
  • java protected关键字:使用protected关键字保护类成员的优点

    示例示例关键字是java中的修饰符,它可以修饰类、变量和方法。修饰类:修饰的类只能在同一个包内被访问,如果子类继承了修饰的父类,则子类可以在不同包内访问父类的成员。…

    2023-04-18 04:45:37
    0 98 44
  • codeblocks手机版下载一款强大的跨平台编程工具

    CodeBlocks是一款免费的、开源的、跨平台的C/C++ IDE,支持多种编程语言,可以用来编写、调试和编译代码。目前CodeBlocks的手机版本只支持Android系统,而且只支持C语言,不支持C++。…

    2023-06-25 04:48:50
    0 41 61
  • go和come的区别:去吧!来吧!改变你的未来

    示例示例go和come的区别:Go是一个动词,表示“去”的意思,指的是从一个地方到另一个地方的运动。Come是一个动词,表示“来”的意思,指的是从另一个地方到当前地方的运动。…

    2023-05-25 16:09:00
    0 33 59

发表评论

登录 后才能评论

评论列表(31条)