Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
                        }
                    }
                }
            }
        }
Ejemplo n.º 3
0
        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;
                            }
                        }
                    }
                }
            }
        }
Ejemplo n.º 4
0
        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;
        }