技术概述

物理系统,就是使自己的游戏对象像物理世界一样,受到重力,阻力,可以运动,使游戏更加真实;物理系统简化了游戏对象的编写,不再自己使用代码做重力,摩擦力等效果,可以通过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. Creo9.0 安装破解图文教程 【2022年12月29日亲测有效】

    前言 creo9.0正式版是一款非常优秀的3D建模设计软件.该软件界面美观,提供了CAD 技术.模制造绘图.多实体建模.多体设计.实时仿真.框架和焊缝设计等一系列强大的辅助设计功能,通过这些功能,让用 ...

  2. 一文看懂 Python 中的函数参数

    函数定义中的参数也就是形式参数,规定了在调用函数时如何传递实际参数以及这些参数有无默认值. 实参传递方式 def f(a): print(a) 实参传递方式有两种,位置和关键字.对于上面定义的函数 f ...

  3. Debug时使用热部署修改代码

    今晚Debug的时候,一些语句怎么也不能debug,F8步过以下跳好多行,看起来很烦人.原来是有些行无法进入debug断点. 是因为Debug之前Tomcat已经编译Class文件,当插入注释/修改代 ...

  4. 《价值流动-Project To Product》读后感

    背景:2022年8月,在这家公司已经任职满两年.这两年我最大的成就就是基于Scrum模式推行了敏捷项目管理,并取得了一定的成果.但是,在推行了两年后新的问题也产生了.例如: 1,项目管理上,项目经理缺 ...

  5. 冰河指南AI技术社区基于ChatGPT正式启动运营

    大家好,我是冰河~~ 最近ChatGPT真的太火了,科技圈几乎都在争相报导这个黑科技,它能够通过学习和理解人们的语言来和人类进行对话,能够与人们进行交流,甚至可以对你提出的问题进行分析,尽可能给出你想 ...

  6. C#:开发一个winform窗体程序,实现强势股票池的数据获取。(需对接第三方接口,目前可免费使用)

    写在前面:短暂的接触过一段时间的股票市场,只能说A股真的太能杀了! 开发这个工具的初衷呢,是和几个好友在每日做"慈善"后,突发奇想:如果能实时获取当前股市里强势的股票就好了,因为这 ...

  7. jupyter环境搭建

    前言 jupyter,一个交互式的笔记本,进行数据分析时比pycharm要好用和专业一些. jupyter安装的正确姿势 在别的教程里,他们讲的是通过pip install jupyter或者brew ...

  8. LeetCode-2104 子数组范围和

    来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/sum-of-subarray-ranges 题目描述 给你一个整数数组 nums .nums 中 ...

  9. ElasticSearch 实现分词全文检索 - ES、Kibana、IK安装

    目录 ElasticSearch 实现分词全文检索 - 概述 ElasticSearch 实现分词全文检索 - ES.Kibana.IK安装 ElasticSearch 实现分词全文检索 - Rest ...

  10. No.2.6

    vw/vh:(能够使用vw单位设置网页元素的尺寸) 相对单位 相对视口的尺寸计算结果 vw:viewport width(1vw=1/100视口宽度) vh:viewport height(1vh=1 ...