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; } }
/// <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); }); } }