protected override void StateChanging()
        {
            bool isParamerNotEmpty = AniParamer != default;

            if (isParamerNotEmpty)
            {
                AniParamer.ResetMotionState();
                AniParamer.ResetMotionWillPlay();
            }
            else
            {
            }

            base.StateChanging();

            if (isParamerNotEmpty)
            {
                if (Current is IAnimatorState state)
                {
                    state.CheckStateAnimation(AniParamer);
                    mAniState = state;
                }
                else
                {
                }
            }
            else
            {
            }
        }
 public bool Update(IAnimatorState state)
 {
     Frame++;
     Testers.Tester.Instance.Log(TesterRPG.Instance, TesterRPG.LOG, string.IsNullOrEmpty(state.AnimationName), "error: ".Append(state.ToString(), " animation name is null."));
     HasCompleted = (StateInfo.normalizedTime > 1f) && StateInfo.IsName(state.AnimationName);
     return(HasCompleted);
 }
 void Start()
 {
     animationClipTypeStateList = new List <AnimationClipTypeState>();
     iAnimatorState             = GameState.Instance.GetEntity <IAnimatorState>();
     iSpecialState = GameState.Instance.GetEntity <ISpecialState>();
     if (!playerAnimator)
     {
         playerAnimator = GetComponent <Animator>();
     }
     if (playerAnimator)
     {
         PlayerAnimRunningState[] playerAnimRunningStates = playerAnimator.GetBehaviours <PlayerAnimRunningState>();
         foreach (PlayerAnimRunningState playerAnimRunningState in playerAnimRunningStates)
         {
             playerAnimRunningState.AnimRunningStateHandle += PlayerAnimRunningState_AnimRunningStateHandle;
         }
     }
     //注册监听
     GameState.Instance.Registor <IPlayerState>(CallBackIPlayerStateState);
     GameState.Instance.Registor <IAnimatorState>(CallBackIAnimatorState);
     GameState.Instance.Registor <ISpecialState>(CallBackISpecialState);
     GameState.Instance.Registor <IPlayerAttributeState>(CallBackIAttributeState);
     //设置初始武器状态
     CallBackIPlayerStateState(GameState.Instance.GetEntity <IPlayerState>(), GameState.GetFieldNameStatic <IPlayerState, bool>(temp => temp.EquipmentChanged));
     //设置初始速度
     CallBackIAttributeState(GameState.Instance.GetEntity <IPlayerAttributeState>(), GameState.GetFieldNameStatic <IPlayerAttributeState, float>(temp => temp.AttackSpeed));
 }
    /// <summary>
    /// 设置物理技能攻击
    /// </summary>
    /// <param name="playerObj">玩家操纵状态对象</param>
    /// <param name="physicsSkillStateStruct">本技能释放时的数据状态</param>
    /// <param name="skillType">技能类型</param>
    /// <param name="weaponTypeByPlayerState">武器类型</param>
    public void SetPhysicSkillAttack(IPlayerState iPlayerState, PhysicsSkillStateStruct physicsSkillStateStruct, EnumSkillType skillType, EnumWeaponTypeByPlayerState weaponTypeByPlayerState)
    {
        if (iPlayerState == null || physicsSkillStateStruct == null)
        {
            return;
        }
        IPlayerState                _iPlayerState            = iPlayerState;
        PhysicsSkillStateStruct     _physicsSkillStateStruct = physicsSkillStateStruct;
        EnumSkillType               _SKillType = skillType;
        EnumWeaponTypeByPlayerState _WeaponTypeByPlayerState   = weaponTypeByPlayerState;
        PhysicSkillInjuryDetection  physicSkillInjuryDetection = _iPlayerState.PhysicSkillInjuryDetection;

        if (physicSkillInjuryDetection != null)
        {
            physicSkillInjuryDetection.CheckAttack(_SKillType, _WeaponTypeByPlayerState, 1, null, (innerOrder, target) =>
            {
                return(CalculatePhysicSkillHurt(_SKillType, _WeaponTypeByPlayerState, _physicsSkillStateStruct, innerOrder, target));
            });
        }
        //如果这是冲锋则开启任务(移动对象)
        switch (skillType)
        {
        case EnumSkillType.ZS03:
            float zs03Time = 0;
            runTaskStruct_Charge.StartTask(0,
                                           () =>
            {
                zs03Time       += Time.deltaTime;
                float speedRate = 0;
                if (zs03Time < 0.3f)
                {
                    speedRate = 0;
                }
                else
                {
                    speedRate = 1;
                }
                _iPlayerState.ForceMoveStruct = new ForceMoveStruct()
                {
                    MoveSpeed = _physicsSkillStateStruct.AttributeState.MoveSpeed * speedRate
                };
                if (zs03Time > 1f)
                {
                    runTaskStruct_Charge.StopTask();
                    IAnimatorState iAnimatorState   = GameState.Instance.GetEntity <IAnimatorState>();
                    iAnimatorState.SkillSustainable = false;
                }
            }, 0, false);
            break;
        }
    }
Example #5
0
 /// <summary>
 /// 用于检测物理技能和普通攻击
 /// </summary>
 /// <param name="iAnimatorState"></param>
 /// <param name="fieldName"></param>
 private void IAnimatorStateChanged(IAnimatorState iAnimatorState, string fieldName)
 {
     if (string.Equals(fieldName, GameState.Instance.GetFieldName <IAnimatorState, EnumPhysicAnimatorType>(temp => temp.PhysicAnimatorType)))
     {
         if (iAnimatorState.PhysicAnimatorType == EnumPhysicAnimatorType.Skill)
         {
             PhysicSkillAudioStruct physicSkillAudioStruct = physicSkillAudios.FirstOrDefault(temp => temp.SkillType == iAnimatorState.PhysicAnimatorSkillType);
             if (physicSkillAudioStruct != null)
             {
                 audioSources[2].clip = physicSkillAudioStruct.Clip;
                 audioSources[2].Play();
             }
         }
         else if (iAnimatorState.PhysicAnimatorType == EnumPhysicAnimatorType.Normal)
         {
             PlayerState playerState = DataCenter.Instance.GetEntity <PlayerState>();
             PlayGoods   playGoods   = playerState.PlayerAllGoods.Where(temp => temp.GoodsLocation == GoodsLocation.Wearing && temp.leftRightArms != null && temp.leftRightArms.Value == false).FirstOrDefault();
             if (playGoods != null)
             {
                 EnumGoodsType enumGoodsType = playGoods.GoodsInfo.EnumGoodsType;
                 //与1000相除求出剔除了具体类型后的上层一分类
                 //然后与100求余计算出具体的武器分类
                 //因为武器的分类是从10开始的因此减去10
                 //动画的第一个分类留空为0表示空手,因此加1
                 int num = (((int)enumGoodsType) / 1000) % 100 - 10 + 1;
                 PhysicNormalAudioStruct physicNormalAudioStruct = physicNormalAudios.FirstOrDefault(temp => temp.WeaponNum == num);
                 if (physicNormalAudioStruct != null)
                 {
                     if (iAnimatorState.PhycisActionNowType == 0)
                     {
                         audioSources[2].clip = physicNormalAudioStruct.Clip1;
                     }
                     else if (iAnimatorState.PhycisActionNowType == 1)
                     {
                         audioSources[2].clip = physicNormalAudioStruct.Clip2;
                     }
                     else if (iAnimatorState.PhycisActionNowType == 2)
                     {
                         audioSources[2].clip = physicNormalAudioStruct.Clip3;
                     }
                     audioSources[2].Play();
                 }
             }
         }
     }
 }
    /// <summary>
    /// 监听函数-动画状态发生变化
    /// </summary>
    /// <param name="iAnimatorState"></param>
    /// <param name="fieldName"></param>
    private void CallBackIAnimatorState(IAnimatorState iAnimatorState, string fieldName)
    {
        if (!playerAnimator)
        {
            return;
        }
        //移动速度发生变化
        if (string.Equals(fieldName, GameState.Instance.GetFieldName <IAnimatorState, float>(temp => temp.AnimatorMoveSpeed)))
        {
            playerAnimator.SetFloat("Speed", iAnimatorState.AnimatorMoveSpeed);
        }
        //移动方向发生变化
        else if (string.Equals(fieldName, GameState.Instance.GetFieldName <IAnimatorState, int>(temp => temp.MoveAnimatorVectorType)))
        {
            float forwardFloat = iAnimatorState.MoveAnimatorVectorType / 180f;
            playerAnimator.SetFloat("Forward", forwardFloat);
        }
        //魔法动画类型发生变化
        else if (string.Equals(fieldName, GameState.Instance.GetFieldName <IAnimatorState, EnumMagicAnimatorType>(temp => temp.MagicAnimatorType)))
        {
            switch (iAnimatorState.MagicAnimatorType)
            {
            case EnumMagicAnimatorType.Sing:
                playerAnimator.SetBool("Sing", true);
                playerAnimator.SetTrigger("Magic");
                playerAnimator.SetTrigger("ChangeMode");
                playerAnimator.SetLayerWeight(1, 0.5f);
                break;

            case EnumMagicAnimatorType.Shot:
                playerAnimator.SetBool("Sing", false);
                playerAnimator.SetLayerWeight(1, 0f);
                break;

            default:
                playerAnimator.SetBool("Sing", false);
                playerAnimator.SetLayerWeight(1, 0f);
                break;
            }
        }
        //物理(普通攻击)动画类型发生变化
        else if (string.Equals(fieldName, GameState.Instance.GetFieldName <IAnimatorState, EnumPhysicAnimatorType>(temp => temp.PhysicAnimatorType)))
        {
            switch (iAnimatorState.PhysicAnimatorType)
            {
            case EnumPhysicAnimatorType.Normal:
                playerAnimator.SetTrigger("Phycis");
                playerAnimator.SetTrigger("ChangeMode");
                //根据当前的物理攻击状态随机一个动作
                if (iAnimatorState.PhycisActionNowType == 0)
                {
                    playerAnimator.SetFloat("PhycisType1", (int)(UnityEngine.Random.Range(0, 10)));
                }
                else if (iAnimatorState.PhycisActionNowType == 1)
                {
                    playerAnimator.SetFloat("PhycisType2", (int)(UnityEngine.Random.Range(0, 10)));
                }
                else if (iAnimatorState.PhycisActionNowType == 2)
                {
                    playerAnimator.SetFloat("PhycisType3", (int)(UnityEngine.Random.Range(0, 10)));
                }
                break;

            case EnumPhysicAnimatorType.Skill:
                playerAnimator.SetTrigger("Skill");
                playerAnimator.SetTrigger("ChangeMode");
                playerAnimator.SetInteger("SkillType", (int)iAnimatorState.PhysicAnimatorSkillType - (int)EnumSkillType.SpecialPhysicActionReleaseStart);
                break;

            default:
                playerAnimator.ResetTrigger("Phycis");
                playerAnimator.ResetTrigger("Skill");
                playerAnimator.SetBool("SkillSustainable", false);    //技能取消持续(主要是有些技能可能会有持续动作)
                break;
            }
        }
        //翻滚动画
        else if (string.Equals(fieldName, GameState.Instance.GetFieldName <IAnimatorState, bool>(temp => temp.RollAnimator)))
        {
            if (iAnimatorState.RollAnimator &&   //翻滚并且
                iSpecialState.Xuanyun.Time <= 0) //没有处于眩晕状态,其他状态后期再加
            {
                //设置翻滚
                playerAnimator.SetTrigger("Roll");
                //设置回false
                iAnimatorState.RollAnimator = false;
            }
        }
        //攻击造成的动画延迟
        else if (string.Equals(fieldName, GameState.Instance.GetFieldName <IAnimatorState, bool>(temp => temp.PhysicHitMonsterAnimDelay)))
        {
            if (physicAttackDelayCoroutine == null)
            {
                physicAttackDelayCoroutine = StartCoroutine(PhysicAttackDelay());
            }
        }
        //持续动作发生变化
        else if (string.Equals(fieldName, GameState.Instance.GetFieldName <IAnimatorState, bool>(temp => temp.SkillSustainable)))
        {
            playerAnimator.SetBool("SkillSustainable", iAnimatorState.SkillSustainable);//技能保持持续(主要是有些技能可能会有持续动
        }
        //被攻击
        else if (string.Equals(fieldName, GameState.Instance.GetFieldName <IAnimatorState, bool>(temp => temp.IsGetHitAnimator)))
        {
            if (iAnimatorState.IsGetHitAnimator && //被攻击状态
                iSpecialState.Xuanyun.Time <= 0)   //没有处于眩晕,其他状态后期再加
            {
                playerAnimator.SetTrigger("GetHit");
            }
            else//否则重置回false
            {
                iAnimatorState.IsGetHitAnimator = false;
            }
        }
    }
 public bool Update(IAnimatorState state)
 {
     Frame++;
     HasCompleted = (StateInfo.normalizedTime > 1f) && StateInfo.IsName(state.AnimationName);
     return(HasCompleted);
 }
    /// <summary>
    /// 计算物理技能伤害
    /// </summary>
    /// <param name="skillType">技能类型</param>
    /// <param name="weaponTypeByPlayerState">武器类型</param>
    /// <param name="physicsSkillStateStruct">物理技能数据</param>
    /// <param name="innerOrder">当前攻击的阶段</param>
    /// <param name="target">攻击的目标</param>
    private bool CalculatePhysicSkillHurt(EnumSkillType skillType, EnumWeaponTypeByPlayerState weaponTypeByPlayerState, PhysicsSkillStateStruct physicsSkillStateStruct, int innerOrder, GameObject target)
    {
        if (target == null)
        {
            return(true);
        }
        InteractiveAsMonster interactiveAsMonster = target.GetComponent <InteractiveAsMonster>();

        if (interactiveAsMonster == null)
        {
            return(true);
        }
        IPlayerState     iPlayerState     = GameState.Instance.GetEntity <IPlayerState>();
        AttackHurtStruct attackHurtStruct = new AttackHurtStruct()
        {
            hurtTransferNum    = 0,
            hurtType           = EnumHurtType.PhysicSkill,
            attributeState     = physicsSkillStateStruct.AttributeState,
            hurtFromObj        = iPlayerState.PlayerObj,
            PhysicAttackFactor = new PhysicAttackFactor()
            {
                IncreaseRatioInjuryFactor = iPlayerState.SelfRoleOfRaceInfoStruct.physicAttackToDamageRateRatio,
                MinimumDamageFactor       = iPlayerState.SelfRoleOfRaceInfoStruct.physicQuickToMinDamageRatio
            }
        };

        CalculateHurt.Result hurtResult = interactiveAsMonster.GiveAttackHurtStruct(attackHurtStruct);
        if (hurtResult.IsCrit || hurtResult.hurtRate > 0.2f)
        {
            iPlayerState.SetVibration(0.1f, 0.7f, 0.7f);//设置手柄震动
        }
        //如果命中了则自身的动画造成0.1秒的延迟
        IAnimatorState iAnimatorState = GameState.Instance.GetEntity <IAnimatorState>();

        if (weaponTypeByPlayerState != EnumWeaponTypeByPlayerState.Arch)
        {
            iAnimatorState.PhysicHitMonsterAnimDelay = true;
        }
        //停止持续
        iAnimatorState.SkillSustainable = false;
        //如果是冲锋则停止任务
        switch (skillType)
        {
        case EnumSkillType.ZS03:
            runTaskStruct_Charge.StopTask();
            break;
        }
        //设置命中声音
        WeaponPhysicHit = (int)weaponTypeByPlayerState;
        //判断技能类型,有些紧只需要判断一次
        switch (skillType)
        {
        case EnumSkillType.GJS03:
        case EnumSkillType.SSS03:
        case EnumSkillType.ZS03:
            return(false);

        default:
            return(true);
        }
    }
    /// <summary>
    /// 计算物理普通攻击伤害
    /// </summary>
    /// <param name="weaponTypeByPlayerState">武器类型</param>
    /// <param name="iAttribute">攻击时的状态数据</param>
    /// <param name="innerOrder">当前攻击的阶段</param>
    /// <param name="target">攻击的目标</param>
    private bool CalculateNormalActionHurt(EnumWeaponTypeByPlayerState weaponTypeByPlayerState, IAttributeState _iAttribute, int innerOrder, GameObject target)
    {
        if (target == null)
        {
            return(true);
        }
        InteractiveAsMonster interactiveAsMonster = target.GetComponent <InteractiveAsMonster>();

        if (interactiveAsMonster == null)
        {
            return(true);
        }
        IPlayerState    iPlayerState = GameState.Instance.GetEntity <IPlayerState>();
        IAttributeState iAttribute   = ((AttributeStateAdditional)_iAttribute).Clone();

        switch (weaponTypeByPlayerState)
        {
        case EnumWeaponTypeByPlayerState.SingleHandedSword:
            if (innerOrder == 3)
            {
                iAttribute.PhysicsAttacking *= 1.2f;
            }
            break;

        case EnumWeaponTypeByPlayerState.TwoHandedSword:
            if (innerOrder == 3)
            {
                iAttribute.PhysicsAttacking *= 0.7f;
            }
            break;

        case EnumWeaponTypeByPlayerState.Arch:
            if (innerOrder == 3)
            {
                iAttribute.PhysicsAttacking *= 2f;
            }
            break;
        }
        AttackHurtStruct attackHurtStruct = new AttackHurtStruct()
        {
            hurtTransferNum    = 0,
            hurtType           = EnumHurtType.NormalAction,
            attributeState     = iAttribute,
            hurtFromObj        = iPlayerState.PlayerObj,
            PhysicAttackFactor = new PhysicAttackFactor()
            {
                IncreaseRatioInjuryFactor = iPlayerState.SelfRoleOfRaceInfoStruct.physicAttackToDamageRateRatio,
                MinimumDamageFactor       = iPlayerState.SelfRoleOfRaceInfoStruct.physicQuickToMinDamageRatio
            }
        };

        CalculateHurt.Result hurtResult = interactiveAsMonster.GiveAttackHurtStruct(attackHurtStruct);
        if (hurtResult.IsCrit || hurtResult.hurtRate > 0.2f)
        {
            iPlayerState.SetVibration(0.1f, 0.6f, 0.6f);//设置手柄震动
        }
        //如果命中了则自身的动画造成0.1秒的延迟
        IAnimatorState iAnimatorState = GameState.Instance.GetEntity <IAnimatorState>();

        if (weaponTypeByPlayerState != EnumWeaponTypeByPlayerState.Arch)
        {
            iAnimatorState.PhysicHitMonsterAnimDelay = true;
        }
        //停止持续
        iAnimatorState.SkillSustainable = false;
        //设置命中声音
        WeaponPhysicHit = (int)weaponTypeByPlayerState;
        //判断武器类型
        switch (weaponTypeByPlayerState)//根据武器类型判断是否还需要下次检测
        {
        case EnumWeaponTypeByPlayerState.Arch:
            return(false);

        default:
            return(true);
        }
    }
    /// <summary>
    /// 设置普通攻击
    /// </summary>
    /// <param name="iPlayerState">玩家状态对象</param>
    /// <param name="attackOrder">攻击的编号</param>
    /// <param name="nowIAttributeState">本技能释放时的数据状态</param>
    /// <param name="weaponTypeByPlayerState">武器类型</param>
    public void SetNormalAttack(IPlayerState iPlayerState, int attackOrder, IAttributeState nowIAttributeState, EnumWeaponTypeByPlayerState weaponTypeByPlayerState)
    {
        if (iPlayerState == null || nowIAttributeState == null)
        {
            return;
        }
        IPlayerState                _iPlayerState            = iPlayerState;
        IAttributeState             _NowIAttributeState      = nowIAttributeState;
        EnumWeaponTypeByPlayerState _WeaponTypeByPlayerState = weaponTypeByPlayerState;
        IAnimatorState              iAnimatorState           = GameState.Instance.GetEntity <IAnimatorState>();
        int _attackOrder = attackOrder;
        PhysicSkillInjuryDetection physicSkillInjuryDetection = _iPlayerState.PhysicSkillInjuryDetection;
        float runTime = 0;//检测超时时间

        if (physicSkillInjuryDetection != null)
        {
            Action BeginCheckAttack = () =>
            {
                runTaskStruct_NormalAttack.StopTask();//停止任务
                physicSkillInjuryDetection.CheckAttack(EnumSkillType.PhysicAttack, _WeaponTypeByPlayerState, 1, null, (innerOrder, target) =>
                {
                    return(CalculateNormalActionHurt(_WeaponTypeByPlayerState, _NowIAttributeState, innerOrder, target));
                },
                                                       attackOrder
                                                       );
            };
            //该任务用于检测是否可以进入该普通攻击的检测
            runTaskStruct_NormalAttack.StartTask(0,
                                                 () =>
            {
                switch (attackOrder)
                {
                case 1:
                    if (iAnimatorState.AnimationClipTypeState != null && iAnimatorState.AnimationClipTypeState.AnimationClipType == EnumAnimationClipType.Attack1 && iAnimatorState.AnimationClipTypeState.TimeType == EnumAnimationClipTimeType.In)
                    {
                        BeginCheckAttack();
                    }
                    break;

                case 2:
                    if (iAnimatorState.AnimationClipTypeState != null && iAnimatorState.AnimationClipTypeState.AnimationClipType == EnumAnimationClipType.Attack2 && iAnimatorState.AnimationClipTypeState.TimeType == EnumAnimationClipTimeType.In)
                    {
                        BeginCheckAttack();
                    }
                    break;

                case 3:
                    if (iAnimatorState.AnimationClipTypeState != null && iAnimatorState.AnimationClipTypeState.AnimationClipType == EnumAnimationClipType.Attack3 && iAnimatorState.AnimationClipTypeState.TimeType == EnumAnimationClipTimeType.In)
                    {
                        BeginCheckAttack();
                    }
                    break;

                default:
                    runTaskStruct_NormalAttack.StopTask();        //停止任务
                    break;
                }
            }, 0, true,
                                                 () =>
            {
                runTime += Time.deltaTime;
                if (runTime > 1)
                {
                    return(false);
                }
                return(true);
            });
        }
    }