Unity 物理系统

Unity物理系统

##1、人机交互

++1.1、外部输入设备

++++键盘

++++触屏

++++摇杆

++++鼠标

++1.2Input类简介

++++Input类是输入系统的接口,使用这个类能够读取输入管理器设置的按键,以及访问移动设备的多点触控或加速感应数据,可以通过该类来实现外部设备控制游戏场景里面的物体。

++++常用的输入方式: 键盘输入、鼠标输入

++++键盘输入常用方法:

-- GetKey :按键按下期间返回true

-- GetKeyDown :按键按下的第一帧返回true

-- GetKeyUp :按键松开的第一帧返回true

++++Input类简介

Edit=>Project Settins=>Input=>【输入管理器】


++++虚拟按键

(虚拟按键,与所设置的键盘按键相对应,可以根据实际需要更改相关设置)

-- Horizontal Horizontal):水平虚拟按键。

-- Name :虚拟按键名字,可以通过该名字得到虚拟轴上的值。

-- Descriptive Name

-- Descriptive Negative  

-- Negative Button left):对应按键的左箭头,代表X轴负方向

-- Positive Button right):对应按键的右箭头,代表Y轴正方向

-- Alt Negative Button a):与左箭头功能相同

-- Alt Positive Button d):与右箭头功能相同

-- Gravity 3):抬起按键值恢复为0的时间

-- Dead 0.001):小于此值计为0,用于摇杆

-- Sensitivity 3):按下按键后传递值的大小

-- Snap V):同时按下正负按钮时值为空

-- Invert :代表X轴的正负方向反转

-- Type Key or Mouse Button):应用到何种输入设备

-- Axis X axis):应用到X

-- Joy Num Get Motion from all Joy) :受控制的操作杆数


++1.3、键盘事件

++++大多数Windows窗口程序都通过处理键盘事件来处理键盘输入,通过名称指定的按键检测按键不同的状态,处理相应的事件。

++++通过名字得到虚拟的值

Static float GetAxis(string axisName)

Float hor = Input.GetAxis(“Horizontal”);

hor接收水平虚拟轴值的变化结果,当按下a键(左箭头)会得到负值(-1~0),d键(右箭头)会得到正值(0~1),可以用此值控制游戏物体的水平移动。


++1.4、鼠标事件

++++例:在“CS”游戏中通过鼠标左键表示射击;鼠标右键表示放大准星,鼠标事件应用非常广泛。

++++鼠标属性和方法

--mousePosition :得到当前鼠标位置

--GetMouseButtonDown :鼠标按键按下的第一帧返回true

--GetMouseButtonUp :鼠标按键松开的第一帧返回true

--GetMouseButton :鼠标按键按下期间一直返回true

--GetAxis(“Mouse X”) :得到一帧内鼠标在水平方向的移动距离

--GetAxis(“Mouse Y”) :得到一帧内鼠标在垂直方向的移动距离

--GetAxis(“Mouse ScrollWheel”) :获取鼠标滚轮的值


##2、碰撞器

++2.1Collider碰撞器组件

++++当我们在场景中创建基本游戏物体后,引擎会自动的为该物体加上Collider(碰撞器)组件,其主要功能是进行碰撞检测。


++++Collider组件的种类

对于规则的游戏物体可以使用引擎提供的碰撞器,对于一些大的场景,其碰撞网格可以由建模师提供。

Search => collider

-- Box Collider

-- Box Collider 2D

-- Capsule Collider

-- Circle Collider 2D

-- Edge Collider 2D

-- Mesh Collider

-- Polygon Collider 2D

-- Sphere Collider

-- Terrain Collider

-- Wheel Collider

-- World Particle Collider

++2.2、碰撞器点击触发事件

++++场景物体的鼠标事件

--OnMouseDown :鼠标在Collider之上,按下鼠标,该事件即被触发

--OnMouseDrag :鼠标在Collider之上,当鼠标拖动时触发

--OnMouseEnter :移动鼠标进入Collider区域的时候,该事件被触发

--OnMouseExit :移动鼠标移出Collider区域的时候,该事件被触发

--OnMouseOver :鼠标处于Collider之上时,每帧都会调用该事件

--OnMouseUp :当鼠标弹起的时候,该事件被触发调用

--OnMouseUpAsButton :当鼠标在同一个Collider上按下又弹起的情况下会触发调用该事件

++++场景物体的鼠标事件

OnMouseEnter  =>  OnMouseOver  =>  OnMouseExit

               OnMouseUpAsButton

               OnMouseDown

               OnMouseUp

               OnMouseDrag


##3、刚体组件

++3.1、物理引擎介绍

++++在游戏中使用物理引擎可以真实的模拟出现实世界中的一些物理效果,例如重力,摩擦力,碰撞等,在Unity中使用的是PhysX物理引擎,该引擎可以在3D世界中模拟需要的效果,它渲染的游戏画面非常的逼真,可以给玩家身临其境的感觉。

++++Unity中要使一个物体受物理引擎的控制,主要是通过刚体组件来实现的。

++++刚体的作用:

刚体能够受到力作用,逼真的展示物体运动效果。

--1、重力:自由落体

--2、反作用力: 例如,与其它物体碰撞

--3、阻力: 受到阻力会慢慢停止运动

--4、外加力: 可以给物体施加一个外力

++3.2、刚体组件的使用

++++Rigidbody

--Mass 1):质量,值越大重量越大

--Drag 0):运动过程中受的阻力

--Angular Drag 0.05):旋转时受到的阻力

--Use Gravity V):是否使用重力

--Is Kinematic

--Interpolate

--Collision Detection

--Constraints(约束,例如勾选Y时,Y方向不可以移动/旋转)

  ---Freeze Position  (冻结位置):X   Y   Z

  ---Freeze Rotation  (冻结旋转):X   Y   Z


++++刚体组件的使用

Interpolate: 插值:当你发现刚体运动时抖动,可以尝试设置这个选项。)

Collision Detection: 碰撞检测: 主要用于避免高速物体穿过其他物体,却未触发碰撞的情况。)

--Interpolate

  ---None(不应用插值)

  ---Interpolate(内插值,基于上一帧的变换来平滑帧变换)

  ---Extrapolate(外插值,基于下一帧的预估变换来平滑帧变换)

--Collision Detection

  ---Discrete(不连续碰撞检测,适用于普通模式,这也是默认模式)

  ---Continuous(连续碰撞检测,一般用于高速运动物体碰撞的物体)

  ---Continuous Dynamic(动态连续碰撞检测,适用于高速物体)


++++注意事项

--对同一个物体,要么通过刚体操纵,要么通过变换操纵,不要同时使用刚体和变换来操纵。因为给刚体施加力和力矩,也会改变物体变换组件的位置和旋转角度,同时使用两种方式会导致旋转和其它计算出现问题。

--如果需要直接操纵物体变换,同时又想拥有刚体特性,那么需要你选择运动学。

++3.3、刚体组件常用属性和方法

++++刚体组件常用属性:

--velocity :刚体的速度

--angularVelocity :刚体的角速度

--drag :物体的阻力

--angularDrag :物体的角阻力

--mass :刚体的质量

--useGravity :是否受重力影响

--isKinematic :是否使用动力学

--freezeRatation :是否冻结旋转

--collisionDetectionMode :碰撞检测模式

--position :刚体位置

--rotation :刚体旋转

++++刚体组件常用方法:

--AddForce :给刚体添加一个力

--AddExplosionForce :给刚体添加一个力,模拟爆炸效果

--AddForceAtPosition :在指定的位置添加一个力

--AddRelativeForce :添加相对力

--AddRelativeTorque :添加相对力矩

--MovePosition :使用刚体移动物体到指定位置


##4、碰撞事件

++4.1、碰撞检测分类:

++++静态碰撞器Static Collider: 只有碰撞器没有刚体的物体;

--现象:保持静止或者轻微移动,如:平面、树木

++++刚体碰撞器Rigidbody Collider:具有刚体和碰撞器的物体;

--现象:完全受物理引擎影响

++++运动学刚体碰撞器:带刚体,且勾选Is Kinematic,此碰撞器不能添加力,只能通过transform移动。

++4.2、注意事项:

++++碰撞发生的条件:

--1、发生碰撞的两个物体都必须带有Collider

--2、发生碰撞的两个物体至少有一个带有刚体

--3、发生碰撞的两个物体必须有相对运动

++4.3、碰撞器的回调方法

++++onCollisionEnter(Collision other) :碰撞开始一瞬间被调用

++++onCollisionStay(Collision other) :一直保持碰撞状态时被调用

++++onCollisionExit(Collision other) :碰撞分离的一瞬间被调用


##5、触发事件

++5.1、触发事件

++++物体的空间检测

++++触发器

--触发器事件执行的条件:两个物体上都要带碰撞器,至少带有一个刚体,并且两物体至少有一个把触发器打开。


++++触发器的回调方法

--OnTriggerEnter(Collider other) :进入触发器的时候调用一次

--OnTriggerStay(Collider other) :处于某个触发器之中的时候持续调用

--OnTriggerExit(Collider other) :退出触发器的时候调用一次

++++场景物体的Trigger事件


++++Trigger事件的语法

--脚本挂载的碰撞体

  ---void OnTriggerEnter(Collider other){ ... }

  ---void OnTriggerExit(Collider other){ ... }

  ---void OnTriggerStay(Collider other){ ... }

--事件传入参数(Collider

--进入的碰撞体(Collider

  ---attached

  ---bounds

  ---enabled

  ---isTrigger

  ---material

  ---sharedMaterial


##6、物理材质

++6.1、物理材质的创建

++++Project窗口中点击右键【Create=>Physic Material】创建物理材质。

++++物理材质用于调整摩擦力和反弹力。


++6.2、物理材质属性设置(MyPhysicMaterial

++++Dynamic Friction (0.6):动态摩擦系数,范围0~1,用于调整该物体的动态摩擦力。

++++Static Friction (0.6):静态摩擦系数,范围0~1,用于调整该物体的静态摩擦力。

++++Bounciness (0):反弹系数,范围0~1,用于调整该物体的反弹力。

++++Friction Combine :组合摩擦力,用于调整摩擦力取值。

--Average :两个摩擦力的平均值;

--Mininum :两个摩擦力中最小的值;

--Multiply :两个摩擦力相乘的值;

--Maxinum :两个摩擦力中最大的值;

++++BounceCombine :组合弹力,用于调整弹力取值。


++6.3、物理材质的使用


##7、射线

++7.1、射线碰撞简介

++++Unity提供了射线机制: 通过虚拟射线检测所碰撞到的物体。

++7.2、射线的创建

++++创建射线: Rayray = new Ray();

--origin :射线发射的原点

--direction :射线发射的方向

++7.3、射线碰撞的应用

++++使用Physics类方法Raycast方法实现射线碰撞检测功能。

bool Raycast(Rayray,out RaycastHithitInfo);

  --ray :要发射的射线

  --hitInfo :碰撞信息

++++从主摄像机到鼠标点击位置创建一条射线;

    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);





#立钻哥哥Unity 学习空间: http://blog.csdn.net/VRunSoftYanlz/

++立钻哥哥推荐的拓展学习链接(Link_Url

++++立钻哥哥Unity 学习空间: http://blog.csdn.net/VRunSoftYanlz/

++++Unity引擎基础https://blog.csdn.net/vrunsoftyanlz/article/details/78881685

++++Unity面向组件开发https://blog.csdn.net/vrunsoftyanlz/article/details/78881752

++++Unity物理系统https://blog.csdn.net/vrunsoftyanlz/article/details/78881879

++++Unity2D平台开发https://blog.csdn.net/vrunsoftyanlz/article/details/78882034

++++UGUI基础https://blog.csdn.net/vrunsoftyanlz/article/details/78884693

++++UGUI进阶https://blog.csdn.net/vrunsoftyanlz/article/details/78884882

++++UGUI综合https://blog.csdn.net/vrunsoftyanlz/article/details/78885013

++++Unity动画系统基础https://blog.csdn.net/vrunsoftyanlz/article/details/78886068

++++Unity动画系统进阶https://blog.csdn.net/vrunsoftyanlz/article/details/78886198

++++Navigation导航系统https://blog.csdn.net/vrunsoftyanlz/article/details/78886281

++++Unity特效渲染https://blog.csdn.net/vrunsoftyanlz/article/details/78886403

++++Unity数据存储https://blog.csdn.net/vrunsoftyanlz/article/details/79251273

++++Unity中Sqlite数据库https://blog.csdn.net/vrunsoftyanlz/article/details/79254162

++++WWW类和协程https://blog.csdn.net/vrunsoftyanlz/article/details/79254559

++++Unity网络https://blog.csdn.net/vrunsoftyanlz/article/details/79254902

++++C#事件https://blog.csdn.net/vrunsoftyanlz/article/details/78631267

++++C#委托https://blog.csdn.net/vrunsoftyanlz/article/details/78631183

++++C#集合https://blog.csdn.net/vrunsoftyanlz/article/details/78631175

++++C#泛型https://blog.csdn.net/vrunsoftyanlz/article/details/78631141

++++C#接口https://blog.csdn.net/vrunsoftyanlz/article/details/78631122

++++C#静态类https://blog.csdn.net/vrunsoftyanlz/article/details/78630979

++++C#中System.String类https://blog.csdn.net/vrunsoftyanlz/article/details/78630945

++++C#数据类型https://blog.csdn.net/vrunsoftyanlz/article/details/78630913

++++Unity3D默认的快捷键https://blog.csdn.net/vrunsoftyanlz/article/details/78630838

++++游戏相关缩写https://blog.csdn.net/vrunsoftyanlz/article/details/78630687

++++设计模式简单整理https://blog.csdn.net/vrunsoftyanlz/article/details/79839641

++++U3D小项目参考https://blog.csdn.net/vrunsoftyanlz/article/details/80141811

++++UML类图https://blog.csdn.net/vrunsoftyanlz/article/details/80289461

++++Unity知识点0001https://blog.csdn.net/vrunsoftyanlz/article/details/80302012

++++U3D_Shader编程(第一篇:快速入门篇)https://blog.csdn.net/vrunsoftyanlz/article/details/80372071

++++U3D_Shader编程(第二篇:基础夯实篇)https://blog.csdn.net/vrunsoftyanlz/article/details/80372628

++++立钻哥哥Unity 学习空间: http://blog.csdn.net/VRunSoftYanlz/


--_--VRunSoft : lovezuanzuan--_--

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Unity物理系统常用的方法包括: 1. 创建碰撞体:使用Colliders组件来添加碰撞体,如BoxCollider、SphereCollider和CapsuleCollider等。碰撞体负责检测对象之间的碰撞和触发事件。 2. 添加刚体:使用Rigidbody组件来给物体添加刚体属性。刚体可以模拟物体的质量、重力、速度、受力等物理属性,并与其他物体进行交互。 3. 碰撞检测:利用OnCollisionEnter、OnCollisionExit和OnCollisionStay等方法来检测对象之间的碰撞。可以在碰撞发生时触发相应的事件或执行特定的操作。 4. 触发:使用Trigger来进行触发的判定,使用OnTriggerEnter、OnTriggerExit和OnTriggerStay等方法来触发相应的事件。 5. 物理材质:通过给对象添加PhysicMaterial来模拟物体的摩擦力和弹性等特性。可以调整材质的属性来改变物体之间的碰撞效果。 6. 接触点信息:使用Collision和Collider组件来获取碰撞点的信息,如碰撞点的坐标、法线方向、碰撞力等。 7. 约束和关节:可以使用关节和约束来模拟物体之间的连接和限制。常见的约束和关节包括HingeJoint、FixedJoint和SpringJoint等。 8. 物理效果:可以模拟物体的运动效果,如重力、摩擦力、空气阻力等。可以使用AddForce、AddTorque等方法来给物体施加力或扭矩。 9. 物理射线:使用Physics.Raycast和Physics.RaycastAll等方法来进行射线检测。可以检测射线与物体之间是否发生碰撞,并获取碰撞点的信息。 10. 物理特效:使用Particle System组件来添加粒子效果,如火花、烟雾、水花等。可以通过设置粒子的速度、大小和颜色等属性来模拟物理现象。 以上是Unity物理系统常用的方法,可以用来实现物体之间的碰撞、运动、连接等物理效果。 ### 回答2: Unity物理系统常用方法包括: 1. 添加碰撞Collider):在物体上添加碰撞组件,可以使物体参与碰撞检测和物理模拟。 2. 添加刚体(Rigidbody):在具有碰撞物体上添加刚体组件,使物体具有物理属性,如重力、施力和受力的效果。 3. 碰撞检测:使用碰撞进行碰撞检测,可以通过判断是否发生碰撞来进行相关处理,比如触发事件、改变游戏状态等。 4. 物理模拟:通过刚体组件物理材质(Physic Material)来模拟物体物理行为,如弹力、摩擦力、空气阻力等。 5. 使用力(Force):通过添加力的方式来施加物体的作用力,可实现物体的移动、旋转等效果。 6. 刚体运动控制:通过改变刚体的速度、角速度或应用力矢量来控制物体的运动,以实现自定义的物理模拟效果。 7. 碰撞事件:当物体发生碰撞时,可以通过碰撞事件(OnCollisionEnter、OnCollisionStay、OnCollisionExit)来触发特定的逻辑或动作。 8. 触发(Trigger)和触发事件:触发是一种特殊的碰撞,不产生物理效果,但可以检测两个物体之间的触发事件(OnTriggerEnter、OnTriggerStay、OnTriggerExit)。 9. 射线投射:通过创建射线(Ray)对象并进行投射,可以检测物体是否被射线所穿过,常用于射线检测碰撞或点击选择物体。 10. 物理层和层掩码:通过设置物理层和层掩码,可以对不同物体进行过滤,控制碰撞或触发事件的发生。 以上是Unity物理系统常用的一些方法,在游戏开发,熟练掌握这些方法可以实现丰富多样的物理效果和交互体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值