7. 物理属性
物理¶
给物体赋予物理特性,可以增加动画表现的丰富性和场景的真实性。
用户可通过需要添加物理类型的组件到场景中,可添加的组件类型有角色控制器、布料、碰撞体、刚体、剖切、铰链关节和车辆。
属性列表¶
一、角色控制器¶
属性 | 属性名 | 类型 | 默认值/可选值 | 说明 |
---|---|---|---|---|
高度 | height | int | 对应角色的胶囊碰撞体的高度。 | |
半径 | radius | int | 对应角色的胶囊碰撞体的半径。 | |
行走速度 | walkSpeed | int | 对应角色的行走速度。 | |
旋转速度 | rotationSpeed | float | 对应角色的旋转速度。 | |
倍率 | speedScale | float | 行走速度、旋转速度的倍率。 | |
步高 | stepHeight | float | 对应角色的步高的高度。 | |
跳高 | maxJumpHeight | float | 对应角色的跳跃的高度。 | |
延迟起跳 | delayedJumpTime | float | 对应角色的延迟起跳时间。 | |
不使用重力 | gravitational | bool | true、false | 开启后,对应角色将不受重力影响。 |
动画名称 | animationName | string | 填写对应动画片段的名称,选填。 |
二、碰撞体¶
属性 | 属性名 | 类型 | 默认值/可选值 | 说明 |
---|---|---|---|---|
碰撞体类型 | mode | string | M、B、S、C | 可选择碰撞体类型。类型包括网格碰撞体、盒子碰撞体、球形碰撞体、胶囊碰撞体。 M=网格碰撞体, B=盒子碰撞体, S=球形碰撞体, C=胶囊碰撞体。 |
启用 | enabled | bool | true、false | 选择后启用碰撞体。 |
触发器 | trigger | bool | true、false | 如果启用此属性,则该碰撞体将用于触发事件,并被物理引擎忽略。 |
中心 | center | Vector3 | (2.6f,3.6f,4) | 碰撞体在对象局部空间中的位置。 |
尺寸 | size | Vector3 | (8.5f,2.5f,2.54f) | 碰撞体的尺寸。 |
三、刚体¶
属性 | 属性名 | 类型 | 默认值/可选值 | 说明 |
---|---|---|---|---|
质量 | mass | int | 刚体的质量。 | |
线性阻力 | drag | int | 移动对象时影响对象的空气阻力大小。 | |
角度阻力 | angleDrag | int | 旋转对象时影响对象的空气阻力大小。 | |
使用重力 | gravitational | bool | true、false | 如果启用此属性,则对象将受重力影响。 |
碰撞检测 | collisionDetection | int | 用于防止快速移动的对象穿过其他对象。 | |
约束 | constraints | int | 对刚体运动的限制。 | |
抓取 | grab | bool | true、false | 控制是否允许抓取。 |
示例代码¶
//碰撞类型
actor.GetComponent<Collider>().mode = "B";
//是否启用碰撞
actor.GetComponent<Collider>().enabled = false;
//是否启用触发器
actor.GetComponent<Collider>().trigger = false;
//设置中心点
actor.GetComponent<Collider>().center = new Vector3(10, 10, 10);
//设置碰撞大小
actor.GetComponent<Collider>().size = new Vector3(3, 3, 3);
示例案例¶
// 1-刚体
public void ActionSetRigidbody()
{
// 获取name为Plane的三维物体—立方体
Actor actor = Actor.Find("Plane");
// 添加刚体组件
actor.AddComponent("Rigidbody");
// 获取刚体组件
Rigidbody rigidbody = actor.GetComponent<Rigidbody>();
// 是否启用|enabled
rigidbody.enabled = true;
// 修改线性阻力|drag
rigidbody.drag = 32;
// 修改角度阻力|angleDrag
rigidbody.angleDrag = 28;
// 是否使用重力|gravitational
rigidbody.gravitational = false;
// 修改碰撞检测|collisionDetection
rigidbody.collisionDetection = 22;
// 修改约束|constraints
rigidbody.constraints = 35;
// 是否抓取|grab
rigidbody.grab = true;
// 修改质量|mass
rigidbody.mass = 15;
}
// 2-碰撞体
public void ActionSetCollider()
{
// 需要一个平面和球/立方体/圆柱体才能看出效果
// 为球添加碰撞体和刚体组件
// 获取name为Sphere的三维物体-球
Actor sphere_actor = Actor.Find("Sphere");
// 修改球属性的位置/旋转/缩放
sphere_actor.localPosition = new Vector3(0, 4, 0);
sphere_actor.localEulerAngles = new Vector3(0, 0, 0);
sphere_actor.localScale = new Vector3(1, 1, 1);
// 为球添加刚体组件
sphere_actor.AddComponent("Rigidbody");
// 获取球的碰撞体组件
Collider collider = sphere_actor.GetComponent<Collider>();
// 选择碰撞体类型|mode 类型为M/B/S/C 即 M:网格碰撞体, B:盒子碰撞体, S:球形碰撞体, C:胶囊碰撞体
collider.mode = "S";
// 是否启用|enabled
collider.enabled = true;
// 是否触发器|trigger
collider.trigger = false;
// 修改中心|center
collider.center = new Vector3(0, 0, 0);
// 修改半径|radius
collider.radius = 0.5f;
// 获取球的刚体组件
Rigidbody sphere_rigidbody = sphere_actor.GetComponent<Rigidbody>();
// 是否启用|enabled
sphere_rigidbody.enabled = true;
// 修改线性阻力|drag
sphere_rigidbody.drag = 0;
// 修改角度阻力|angleDrag
sphere_rigidbody.angleDrag = 0;
// 是否抓取|grab
sphere_rigidbody.grab = true;
// 是否使用重力|gravitational
sphere_rigidbody.gravitational = true;
// 修改碰撞检测|collisionDetection
sphere_rigidbody.collisionDetection = 0;
// 修改约束|constraints
sphere_rigidbody.constraints = 0;
// 修改质量|mass
sphere_rigidbody.mass = 1;
// 1、为平面添加碰撞体和刚体组件
// 获取name为plane的三维物体-平面
Actor plane_actor = Actor.Find("Plane");
// 为平面添加刚体组件
plane_actor.AddComponent("Rigidbody");
// 获取平面的碰撞体组件
Collider plane_collider = plane_actor.GetComponent<Collider>();
// 选择碰撞体类型|mode 类型为M/B/S/C 即 M:网格碰撞体, B:盒子碰撞体, S:球形碰撞体, C:胶囊碰撞体
plane_collider.mode = "M";
// 是否启用|enabled
plane_collider.enabled = true;
// 是否触发器|trigger
plane_collider.trigger = false;
// 修改中心|center
plane_collider.center = new Vector3(0, 0, 4);
// 是否凸多面体|convex
plane_collider.convex = false;
// 获取平面的刚体组件
Rigidbody plane_rigidbody = plane_actor.GetComponent<Rigidbody>();
// 是否启用|enabled
plane_rigidbody.enabled = true;
// 修改线性阻力|drag
plane_rigidbody.drag = 0;
// 修改角度阻力|angleDrag
plane_rigidbody.angleDrag = 0;
// 是否使用重力|gravitational
plane_rigidbody.gravitational = false;
// 修改碰撞检测|collisionDetection
plane_rigidbody.collisionDetection = 0;
// 修改约束|constraints
plane_rigidbody.constraints = 0;
// 是否抓取|grab
plane_rigidbody.grab = false;
// 修改质量|mass
plane_rigidbody.mass = 0;
}
// 3-角色控制器
public void ActionSetCharacterController()
{
// 在角色控制器教材案例模型中实现该功能 只要添加一个Empty三维物体就可实现一以下效果
// 将子节点“角色”拖入节点“Empty”中
// 获取name为Empty的三维物体-空物体
Actor character_controller_actor = Actor.Find("Empty");
// 为Empty添加角色控制器组件
character_controller_actor.AddComponent("CharacterControllerComponent");
// 修改Empty属性的位置/旋转/缩放
character_controller_actor.localPosition = new Vector3(0, 0.75f, 0);
character_controller_actor.localEulerAngles = new Vector3(0, 0, 0);
character_controller_actor.localScale = new Vector3(1, 1, 1);
// 获取name为角色的人物
Actor person_actor = Actor.Find("角色");
// 修改角色属性的位置/旋转/缩放
person_actor.localPosition = new Vector3(0, -0.75f, 0);
person_actor.localEulerAngles = new Vector3(0, 180, 0);
person_actor.localScale = new Vector3(0, 0.75f, 0);
// 获取Empty的角色控制器组件
CharacterControllerComponent character_controller = character_controller_actor.GetComponent<CharacterControllerComponent>();
// 是否启用|enabled
character_controller.enabled = true;
// 选择高度|height
character_controller.height = 0.7f;
// 选择半径|radius
character_controller.radius = 0.4f;
// 选择行走速度|walkSpeed
character_controller.walkSpeed = 1;
// 选择旋转速度|rotationSpeed
character_controller.rotationSpeed = 0.015f;
// 选择倍率|speedScale
character_controller.speedScale = 1;
// 选择步高|stepHeight
character_controller.stepHeight = 0.2f;
// 选择跳高|maxJumpHeight
character_controller.maxJumpHeight = 0.6f;
// 是否使用重力|gravitational
character_controller.gravitational = true;
// 选择延迟起跳|delayedJumpTime
character_controller.delayedJumpTime = 0.8f;
// 前进|forwardKey
character_controller.forwardKey = "";
// 后退|backOffKey
character_controller.backOffKey = "";
// 左转|turnLeftKey
character_controller.turnLeftKey = "";
// 右转|turnRightKey
character_controller.turnRightKey = "";
// 跳跃|jumpKey
character_controller.jumpKey = "";
// 输入待机动画名称|idleAnimation
character_controller.idleAnimation = "idle";
// 输入行走动画名称|walkAnimation
character_controller.walkAnimation = "Walking";
// 输入左转动画名称|turnLeftAnimation
character_controller.turnLeftAnimation = "Walking";
// 输入右转动画名称|turnRightAnimation
character_controller.turnRightAnimation = "Walking";
// 输入跳跃动画名称|jumpAnimation
character_controller.jumpNameAnimation = "jump";
// 输入倒退动画名称|backWalkAnimation
character_controller.walkBackAnimation = "Walking";
// 输入动画Actor名称|animationName 子节点名称为角色
character_controller.animationName = "角色";
}