private void _DoWalking(Transform enemy)
        {
            Transform         playerTr = m_MainCtrl.GetPlayerGO().transform;
            CCDemo3_EnemyProp prop     = enemy.GetComponent <CCDemo3_EnemyProp>();

            prop.TimeUntilNextThink -= Time.deltaTime;

            if (prop.TimeUntilNextThink < 0 ||
                (playerTr.position - enemy.position).magnitude < NEAR_THRES)
            {
                _ThinkActions(enemy);
                return;
            }

            Animator anim = enemy.GetComponent <Animator>();

            int st = 0;

            // get the state
            if (anim.IsInTransition(0))
            {
                AnimatorStateInfo s = anim.GetNextAnimatorStateInfo(0);
                st = CCDemo3_Helper.GetAnimatorStateHash(s);
            }
            else
            {
                AnimatorStateInfo s = anim.GetCurrentAnimatorStateInfo(0);
                st = CCDemo3_Helper.GetAnimatorStateHash(s);
            }

            //execute move
            if (st == CCDemo3_MainCtrl.FORWARD_STATE)
            {
                anim.SetFloat(CCDemo3_MainCtrl.FORWARD_SPD_HASH, 1.0f);
            }
            else if (st == CCDemo3_MainCtrl.BACKWARD_STATE)
            {
                anim.SetFloat(CCDemo3_MainCtrl.FORWARD_SPD_HASH, -1.0f);
            }
            else if (st == CCDemo3_MainCtrl.STRAFE_LEFT_STATE || st == CCDemo3_MainCtrl.STRAFE_RIGHT_STATE)
            {
                float strafe = (st == CCDemo3_MainCtrl.STRAFE_LEFT_STATE) ? -1f : 1f;
                anim.SetFloat(CCDemo3_MainCtrl.STRAFE_SPD_HASH, strafe);

                float dist       = (playerTr.position - enemy.position).magnitude; //the radius
                float deltaAngle = prop.RotateSpeed * Time.deltaTime / dist * Mathf.Rad2Deg * -strafe;

                Quaternion q       = Quaternion.Euler(0, deltaAngle, 0);
                Vector3    diff    = enemy.position - playerTr.position;
                Vector3    newDiff = q * diff;
                enemy.position = newDiff + playerTr.position;
            }

            _FaceEnemyToPlayer(enemy, playerTr);
        }
Пример #2
0
        public bool IsAtking(GameObject go)
        {
            Animator animator = go.GetComponent <Animator>();
            int      st       = 0;

            if (animator.IsInTransition(0))
            {
                st = CCDemo3_Helper.GetAnimatorStateHash(animator.GetNextAnimatorStateInfo(0));
            }
            else
            {
                st = CCDemo3_Helper.GetAnimatorStateHash(animator.GetCurrentAnimatorStateInfo(0));
            }
            return(st == HEAVY_PUNCH_STATE ||
                   st == LIGHT_PUNCH_STATE);
        }
        void Update()
        {
            int curState = CCDemo3_Helper.GetAnimatorStateHash(m_Animator.GetCurrentAnimatorStateInfo(0));
            AnimatorStateInfo nextStateInfo = m_Animator.GetNextAnimatorStateInfo(0);
            int nextState = CCDemo3_Helper.GetAnimatorStateHash(nextStateInfo);

            if (curState != CCDemo3_MainCtrl.LIGHT_PUNCH_STATE &&
                (nextState != CCDemo3_MainCtrl.LIGHT_PUNCH_STATE))
            {
                //if( m_LightPunchCollider.enabled )
                //{
                //    //Dbg.Log("disable LP {0}", Time.frameCount);
                //}
                m_LightPunchCollider.enabled = false;
            }

            if (curState != CCDemo3_MainCtrl.HEAVY_PUNCH_STATE &&
                (nextState != CCDemo3_MainCtrl.HEAVY_PUNCH_STATE))
            {
                m_HeavyPunchCollider.enabled = false;
            }
        }
Пример #4
0
        public bool IsCanWalkState(GameObject go)
        {
            Animator animator = go.GetComponent <Animator>();
            int      st       = 0;

            if (animator.IsInTransition(0))
            {
                st = CCDemo3_Helper.GetAnimatorStateHash(animator.GetNextAnimatorStateInfo(0));
            }
            else
            {
                st = CCDemo3_Helper.GetAnimatorStateHash(animator.GetCurrentAnimatorStateInfo(0));
            }

            if (st == IDLE_STATE)
            {
                return(true);
            }
            else
            {
                return(IsWalkingState(go));
            }
        }
Пример #5
0
        public void OnHit(GameObject hit, GameObject beHit)
        {
            GameObject atkGO = _GetCollisionOwner(hit);
            GameObject defGO = _GetCollisionOwner(beHit);

            if (defGO == m_PlayerGO) //player gets hit by enemy
            {
                if (atkGO == m_PlayerGO)
                { //this is possible if the action make his own hand touches his own body...
                    return;
                }
                if (!IsAtking(atkGO))
                { //the accident collision should not be counted
                    return;
                }
                if (IsUnderAtk(defGO))
                {
                    return; //if already be hit, don't add new
                }

                if (EnableParry)
                {
                    if (!m_ParryCC.gameObject.activeSelf)
                    {
                        Transform cctr     = m_ParryCC.transform;
                        Transform playerTr = m_PlayerGO.transform;

                        m_ParryCC.gameObject.SetActive(true);
                        var swaplst = CutsceneController.GetSwapObjList(m_ParryCC);
                        swaplst.Add(new CutsceneController.SwapObjPair(defGO, cctr.Find("Player").gameObject));
                        swaplst.Add(new CutsceneController.SwapObjPair(atkGO, cctr.Find("Enemy").gameObject));

                        Vector3 ccPos = playerTr.position;
                        ccPos.y       = cctr.position.y;
                        cctr.position = ccPos;

                        Vector3 fdir = atkGO.transform.position - playerTr.position;
                        fdir.y       = 0;
                        cctr.forward = fdir;
                        CutsceneController.StartCC(m_ParryCC);
                        m_ParryCC.OnPlayStopped += _OnParryCCStop;
                    }
                }
                else
                {
                    CCDemo3_EnemyProp prop     = atkGO.GetComponent <CCDemo3_EnemyProp>();
                    Transform         playerTr = m_PlayerGO.transform;
                    Vector3           atkPos   = atkGO.transform.position;
                    atkPos.y         = playerTr.position.y;
                    playerTr.forward = atkPos - playerTr.position;

                    m_HP = Mathf.Clamp(m_HP - prop.AtkPwr, 0, int.MaxValue);
                    Dbg.Log("player under atk, hp = {0}", m_HP);

                    if (m_HP <= 0)
                    {
                        m_PlayerAnimator.SetTrigger(HEAVY_PUNCHED_HASH);
                        _OnPlayerDie();
                    }
                    else
                    {
                        m_PlayerAnimator.SetTrigger(HEAVY_PUNCHED_HASH);
                    }
                }
            }
            else //player hit the enemy
            {
                if (atkGO != m_PlayerGO)
                { //two enemies collide...
                    return;
                }
                if (!IsAtking(atkGO))
                {
                    return;
                }
                if (IsUnderAtk(defGO))
                {
                    return; //if already be hit, don't add new
                }

                int               atkStateHash  = CCDemo3_Helper.GetAnimatorStateHash(m_PlayerAnimator.GetCurrentAnimatorStateInfo(0));
                Transform         defTr         = defGO.transform;
                CCDemo3_EnemyProp prop          = defGO.GetComponent <CCDemo3_EnemyProp>();
                Animator          enemyAnimator = defTr.GetComponent <Animator>();

                if (atkStateHash == LIGHT_PUNCH_STATE)
                {
                    Vector3 dir = atkGO.transform.position - defTr.position;
                    dir.y         = 0;
                    defTr.forward = dir;
                    prop.HP      -= m_LightPunchPwr;
                    enemyAnimator.SetTrigger(LIGHT_PUNCHED_HASH);
                    Dbg.Log("Enemy {0} under atk, hp = {1}", defGO.name, prop.HP);
                }
                else if (atkStateHash == HEAVY_PUNCH_STATE)
                {
                    Vector3 dir = atkGO.transform.position - defTr.position;
                    dir.y         = 0;
                    defTr.forward = dir;
                    prop.HP      -= m_HeavyPunchPwr;
                    enemyAnimator.SetTrigger(HEAVY_PUNCHED_HASH);
                    Dbg.Log("Enemy {0} under atk, hp = {1}", defGO.name, prop.HP);
                }

                if (prop.HP <= 0)
                {
                    _OnEnemyDie(prop.gameObject);
                }
            }
        }