Exemplo n.º 1
0
        // unity event handlers

        void Start()
        {
            m_MainCtrl = GameObject.Find("GlobalScript").GetComponent <CCDemo3_MainCtrl>();
            m_RefTr    = transform.Find("Hips/Spine/Spine1/Spine2/Neck/Neck1");
            m_Prop     = GetComponent <CCDemo3_EnemyProp>();

            Dbg.Assert(m_MainCtrl != null, "CCDemo3_EnemyMarker.Start: failed to get mainctrl");
            Dbg.Assert(m_RefTr != null, "CCDemo3_EnemyMarker.Start: failed to get spine transform");
            Dbg.Assert(m_Prop != null, "CCDemo3_EnemyMarker.Start: failed to get prop");
        }
        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);
        }
Exemplo n.º 3
0
        /// <summary>
        /// he who dares to touch the wall will be dead
        /// </summary>
        public void OnTouchWall(GameObject chara)
        {
            GameObject owner = _GetCollisionOwner(chara);
            Animator   anim  = owner.GetComponent <Animator>();

            anim.SetTrigger(LIGHT_PUNCH_HASH);

            if (owner == m_PlayerGO)
            {
                m_HP = 0;
                _OnPlayerDie();
            }
            else
            {
                CCDemo3_EnemyProp prop = owner.GetComponent <CCDemo3_EnemyProp>();
                prop.HP = 0;
                _OnEnemyDie(owner);
            }
        }
Exemplo n.º 4
0
        private void _OnParryCCStop(CutsceneController cc)
        {
            cc.OnPlayStopped -= _OnParryCCStop;
            var swaplst = CutsceneController.GetSwapObjList(cc);

            foreach (var pr in swaplst)
            {
                if (pr.m_ExternalGO.name == "Enemy")
                {
                    // apply root motion
                    GameObject atkGO = pr.m_ExternalGO;
                    Transform  tr    = atkGO.transform;
                    Transform  hips  = tr.Find("Hips");

                    Vector3 pos = hips.position;
                    pos.y       = tr.position.y;
                    tr.position = pos;

                    pos   = hips.localPosition;
                    pos.x = pos.z = 0f;
                    hips.localPosition = pos;

                    Vector3 angles = hips.eulerAngles;
                    angles.x       = angles.z = 0;
                    tr.eulerAngles = angles;

                    // jump to LIEDOWN_STATE
                    Animator anim = tr.GetComponent <Animator>();
                    anim.Play(LIEDOWN_STATE);

                    // apply dmg
                    CCDemo3_EnemyProp prop = atkGO.GetComponent <CCDemo3_EnemyProp>();
                    prop.HP -= prop.AtkPwr;
                    if (prop.HP <= 0)
                    {
                        _OnEnemyDie(prop.gameObject);
                    }
                }
                else if (pr.m_ExternalGO.name == "Player")
                {
                    EnableParry = false;

                    // apply root motion
                    Transform tr   = m_PlayerGO.transform;
                    Transform hips = tr.Find("Hips");

                    Vector3 pos = hips.position;
                    pos.y       = tr.position.y;
                    tr.position = pos;
                    Dbg.Log("enemy pos: {0}", pos);

                    pos   = hips.localPosition;
                    pos.x = pos.z = 0f;
                    hips.localPosition = pos;

                    Vector3 angles = hips.eulerAngles;
                    angles.x       = angles.z = 0;
                    tr.eulerAngles = angles;

                    // jump to idle state
                    m_PlayerAnimator.Play(IDLE_STATE, 0, 0);
                }
            }
        }
Exemplo n.º 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);
                }
            }
        }
        // "Coroutine"

        private Job Job_SpawnEnemyWave(float delay)
        {
            yield return(new WaitForSeconds(delay));

            m_CurrentWave++;

            Vector3 pos = m_MainCtrl.GetPlayerGO().transform.position;

            if (m_CurrentWave != m_TotalWaves) //for mobs
            {
                int enemyCategoryCnt = m_EnemyDescLst.Count;
                for (int i = 0; i < m_CurrentWave; ++i)
                {
                    int       enemyTypeIdx = Random.Range(0, enemyCategoryCnt);
                    EnemyDesc desc         = m_EnemyDescLst[enemyTypeIdx];

                    float   radian   = Random.Range(0f, 2 * Mathf.PI);
                    float   x        = pos.x + Mathf.Cos(radian) * m_SpawnDist;
                    float   z        = pos.z + Mathf.Sin(radian) * m_SpawnDist;
                    float   y        = pos.y;
                    Vector3 enemyPos = new Vector3(x, y, z);
                    //Dbg.Log("radian : {0}, pos {1}", radian, enemyPos);

                    Quaternion enemyFacing = Quaternion.LookRotation(pos - enemyPos);

                    GameObject        enemy = GameObject.Instantiate(desc.m_Prefab, enemyPos, enemyFacing) as GameObject;
                    CCDemo3_EnemyProp prop  = enemy.GetComponent <CCDemo3_EnemyProp>();
                    prop.HP              = desc.m_HP;
                    prop.AtkPwr          = desc.m_Atk;
                    prop.m_AnimatorSpeed = desc.m_AnimatorSpeed;

                    m_ActiveEnemies.Add(enemy.transform);
                    m_MainCtrl.OnEnemySpawn(enemy);
                }
            }
            else //for boss
            {
                float   radian   = Random.Range(0f, 2 * Mathf.PI);
                float   x        = pos.x + Mathf.Cos(radian) * m_SpawnDist;
                float   z        = pos.z + Mathf.Sin(radian) * m_SpawnDist;
                float   y        = pos.y;
                Vector3 enemyPos = new Vector3(x, y, z);

                Quaternion enemyFacing = Quaternion.LookRotation(pos - enemyPos);

                EnemyDesc         desc  = m_BossDesc;
                GameObject        enemy = GameObject.Instantiate(desc.m_Prefab, enemyPos, enemyFacing) as GameObject;
                CCDemo3_EnemyProp prop  = enemy.GetComponent <CCDemo3_EnemyProp>();
                prop.HP              = desc.m_HP;
                prop.AtkPwr          = desc.m_Atk;
                prop.m_AnimatorSpeed = desc.m_AnimatorSpeed;

                var marker = enemy.GetComponent <CCDemo3_EnemyMarker>();
                marker.enabled = true;

                m_ActiveEnemies.Add(enemy.transform);
                m_MainCtrl.OnEnemySpawn(enemy);
            }

            m_bHinted = false;
        }
        // private method

        /// <summary>
        /// decide to walk or atk
        /// when called, it is guaranteed to be in valid state
        /// </summary>
        private void _ThinkActions(Transform enemy)
        {
            Transform         playerTr = m_MainCtrl.GetPlayerGO().transform;
            float             dist     = (playerTr.position - enemy.position).magnitude;
            Animator          anim     = enemy.GetComponent <Animator>();
            CCDemo3_EnemyProp prop     = enemy.GetComponent <CCDemo3_EnemyProp>();

            prop.TimeUntilNextThink = Random.Range(0.2f, 0.5f);

            float r = Random.value;

            //reset the values
            anim.SetFloat(CCDemo3_MainCtrl.FORWARD_SPD_HASH, 0f);
            anim.SetFloat(CCDemo3_MainCtrl.STRAFE_SPD_HASH, 0f);

            if (m_TimeSinceLastAtk > m_AtkInterval && dist < 2 * HEAVY_PUNCH_DIST)
            { //atk
                if (r > 0.5f)
                {
                    //Dbg.Log("Atk");
                    anim.SetTrigger(CCDemo3_MainCtrl.HEAVY_PUNCH_HASH);
                    m_TimeSinceLastAtk = 0f;
                }
            }
            else
            { //move
                if (dist < NEAR_THRES)
                {
                    //Dbg.Log("Force backward");
                    anim.SetFloat(CCDemo3_MainCtrl.FORWARD_SPD_HASH, -1.0f);
                }
                else if (dist > FAR_THRES)
                {
                    //Dbg.Log("Force forward");
                    anim.SetFloat(CCDemo3_MainCtrl.FORWARD_SPD_HASH, 1.0f);
                }
                else
                {
                    if (r <= 0.25f)
                    { //left
                      //Dbg.Log("left");
                        anim.SetFloat(CCDemo3_MainCtrl.STRAFE_SPD_HASH, -1f);
                    }
                    else if (r <= 0.5f)
                    { //right
                      //Dbg.Log("right");
                        anim.SetFloat(CCDemo3_MainCtrl.STRAFE_SPD_HASH, 1f);
                    }
                    else if (r <= 0.75f)
                    { //forward
                      //Dbg.Log("foward");
                        anim.SetFloat(CCDemo3_MainCtrl.FORWARD_SPD_HASH, 1f);
                    }
                    else if (r <= 1f)
                    { //backward
                      //Dbg.Log("backward");
                        anim.SetFloat(CCDemo3_MainCtrl.FORWARD_SPD_HASH, -1f);
                    }
                }
            }
        }