void SpawnMonsterObjectsRPC(WorldObj.Nationality _nationality, int _soldiernumber, WorldObj.SoldierType _soldiertype, int _teamMorola, int _viewId, int _viewIdModel) { //计算出野怪位置 Vector3 GriffinPosition = Vector3.zero; switch (_soldiertype) { case SoldierType.Griffin: bool rightposition = false; while (!rightposition) { GriffinPosition = RandomPosition(); rightposition = true; for (int j = 0; j < citiespositions.Count; j++) { if (Vector3.Distance(citiespositions[j], GriffinPosition) < 2f) { rightposition = false; break; } } } break; default: break; } GameObject newMonster = Instantiate(team, GriffinPosition, Quaternion.identity); newMonster.GetComponent <PhotonView>().viewID = _viewId; //给新派生的队伍对象赋值 TeamObj teamObj = newMonster.GetComponent <TeamObj>(); teamObj.nationality = _nationality; teamObj.soldiernumber = _soldiernumber; teamObj.soldiertype = _soldiertype; teamObj.hero = ""; teamObj.teamspeed = WorldObj.BeginTeamSpeed; teamObj.teammorale = WorldObj.BeginTeamMorale; //根据士兵类型激活队伍模型 Transform teamModel = null; switch (teamObj.soldiertype) { case WorldObj.SoldierType.Griffin: teamModel = teamObj.transform.Find("Griffin_Yellow"); break; } if (teamModel) { //激活队伍模型 teamModel.gameObject.SetActive(true); //手动分配队伍模型的PhotonViewID teamModel.GetComponent <PhotonView>().viewID = _viewIdModel; } //使其不可见 Funcs.ChangeObjectAlphaValue(teamObj.teamHealthCanvas, 0f); Funcs.ChangeObjectAlphaValue(teamObj.transform, 0f); }
private void FixedUpdate() { if (!photonView.isMine) { return; } //如果更换场景摄像头被Destroy了则playercamera指向新场景的摄像头 if (!playercamera) { playercamera = FindObjectOfType <Camera>().transform; } if (!Ground) { Ground = GameObject.Find("Ground(Clone)").transform; } cooltime += Time.deltaTime; if (cooltime >= 0.2f) { cooltime = 0f; //每10帧判断敌人队伍是否应该被看见 foreach (var item in WorldObj.allTeams) { //判断每一支非己方的TeamObj是否该被看见 if (item.nationality != nationality) { bool seen = false; //是否该被看见变量 GameObject infoSource = null; foreach (var team in WorldObj.allTeams) { if (team.nationality == nationality) { if (Vector3.Distance(item.transform.position, team.transform.position) < WorldObj.SkillDistance) { seen = true; infoSource = team.gameObject; break; } } } foreach (var eachcity in WorldObj.allCities) { if (eachcity && eachcity.nationality == nationality) { if (Vector3.Distance(item.transform.position, eachcity.transform.position) < WorldObj.SkillDistance) { seen = true; infoSource = eachcity.gameObject; break; } } } //根据判断结果使敌人消失或者显形(包括敌人血条teamHealthCanvas) if (seen && !item.visible) //使显形 { item.visible = true; StartCoroutine(Funcs.SlowDisappearIE(item.teamHealthCanvas, 2f, 100f, true)); StartCoroutine(Funcs.SlowDisappearIE(item.transform, 2f, 100f, true)); try { //侦查信息显示 uiController.ScoutInfoShow(nationality, WorldObj.AnimatorAction.Victory, WorldObj.ScoutInfoType.EnemyBeFound, infoSource); } catch (Exception) { } } else if (!seen && item.visible)//使消失 { item.visible = false; StartCoroutine(Funcs.SlowDisappearIE(item.teamHealthCanvas, 2f, 100f, false)); StartCoroutine(Funcs.SlowDisappearIE(item.transform, 2f, 100f, false)); } } } } //如果正在操作界面的城市受到攻击,则关闭UI if (cityController.cityObj && cityController.cityObj.fighting && WorldObj.UIRun) { uiController.CloseAllPanels(); } //如果城市的敌人列表中的队伍不再攻城或者已经不存在,则从列表中清除该队伍 foreach (var item in WorldObj.allCities) { if (item && item.fighting) { for (int i = 0; i < item.enemies.Count; i++) { TeamObj fightTeam = null; foreach (var eachTeam in WorldObj.allTeams) { if (eachTeam.hero == item.enemies[i]) { fightTeam = eachTeam; } } if ((fightTeam && !fightTeam.enemies.Contains(item.word)) || !fightTeam) { item.UpdateEnemies(item.enemies[i], false); } if (item.enemies.Count == 0) { item.UpdateFighting(false); } } } } }
void Update() { if (!photonView.isMine) { return; } //测试用代码 if (Input.GetMouseButtonDown(1)) { } //鼠标或触摸屏的输入操作 if (Input.GetMouseButtonDown(0) || Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began) { Vector3 pos; if (Input.GetMouseButtonDown(0)) { pos = Input.mousePosition; } else { pos = Input.GetTouch(0).deltaPosition; } //从摄像头发送射线指定屏幕位置到场景位置 RaycastHit hit = Funcs.RayScreenPoint(playercamera, pos); if (!hit.collider) { Debug.Log("未点击到任何物体!"); return; } Transform obj = hit.collider.transform; //如果UI没有在运行 if (!WorldObj.UIRun) { //摄像头移动的操作 if (!teamSelected && obj.parent && !obj.parent.GetComponent <TeamObj>() && (pos.x < Screen.width / 4 || pos.x > Screen.width * 3 / 4)) // || pos.y < Screen.height / 3 || pos.y > Screen.height * 2 / 3)) { float newx = (pos.x - Screen.width / 2) / 100f; //float newy = (pos.y - Screen.height / 2) / 100f; if (obj) { newx = hit.point.x; } //如果没到左右边界,或者到了左右边界但点击的位置不会让摄像头移出边界,则赋值新目标位置cameraNewPosition if (Mathf.Abs(playercamera.position.x) >= (Ground.localScale.x * 10 / 2 - Screen.width / 2 / screenSizeCoefficient)) { if (Mathf.Abs(newx) < Mathf.Abs(playercamera.position.x)) { cameraNewPosition = new Vector3(newx, playercamera.position.y, playercamera.position.z); //newy); } } else { cameraNewPosition = new Vector3(newx, playercamera.position.y, playercamera.position.z); //newy); } } else { cameraNewPosition = playercamera.position; } //如果点到城市并且没有事先选择队伍 if (!teamSelected && obj.parent && obj.parent.GetComponent <CityObj>()) { CityObj aCity = obj.parent.GetComponent <CityObj>(); if (aCity.nationality == nationality && !aCity.fighting) { //teamController.CityGetSpotlight(aCity); //城市获得聚光灯 cityController.cityObj = aCity; cityController.CityMenu(); } } //如果点到队伍并且没有事先选择队伍 else if (!teamSelected && obj.parent && obj.parent.GetComponent <TeamObj>()) { selectedTeam = obj.parent.GetComponent <TeamObj>(); //如果是敌对队伍或带队英雄被沉默,则队伍不可操作 HeroObj teamHero = WorldObj.MatchHero(selectedTeam.hero); if (selectedTeam.nationality != nationality || (!teamHero || teamHero.heroskill == WorldObj.HeroSkill.none) || selectedTeam.hero == "") { return; } teamController.teamObj = selectedTeam; //打开信息提示,使已选择标志为真 teamController.TeamHint(); teamSelected = true; } //如果点到城市并且事先选择了队伍 else if (teamSelected && obj.parent && obj.parent.GetComponent <CityObj>()) { if (teamController.clickSkill) { return; } if (selectedTeam) { selectedTeam.targetCity = obj.parent.GetComponent <CityObj>(); selectedTeam.targetTeam = null; } teamController.TeamToCity(obj.parent.GetComponent <CityObj>()); //关闭信息提示,使已选择标志为假 teamSelected = false; teamController.TeamHintClose(); } //如果点到队伍并且事先选择了队伍 else if (teamSelected && obj.parent && obj.parent.GetComponent <TeamObj>()) { if (selectedTeam && obj.parent.GetComponent <TeamObj>() != selectedTeam) { selectedTeam.targetTeam = obj.parent.GetComponent <TeamObj>(); selectedTeam.targetCity = null; } //teamController.GoToPosition(hit.point); /* * switch (selectedTeam.soldiertype) * { * case WorldObj.SoldierType.SwordMan: * case WorldObj.SoldierType.Archer: * case WorldObj.SoldierType.Cavalry: * case WorldObj.SoldierType.Tank: * teamController.GoToPosition(hit.point); * * break; * //是工程兵则走到指定位置开始建造 * case WorldObj.SoldierType.Worker: * teamController.GoAndBuild(hit.point); * break; * case WorldObj.SoldierType.Griffin: * break; * default: * break; * } */ switch (selectedTeam.soldiertype) { case WorldObj.SoldierType.SwordMan: case WorldObj.SoldierType.Archer: case WorldObj.SoldierType.Cavalry: case WorldObj.SoldierType.Tank: case WorldObj.SoldierType.Worker: if (!teamController.clickSkill) { teamController.TeamToTeam(obj.parent.GetComponent <TeamObj>()); } break; case WorldObj.SoldierType.Griffin: break; default: break; } teamSelected = false; //使用英雄技能 TeamObj objTeam = obj.parent.GetComponent <TeamObj>(); teamController.HeroUseSkill(objTeam); teamController.TeamHintClose(); } //如果点到地上并且事先选择了队伍 else if (teamSelected && obj && obj == Ground) { if (selectedTeam) { selectedTeam.targetTeam = null; selectedTeam.targetCity = null; } switch (selectedTeam.soldiertype) { case WorldObj.SoldierType.SwordMan: case WorldObj.SoldierType.Archer: case WorldObj.SoldierType.Cavalry: case WorldObj.SoldierType.Tank: teamController.GoToPosition(hit.point); break; //是工程兵则走到指定位置开始建造 case WorldObj.SoldierType.Worker: teamController.GoAndBuild(hit.point); break; case WorldObj.SoldierType.Griffin: break; default: break; } teamSelected = false; teamController.TeamHintClose(); //如果工兵队发现位置不可建造,则重新选择建造地点 if (reGoBuild) { teamSelected = true; teamController.clickSkill = true; reGoBuild = false; } } //如果点到侦查模型上 else if (obj && obj == teamScout) { teamSelected = false; teamController.TeamHintClose(); //如果有信息来源,则聚光信息来源,摄像头移动到其位置 if (WorldObj.scoutInfoSourceObj) { TeamObj teamInfoSource = WorldObj.scoutInfoSourceObj.GetComponent <TeamObj>(); CityObj cityInfoSource = WorldObj.scoutInfoSourceObj.GetComponent <CityObj>(); if (teamInfoSource) //如果是队伍信息来源 { //teamController.TeamGetSpotlight(teamInfoSource); cameraNewPosition.x = teamInfoSource.transform.position.x; } else if (cityInfoSource) //如果是城市信息来源 { //teamController.CityGetSpotlight(cityInfoSource); cameraNewPosition.x = cityInfoSource.transform.position.x; } } } } } }
IEnumerator GoAndBuildIE(int _builderIndex, Vector3 _buildPosition) { UIController uiController = countryObj.GetComponent <UIController>(); //测试是否能建造 if (!CanBuild(_builderIndex, _buildPosition)) { uiController.ScoutInfoShow(countryObj.nationality, WorldObj.AnimatorAction.Victory, WorldObj.ScoutInfoType.CannotBuild, builders[_builderIndex].gameObject); //无法建造警告 CannotBuildWarning(_builderIndex, _buildPosition); //则设置该标志为真,使得再次点击可以直接重选建造位置 countryObj.reGoBuild = true; yield break; } //开始行走向建造目标位置,移动提示模型到该位置并使其半透明 if (builders[_builderIndex].hintModel) { builders[_builderIndex].hintModel.position = _buildPosition; StopCoroutine(builders[_builderIndex].coroutineHintModelFlash); builders[_builderIndex].coroutineHintModelFlash = null; //使模型可见 Funcs.SetObjectVisuality(builders[_builderIndex].hintModel, true); //使模型半透明 Funcs.ChangeObjectAlphaValue(builders[_builderIndex].hintModel, 0.4f); } //队伍开始行走直到接近目标位置 builders[_builderIndex].GetComponent <NavMeshAgent>().SetDestination(_buildPosition); uiController.ScoutInfoShow(countryObj.nationality, WorldObj.AnimatorAction.Victory, WorldObj.ScoutInfoType.GoBuild, builders[_builderIndex].gameObject); while (Vector3.Distance(builders[_builderIndex].transform.position, _buildPosition) > 1.2f) { yield return(new WaitForSeconds(Time.deltaTime * 75)); } //测试是否能建造 //开始建造 if (!CanBuild(_builderIndex, _buildPosition)) { uiController.ScoutInfoShow(countryObj.nationality, WorldObj.AnimatorAction.Victory, WorldObj.ScoutInfoType.CannotBuild, builders[_builderIndex].gameObject); yield break; } cityController.BuildNewTeam(builders[_builderIndex].nationality, 1000, "", WorldObj.SoldierType.Tank, builders[_builderIndex].partsnames, _buildPosition); //保存并得到保存的已建造的队伍序号 photonView.RPC("SaveNewTeamRPC", PhotonTargets.All, null); //马上取出该序号防止其他进程改变其值 int thisNewTeamIndex = newTeamIndex; //将Work带的配件表赋值给新建造的队伍,以便在新建队伍的初始化中调用 photonView.RPC("GivePartsNamesRPC", PhotonTargets.All, builders[_builderIndex].partsnames); //开始建造后,使得工程队转向建造位置,静止不动并不可选取 builders[_builderIndex].transform.LookAt(new Vector3(_buildPosition.x, builders[_builderIndex].transform.position.y, _buildPosition.z)); //锁住队伍 LockUnLockTeam(builders[_builderIndex], true); //准备建造模型逐步建造 photonView.RPC("PrepareStepBuildRPC", PhotonTargets.All, WorldObj.SoldierType.Tank, builders[_builderIndex].nationality); //逐步建造队伍模型 StepBuild(thisNewTeamIndex, _builderIndex, builders[_builderIndex].partsnames, 10f); //删除提示模型 if (builders[_builderIndex].hintModel) { Destroy(builders[_builderIndex].hintModel.gameObject); } //协程结束则清空协程变量 builders[_builderIndex].coroutineGoAndBuild = null; }