技术概述

物理系统,就是使自己的游戏对象像物理世界一样,受到重力,阻力,可以运动,使游戏更加真实;物理系统简化了游戏对象的编写,不再自己使用代码做重力,摩擦力等效果,可以通过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. 角色翻转错位

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

最新文章

  1. Android tween 动画 XML 梳理
  2. Nginx--&gt;基础--&gt;排错--&gt;nginx错误总结
  3. 第 6 章 贴近servlet
  4. 【MPI学习6】MPI并行程序设计模式:具有不连续数据发送的MPI程序设计
  5. easyui 表单和自定义验证扩展和js自定义返回值
  6. HTML的FORM的元素
  7. Java反射-简单应用
  8. 大数相加a+b
  9. SilverLight搭建WCF聊天室详细过程[转]
  10. Shapley值的一个应用
  11. Dotfuscator使用
  12. android 对话框全屏
  13. CentOS7 安装 hbase1.3.3
  14. 用开源项目ExpandableTextView打造可以下拉扩展的TextView
  15. 【WP8】图片压缩处理
  16. DateTimeField如何自动设置为当前时间并且能被修改 ——django日期时间字段的使用
  17. CF 798B 渣渣题
  18. 循环遍历正则验证input框内容合法性
  19. [BZOJ2809&amp;1455&amp;1367]解题报告|可并堆
  20. Django-2的路由层(URLconf)

热门文章

  1. 黏包现象、struct模块、并行与并发
  2. 学习Java Day25
  3. vue2安装sass 预编译
  4. 【KAWAKO】audiotsm-使用python对音频进行变速不变调处理
  5. Postman操作指南
  6. Invade the Mars
  7. Spring Boot学习笔记(一)----概要与入门
  8. AHOI,但是初中组,2017-2018
  9. npm -D与-S
  10. .NET 中创建录音机和播放器应用