自己用的unity学习笔记(一)——系统组件

来源:互联网 发布:linux下nslookup 编辑:程序博客网 时间:2024/05/17 06:23

语法补充

特性

1、结构体、类、变量的上方,写中括号[],此内容叫做特性。

[System.Serializable] 序列化特性,将下列结构体或者类或者变量允许被序列化,私有的成员不会被序列化。

序列化:按照一定的规则排序(占记)

单例

单例的东西不会主动挂在到GameObject身上

私有构造函数,就不能new 了。

一般用于整个游戏中唯一的东西,可以用单例,例如玩家,输入输出管理器,动作管理器,音效管理器,资源管理器(模型和预制体),对象池。

单例是静态的,比较费资源,尽量少用。

继承monobehaviour

对象池

优化游戏性能的工具,所有对象放入对象池中,使用取出,用完放回。

物理引擎

任何物理方面的碰撞都不能直接改变transform属性。

Unity的演算中,是0.2秒演算一次。0.2秒的插值。

刚体Rigidbody

刚体物体都有休眠状态,物体停止运动一段时间后,就会睡眠,再受力才会唤醒,睡眠中碰撞检测会停止。

组件属性

Rigidbody组件,给物体添加物理基本属性

Mass 质量,单位千克

Drag空气阻力,

AngularDrag  扭矩力(角阻力),控制旋转的速度

Use Gravity 是否使用重力渲染物体

Is Kinematic 是否开启动力学,开启:不再受物理引擎影响,此时就可以使用transform移动了。

Interpolate 插值,用于控制刚体运动抖动的情况。

None 无抖动,

interpolate内插值,基于前一帧的transform来平滑此次的transform

Extrapolate外插值,基于后一帧的transform来平滑此次的transform(引擎会提前演算所有位置信息)。

Collision Detection,碰撞检测,用于避免高速运动的对象穿过其他物体,而导致的未发生碰撞。

默认 Discrete  离散碰撞检测,与场景中其他碰撞体碰撞时进行碰撞检测

Continuous 连续碰撞检测,实时演算,对物理性能消耗会很大,用于快速运动的对象。一般用离散。

Continuityous Dynamic 连续动态碰撞,无论速度多快,都能检测到

Constrains 约束,约束运动轴向,约束旋转轴向

方法

public void AddForce(Vector3 force,ForceMode);碰撞器Collider

第二个参数ForceMode

ForceMode.Force添加一个可持续的力到刚体,使用质量

ForceMode.Acceleration添加一个可持续的加速度到刚体,忽略用质量(忽略了重力)

ForceMode.Impulse添加一个瞬间冲击力到刚体,使用质量

ForceMode.VelocityChange添加一个瞬间冲击力到刚体,忽略质量(忽略了重力)

eg: rig.AddForce(new Vector3(1,0,0),ForceMode.Force);

transform里的forword指的是当前物体在世界中的正前方。V3里的forword是坐标轴意义上的正前方

动量定理

Ft = mv; *力所持续的时间= 质量*速度。

Force: 持续力完全满足动量定理

持续力会让速度越来越快,当持续力等于动摩擦力时,速度才会变成匀速。但起步时必须大于静摩檫力。几乎不用,模拟速度太麻烦。

动摩擦力小于静摩檫力

Acceleration:加速率,会忽略质量,使质量为1,速度和力、时间有关。

Impulse瞬间力会忽略时间,让时间为1,速度会受力的大小和质量的影响,瞬间力质量小的速度大。

VelocityChange 直接加速度,忽略时间和质量,力和速度直接挂钩。此时加力,加多少力就会每帧有多少速度。

 

刚体移动

使用刚体后,禁止使用transform移动。

MovePosition(位置,)

位置:当前位置+增量,例如:transform.position+transform.forward

碰撞Collision

建议不要在同一物体上同时放上碰撞器和触发器

碰撞检测的代码必须挂在到需要碰撞的物体上,例如子弹撞击物体,碰撞代码应该写在子弹上,其他地方调用不起作用。

物体只有拥有collider,才能碰撞或者被碰撞。

碰撞函数所传的参数都是collision类型的对象

碰撞消息函数

OnCollisionEnter 


当此collider/rigidbody触发另一个rigidbody/collider时,OnCollisionEnter将被调用。

OnCollisionEnter2D 

当进入的碰撞器与这个对象的碰撞器接触,发送信息(仅限2D物理)。

OnCollisionExit 

当此collider/rigidbody停止触发另一个rigidbody/collider时,OnCollisionExit将被调用。

OnCollisionExit2D 

当另一个对象的碰撞器停止接触这个对象的碰撞器时,发送信息(仅限2D物理)。

OnCollisionStay 

当此collider/rigidbody触发另一个rigidbody/collider时,OnCollisionStay将会在每一帧被调用。

OnCollisionStay2D 

当另一个对象的碰撞器每帧接触这个对象的碰撞器时,发送信息(仅限2D物理)。

Collision属性

collider

The Collider we hit (Read Only).
被碰撞的那个碰撞器(只读)

contacts

The contact points generated by the physics engine.
物理引擎生成的碰撞点集。

gameObject

The GameObject whose collider we are colliding with. (Read Only).
被碰撞的碰撞器所在的游戏对象(只读)

impulse

The total impulse applied to this contact pair to resolve the collision
应用在接触解决的碰撞的总的推动力。

relativeVelocity

The relative linear velocity of the two colliding objects (Read Only).
两个碰撞的对象之间的相对线性速度(只读)

rigidbody

The Rigidbody we hit (Read Only). This is null if the object we hit is a collider with no rigidbody attached.
被碰撞的刚体组件(只读)。当这个对象碰撞到一个没有被附加刚体组件的碰撞器时返回null

transform

The Transform of the object we hit (Read Only).
我们点击的对象的变换(只读)

碰撞条件

上述内容总结碰撞的条件:都必须有碰撞体,必须有一个物体携带刚体,携带刚体的物体必须处于唤醒状态。

如果一方是运动学刚体,另一方必须不是运动学刚体

触发器trigger

建议不要在同一物体上同时放上碰撞器和触发器

在碰撞器中勾选上Istrigger选项,该碰撞器就会变成触发器。

物体触动触发器,不需要一定有刚体,碰撞不一定要有刚体,但都要有collider

触发和碰撞同用碰撞器collider的属性

触发器的所有方法参数都是collider类型的对象

触发器触发的条件

必须一方有刚体,都必须有碰撞体,至少一方开启IsTrigger

消息函数

OnTriggerEnter 

Collider(碰撞体)进入trigger(触发器)时调用OnTriggerEnter

OnTriggerEnter2D 

当另一个对象进入到这个对象附加的触发碰撞器时发送消息(仅2D物理)。

OnTriggerExit 

Collider(碰撞体)停止触发trigger(触发器)时调用OnTriggerExit

OnTriggerExit2D 

当另一个对象离开附加在这个对象的触发碰撞器时发送消息(仅2D物理)。

OnTriggerStay 

当碰撞体接触触发器时,OnTriggerStay将在每一帧被调用。

OnTriggerStay2D 

当另一个对象停留在这个对象附加的触发碰撞器内时,每帧发送消息(仅2D物理)。

Collider属性

射线RAY

检测必要条件:要有碰撞器组件

Physics.Raycast射线不能穿透,检测到第一个碰撞体后就会马上返回,如果想要穿透,应该用Physics.RaycastAll()函数

定义射线

Ray r = new Ray();无参的构造

Ray r = new Ray(原点,方向);有参的构造

构造定义射线是没有射出去的,只是定义。

Physics.Raycast();//用该函数发射射线。返回bool值,如果射线碰到碰撞器组件就会返回true.

如果想要穿透,应该用Physics.RaycastAll()函数,该函数碰到物体后不会马上返回,达到指定距离后才会统一返回所有碰撞信息的物体

射线函数

1Ray Camera.main.ScreenPointToRay(Vector3 pos)   返回一条射线Ray从摄像机到屏幕指定一个点

2Ray Camera.main.ViewportPointToRay(Vector3 pos)  返回一条射线Ray从摄像机到视口(视口之外无效)指定一个点

3Ray 射线类 

4RaycastHit 光线投射碰撞信息

5\bool Physics.Raycast(Vector3 origin, Vector3 direction, float distance, int layerMask)

    当光线投射与任何碰撞器交叉时为真,否则为假。

    bool Physics.Raycast(Ray ray, Vector3 direction, RaycastHit out hit, float distance, int layerMask)

    在场景中投下可与所有碰撞器碰撞的一条光线,并返回碰撞的细节信息()

    bool Physics.Raycast(Ray ray, float distance, int layerMask)

    当光线投射与任何碰撞器交叉时为真,否则为假。

    bool Physics.Raycast(Vector3 origin, Vector3 direction, RaycastHit out hit,float distance, int layerMask)

    当光线投射与任何碰撞器交叉时为真,否则为假。

 

    注意:如果从一个球型体的内部到外部用光线投射,返回为假。

    参数理解:

origin : 在世界坐标中射线的起始点

direction: 射线的方向

distance: 射线的长度

hit: 使用c#中out关键字传入一个空的碰撞信息类,然后碰撞后赋值。可以得到碰撞物体的transform,rigidbody,point等信息。 

layerMask: 只选定Layermask层内的碰撞器,其它层内碰撞器忽略。 选择性的碰撞

6RaycastHit[] RaycastAll(Ray ray, float distance, int layerMask)

   投射一条光线并返回所有碰撞,也就是投射光线并返回一个RaycastHit[]结构体。

物理系统的相交球

Collider[] Colliders = Physics.OverlapSphere(transform.position,5);检测到五米的球体相交的碰撞体组件,返回一个数组,该数组包含自己,需要剔除

遍历数组,获取每个物体的刚体组件,如果刚体为空剔除掉,添加力,力的方向使用爆炸圆心到每个物体的向量,向量归一化(只取方向,不取大小,因为爆炸中距离越远,受力越小)*1/Vector3.Distancetransform.positon,item.tansform.positon)(乘以这个参数可实现近物体受力大,远物体受力小的效果。),impulse爆炸力。

上述内容爆炸内容可使用:rig.AddexplosionForce(力的大小,爆炸位置,爆炸半径,模拟向上的爆炸偏移,力的模式);

动画

动画分为新动画系统(animator组件)和旧动画系统(Animation组件)

Animation动画(旧动画系统)

选中fbx文件的动画。

Rig 动画的类型

Gen新动画系统

旧动画系统 指运用了Animation的组件

人体动画系统

Animation

模型所有的动画都在这里。

动画是由多个AnimationClip(动画片段)组成的,播放会一次播放全部,真正使用需要切割。

CullType:裁剪方式

Always开头的是一直播放

based是后台不播放

动画切割

动画操作实例:

Rig中选择legacy旧动画

选中animations,勾选导入动画

点击加号新建,改名

Startend设置150-260  idle动画  待机

1126-1163落地

20-50 walk动画 行走

80-90 jump动画 跳跃

Add Loop Frame

Wrap mode  选择loop

Apply确认添加动画

 

点击游戏物体,选择animation组件-size1-》选中动画

组件第一个参数animation:模型默认动画

游戏物体需要加刚体,不然跳跃不会落下。

Animation组件

animation组件用于播放动画。能指定动画剪辑到动画组件并从脚本控制播放。该动画系统是基于权重并支持动画融合、添加动画、动画混合、层并完全控制播放的各个方面。

curves动画曲线,可以用来匹配关键帧的得到一个曲线值,通过曲线值来实现其他功能,例如随着动画进行不断提高声音大小。

AnimationState可以用于改变动画的层、修改播放速度以及直接控制融合与混合。

Ani.Playqueued();队列播放动画,一个动画全部播放完,才会使用play切换到下一个动画, 如果动画为循环,那就永远跳不过去。

动画也支持枚举,所以你可以像这样在AnimationStates之间循环:

anim = GetComponent<Animation>();

foreach (AnimationState state in anim) {

        state.speed = 0.5F;

}

 

 

Animator新动画系统

属性介绍

Humanoid 标准人性,可以编辑骨骼,点击configing调整

 

Mapping骨骼其实就是关节在控制动作,所有骨骼节点其实就是空节点,只有transform.

骨骼中映射对应,实圈是必须有的动画(共15个,也就意味着人性骨骼必须是15根骨),虚圈可以没有。

Bake into pose 锁定对应的x,y,z,旋转的偏移,不影响动作。

Based upon (基于什么位移或者旋转):

original(基于模型的轴旋转)。Body orientation(基于自身的前方)

Y轴的center of mess(以网格为中心,中心点在物体中心)feet(以脚为中心,中心点在脚下),original(基于模型的中心,模型中心在哪就在那)

(红色时不要勾选bake into pose

Mirror 动画镜像,左右反向。

Muscles&Settings肌肉调整,调整一下滑动条,看看极限动作下有没有撕裂。

Controller动画控制器

 

是否应用美术制作动画时的位移(美术模型中必须要有的位移)

动画事件

必须写在和animator同级的物体上的代码里

在动画中通过event选项选择某一帧调用指定额方法,并且同时传参数。

动画事件只能调用无参,或者带一个参数的消息函数。

动画混合树

使用一个或多个参数控制权重的分配

右键-Create blend tree-》双击点击树

点击base layer返回

Blend type 混合维度(其实就是参数的个数)。

Parameter 权重参数0-1,

Motion动画片段,点击添加需要混合的动画片段

Threshold:权重值范围比例 Automate thresholds :自动设置0-1的权重值,取消可以手动调整任意范围权重值。

钟表标志代表速度。

动画融合

没有对应动画时,可采用其他动画混合出一个,

(移动收刀拔刀动画融合)

创建新的层

第二层内把需要改变的动画拿过来,原层的动画就不要了,例如收刀拔刀动画

第二层建一个空的状态作为默认,没有动画,和原有的条件一样连接到收刀拔刀

修改第二层权重为1

Addtive叠加,override覆盖

第二层需要一个avastmask, 拔刀收刀不需要下半身动画,将下半身去掉

IK(反向动力学)

子节点带动根节点运动叫反向动力学(根节点带动子节点是正向动力)

在动画layer层中勾选IK Pass,启用反向动力学。

Ani.SetIKPosition(AvatarIKGoal.四肢,目标位置);四肢例如LeftHand,这样就是用左手触碰目标位置。

反向动力学只有距离近的时候才会弯曲关节

Ani.SetIKPositionWeight(AvatarIKGoal.四肢,权重);权重最高为1,代表反向动力的影响权重

Ani.SetLookAtWeight(1.0f, 1.0f, 1.0f, 1.0f); 四肢权重值

Ani.SetLookAtPosition(目标);看向目标,并带动所有关节,权重为1.

 

角色控制器

和刚体的区别:

1、 角色控制器允许你受制于碰撞的情况下,很容易进行运动,而不用处理刚体(有碰撞但不受重力影响,所以需要模拟用力)。刚体受制于物理影响。

Slope limit 爬坡的最大角度

Step offset 步长偏移,能上台阶的高度

Skin width 皮肤的厚度

Min move distance 最小移动距离,移动速度小于这个值,人物就会停止,避免角色物体颤抖

以下参数是碰撞体的大小及位置。

Center

Radius

Height

SimpleMove()方法会忽略y轴的速度。Y轴上速度被忽略。速度以米/秒为单位。重力被自动应用。返回如果角色着地。建议你每帧只调用一次Move或者SimpleMove

Move()通过动力来移动,动力只受限于碰撞(不应用任何重力)。

 

 

 

ParticleSystem 粒子系统,类型名称。

粒子不可以放大。

阅读全文
0 0
原创粉丝点击