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运行环境的整个过程,以及对其中遇到的一些问题的思考. 一 ...
随机推荐
- javaweb-LoginDemo在JdbcTemp的登录实现及总结+进阶javabean改进
刚开始发现- -我好像忘记了JdbcTemp的知识了,以为自己学漏了,重新回去看了一下,还好还记得,所以今天做一个案例: 案例分析: 登录的实现 步骤: 先导入jar包,然后写一个简单的html页面 ...
- vue项目部署在nodejs+express
一.安装node和打包vue项目就不用多说了 二.安装express Express是一个保持最小规模的灵活的Node.js web应用程序开发框架,为web和移动应用程序提供一组强大的功能 npm ...
- 一文搞懂 DevOps
前言 DevOps作为一个热门的概念,近年来频频出现在各大技术社区和媒体的文章中,备受行业大咖的追捧,也吸引了很多吃瓜群众的围观. 那么,DevOps是什么呢? 有人说它是一种方法,也有人说它是一种工 ...
- javaEE(单元测试、反射、动态代理、xml)
单元测试 最小的功能单元编写测试代码,java针对方法,检查方法的正确性 JUnit单元测试框架 @Test注解 public class A { @Test public void a(){ ... ...
- CSS动画,盒子爬坡源码
html: <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- python爬取网页的多种方式以及保存方法
爬取网页信息并保存 bs4和lxml都是用来将接收的数据解析html 1.bs4+excel(openpyxl): import requests from bs4 import BeautifulS ...
- 创建微信小程序组件的步骤
创建组件 新建目录 一个组件由四部分组成,js.json.wxml.wxss,组件其实就是页面中被拆分出来的,可以在多个页面中共同使用的小块 UI,所以看起来和新建一个页面的四个文件一样: 引入组件 ...
- Java打印裴波那契数列
//裴波那契数列的定义:他的第一项和第二项均为1,以后各项都为前两项的和.如: 1,1,2,3,5,8,13,21,34,55,89,144,233,~~~~ 关键代码如下: package fuxi ...
- python如何画高光谱立体图像
语句含义:spectral.view_cube(image,bands=[29,19,9]) 中的29,19和9是第几个波段,可以改成数据波段数以内的其他的数值
- 运行Java时报错:Error: opening registry key 'Software\JavaSoft\Java Runtime Environment'
卸载旧的JAVA JDK,安装新版的JDK时,运行cmd的java -version命令遇到这样的报错: Error: opening registry key 'Software\JavaSoft\ ...