unity简单物理系统

技术概述

物理系统,就是使自己的游戏对象像物理世界一样,受到重力,阻力,可以运动,使游戏更加真实;物理系统简化了游戏对象的编写,不再自己使用代码做重力,摩擦力等效果,可以通过unity设置参数完成。只需要自己写运动相关的代码

技术详述

2D物理系统组件

刚体

RigidBody2D

GetComponent<Rigidbody2D>();//返回对象挂载的刚体组件
rb.velocity;//物体的速度属性

碰撞器

collision2D

collision2D组件可以获得自己挂载的游戏对象的所有属性

物理材质

Material

可以通过设置弹力和摩檫力自定义材质

碰撞检测函数

void OnCollisionEnter2D(Collision2D collision)
{
	//当物体发生碰撞时自动调用
}

在主角中的使用

移动

Input.GetAxisRaw("Horizontal")用来监听键盘上方向键,左键为-1,右键为1

void GroundMovement()
{
    horizontalMove = Input.GetAxisRaw("Horizontal");//只返回-1,0,1
    rb.velocity = new Vector2(horizontalMove * speed + currentSpeedX, rb.velocity.y);   
}

长跳跃与短跳跃

一个2d横板游戏,核心部分就是跳跃了,由于初学unity,很多东西都不会,想要做好跳跃还是很难的。

void Jump()//最简单的跳跃
{
    if(isGround&&jumpPressed)
		rb.velocity = new Vector2(rb.velocity.x, jumpForce);
}

首先,将物体绑定rigidbody转换为物理对象,然后调用rb.velocity直接修改y轴的速度,将Jump放到FixedUpdate()方法中,将在每0.2s内执行一次,如果检测到跳跃按键,就会跳跃。

运行效果就会发现人物很缓慢的向上“平移”,然后缓慢向下“平移”,可以修改gravityscale来增加物体受重力影响,使跳跃更快,但是上升阶段和下降阶段所花的时间是一致的,手感很差,解决办法是在下落时增加加速度。

if (rb.velocity.y >= -50 && rb.velocity.y < 0)
{
	rb.velocity += Vector2.up * Physics2D.gravity.y * 2.5f * Time.deltaTime;
}
  • 如何实现长短跳跃

许多游戏,当长按按键时,角色跳的更高,短按时跳的低,最简单的实现方式则是修改“重力”,让主角在松开按键时重力增加虽然不符合物理现实,但是不同的跳跃高度可以做出更有趣的关卡

if (rb.velocity.y >= -50 && rb.velocity.y < 0)
{
	rb.velocity += Vector2.up * Physics2D.gravity.y * 2.5f * Time.deltaTime;
}
//假设c是跳跃键
//当松开c时角色快速下落,用这种方式可以实现长短跳跃
else if (rb.velocity.y > 0 && !Input.GetKey(KeyCode.C))
{
	rb.velocity += Vector2.up * Physics2D.gravity.y * 2.5f * Time.deltaTime;
}

二段跳

二段跳就是加一个跳跃次数来控制

void BetterJump()//跳跃
{
    if (isGround)
    {
        jumpCount = 2;//可跳跃数量
    }
    if (jumpPressed && isGround)//一段跳
    {
        rb.velocity = new Vector2(rb.velocity.x, jumpForce);
        jumpCount--;
        jumpPressed = false;
    }
    else if (jumpPressed && jumpCount > 0 )//二段跳
    {
        if (doubleJumpAble)
            rb.velocity = new Vector2(rb.velocity.x, jumpForce);
        jumpCount--;
        jumpPressed = false;
    }
   
}

攀爬(蹬墙跳)

蹬墙跳和跳跃相似,唯一的区别是角色需要加一个水平速度。

由于方向键也会更新角色速度,如果直接设置速度,就会立即被更新,就蹬墙的水平速度会被覆盖,所以新创建一个变量currentspeed,角色速度=currentspeed+speed,speed受方向键控制,currentspeed通过代码每帧减少至0

rb.velocity = new Vector2(speedX, jumpForce);
if (transform.localScale.x > 0)
{
    currentSpeedX = speedX * 1;
}
else
{
    currentSpeedX = speedX * -1;
}

技术使用中遇到的问题和解决过程

  1. 角色一顿一顿的移动,不流畅

    Update()方法的执行时间间隔不是固定的,如果想要流畅移动,需要speed * Time.deltaTime;,Time.deltaTime获得当前帧的时间

  2. 角色翻转错位

    控制角色移动时需要控制父对象,父对象移动时会修改子对象位置,但是修改子对象位置时不会影响父对象

posted @ 2021-06-26 11:32  繁星se  阅读(351)  评论(0编辑  收藏  举报