跳转至

RE0:从零开始的角色控制器

一 前期准备

InputSystem插件

Cinemachine插件

  • 虚拟相机
  • Follow:跟随
  • Look at:盯着角色转
  • Aim: Do nothing
  • Body:
    • Binding Mode:World Place防止乱动

二 手持武器行走

Animator Layers 动画层级

玩家持枪站立和玩家行走两个动画如何缝合到一个上面? 如何单独控制一个部位的变化?变脸又如何实现?

  • 设置:
    • 优先级顺序:越下面的层级优先级越高,不过也和Blending设置有关。
    • Weight:权重[0,1],当前动画层级的影响,1则为全部替代
    • Mask:角色身体的哪些部分会播放我们的动画
    • 资源文件里建立一个新的Avatar Mask文件
    • Humanoid,人性骨骼的影响部位,绿色()
    • Transform,选择非人形的骨骼节点
      • Import skelecton 即可导入节点进行修改
      • 导入了就删不掉,只能重新建立了
  • Blending
    • Override:覆盖其他层级,如拿枪动画
    • Additive:混合其他层级,如疲惫动画。注意:如果被混合的层级根本没有相应的动画Curve,则没有影响(比如有个动画就没有手臂动画曲线,那么是不会混合的,不能混合不存在的动画)
  • Sync:选择同步,如建立在原动作上的受伤动画“高兴”和“伤心”动画
    • Source Layer:选择哪个层级同步
    • Timing:不同动画的时长不一样,动画系统会自动为动画片段进行缩放并同步
      • Timing为权重,0就是以目标选择同步层级为准,1则是以当前选择同步层级为准。
  • IK Pass:如果要使用IK的话,就需要勾选,尤其是手部

三 动画层级覆盖

动画之间的层级会影响动画显示,如受伤影响了拿枪动画。所以我们必须要把拿枪动画放到受伤动画上面。

四 碰到物体会旋转

  • 刚体RigidBody设置Y轴锁定Constraint

五 武器与IK

5.1 准备

  • animation rigging:快速定位骨骼
  • 将武器拖进去

5.2 原理

  • 原理:CCD循环梯度下降
  • 正向动力学问题:上级旋转误差会累积到下一级

5.3 使用

  • 需要IK的动作请设置IK Pass选项
  • 在控制器脚本中,使用OnAnimationIK()函数
  • 把双手两个IK Goal位置和角度权重设置为1
    private OnAnimationIK(int layerIndex)
    {
            animator.SetIKPositionWeight(AvatarIKGoal.LeftHand,1f);
            animator.SetIKRotationWeight(AvatarIKGoar.LeftHand,1f);
            animator.SetIKPositionWeight(AvatarIKGoal.RightHand,1f);
            animator.SetIKRotationWeight(AvatarIKGoar.RightHand,1f);
            Debug.Log(layerIndex);
    }
    
  • 如果枪的位置显得不合适,可以设置一个RightHandPosition空物体,并让手的IK Goal位置与这个一致
    private OnAnimationIK(int layerIndex)
    {
            animator.SetIKPosition(AvatarIKGoal.RightHand,rightHandPosition.position)
            animator.SetIKRotation(AvatarIKGoal.RightHand,rightHandPosition.position)
            animator.SetIKPosition(AvatarIKGoal.LeftHand,legtHandPosition.position)
            animator.SetIKRotation(AvatarIKGoal.LeftHand,leftHandPosition.position)
            Debug.Log(layerIndex);
    }
    

六 Animation Rigging功能

离成功总是差那么点 * Rig:控制骨骼的工具 * 多种约束提供选择

七 动画状态机控制IK

7.1 切换Target

  • 切换Target,一般要编写脚本。但简单一点就可以直接将两个target的位置本身存成动画片段。
  • 然后把他们用一个新的Layer存起来,实现两个动画片段的过渡

八 拔枪、收枪和动画片段三种操作

8.1 分割

Inspector--Animation设置中有滑块可以分割需要的动画

8.2 设置循环

请确保起始帧和结束帧足够的相似。相似度可以通过下面绿色条形图来判断

8.3 动画事件

以拔枪收枪为例,我们需要将枪放在肩部骨骼上。通过动画事件在拔枪收枪动画合适的时间中切换位置 * 注意:这里是在Inspector中直接设置动画文件的事件Events。而不是在Animation动画窗口添加动画帧事件 * 原理:发送一个Message,并调用这个游戏对象上绑定的所有这些组件 * 造成的问题:扭曲,IK可能会把原动画覆盖掉。后面使用Curve来逐渐减少IK权重

8.4 为动画添加Curve

  • 可以为没有root Motion的动画添加Curve
  • 为IK权重变化(保证接触到枪时为1,脱离时为0) ![[Pasted image 20240915124938.png]]
  • 在Animator的Parameters建立一个和动画曲线同名的float类型参数,curve的参数变化会自动传入