//结束回合 void OnRsetState() { anima.CrossFade(animName_Idle); FightManager.main.FinishRound(); //结束一个回合 actionBar.GetComponent <UISlider>().value = 0; //把行动条归零,重新开始一个回合 state = PlayerFightState.Idle; //结束回合之后一定要把主角战斗状态设置为空闲状态 isShowed = false; }
private void Awake() { IdleState = new PlayerIdleState(this); RunState = new PlayerRunState(this); FightState = new PlayerFightState(this); WinState = new PlayerWinState(this); LoseState = new PlayerLoseState(this); }
/// <summary> /// 初始化状态机 /// 状态和转换条件在这统一初始化添加 /// 默认 除了skill和fight状态 其余状态要切换到其他状态的时候 要先切换到idle状态 /// </summary> protected override void InitStateMachine() { stateDic = new Dictionary <StateID, FSMState>(); m_FSM = new FSMSystem(); idleState = new PlayerIdleState(); moveState = new PlayerMoveState(); fightState = new PlayerFightState(); skillState = new PlayerSkillState(); //attr = player.GetComponent<AttrController>(); m_FSM.attr = attr; m_FSM.AddState(idleState, this); stateDic.Add(idleState.ID, idleState); idleState.AddTransition(Transition.IsIdle, StateID.Idle); idleState.AddTransition(Transition.IsMove, StateID.Move); idleState.AddTransition(Transition.IsDeath, StateID.Death); idleState.AddTransition(Transition.IsFight, StateID.Fight); idleState.AddTransition(Transition.IsCast_Skill, StateID.Cast_Skill); idleState.AddTransition(Transition.IsRiding, StateID.Riding); idleState.AddTransition(Transition.IsVigilance, StateID.Vigilance); idleState.AddTransition(Transition.IsChatStart, StateID.ChatStart); idleState.AddTransition(Transition.IsChatEnd, StateID.ChatEnd); m_FSM.AddState(moveState, this); stateDic.Add(moveState.ID, moveState); moveState.AddTransition(Transition.IsIdle, StateID.Idle); m_FSM.AddState(fightState, this); stateDic.Add(fightState.ID, fightState); fightState.AddTransition(Transition.IsIdle, StateID.Idle); fightState.AddTransition(Transition.IsCast_Skill, StateID.Cast_Skill); fightState.AddTransition(Transition.IsMove, StateID.Move); m_FSM.AddState(skillState, this); stateDic.Add(skillState.ID, skillState); skillState.AddTransition(Transition.IsIdle, StateID.Idle); skillState.AddTransition(Transition.IsFight, StateID.Fight); //初始状态分主城(Idle)和地下城(Fight) //设置初始状态(idle状态) if (AttrController.Instance.Fight()) { m_FSM.SetCurrentState(fightState); m_FSM.CurrentState.m_MyJoystick = ETCInput.GetControlJoystick("MyJoystick"); //m_FSM.attr.StartCoroutine(fightState.DoLogic()); } else { m_FSM.SetCurrentState(idleState); m_FSM.CurrentState.m_MyJoystick = ETCInput.GetControlJoystick("MyJoystick"); } //m_FSM.attr.StartCoroutine(idleState.DoLogic()); //idleState.RunLogic(); //测试战斗状态 //m_FSM.SetCurrentState(fightState); //m_FSM.CurrentState.m_MyJoystick = ETCInput.GetControlJoystick("MyJoystick"); //m_FSM.attr.StartCoroutine(fightState.DoLogic()); }
// Update is called once per frame void Update () { if(isLockingTarget == false && Input.GetMouseButtonDown(0) && state != PlayerFightState.Death) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hitinfo; bool isCollider = Physics.Raycast(ray, out hitinfo); if(isCollider && hitinfo.collider.tag == Tags.enemy) { target_normalattack = hitinfo.collider.transform; state = PlayerFightState.NormalAttack;//进入普通攻击模式 showEffect = false; timer = 0; playermove.stopFollowing(); } else { state = PlayerFightState.ControlWalk; target_normalattack = null; } } if(state == PlayerFightState.NormalAttack) { if (target_normalattack == null) { state = PlayerFightState.ControlWalk; playermove.stopFollowing(); return; } if (isInBeHited) return; float distance = Vector3.Distance(transform.position, target_normalattack.position); if (attack_state !=AttackState.Tracking && distance <= min_attackDistance) { //转向目标 时应该播放原地踏步动画 Quaternion rotation = Quaternion.LookRotation(target_normalattack.position - transform.position); transform.rotation = Quaternion.Slerp(transform.rotation, rotation, 5 * Time.deltaTime); attack_state = AttackState.Attack; timer += Time.deltaTime; GetComponent<Animation>().CrossFade(animName_now); if(timer >= time_normalattack) { animName_now = animName_Idle; if (!showEffect) { showEffect = true; GameObject.Instantiate(attack_effect, target_normalattack.position, Quaternion.identity); target_normalattack.GetComponent<BabyWolfManager>().TakeDamage(PlayerStatus._instance.finalAttack); } //播放特效 } if(timer >= 1f/normalattack_rate) { showEffect = false; timer = 0; animName_now = animName_normalattack; } } else if (distance > Min_followDist) { playermove.MoveToTargetRadius(target_normalattack.position); attack_state = AttackState.Tracking; timer = 0; } else if (attack_state == AttackState.Tracking && distance <= Min_followDist) { attack_state = AttackState.Attack; playermove.stopFollowing(); // animation.CrossFade(animName_Idle); // animName_now = animName_Idle; } } else if(state == PlayerFightState.Death) { GetComponent<Animation>().CrossFade(animName_Death); } if(isLockingTarget && Input.GetMouseButtonDown(0)) { OnLockTarget(); } }
IEnumerator OnLockMultiTarget() { CursorManager.instance.SetNormal(); Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hitinfo; LayerMask mask = 1 << LayerMask.NameToLayer("GroundLayer"); bool isCollider = Physics.Raycast(ray, out hitinfo,1000, mask); if (isCollider && hitinfo.collider.tag == Tags.ground) { // Quaternion rotation = Quaternion.LookRotation(transform.position - hitinfo.point); // transform.rotation = rotation; transform.LookAt(hitinfo.point); GetComponent<Animation>().CrossFade(cur_skill.animation_name); yield return new WaitForSeconds(cur_skill.animation_time); state = PlayerFightState.ControlWalk; isLockingTarget = false; GameObject effectprefab = null; if (SkillEffectRes._instance.skillDic.TryGetValue(cur_skill.efx_name, out effectprefab)) { GameObject skill_eff = GameObject.Instantiate(effectprefab, hitinfo.point + Vector3.up*0.5f, Quaternion.identity) as GameObject; BallExplosionSkill skillmanager = skill_eff.AddComponent<BallExplosionSkill>(); skillmanager.attack = PlayerStatus._instance.finalAttack; skillmanager.eff_radius = 2; } } else state = PlayerFightState.ControlWalk; }
void onMultiTargetSkillUse(SkillInfo skill) { CursorManager.instance.SetLockTarget(); state = PlayerFightState.SkillAttack; isLockingTarget = true; cur_skill = skill; }
IEnumerator OnLockSingleTarget() { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hitinfo; bool isCollider = Physics.Raycast(ray, out hitinfo); if(isCollider && hitinfo.collider.tag == Tags.enemy) { transform.LookAt(hitinfo.point); GetComponent<Animation>().CrossFade(cur_skill.animation_name); yield return new WaitForSeconds(cur_skill.animation_time); state = PlayerFightState.ControlWalk; isLockingTarget = false; GameObject effectprefab = null; if (SkillEffectRes._instance.skillDic.TryGetValue(cur_skill.efx_name, out effectprefab)) { GameObject.Instantiate(effectprefab, hitinfo.collider.transform.position, Quaternion.identity); } // PlayerStatus._instance.attack *= cur_skill.applyValue / 100f; hitinfo.collider.GetComponent<BabyWolfManager>().TakeDamage((int)(PlayerStatus._instance.finalAttack*(cur_skill.applyValue/100f))); } else { state = PlayerFightState.NormalAttack; } CursorManager.instance.SetNormal(); }
IEnumerator OnBuffSkillUse(SkillInfo skill) { state = PlayerFightState.SkillAttack; GetComponent<Animation>().CrossFade(skill.animation_name); yield return new WaitForSeconds(skill.animation_time); state = PlayerFightState.ControlWalk; switch(skill.applyProperty) { case ApplyProperty.Attack: PlayerStatus._instance.attack *= (skill.applyValue / 100f); break; case ApplyProperty.AttackSpeed: normalattack_rate *= (skill.applyValue / 100f); break; case ApplyProperty.Def: PlayerStatus._instance.def *= (skill.applyValue / 100f); break; case ApplyProperty.Speed: break; } GameObject effectprefab = null; if (SkillEffectRes._instance.skillDic.TryGetValue(skill.efx_name, out effectprefab)) { GameObject.Instantiate(effectprefab, transform.position, Quaternion.identity); } yield return new WaitForSeconds(skill.applyTime); switch (skill.applyProperty) { case ApplyProperty.Attack: PlayerStatus._instance.attack /= (skill.applyValue / 100f); break; case ApplyProperty.AttackSpeed: normalattack_rate /= (skill.applyValue / 100f); break; case ApplyProperty.Def: PlayerStatus._instance.def /= (skill.applyValue / 100f); break; case ApplyProperty.Speed: break; } }
IEnumerator OnPassiveSkillUse(SkillInfo skill) { state = PlayerFightState.SkillAttack; GetComponent<Animation>().CrossFade(skill.animation_name); yield return new WaitForSeconds(skill.animation_time); state = PlayerFightState.ControlWalk; int addhp = 0; int addmp = 0; if (skill.applyProperty == ApplyProperty.HP) addhp = skill.applyValue; else if (skill.applyProperty == ApplyProperty.MP) addmp = skill.applyValue; PlayerStatus._instance.useDrugEff(addhp, addmp); GameObject effectprefab = null; if(SkillEffectRes._instance.skillDic.TryGetValue(skill.efx_name,out effectprefab)) { GameObject.Instantiate(effectprefab, transform.position, Quaternion.identity); } }
public void takeDamage(int harm) { if (state == PlayerFightState.Death) return; int def = PlayerStatus._instance.finalDef; int tempharm = (int)( harm * ((200f - def) / 200f)); if (tempharm < 1) tempharm = 1; float value = Random.Range(0, 1f); if(value < PlayerStatus._instance.dodgeRate) { //AudioSource.PlayClipAtPoint(sound_miss, transform.position); // hudtext.Add("Miss", Color.cyan, 0f); } else { //hudtext.Add("-" + tempharm, Color.red, 1); PlayerStatus._instance.hp_remain -= tempharm; HeadStatusUI._instance.UpdateShowUI(); if (PlayerStatus._instance.hp_remain <= 0) { state = PlayerFightState.Death; // Destroy(this.gameObject, 2); } else { //aniState = WolfAnimateState.Hitted; StartCoroutine(showHittedAnimation()); } } }
//对外接口——技能攻击 public void OnSkill() { state = PlayerFightState.Skill; isAtked = false; }
//对外接口——普通攻击(战斗菜单的按钮事件,点击 攻击 ,会调用此方法) public void OnAttack() { state = PlayerFightState.Atk; isAtked = false; }