Ejemplo n.º 1
0
 //结束回合
 void OnRsetState()
 {
     anima.CrossFade(animName_Idle);
     FightManager.main.FinishRound();               //结束一个回合
     actionBar.GetComponent <UISlider>().value = 0; //把行动条归零,重新开始一个回合
     state    = PlayerFightState.Idle;              //结束回合之后一定要把主角战斗状态设置为空闲状态
     isShowed = false;
 }
Ejemplo n.º 2
0
 private void Awake()
 {
     IdleState  = new PlayerIdleState(this);
     RunState   = new PlayerRunState(this);
     FightState = new PlayerFightState(this);
     WinState   = new PlayerWinState(this);
     LoseState  = new PlayerLoseState(this);
 }
Ejemplo n.º 3
0
    /// <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());
    }
Ejemplo n.º 4
0
	// 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();
        }
	}
Ejemplo n.º 5
0
    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;
    }
Ejemplo n.º 6
0
 void onMultiTargetSkillUse(SkillInfo skill)
 {
     CursorManager.instance.SetLockTarget();
     state = PlayerFightState.SkillAttack;
     isLockingTarget = true;
     cur_skill = skill;
 }
Ejemplo n.º 7
0
    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();
    }
Ejemplo n.º 8
0
    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;
        }
    }
Ejemplo n.º 9
0
    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);
        }

    }
Ejemplo n.º 10
0
    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());
            }

        }
    }
Ejemplo n.º 11
0
 //对外接口——技能攻击
 public void OnSkill()
 {
     state   = PlayerFightState.Skill;
     isAtked = false;
 }
Ejemplo n.º 12
0
 //对外接口——普通攻击(战斗菜单的按钮事件,点击 攻击 ,会调用此方法)
 public void OnAttack()
 {
     state   = PlayerFightState.Atk;
     isAtked = false;
 }