草庐IT

Unity3D学习 ② 物体的正常跳跃、二段跳、冲刺

林林zonzon 2023-11-20 原文

1.物体正常跳跃与二段跳

1.1 物体正常跳跃

限制物体在按下跳跃键的时候只能跳跃一次。而不是能够无限跳跃。

具体实现思路是:给地面设置标签,检测物体是否和地面碰撞。

1.1.1 地面(plane)标签设置

我们为了物体能够正常跳跃,需要给地面添加一个标签。

点击地面plane 再点击 tag 下面的AddTag选项

在AddTag页面点击➕号,创建Ground标签

创建完成后,在plane上标签中选中为Ground

 

1.1.2 物体跳跃代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Move : MonoBehaviour
{
    public float moveSpeed = 5f;
    public float rotateSpeed = 5f;
    public float jumpSpeed = 8f;
    // 判断是否在地面上
    private bool isGround = true;
    Vector3 moveAmount;
    Rigidbody rb;
    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void Update()
    {
        Vector3 moveDir = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")).normalized;
        moveAmount = moveDir * moveSpeed * Time.deltaTime;

        Vector3 targetDir = Vector3.Slerp(transform.forward, moveDir, rotateSpeed * Time.deltaTime);
        transform.rotation = Quaternion.LookRotation(targetDir);

        if (Input.GetButtonDown("Jump"))
        {
            //如果物体在地面上
            if (isGround)
            {
                //瞬移效果
                //transform.Translate(Vector3.up * Time.deltaTime * jumpSpeed);

                // 实现跳跃效果
                rb.AddForce(Vector3.up * jumpSpeed);
                // 此时物体不在地面上
                isGround = false;
            }
        }
        
    }
    private void FixedUpdate()
    {
        rb.MovePosition(rb.position + moveAmount);
    }
    // 碰撞检测
    private void OnCollisionEnter(Collision collision)
    {
        // 物体碰触到地面
         if(collision.gameObject.tag == "Ground")
        {
            // 物体在地面上
            isGround = true;
        }
    }
}

1.2 物体二段跳

二段跳的实现:新增两个变量,一个控制物体能否进行二段跳,一个监测物体是否在进行跳跃

物体进行二段跳的条件:当物体不在地面上&&物体能进行二段跳&&物体正在一段跳。

物体二段跳代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Move : MonoBehaviour
{
    // 移动速度
    public float moveSpeed = 5f;
    // 旋转速度
    public float rotateSpeed = 5f;
    // 跳跃速度
    public float jumpSpeed = 8f;
    // 是否在地上
    private bool isGround = true;
    // 物体是否能进行二段跳,因为设置为可操控,所以为public
    public bool isDoubleJump = false;
    // 物体是否在一段跳
    private bool isJump = true;
    Vector3 moveAmount;
    Rigidbody rb;
    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void Update()
    {
        Vector3 moveDir = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")).normalized;
        moveAmount = moveDir * moveSpeed * Time.deltaTime;

        Vector3 targetDir = Vector3.Slerp(transform.forward, moveDir, rotateSpeed * Time.deltaTime);
        transform.rotation = Quaternion.LookRotation(targetDir);

        if (Input.GetButtonDown("Jump"))
        {
            if (isGround)
            {
                //瞬移效果
                //transform.Translate(Vector3.up * Time.deltaTime * jumpSpeed);
                rb.AddForce(Vector3.up * jumpSpeed);
                // 物体正在一段跳
                isJump = true;
                // 物体不在地面上
                isGround = false;
            }
            // 如果物体能进行二段跳&&物体不在地面上&&物体在跳跃
            else if (isDoubleJump&&!isGround&&isJump)
            {
               // 再进行一次跳跃操作
               rb.AddForce(Vector3.up * jumpSpeed);
               // 物体不再一段跳
               isJump = false;
            }
        }
        
    }
    private void FixedUpdate()
    {
        rb.MovePosition(rb.position + moveAmount);
    }
    private void OnCollisionEnter(Collision collision)
    {
         if(collision.gameObject.tag == "Ground")
        {
            isGround = true;
        }
    }
}

此处记得打勾,物体才能进行二段跳。

 2.物体的冲刺

设置sprintSpeed 将按下冲刺键时候的物体速度更改为sprintSpeed即可。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Move : MonoBehaviour
{
    public float moveSpeed = 5f;
    public float rotateSpeed = 5f;
    public float jumpSpeed = 8f;
    public float sprintSpeed = 10f;
    private bool isGround = true;
    public bool isDoubleJump = false;
    private bool isJump = true;
    Vector3 moveAmount;
    Rigidbody rb;
    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void Update()
    {
        Vector3 moveDir = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")).normalized;
        moveAmount = moveDir * moveSpeed * Time.deltaTime;

        Vector3 targetDir = Vector3.Slerp(transform.forward, moveDir, rotateSpeed * Time.deltaTime);
        transform.rotation = Quaternion.LookRotation(targetDir);

        if (Input.GetButtonDown("Jump"))
        {
            if (isGround)
            {
                //瞬移效果
                //transform.Translate(Vector3.up * Time.deltaTime * jumpSpeed);
                rb.AddForce(Vector3.up * jumpSpeed);
                isJump = true;
                isGround = false;
            }
            else if (isDoubleJump&&!isGround&&isJump)
            {
               rb.AddForce(Vector3.up * jumpSpeed);
               isJump = false;
            }
        }
        // 按住左shift键实现冲刺效果
        if (Input.GetKey(KeyCode.LeftShift))
        {
            moveAmount = moveDir * sprintSpeed * Time.deltaTime;
        }


    }
    private void FixedUpdate()
    {
        rb.MovePosition(rb.position + moveAmount);
    }
    private void OnCollisionEnter(Collision collision)
    {
         if(collision.gameObject.tag == "Ground")
        {
            isGround = true;
        }
    }
}

有关Unity3D学习 ② 物体的正常跳跃、二段跳、冲刺的更多相关文章

  1. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  2. ruby-on-rails - 无法让 rspec、spork 和调试器正常运行 - 2

    GivenIamadumbprogrammerandIamusingrspecandIamusingsporkandIwanttodebug...mmm...let'ssaaay,aspecforPhone.那么,我应该把“require'ruby-debug'”行放在哪里,以便在phone_spec.rb的特定点停止处理?(我所要求的只是一个大而粗的箭头,即使是一个有挑战性的程序员也能看到:-3)我已经尝试了很多位置,除非我没有正确测试它们,否则会发生一些奇怪的事情:在spec_helper.rb中的以下位置:require'rubygems'require'spork'

  3. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  4. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  5. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  6. unity---接入Admob - 2

    目录1.AdmobSDK下载地址2.将下载好的unityPackagesdk导入到unity里​编辑 3.解析依赖到项目中

  7. Unity 3D 制作开关门动画,旋转门制作,推拉门制作,门把手动画制作 - 2

    Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u

  8. [Vuforia]二.3D物体识别 - 2

    之前说过10之后的版本没有3dScan了,所以还是9.8的版本或者之前更早的版本。 3d物体扫描需要先下载扫描的APK进行扫面。首先要在手机上装一个扫描程序,扫描现实中的三维物体,然后上传高通官网,在下载成UnityPackage类型让Unity能够使用这个扫描程序可以从高通官网上进行下载,是一个安卓程序。点到Tools往下滑,找到VuforiaObjectScanner下载后解压数据线连接手机,将apk文件拷入手机安装然后刚才解压文件中的Media文件夹打开,两个PDF图打印第一张A4-ObjectScanningTarget.pdf,主要是用来辅助扫描的。好了,接下来就是扫描三维物体。将瓶

  9. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  10. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

随机推荐