跳转至

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 = "角色";
    }