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); }
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; } }
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(); }
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 - 양팀 대결이 아님."); } } }
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); } }
void PayloadArrive() { arrive = true; MyDebug.Log("화물이 종단점에 도착했습니다."); }
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 : 팀세팅과 관련된 처리 모두 끝."); }
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); } }