动画分层处理 动画帧事件 灯光 创建子状态机 融合树 导航 动态路障

动画分层处理

可以拆分动画 不同的层执行不同的动画

Base Layer 第0层

Weight 权重
Mask 遮罩 骨骼遮罩  右键 ----> Create ----> Avatar Mask (一般主层不动)
Humanoid 人形 点红了不执行,绿色的执行动作
Transform 找到非人性骨骼拖过来
IK Pass 反向动力学

给人物加一把枪,需要放到骨骼里

IK 动画 小例子

//写法大致相同
using UnityEngine;

public class PlayerIK : MonoBehaviour {
	//目标作为牵引
    public Transform target;
    //拿到Animator
    private Animator animator;
    
    private void Awake(){
        //找到Animator组件
        animator = GetComponent<Animator>();
    }
    
    //专门的IK回调
    //当勾选IK Pass 每帧执行一次
    private void OnAnimatorIK(int layerIndex){
        //设置权重
        animator.SetIKPositionWeight(AvatarIKGoal.LeftHand, 1);
        animator.SetIKPositionWeight(AvatarIKGoal.RightHand, 1);
        animator.SetLookAtWeight(1);
        //设置目标
        animator.SetIKPosition(AvatarIKGoal.LeftHand, target.position);
        animator.SetIKPosition(AvatarIKGoal.RightHand, target.position);
        animator.SetLookAtPosition(target.position);
    }
}

在动画剪辑(动画片段)里有Curves曲线

创建Box Collder 最好先创建到他的网格上,调整好了复制一份粘到跟对象上 Paste Component As New 粘贴新组件

让碰撞体跟随角色

using UnityEngine;

public class PlayerAnimationCurve : MonoBehaviour {
    private Animator animator;
    private BoxCollider boxCollider;
    //中心
    private float originCenter;
    
    private void Awake(){
        animator = GetComponent<Animator>();
        boxCollider = GetComponent<BoxCollider>();
    }
    
    private void Start(){
        //获取他的中心
        originCenter = boxCollider.center.y;
    }
    
    private void Update(){
        if(!animator.GetCurrentAnimatorStateInfo(0).IsName("Armed-Jump"))
            return;
        //获取曲线数值
        float curveCenterOffset = animator.GetFloat("JumpCenter");
        //调节碰撞体的中心
        boxCollider.center = 
            new Vector3(boxCollider.center.x, 
                        originCenter + curveCenterOffset, 
                        boxCollider.center.z);
    }
}

动画帧事件

Function 
Float (这四个只能四选一)
Int
String
Object

灯光

GameObject ----> Light ----> 
Directional Lightv 方向光 (这三种实时渲染)
Point Light 点灯光
Spotlight 聚光灯
Area Light 区域光

Range 光照范围 Intensity 光照强度 Shadow Type 硬阴影,软阴影

创建子状态机

状态机中右键 Create Sub-State Machine 动画特别多 还需要分类特别细的时候才用,一般用不上

融合树

右键 Create State Empty 空动画

右键 Create State From New Blend Tree 创建新的融合树

Threshold 阈值

动画层 融合不同部位的动画
融合树 融合的是不同方向的动画
1D  一个方向
2D Simple Directional  又有水平又有前后的用2d   动画不同方向,动画不能没有方向 比如站立
2D Freeform Directional 动画不同方向,动画可以有一个每天有方向
2D Freeform Cartesian 没有限制
Direct 表情融合
Compute Positions

导航系统

先设置静态 : 选中不会动的物体,Static,Navigation Static
Window,Navigation

Navigation
Agents		Areas		Bake 烘焙(导航路面)		Object



Areas 区域 路面(分层路面导航)





Bake 烘焙(导航路面)
Baked Agent Size  代理导航角色
Agent Radius 角色半径
Agent Height 高度
Max Slope 最大斜坡坡度
Step Height 每一节台阶的最大高度

添加导航组件Nav Mesh Agent
Agent Type (默认)
Base Offset 垂直方向偏移量
Speed 导航的移动速度(最大速率)
Angular Speed 角速度/旋转速度
Acceleration 加速度
Stopping Distance 制动距离/距离目标多少米停下来
Auto Braking 自动制动
Radius
Height
Quality 导航质量
Priority 优先级
Drop Height 跳跃高度  跳下    同一路面
Jump Distance 跳跃距离  使用时候要选中两个分离路面 Static 勾选Off Mesh Link Generation
Auto Traverse Off Mesh Link 当遇到分离路面导航的时候是否用unity的导航

Off Mesh Link组件   不同路面
Start
End
using UnityEngine;
using UnityEngine.AI;//引用命名空间

public class PlayerNavigation : MonoBehaviour {
    [Header("导航目标")]
	public Transform target;
    [Header("时间间隔")]
    public float offMeshLinkInterval = 3f;
    [Header("跳跃高度")]
    public float jumpHeight = 3f;

    private NavMeshAgent nav;
    //增量
    private float linkScale = 0;
    
    private void Awake(){
        nav = GetComponent<NavMeshAgent>();
    }
    
    private void Start(){
        //设置目的地
        nav.SetDestination(target.position);
        //nav.destination = target.position;
    }
    
    private void Update(){
        AgentOffMeshLink();
    }
    
    private void AgentOffMeshLink(){
        OffMeshLinkData data = nav.currentOffMeshLinkData;
        //如果往下跳
        if(nav.isOnOffMeshLink && data.linkType == OffMeshLinkType.LinkTypeDropDown){
            //跳跃比例
            linkScale += Time.deltaTime/offMeshLinkInterval;
            //计算y轴的抛物线高度  公式:y = (x - x²) × 3
            float upOffset = (linkScale - linkScale * linkScale) * jumpHeight;
            //设置角色的位置(直线过去)
            transform.position = 
                Vector3.up * upOffset + Vector3.Lerp(data.startPos, data.endPos, linkScale);
            if(linkScale > 1){
                //完成分离路面导航
                nav.CompleteOffMeshLink();
                linkScale = 0;
            }
        }
    }
    
}
nav.isStopped = true;//暂停导航
nav.isStopped = false;//恢复导航

动态路障

Nav Mesh Obstacle

Carve 这个看情况 勾上他 会自动选择路 不勾 会像一个死心眼子一样 在那里死磕。。直到动态路障消失!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值