예제 #1
0
        protected virtual void DieCallBack()
        {
            if (IsDie || !photonView.IsMine)
            {
                return;
            }
            MyDebug.Log("Hero::DieCallBack - " + photonView.ViewID);

            IsDie = true;
            photonView.RPC("RPCIsDie", RpcTarget.Others, IsDie);

            anim.SetTrigger("die");
            Camera.main.transform.Translate(Vector3.up * 2.0f, Space.World);
            Camera.main.transform.LookAt(transform.position);

            coll.enabled = false;
            photonView.RPC("ColliderOnOff", RpcTarget.Others, false);

            GetRigidBody.isKinematic = true;

            Invoke("Respawn", respawnTime);
        }
예제 #2
0
        private void OnTriggerEnter(Collider other)
        {
            if (!attachingHero.photonView.IsMine)
            {
                return;
            }
            if (state != E_PenetrateState.Shot)
            {
                return;
            }

            GameObject hit = other.gameObject;

            MyDebug.Log("HSPenetrateVision:: OnTriggerEnter - 충돌" + hit.name + " , 충돌 물체 레이어 = " + LayerMask.LayerToName(hit.layer) + ", 태그 = " + hit.tag);
            if ((hit.layer == Constants.mapLayerMask && !hit.CompareTag(LayerMask.LayerToName(attachingHero.gameObject.layer))) //벽에 부딪힌 경우.
                ||
                TeamInfo.GetInstance().IsThisLayerEnemy(hit.layer)                                                              //적에 부딪힌 경우
                )
            {
                attachingHero.photonView.RPC("PenetrateVisionSettle", Photon.Pun.RpcTarget.All, transform.position);
                return;
            }
        }
예제 #3
0
        public override void ControlHero(E_ControlParam param)
        {
            if (!photonView.IsMine || IsCannotActiveState())
            {
                return;
            }

            if (param == E_ControlParam.Ultimate)
            {
                if (UltAmountPercent < 1)
                {
                    return;
                }
            }

            if (!activeCtrlDic[param].IsCoolTimeOver())
            {
                return;
            }
            MyDebug.Log(param + "입력 - 쿨타임 검사 통과");

            activeCtrlDic[param].Activate();
        }
예제 #4
0
        void GetABHeroes()
        {
            ATeamHeroes = new List <Hero>();
            BTeamHeroes = new List <Hero>();
            Hero[] heroes = GameObject.FindObjectsOfType <Hero>();

            for (int i = 0; i < heroes.Length; i++)
            {
                int    photonKey = heroes[i].photonView.ViewID / 1000;
                string teamName  = NetworkManager.instance.Teams[photonKey];
                if (teamName == Constants.teamA_LayerName)
                {
                    ATeamHeroes.Add(heroes[i]);
                }
                else if (teamName == Constants.teamB_LayerName)
                {
                    BTeamHeroes.Add(heroes[i]);
                }
                else
                {
                    MyDebug.Log("Payload :: GetABHeroes - 양팀 대결이 아님.");
                }
            }
        }
예제 #5
0
 public virtual void GetDamaged(float damage, int attackerPhotonViewID)
 {
     if (IsDie)
     {
         return;
     }
     currHP -= damage;
     MyDebug.Log("Hero::GetDamaged - " + photonView.ViewID + "GetDamaged RPC Called . " + damage);
     if (currHP <= 0)
     {
         MyDebug.Log("Hero::GetDamaged - " + photonView.ViewID + " 사망.");
         Hero attacker = TeamInfo.GetInstance().HeroPhotonIDDic[attackerPhotonViewID];
         if (attacker == null)
         {
             MyDebug.Log("Hero::GetDamaged - " + photonView.ViewID + "RPC Called dmg = " + damage + " , but 공격자가 존재하지 않음." + attackerPhotonViewID);
         }
         else
         {
             if (attackerPhotonViewID == photonView.ViewID)  //내가 나를 공격자로 두고 겟 데미지를 부름 - 낙사한 경우임.
             {
                 ShowKillLog(null, HeroType);
             }
             else
             {
                 ShowKillLog(attacker.PlayerName, attacker.HeroType);
             }
         }
         dieAction();
     }
     else if (TeamInfo.GetInstance().HeroPhotonIDDic[attackerPhotonViewID].gameObject.layer == TeamInfo.GetInstance().MyTeamLayer
              //어태커의 팀이 "이" 클라이언트와 같은 팀이라면 피격당한 이 히어로의 피격 효과를 줌.
              )
     {
         SetBeAttackedEffect(3f);
     }
 }
예제 #6
0
 void PayloadArrive()
 {
     arrive = true;
     MyDebug.Log("화물이 종단점에 도착했습니다.");
 }
예제 #7
0
        IEnumerator WaitForAllHeroBorn()
        {
            int heroCounts = 0;

            while (heroCounts != PhotonNetwork.CurrentRoom.PlayerCount)
            {
                heroCounts = GameObject.FindObjectsOfType <Hero>().Length;
                yield return(new WaitForSeconds(1f));
            }
            //Hero 전부 생성

            if (NetworkManager.instance == null)
            {
                MyDebug.Log("TeamInfo:::GetTeamInfoFromNetworkManager - NetworkManager DO NOT exist");
                //Game Abort.
                UnityEngine.SceneManagement.SceneManager.LoadScene(UnityEngine.SceneManagement.SceneManager.GetSceneByBuildIndex(0).name);
                yield break;
            }

            Dictionary <int, string> teamInfoDic = NetworkManager.instance.Teams;

            myPhotonViewIDKey = 0;
            Hero[] heroes = GameObject.FindObjectsOfType <Hero>();
            for (int i = 0; i < heroes.Length; i++)
            {
                if (heroes[i].photonView.IsMine)
                {
                    myPhotonViewIDKey = heroes[i].photonView.ViewID / 1000;
                }
            }

            myTeamLayer = LayerMask.NameToLayer(teamInfoDic[myPhotonViewIDKey]);
            enemyTeamLayers.Clear();

            Dictionary <int, string> .Enumerator enu = teamInfoDic.GetEnumerator();
            while (enu.MoveNext())
            {
                int    photonViewIDKey = enu.Current.Key;
                string layerName       = enu.Current.Value;
                int    layerMask       = LayerMask.NameToLayer(layerName);

                if (false == enemyTeamLayers.Contains(layerMask) && layerMask != myTeamLayer)
                {
                    enemyTeamLayers.Add(layerMask);
                }
            }

            //레이어 세팅 끝.

            //이제 영웅의 레이어 세팅과 영웅 분류를 저장.

            myTeamHeroes.Clear();
            enemyHeroes.Clear();
            heroPhotonIDDic.Clear();
            for (int i = 0; i < heroes.Length; i++)
            {
                heroPhotonIDDic.Add(heroes[i].photonView.ViewID, heroes[i]);
                int heroPhotonID = heroes[i].photonView.ViewID / 1000;               //이 영웅의 포톤뷰 키

                int setLayerByNM = LayerMask.NameToLayer(teamInfoDic[heroPhotonID]); //네트워크 매니저에서 저장되어 넘어온 이 포톤뷰의 팀 설정 (레이어)
                if (setLayerByNM == myTeamLayer)
                {
                    myTeamHeroes.Add(heroes[i]);
                    heroes[i].gameObject.layer = myTeamLayer;
                    heroes[i].SetOutLineAndRim(outLineWidth, myTeamColor);
                }
                else
                {
                    enemyHeroes.Add(heroes[i]);
                    heroes[i].gameObject.layer = setLayerByNM;  //저장되어 넘어온 레이어를 Hero에 넣어줌.
                    heroes[i].SetOutLineAndRim(outLineWidth, enemyTeamColor);
                }
            }

            //Team Setting is Done

            for (int i = 0; i < heroes.Length; i++)
            {
                if (heroes[i].hpBar != null)
                {
                    heroes[i].hpBar.SetAsTeamSetting();
                }
                if (heroes[i].photonView.IsMine)
                {
                    Destroy(heroes[i].hpBar.gameObject);
                }
            }

            isTeamSettingDone = true;

            MyDebug.Log(" TeamInfo : 팀세팅과 관련된 처리 모두 끝.");
        }
예제 #8
0
        void NormalAttack()
        {
            anim.SetTrigger("normalAttack");
            FPSCamPerHero.FPSCamAct(E_ControlParam.NormalAttack);

            List <Hero> enemyHeroes        = TeamInfo.GetInstance().EnemyHeroes;
            Ray         ray                = Camera.main.ScreenPointToRay(screenCenterPoint);
            Vector3     normalAttackVector = ray.direction * normalAttackLength;

            for (int i = 0; i < enemyHeroes.Count; i++)
            {
                Hero    enemy         = enemyHeroes[i];
                Vector3 enemyPosition = enemy.CenterPos - ray.origin;
#if UNITY_EDITOR
                Debug.DrawLine(ray.origin,
                               ray.origin + normalAttackVector,
                               Color.blue,
                               3f
                               );
                Debug.DrawLine(ray.origin,
                               ray.origin + enemyPosition,
                               Color.red,
                               3f
                               );
#endif

                float dot = Vector3.Dot(enemyPosition, normalAttackVector);
                if (dot < Mathf.Epsilon)
                {
                    MyDebug.Log(enemy.photonView.ViewID + "HH NA enemy Behind, no attack");
                    continue;
                }
                float projectedDis = dot * normalAttackLengthDiv;
#if UNITY_EDITOR
                Debug.DrawLine(
                    ray.origin + Vector3.right * 0.1f,

                    ray.origin + Vector3.right * 0.1f + ray.direction * projectedDis,
                    Color.white, 3f
                    );
                Debug.DrawLine(
                    ray.origin + Vector3.left * 0.1f,

                    ray.origin + Vector3.left * 0.1f + ray.direction * normalAttackLength,
                    Color.green, 3f
                    );
#endif

                if (projectedDis > normalAttackLength)
                {
                    MyDebug.Log(enemy.photonView.ViewID + "HH NA enemy too far, no attack");
                    continue;
                }
                float projectedDisSqr  = projectedDis * projectedDis;
                float orthogonalDisSqr = enemyPosition.sqrMagnitude - projectedDisSqr;
#if UNITY_EDITOR
                Debug.DrawLine(
                    ray.origin + ray.direction * projectedDis,
                    ray.origin + ray.direction * projectedDis +
                    (enemy.CenterPos - (ray.origin + ray.direction * projectedDis))
                    .normalized
                    * Mathf.Sqrt(orthogonalDisSqr),
                    Color.magenta, 3f
                    );

                Debug.DrawLine(
                    ray.origin + ray.direction * projectedDis + ray.direction * 0.1f,
                    ray.origin + ray.direction * projectedDis + ray.direction * 0.1f +
                    (enemy.CenterPos + ray.direction * 0.1f - (ray.origin + ray.direction * projectedDis + ray.direction * 0.1f))
                    .normalized
                    * Mathf.Sqrt(correctionRangeSqr),
                    Color.green, 3f
                    );
#endif
                if (orthogonalDisSqr > correctionRangeSqr)
                {
                    Debug.Log(enemy.photonView.ViewID + "HH NA enemy orthogonalDis too far, no attack");
                    continue;
                }
                enemy.photonView.RPC("GetDamaged", Photon.Pun.RpcTarget.All, normalAttackDamage, photonView.ViewID);
            }
        }