Unity2D_角色移动跳跃

2024-01-30 16:36
文章标签 跳跃 角色 移动 unity2d

本文主要是介绍Unity2D_角色移动跳跃,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

水平移动

Rigidbody2D

使用Unity自带的刚体组件,通过修改刚体物品中Rigidbody2D的属性velocity速度来实现物体移动

  1. 声明Rigidbody2D属性,以及角色移动速度

    public float playerSpeed = 5f;
    private Rigidbody2D rigidbody2D;
    
  2. 在Start方法中将rigidbody2D绑定上物体的对应组件

    void Start()
    {rigidbody2D = GetComponent<Rigidbody2D>();
    }
    
  3. 读取键盘,并修改rigidbody2D的velocity,以实现移动

    private void move()
    {//读取键盘的水平方向输入//这里hotizontal的取值为[-1,1],根据按键时长变化float horizontal = Input.GetAxis("Horizontal");//修改rigidbody2D的速度,这里只修改水平方向速度,竖直方向保持原状rigidbody2D.velocity = new Vector2(horizontal*playerSpeed, rigidbody2D.velocity.y);
    }
    

    GetAxisRaw()的返回值就只有1和-1,不是线性变化

    可以通过上述方法修改角色朝向,修改transform.localScale即可实现角色翻转

    float forward = Input.GetAxisRaw("Horizontal");
    if (forward != 0)
    {transform.localScale = new Vector3(transform.localScale.x * forward, transform.localScale.y, transform.localScale.z);
    }
    
  4. 将我们自定义的方法在Update()中调用即可

    void Update()
    {move();
    }
    

Transform

直接利用sprite的transform中的position属性,直接在该属性的基础上加上一个new Vector3即可

//获取键盘水平输入
float horizontal = Input.GetAxisRaw("Horizontal");
//在本身位置基础上向量位移
transform.position = transform.position + new Vector3(horizontal * playerSpeed * Time.deltaTime, 0, 0);

其中Time.deltaTime是帧之间间隔的时间(由于这里是直接改变物体位置,Update()是每帧执行一次,乘上后代表每秒移动的距离

transform有2个position相关的属性:

  1. position:世界坐标系下物体的坐标
  2. localPosition:父坐标系下物体的坐标

跳跃

跳跃实现

这里同样使用Rigidbody2D来实现角色的跳跃

在给物体施加有重力的情况下,给物体施加一个向上的初速度,同时要考虑到角色的跳跃判定,即接触到地面时才能进行跳跃

  1. 定义物体跳跃的初速度

    public float jumpSpeed = 5f
    
  2. 给物体设定跳跃次数

    //初始设定的跳跃次数
    public int jumpTimes;
    //Player还能跳跃的次数
    private int canJump;void Start()
    {//初始Player在空中,可将跳跃次数赋为0canJump = 0;
    }
    
  3. 判断物体是否还在地面上

    //Player落地,跳跃次数重置
    private void OnCollisionEnter2D(Collision2D collision)
    {if(collision.gameObject.layer == 3){canJump = jumpTimes;}
    }//Player离开地面,跳跃次数相应减一(跳离地面不算)
    private void OnCollisionExit2D(Collision2D collision)
    {if (collision.gameObject.layer == 3 && rigidbody2D.velocity.y<=0){canJump--;}
    }
    

    layer==3是根据在unity的Layer中设置的3为Ground并将地面都设为Ground

  4. 检测到跳跃键,给物体施加向上的初速度

    private void jump()
    {//判断是否按下空格bool isJump = Input.GetKeyDown(KeyCode.Space);//能跳且还有跳跃次数if(isJump && canJump>0){//给个跳跃初速度rigidbody2D.velocity = new Vector2(rigidbody2D.velocity.x, jumpSpeed);//跳跃次数-1canJump--;}
    }
    
  5. 在Update()中调用jump()函数即可

    void Update()
    {jump();
    }
    

注意,实际游戏场景中有的墙会有摩擦导致物体挂在墙上

新建一个Physics Material 2D将摩擦调为0即可

手感优化

2D横版跳跃闯关游戏中最经典的就是马里奥了,通过某UP分析了马里奥的跳跃方式后发现:

  1. 马里奥的跳跃会根据按键时间的长短来控制跳跃的高度
  2. 马里奥上升与下降的帧数对比,大约是18:10

因此,可以根据这些分析得出以下优化思路:

  1. 跳跃实现时给的是初速度,跳跃高度无非就是由加速度决定,而在无附加情况下加速度只由重力决定。因此,可以根据是否按住按键为角色附加向上的加速度(抵消部分重力加速度带来的减速),以此增加角色的跳跃高度。
  2. 下落时比上升时要快,同样可以给下落时增加一个加速度,使物体能够快速下落。
  3. 如果觉得物体滞空时间太长,可以考虑增加物体的初速度,并增大全局重力(Project Settings -> Physics 2D -> Gravity),使跳跃高度不变的情况下滞空时间减少

示例:

//跳跃初速度
public float jumpSpeed = 8f;
//初始设定的跳跃次数
public int jumpTimes;
//Player还能跳跃的次数
private int canJump;
//上升时抵消几倍的重力加速度
public float upAddAce = 0.5f;
//下降时附加几倍重力加速度
public float fallAddAce = 1.0f;private void jump()
{//判断是否按下空格bool isJump = Input.GetKeyDown(KeyCode.Space);//能跳且还有跳跃次数if(isJump && canJump>0){//给个跳跃初速度rigidbody2D.velocity = new Vector2(rigidbody2D.velocity.x, jumpSpeed);//跳跃次数-1canJump--;}//判断是否按住空格bool holdJump = Input.GetKey(KeyCode.Space);//按住空格且物体在上升状态则附加一个向上的加速度if (holdJump && rigidbody2D.velocity.y > 0){rigidbody2D.velocity += Vector2.down * Physics2D.gravity.y * upAddAce * Time.deltaTime;}//物体在下落时,附加向下加速度if(rigidbody2D.velocity.y < 0){rigidbody2D.velocity += Vector2.up * Physics2D.gravity.y * fallAddAce * Time.deltaTime;}
}

这篇关于Unity2D_角色移动跳跃的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/660864

相关文章

我在移动打工的日志

客户:给我搞一下录音 我:不会。不在服务范围。 客户:是不想吧 我:笑嘻嘻(气笑) 客户:小姑娘明明会,却欺负老人 我:笑嘻嘻 客户:那我交话费 我:手机号 客户:给我搞录音 我:不会。不懂。没搞过。 客户:那我交话费 我:手机号。这是电信的啊!!我这是中国移动!! 客户:我不管,我要充话费,充话费是你们的 我:可是这是移动!!中国移动!! 客户:我这是手机号 我:那又如何,这是移动!你是电信!!

用Unity2D制作一个人物,实现移动、跳起、人物静止和动起来时的动画:中(人物移动、跳起、静止动作)

上回我们学到创建一个地形和一个人物,今天我们实现一下人物实现移动和跳起,依次点击,我们准备创建一个C#文件 创建好我们点击进去,就会跳转到我们的Vision Studio,然后输入这些代码 using UnityEngine;public class Move : MonoBehaviour // 定义一个名为Move的类,继承自MonoBehaviour{private Rigidbo

简单的角色响应鼠标而移动

actor类 //处理移动距离,核心是找到角色坐标在世界坐标的向量的投影(x,y,z),然后在世界坐标中合成,此CC是在地面行走,所以Y轴投影始终置为0; using UnityEngine; using System.Collections; public class actor : MonoBehaviour { public float speed=0.1f; CharacterCo

物联网之流水LED灯、正常流水灯、反复流水灯、移动流水灯

MENU 硬件电路设计软件程序设计正常流水LED灯反复流水LED灯移动流水LED灯 硬件电路设计 材料名称数量直插式LED1kΩ电阻杜邦线(跳线)若干面包板1 每一个LED的正极与开发板一个GPIO引脚相连,并串联一个电阻,负极接GND。 当然也可以选择只使用一个电阻。 软件程序设计 正常流水LED灯 因为要用到多个GPIO引脚,所以最好把所有的GPI

12C 新特性,MOVE DATAFILE 在线移动 包括system, 附带改名 NID ,cdb_data_files视图坏了

ALTER DATABASE MOVE DATAFILE  可以改名 可以move file,全部一个命令。 resue 可以重用,keep好像不生效!!! system照移动不误-------- SQL> select file_name, status, online_status from dba_data_files where tablespace_name='SYSTEM'

《C++中的移动构造函数与移动赋值运算符:解锁高效编程的最佳实践》

在 C++的编程世界中,移动构造函数和移动赋值运算符是提升程序性能和效率的重要工具。理解并正确运用它们,可以让我们的代码更加高效、简洁和优雅。 一、引言 随着现代软件系统的日益复杂和对性能要求的不断提高,C++程序员需要不断探索新的技术和方法来优化代码。移动构造函数和移动赋值运算符的出现,为解决资源管理和性能优化问题提供了有力的手段。它们允许我们在不进行不必要的复制操作的情况下,高效地转移资源

创建一个大的DIV,里面的包含两个DIV是可以自由移动

创建一个大的DIV,里面的包含两个DIV是可以自由移动 <body>         <div style="position: relative; background:#DDF8CF;line-height: 50px"> <div style="text-align: center; width: 100%;padding-top: 0px;"><h3>定&nbsp;位&nbsp;

九、我们应当怎样做需求分析:功能角色分析与用例图

在我们进行一系列需求调研工作的同时,我们的需求分析工作也开始启动了。需求调研与需求分析工作应当是相辅相伴共同进行的。每次参加完需求调研回到公司,我们就应当对需求调研的成果进行一次需求分析。当下一次开始进行需求调研时,我们应当首先将上次需求分析的结果与客户进行确认,同时对需求分析中提出的疑问交给客户予以解答。这就是一个需求捕获->需求整理->需求验证->再需求捕获的过程。  但是,当我们经

C# 通过拖控件移动窗体

目录 引言一、通过控件事件移动窗体1、创建窗体界面2、添加控件事件3、添加代码 二、通过windowsAPI移动窗体1、 构建窗体和添加事件2、代码展示 引言 在C#Form窗体设计中,如果我们不需要使用默认边框设计自己个性化的窗体(FromBorderStyle=none时),这时候你会发现拖动窗体的功能就没有了,这里需要自己构建方法让用户可以拖动整个窗体,这里我们使用前辈的

网络层 VII(IP多播、移动IP)【★★★★★★】

一、IP 多播 1. 多播的概念 多播是让源主机一次发送的单个分组可以抵达用一个组地址标识的若干目的主机,即一对多的通信。在互联网上进行的多播,称为 IP 多播(multicast , 以前曾译为组播)。 与单播相比,在一对多的通信中,多播可大大节约网络资源。假设视频服务器向 90 台主机传送同样的视频节目,单播与多播的比较如下图所示。 下图(a)是视频服务器用单播方式向 90 台主机传