一.刚体组件的属性介绍
刚体能让你的游戏对象被物理引擎所控制,它能通过受到推力和扭力来实现真实的物理表现效果。所有游戏对象必须包含刚体组件来实现重力、通过脚本施加力、或者与其他对象进行交互,这一切都通过NVIDIA的PhysX物理引擎来实现。
属性
Mass 质量,单位为Kg,建议不要让对象之间的质量差达到100倍以上
Drag 空气阻力,为0表示没有阻力,infinity表示立即停止移动
Angular Drag 扭力的阻力,数值意义同上
Use Gravity 是否受重力影响
Is Kinematic 是否为Kinematic刚体,如果启用该参数,则对象不会被物理所控制,只能通过直接设置位置、旋转和缩放来操作它,一般用来实现移动平台,或者带有HingeJoint的动画刚体,在某些时候,主要是创建布娃娃效果的时候,你可能需要在动画与物理控制之间进行切换。你可以将刚体设置为IsKinematic,当设置为Kinematic模式,它将不再受到外力影响。这时你只能通过变换方式来操作对象,但是Kinematic刚体还会影响其他刚体,但他自己不会再受物理引擎控制。比如,连在Kinematic刚体上的Joints还会继续影响连接的另一个非Kinematic刚体,同时也能够给其他刚体产生碰撞力。
Interpolate 如果你的刚体运动时有抖动,尝试一下修改这个参数,None表示没有插值,Interpolate表示根据上一桢的位置来做平滑插值,Extrapolate表示根据预测的下一桢的位置来做平滑插值
Freeze Rotation 如果选中了该选项,那么刚体将不会因为外力或者扭力而发生旋转,你只能通过脚本的旋转函数来进行操作
Collision Detection 碰撞检测算法,用于防止刚体因快速移动而穿过其他对象,当使用默认的离散式碰撞检测时,如果前一桢时对象在墙这一面,下一桢时对象已到到了墙另一面,那么碰撞检测算法将检测不到碰撞的发生,你可以将该对象的碰撞检测属性设置为Continuous,这时碰撞检测算法将会防止对象穿过所有的静态碰撞体,设置为Continuous Dynamic将还会防止穿过其他也设置为Continuous或者Continuous Dynamic的刚体。CCD只支持Box,Sphere和Capsule的碰撞体。
Constraints 刚体运动的约束,包括位置约束和旋转约束,勾选表示在该坐标上不允许进行此类操作
Collider——很简单,就是碰撞盒,有碰撞盒才有碰撞,所有碰撞的参与者都必须要有至少一个碰撞盒才行
Trigger——这也是一个描述,同是Collider的一个属性。被标记为Trigger的碰撞盒基本不再具备物理特性(如果绑有刚体的话,且使用重力,受重力下落)
力
Rigidbody.AddForce
Rigidbody.AddRelativeForce
igidbody.AddTorque
Rigidbody.AddRelativeTorque
Physics.Raycast
1.检测射线是否碰到物体
void Update(){
Vector3 fwd = transform.TransformDirection(Vector3.forward);
if (Physics.Raycast(transform.position, fwd, 10))
{
print("There is something in front of the object!");
}
2.检测射线碰到物体,出参
void Update() {
RaycastHit hit;
if (Physics.Raycast(transform.position, -Vector3.up, out hit, 100.0F))
{
float distanceToGround = hit.distance;
}
}
3.从摄像机发射出射线,出参
void Update() {
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, 100))
{
Debug.DrawLine(ray.origin, hit.point);
}
}
CharacterController
Move
角色移动只受到碰撞的约束。角色遇到碰撞时将会沿着碰撞盒滑动(你懂得)。返回值是对移动过程中遇到的碰撞信息的汇总。Move函数并不使用重力。
SimpleMove 简单移动(会自动模拟重力)
Y轴的速度将会被忽略。速度单位是米每秒。重力自动生效。返回值是角色是否着地。
建议每帧只调用一次Move或者SimpleMove
移动Move
设置目的地SetDestination
停止Stop
继续Resume
路径等待pathPending
设置速度Speed
当前速度Velocity
导航层
& 位逻辑与
| 位逻辑或
^ 位逻辑异或
- 位逻辑反
>> 右移
<< 左移
Navigation
Object面板
NavigationStatic 勾选后表示该对象参与导航网格的烘培。
Generation OffMeshLink 勾选后可跳跃(Jump)导航网格和下落(Drop)。
NavigationArea 物体烘焙网格属于那个图层,可通过代码让游戏人物走不同的路
Bake面板
AgentRadius 具有代表性的物体半径,半径越小生成的网格面积越大
AgentHeight 具有代表性的物体的高度,代理所能通过的最大高度
Max Slope 斜坡的坡度
Step Height 台阶高度
Drop Height 允许跳跃最大下落距离
Jump Distance 允许最大的跳跃距离
Advanced
Manual Voxel Size 手动设置立体像素
Min Region Area 最小生成区域(小于该值则忽略)
Height Mesh 生成高度图,(如果你的游戏agent需要更精准的行走位置,你可以启用高度网格Height Mesh,高度网格Height Mesh将占用你“运行时”的内存和cpu,并且需要更多的烘焙时间);
导航Agent
Raduis 代理的半径(仅用于寻路目的,可以跟实际对象的半径大小不一样,一般比实际对象的半径大)。
Speed 速度,走向它的目的地的最大移动速度。
Acceleration 加速度,最大加速度。
Angular Speed 角速度,最高转速(度/秒)。
Stopping distance 制动距离,到目的地的距离小于这个值,代理减速。
Auto Traverse OffMesh Link 自动通过OffMesh链接
Auto Repath 自动重新寻路
Height 代理的高度
Base offset 碰撞几何体相对于实际几何体垂直的偏移
方法:
移动Move
设置目的地SetDestination
停止Stop
继续Resume
路径等待pathPending
设置速度Speed
当前速度Velocity
导航障碍物
carve 是否雕刻
carveOnlyStationary 当障碍静止时可以被雕刻?
carvingMoveThreshold 移动障碍物后,重新雕刻的移动临界距离
TimeToStationary 障碍被处理为静止的等待时间
center 障碍的中心,在对象自身空间测量。
height 障碍的圆柱形状的高。
radius 障碍的胶囊形状的半径。
shape 障碍的形状。
size 障碍的大小,在对象的自身空间测量。
分离网格
activated 激活连接。
NavMesh area 该OffMeshLink 组件的NavMesh 区域索引。
autoUpdatePositions 自动更新端点。
biDirectional 可以在两个方向来回移动。
costOverride 修改链接寻找目标成本。
startTransform 该变换表示链接开始位置。
endTransform 该变换表示链接终点位置。
脚本与材质系统
整个 CG 领域中这三个概念都是差不多的,在一般的实践中,大致上的层级关系是:�材质 Material包含贴图 Map,贴图包含纹理 Texture。
纹理是最基本的数据输入单位,游戏领域基本上都用的是位图。此外还有程序化生成的纹理 Procedural Texture。
贴图的英语 Map 其实包含了另一层含义就是“映射”。其功能就是把纹理通过 UV 坐标映射到3D 物体表面。贴图包含了除了纹理以外其他很多信息,比方说 UV 坐标、贴图输入输出控制等等。
材质是一个数据集,主要功能就是给渲染器提供数据和光照算法。贴图就是其中数据的一部分,根据用途不同,贴图也会被分成不同的类型,比方说 Diffuse Map,Specular Map,Normal Map 和 Gloss Map 等等。另外一个重要部分就是光照模型 Shader ,用以实现不同的渲染效果。
color 颜色
mainTexture 主纹理
Legacy动画系统
Unity提供了Animation编辑器,它可以为我们编辑物理动画。举个例子比如场景中有一个来回摇动的秋千,这个秋千在项目中完全只起到衬托作用,它不会与别的游戏对象有任何交互。如果这个秋千也用代码来写控制它来回摇动,会感觉小题大做。此时完全可以使用Animation编辑器来完成。
如下图所示,Animation窗口弹出后,点击左上角那个“小红点”按钮。因为默认新建的Cube对象是没有动画的,所以这里将弹出创建动画窗口。在窗口中点击Save,此时一个名叫New Animation的动画文件将被保存在Project视图中。
如下图所示,此时动画将处于编辑中模式, 在右上方空白处点击鼠标右键,即可添加一个Key , 点击Key就会出现一道竖向的红线,上面对应着Key的时间,这时候在左侧Transform中可以修改每一帧模型的位置,或者在编辑器中也可以修改,数值同样会被保存在每一帧的Transform中。
1、动画与灯光的结合——制作一闪一闪的灯光
2、动画与摄像机的结合——制作地形漫游功能
插值动画与光照系统的配合使用
Mecanim动画系统
2D混合类型使用了一套适应自身的不同使用方法。他的不同点在于:每个子动作都在对整个动作产生影响。
2D Simple Directional 2D简单定向
当你的动作表现为不同的方向(就像“向前走”、“向后走”、“向左走”和“向右走”,或“”“朝向上”、“朝向下”、“朝向做”和“朝向右”)时,你可以使用这个混合类型。你可以选择“等待”或者“朝向前”作为原点动作。在简单定向模式中应该尽量避免使用相同朝向的动作,比如“向前走”和“向前跑”。
2D Freeform Directional 2D自由定向
这个混合类型同样也用于混合朝向不同的动作,你也可以混合像“向前走”和“向前跑”这样的动作。在自由定向模式下,动作集合一般都应该有一个位于原点的动作,比如“等待”。
2D Freeform Cartesian 2D自由笛卡尔坐标
这种模式最好使用在你的各个动作间没有明显朝向区别的时候。在使用自由笛卡尔坐标时,你可以在X轴和Y轴上分别使用不同的定义,比如“角速度”和“线速度”。比如这样一些子动作:“向前走动不转弯”、“向前跑动不转弯”、“向前走动转向右”、“向前跑动转向右”等。
通过身体遮罩可以对动画里面特定的身体部位进行激活或禁止。在网格导入观察器和动画层的动画标签里面可以设置身体遮罩。身体遮罩让您能根据角色需求精确的裁剪动画。例如,您有一个常见的行走动画,包括手臂和腿的动作,但是如果现在一个角色的双手举着巨大的物体,您当然不会希望她在行走的时候手臂来回摆动。当然,您可以通过身体遮罩的切换,继续使用常规的行走动画。
using UnityEngine;using System.Collections; IK与FK对应,正向运动学就是根骨骼带动节点骨骼运动。而反向运动学就是反过来,由子节点带动父节点运动。对于Humanoid的动画,使用的方法很简单,在Animator窗口中,对于要使用IK的动画状态勾上Foot IK选项,在Base Layer中勾上IK Pass选项。然后在代码中实现OnAnimatorIK函数来控制IK。public class Lession04 : MonoBehaviour {Animator anim;public Transform rightHand;public Transform leftFoot;void Start(){anim=GetComponent();
}
void OnAnimatorIK(int layer){
if(rightHand!=null)
{
anim.SetIKPositionWeight(AvatarIKGoal.RightHand,1);
anim.SetIKPosition(AvatarIKGoal.RightHand,rightHand.position);
anim.SetIKRotationWeight(AvatarIKGoal.RightHand,1);
anim.SetIKRotation(AvatarIKGoal.RightHand,rightHand.rotation);
}
if(leftFoot!=null)
{
anim.SetIKPositionWeight(AvatarIKGoal.LeftFoot,1);
anim.SetIKPosition(AvatarIKGoal.LeftFoot,leftFoot.position);
}
}
}