/// <summary> /// 设置当前状态 /// </summary> /// <param name="stateInfo"></param> void SetCurStateInfo(XX_AnimationStateInfo stateInfo) { _curStateInfo = stateInfo; _curStateTime = 0; IsAttacking = true; animator.SetBool(isAttack, IsAttacking); }
/// <summary> /// 初始化攻击动画 /// </summary> void InitStateInfos() { normalStateInfo = new XX_AnimationStateInfo(animator, "UpBody.OrientalSword_COMBOATTACK01", 0.5f, true, 0f, 0.5f, 0.5f); normal1StateInfo = new XX_AnimationStateInfo(animator, "UpBody.OrientalSword_COMBOATTACK01", 0.6f, true, 0.5f, 0.6f, 0.6f); normal2StateInfo = new XX_AnimationStateInfo(animator, "UpBody.OrientalSword_COMBOATTACK01", 0.9f, true, 1.1f, 0.9f, 0.9f); _stateInfos.Add(normalStateInfo); _stateInfos.Add(normal1StateInfo); _stateInfos.Add(normal2StateInfo); }
/// <summary> /// 当状态离开 /// </summary> /// <param name="stateInfo"></param> void OnExitState(XX_AnimationStateInfo stateInfo) { SetUpBodyLayerWeight(0); SetDownBodyLayerWeight(0); SetAttackHorParameter(0); SetAttackVerParameter(0); _curStateTime = 0; _curStateInfo = null; IsAttacking = false; animator.SetBool(isAttack, IsAttacking); _isAction = null; _normalNextStateInfo = null; }
/// <summary> /// 攻击逻辑 /// </summary> void OnAttack() { bool canAttack = characterController.animState.attackIndex != 0; canAttack &= _curStateInfo == null || (_curStateInfo != null && _curStateTime >= _curStateInfo.AnimationLength); canAttack |= (_curStateInfo != null && _normalNextStateInfo != null && _curStateTime >= _curStateInfo.AnimationLength); if (IsAttacking) { if (characterController.animState.attackIndex == 1 && IsCurAttackNormal()) { _normalNextStateInfo = _curStateInfo == normalStateInfo ? normal1StateInfo : _curStateInfo == normal1StateInfo ? normal2StateInfo : _curStateInfo == normal2StateInfo ? normalStateInfo : null; } //判断是否在其他不同行为 例如 走,跳,蹲下 bool isAction = !characterController.animState.onGround; isAction |= characterController.animState.run; isAction |= characterController.animState.walk; isAction |= characterController.animState.crouch; if (isAction != _isAction) { _isAction = isAction; SetDownBodyLayerWeight(isAction ? 0 : 1.0f); } } if (!canAttack) { return; } //TODO 获取合适得状态 //XX_AnimationStateInfo stateInfo; SetCurStateInfo(_normalNextStateInfo ?? normalStateInfo); SetAttackHorParameter(1); SetUpBodyLayerWeight(1); }