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;
}
技术使用中遇到的问题和解决过程
角色一顿一顿的移动,不流畅
Update()方法的执行时间间隔不是固定的,如果想要流畅移动,需要
speed * Time.deltaTime;,Time.deltaTime获得当前帧的时间角色翻转错位
控制角色移动时需要控制父对象,父对象移动时会修改子对象位置,但是修改子对象位置时不会影响父对象
unity简单物理系统的更多相关文章
- Unity的物理材质
Physic Materials资源包 在Unity中的项目导入Unity自带的资源包 Physic Materials,自带的资源包有不同种类的物理材质: Bouncy:有弹性的 Ice:结冰 Me ...
- 1.物理系统PhysicsWorld,RayCast
1 3.0物理系统PhysicsWorld T07PhysicsWorld.h #ifndef __T07PhysicsWorld_H__ #define __T07PhysicsWorld_H ...
- 关于Unity中物理引擎的使用
物理引擎控制刚体,刚体上面贴上图片,所以看起来就是游戏运行起来的状态 物理世界计算刚体的运行状态,通过贴图显现出运算结果. 一.物理引擎 1:Unity 2D物理引擎基于Box2D封装而成;2: 物理 ...
- Atitit 游戏引擎---物理系统(1)------爆炸效果
Atitit 游戏引擎---物理系统(1)------爆炸效果 1.1. 动画框架的来源flex,jqueryuijs,anim , cocos2d 1 1.2. Jqueryui的特效库 1 1.3 ...
- .Net简单图片系统-简介
系统简介 最近做了一个简单图片系统,这个系统就是 将上传的的图片保存到系统本地文件系统或者基于fastdfs的分布式文件系统中,在查看图片时会直接请求此系统或者fastdfs的tracker服务器(需 ...
- 用Qt写软件系列三:一个简单的系统工具(上)
导言 继上篇<用Qt写软件系列二:QIECookieViewer>之后,有一段时间没有更新博客了.这次要写的是一个简单的系统工具,需求来自一个内部项目.功能其实很简单,就是查看当前当前系统 ...
- 使用Struts2和jQuery EasyUI实现简单CRUD系统(转载汇总)
使用Struts2和jQuery EasyUI实现简单CRUD系统(一)——从零开始,ajax与Servlet的交互 使用Struts2和jQuery EasyUI实现简单CRUD系统(二)——aja ...
- Ubuntu学习笔记-win7&Ubuntu双系统简单搭建系统指南
win7&Ubuntu双系统简单搭建系统指南 本文是自己老本子折腾Ubuntu的一些记录,主要是搭建了一个能够足够娱乐(不玩游戏)专注练习自己编程能力的内容.只是简单的写了关于系统的安装和一些 ...
- python实现简单购物车系统(练习)
#!Anaconda/anaconda/python #coding: utf-8 #列表练习,实现简单购物车系统 product_lists = [('iphone',5000), ('comput ...
- 学习笔记:Vue+Node+Mongodb 构建简单商城系统(二)
前面几个月工作有点忙,导致构建简单商城系统的计划搁置近三个月.现在终于有时间重新回过头来继续本计划.本篇主要记录自己在阿里云服务器上搭建node运行环境的整个过程,以及对其中遇到的一些问题的思考. 一 ...
随机推荐
- Creo9.0 安装破解图文教程 【2022年12月29日亲测有效】
前言 creo9.0正式版是一款非常优秀的3D建模设计软件.该软件界面美观,提供了CAD 技术.模制造绘图.多实体建模.多体设计.实时仿真.框架和焊缝设计等一系列强大的辅助设计功能,通过这些功能,让用 ...
- 一文看懂 Python 中的函数参数
函数定义中的参数也就是形式参数,规定了在调用函数时如何传递实际参数以及这些参数有无默认值. 实参传递方式 def f(a): print(a) 实参传递方式有两种,位置和关键字.对于上面定义的函数 f ...
- Debug时使用热部署修改代码
今晚Debug的时候,一些语句怎么也不能debug,F8步过以下跳好多行,看起来很烦人.原来是有些行无法进入debug断点. 是因为Debug之前Tomcat已经编译Class文件,当插入注释/修改代 ...
- 《价值流动-Project To Product》读后感
背景:2022年8月,在这家公司已经任职满两年.这两年我最大的成就就是基于Scrum模式推行了敏捷项目管理,并取得了一定的成果.但是,在推行了两年后新的问题也产生了.例如: 1,项目管理上,项目经理缺 ...
- 冰河指南AI技术社区基于ChatGPT正式启动运营
大家好,我是冰河~~ 最近ChatGPT真的太火了,科技圈几乎都在争相报导这个黑科技,它能够通过学习和理解人们的语言来和人类进行对话,能够与人们进行交流,甚至可以对你提出的问题进行分析,尽可能给出你想 ...
- C#:开发一个winform窗体程序,实现强势股票池的数据获取。(需对接第三方接口,目前可免费使用)
写在前面:短暂的接触过一段时间的股票市场,只能说A股真的太能杀了! 开发这个工具的初衷呢,是和几个好友在每日做"慈善"后,突发奇想:如果能实时获取当前股市里强势的股票就好了,因为这 ...
- jupyter环境搭建
前言 jupyter,一个交互式的笔记本,进行数据分析时比pycharm要好用和专业一些. jupyter安装的正确姿势 在别的教程里,他们讲的是通过pip install jupyter或者brew ...
- LeetCode-2104 子数组范围和
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/sum-of-subarray-ranges 题目描述 给你一个整数数组 nums .nums 中 ...
- ElasticSearch 实现分词全文检索 - ES、Kibana、IK安装
目录 ElasticSearch 实现分词全文检索 - 概述 ElasticSearch 实现分词全文检索 - ES.Kibana.IK安装 ElasticSearch 实现分词全文检索 - Rest ...
- No.2.6
vw/vh:(能够使用vw单位设置网页元素的尺寸) 相对单位 相对视口的尺寸计算结果 vw:viewport width(1vw=1/100视口宽度) vh:viewport height(1vh=1 ...