技术概述

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

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

unity简单物理系统的更多相关文章

  1. Unity的物理材质

    Physic Materials资源包 在Unity中的项目导入Unity自带的资源包 Physic Materials,自带的资源包有不同种类的物理材质: Bouncy:有弹性的 Ice:结冰 Me ...

  2. 1.物理系统PhysicsWorld,RayCast

     1 3.0物理系统PhysicsWorld T07PhysicsWorld.h #ifndef __T07PhysicsWorld_H__ #define __T07PhysicsWorld_H ...

  3. 关于Unity中物理引擎的使用

    物理引擎控制刚体,刚体上面贴上图片,所以看起来就是游戏运行起来的状态 物理世界计算刚体的运行状态,通过贴图显现出运算结果. 一.物理引擎 1:Unity 2D物理引擎基于Box2D封装而成;2: 物理 ...

  4. Atitit 游戏引擎---物理系统(1)------爆炸效果

    Atitit 游戏引擎---物理系统(1)------爆炸效果 1.1. 动画框架的来源flex,jqueryuijs,anim , cocos2d 1 1.2. Jqueryui的特效库 1 1.3 ...

  5. .Net简单图片系统-简介

    系统简介 最近做了一个简单图片系统,这个系统就是 将上传的的图片保存到系统本地文件系统或者基于fastdfs的分布式文件系统中,在查看图片时会直接请求此系统或者fastdfs的tracker服务器(需 ...

  6. 用Qt写软件系列三:一个简单的系统工具(上)

    导言 继上篇<用Qt写软件系列二:QIECookieViewer>之后,有一段时间没有更新博客了.这次要写的是一个简单的系统工具,需求来自一个内部项目.功能其实很简单,就是查看当前当前系统 ...

  7. 使用Struts2和jQuery EasyUI实现简单CRUD系统(转载汇总)

    使用Struts2和jQuery EasyUI实现简单CRUD系统(一)——从零开始,ajax与Servlet的交互 使用Struts2和jQuery EasyUI实现简单CRUD系统(二)——aja ...

  8. Ubuntu学习笔记-win7&Ubuntu双系统简单搭建系统指南

    win7&Ubuntu双系统简单搭建系统指南 本文是自己老本子折腾Ubuntu的一些记录,主要是搭建了一个能够足够娱乐(不玩游戏)专注练习自己编程能力的内容.只是简单的写了关于系统的安装和一些 ...

  9. python实现简单购物车系统(练习)

    #!Anaconda/anaconda/python #coding: utf-8 #列表练习,实现简单购物车系统 product_lists = [('iphone',5000), ('comput ...

  10. 学习笔记:Vue+Node+Mongodb 构建简单商城系统(二)

    前面几个月工作有点忙,导致构建简单商城系统的计划搁置近三个月.现在终于有时间重新回过头来继续本计划.本篇主要记录自己在阿里云服务器上搭建node运行环境的整个过程,以及对其中遇到的一些问题的思考. 一 ...

随机推荐

  1. 《自定义工作流配置,springboot集成activiti,前端vue,完整版审批单据》

    前言 activiti工作流引擎项目,企业erp.oa.hr.crm等企事业办公系统轻松落地,一套完整并且实际运用在多套项目中的案例,满足日常业务流程审批需求. 一.项目形式 springboot+v ...

  2. 线程基础知识11-CAS+自旋锁

    1.CAS是什么(CompareAndSet) CAS(Compare and swap)比较和替换是设计并发算法时用到的一种技术.简单来说,比较和替换是使用一个期望值和一个变量的当前值进行比较,如果 ...

  3. 云萌 V2.6.3.0 win10,win11 Windows永久激活工具

    Windows如果一直不激活,其实用起来问题也不大,除了无法修改壁纸.颜色.锁屏.主题以及无法使用微软账号的同步功能等之外,绝大多数的基本功能都可以正常使用.不过该激活还是得激活的.别的不说,就桌面右 ...

  4. ColorFolder文件管理工具使用教程

    ColorFolder ColorFolder Mac中文版是Mac上的一款文件夹图标修改工具,可以帮助您一键改变文件夹的颜色.帮助你更好的保持良好排序和分类,让你的文件显得更有条理,并有效提高文件管 ...

  5. CSS常用属性(2)

    (4) position(定位) fixed 一般用来写网页顶端的固定导航条,或者两侧的菜单. <!--对于块级标签来说加上position:fixed之后,该div就不会占一整行,一般需要手动 ...

  6. SQL性能优化的47个小技巧,你了解多少?

    大家好,我是哪吒. 1.先了解MySQL的执行过程 了解了MySQL的执行过程,我们才知道如何进行sql优化. 客户端发送一条查询语句到服务器: 服务器先查询缓存,如果命中缓存,则立即返回存储在缓存中 ...

  7. 2021级《JAVA语言程序设计》上机考试试题4

    现在就是写学生,学生查看个人信息,,修改个人密码,学生功能页的页面,代码最一开始给了 然后,这三个比较紧密,所以一起写了 学生功能页 <%@ page language="java&q ...

  8. dataset的基本使用

    在折线图(柱状.散点图类似)中使用 案例一(默认方式) let option={ dataset:{ source:[ ["1","2","3&quo ...

  9. Centos7搭建hadoop3.3.4分布式集群

    目录 1.背景 2.集群规划 2.1 hdfs集群规划 2.2 yarn集群规划 3.集群搭建步骤 3.1 安装JDK 3.2 修改主机名和host映射 3.3 配置时间同步 3.4 关闭防火墙 3. ...

  10. JZOJ 5843.B

    \(Description\) 给定 \(n\) 个正整数序列 ,每个序列长度为 \(m\). 选择至少 \(1\) 个序列,在每个被选择的序列中选择一个元素,求出所有被选择的元素的 \(\gcd\) ...