2025.1.14
1.实现了人物的待机,走路,跑步的动画以及其代码逻辑实现。
其中,(待机/走路),(跑步)在动画机BlendTree中的参数用yVelocity,xVelocity表示,
private void AnimatorController()
{
float yVelocity = Vector3.Dot(moveDir.normalized, transform.forward); //因为人物会转向并且人物是依据世界坐标进行移动,所以要将动画参数设置为相对坐标对应的值
float xVelocity = Vector3.Dot(moveDir.normalized, transform.right); //Dot是将两个向量相乘得到一个值,normalized可以进行归一化,且不改变moveDir的值,而 Normalized 会改变其值
animator.SetFloat("xVelocity", xVelocity, 0.1f, Time.deltaTime);
animator.SetFloat("yVelocity", yVelocity, 0.1f, Time.deltaTime);
bool playRunAnimation = isRun && moveDir.magnitude > 0f; //因为Run的动画树没有设置idle,所以在不动时按跑步键会播放跑步动画,这是需要判断 moveDir.magnitude > 0f 才能进入Run 的动画树
animator.SetBool("isRun", playRunAnimation);
}
2.在InputSystem的基础上建立输入方法,实现了移动,瞄准,跑步的输入
private void AssignInputSystem()
{
controls.Enable(); (后面会改为 controls = player.controls;)
controls.Character.Movement.performed += context => moveInput = context.ReadValue<Vector2>();
controls.Character.Movement.canceled += context => moveInput = Vector2.zero;
controls.Character.Aim.performed += context => aimInput = context.ReadValue<Vector2>();
controls.Character.Aim.canceled += context => aimInput = Vector2.zero;
controls.Character.Run.performed += context =>
{
isRun = true;
speed = runSpeed;
};
controls.Character.Run.canceled += context =>
{
isRun = false;
speed = walkSpeed;
};
3.把动画过渡的设置理了一遍:
Has Exit Time Exit Time 是一种不依赖参数的特殊过渡。但是,它依赖状态的标准化时间。选中此选项可在 Exit Time 指定的具体时间进行过渡。
Exit Time
如果选中 Has Exit Time__,此值表示过渡可以生效的确切时间。该时间以标准化时间表示(例如,退出时间为 0.75 表示,在已播放 75% 动画的第一帧上,__Exit Time 条件为 true)。在下一帧上,该条件为 false。对于循环动画,每个循环都会评估退出时间小于 1 的过渡,因此可使用此选项在每个循环的动画中以适当时机对过渡进行计时。对 Exit Time 大于 1 的过渡仅评估一次,因此此类过渡可用于在固定循环次数后的特定时间退出。例如,过渡的退出时间为 3.5 的情况下,在三个半循环后对该过渡评估一次。
Fixed Duration
如果选中 Fixed Duration 复选框,则以秒为单位解读过渡时间。如果未选中 Fixed Duration 复选框,则过渡时间解读为源状态的标准化时间的一部分。
Transition Duration
相对于当前状态持续时间的过渡持续时间,以标准化时间或秒为单位(具体取决于 Fixed Duration 模式)。此时间在过渡图中显示为两个蓝色标记之间的部分。
Transition Offset
过渡到的目标状态的起始播放的时间偏移。例如,值为 0.5 表示目标状态在其时间轴的 50% 处开始播放。
Interruption Source
此选项用于控制该过渡可能中断的情况(请参阅下文的过渡中断)。
Ordered Interruption
确定当前过渡是否可在不考虑顺序的情况下被其他过渡中断(请参阅下文的过渡中断)。
Conditions
一个过渡可以具有单个条件、多个条件或根本没有条件。如果过渡没有条件,Unity Editor 只会考虑 Exit Time__,并在达到退出时间时发生过渡。如果过渡有一个或多个条件,则必须满足所有条件才能触发过渡。
一个条件包含:
- 一个事件参数(在条件中考虑其值)。
- 条件谓词(需要时填写,例如,浮点数的“小于”或“大于”)。
- 一个参数值(需要时填写)。
如果为该过渡选择 Has Exit Time__ 并有一个或多个条件,请注意 Unity Editor 在 Exit Time 之后考虑条件是否为 true。这样可确保在动画的特定部分中进行过渡。
4.增加了武器系统
新建一个Player脚本,其是所有人物控制脚本的核心,所以的有关人物的控制都能通过Player脚本实现交互。将基于InputSystem控制输入的PlayerControls controls建立在此,其他脚本只需将它们自身的controls 赋值为 player里的controls 即可 (注意,因为Player里controls是在OnEnable里controls.Enable()的,所以AssignInputSystem()要在其之后的Start里赋值).
新建WeaponVisualController脚本,用来实现武器切换,本质上就是将所有武器聚集在角色手上,然后将所有枪的active设置为false,通过按对应键将武器设为true。
5.增加了射击系统
增加射击动画,新建一层AnimatorLayer为射击层,将权重拉为1。并且新建一个AvatarMask,将其下半身全取消,并把它设置为射击层的Mask。
下载Animation Rigging,之后用它的muti-Aim Constraint来完成角色和枪的抬头低头。用Two Bone IK Constraint 来修正左手的位置,以配合武器的模型。
将脚本当做标签来使用,将标签所在物体的transform值赋予IK,来修改左手的位置
private void AttachLeftHand()
{
//获取标签所在物体的transform,并且其刚好是 gunTransfroms 的孩子
Transform trasformTarget = currentGun.GetComponentInChildren<LeftHandTargetTransform>().transform;
leftHand.localPosition = trasformTarget.localPosition;
leftHand.localRotation = trasformTarget.localRotation;
}
标签:动画,2025.1,context,controls,Exit,过渡,Time,15,日志 From: https://blog.csdn.net/ababla/article/details/145148550