void Create() { var sz = MG.Room.MapSize; var cols = (int)sz.x; var rows = (int)sz.y; var lm = transform.Find("Line").gameObject; var lst = new List <LineRenderer>(); FC.For(rows + 2, (y) => { var l = Instantiate(lm) as GameObject; var lr = l.GetComponent <LineRenderer>(); lr.positionCount = 2; lr.SetPosition(0, new Vector3(0 - 0.5f, 0.1f, y - 0.5f)); lr.SetPosition(1, new Vector3(cols + 0.5f, 0.1f, y - 0.5f)); lr.gameObject.SetActive(true); lr.transform.SetParent(transform, false); lst.Add(lr); }); FC.For(cols + 2, (x) => { var l = Instantiate(lm) as GameObject; var lr = l.GetComponent <LineRenderer>(); lr.positionCount = 2; lr.SetPosition(0, new Vector3(x - 0.5f, 0.1f, 0 - 0.5f)); lr.SetPosition(1, new Vector3(x - 0.5f, 0.1f, rows + 0.5f)); lr.gameObject.SetActive(true); lr.transform.SetParent(transform, false); lst.Add(lr); }); lrs = lst.ToArray(); }
// 更新血条旁边的技能图标 public void UpdateSkillPicture(Warrior warrior) { var PassiveSkillFrame = PassiveSkill.transform.parent.gameObject; var ActiveSkillFrame = ActiveSkill.transform.parent.gameObject; PassiveSkillFrame.SetActive(false); ActiveSkillFrame.SetActive(false); var AllBuffs = warrior.Buffs; if (warrior.GetDefaultActiveSkill() != null) { ActiveSkill.GetComponent <Image>().sprite = Resources.Load <Sprite>("UI/Skill/" + warrior.GetDefaultActiveSkill().ID) as Sprite; ActiveSkillFrame.SetActive(true); } FC.For(AllBuffs.Length, (i) => { if (AllBuffs[i] is PatternSkill) { ActiveSkill.GetComponent <Image>().sprite = Resources.Load <Sprite>("UI/Skill/" + AllBuffs[i].ID) as Sprite; ActiveSkillFrame.SetActive(true); } else if (AllBuffs[i] is ISkillWithPassiveSkill) { PassiveSkill.GetComponent <Image>().sprite = Resources.Load <Sprite>("UI/Skill/" + AllBuffs[i].ID) as Sprite; PassiveSkillFrame.SetActive(true); } }); }
public bool RemoveBuff(Buff b) { bool found = false; FC.For(allBuffs.Length, (player) => { var buffs = allBuffs[player]; if (buffs == null) { return; } if (buffs.Contains(b)) { allBuffs[player].Add(b); foreach (var u in Room.GetAllUnitsByPlayer(player)) { b.OffUnit(u); } buffs.Remove(b); found = true; } }, () => !found); return(found); }
public void LoadAll() { if (!File.Exists(SaveFile)) { return; } using (var r = new BinaryReader(new FileStream(SaveFile, FileMode.Open))) { try { var count = r.ReadInt32(); var data = r.ReadBytes((int)r.BaseStream.Length); var buff = new RingBuffer(); buff.Write(data); FC.For(count, (i) => { var replay = buff.Read <BattleReplay>(); replays.Add(replay); }); } catch (Exception) { replays.Clear(); } finally { r.Close(); } } }
// 彻底销毁一个模型 private void DestroyModel(MapUnit mu) { var lst = new List <Transform>(); if (mu.Attack01Stub != null && mu.Attack01Stub.childCount > 0) { FC.For(mu.Attack01Stub.childCount, (i) => { lst.Add(mu.Attack01Stub.GetChild(i)); }); } if (mu.Attack02Stub != null && mu.Attack02Stub.childCount > 0) { FC.For(mu.Attack02Stub.childCount, (i) => { lst.Add(mu.Attack02Stub.GetChild(i)); }); } foreach (var c in lst) { var ae = c.GetComponent <AttackEffect>(); if (ae != null) { EC.DestroyEffect(ae); } var aa = c.GetComponent <AttackAudio>(); if (aa != null) { AC.DestroyAudio(aa); } } mu.MG = null; mu.transform.SetParent(null); mu.gameObject.SetActive(false); Destroy(mu.gameObject); }
// 反序列化一个录像 public static BattleReplay Deserialize(IReadableBuffer data) { var replay = DeserializeHeader(data); string lastMsgTitle = null; byte[] lastMsgData = null; var msgs = new List <KeyValuePair <string, IReadableBuffer> >(); var cnt = data.ReadInt(); FC.For(cnt, (i) => { // 这里生成 msg 必须用网络字节序,因为这里的数据等同于是直接伪装成了网络上的消息, // 对 Room4Client 来说是一致读取的 var sameAsLastOne = data.ReadBool(); if (!sameAsLastOne) { var msgTitle = data.ReadString(); var msgLen = data.ReadInt(); var msgBody = data.ReadBytes(msgLen); msgs.Add(new KeyValuePair <string, IReadableBuffer>(msgTitle, new RingBuffer(true, true, msgBody))); lastMsgTitle = msgTitle; lastMsgData = msgBody; } else { msgs.Add(new KeyValuePair <string, IReadableBuffer>(lastMsgTitle, new RingBuffer(true, true, lastMsgData))); } }); replay.Msgs = msgs; return(replay); }
public void Build() { // 创建新按钮 FC.For(choices.Length, (i) => { var go = Instantiate(ChoiceBtn); go.transform.SetParent(SelectArea.transform); go.GetComponentInChildren <Text>().text = ChoicesName[i]; var choiceTag = choices[i]; go.GetComponent <Button>().onClick.AddListener(() => { OnSelectOne(choiceTag); }); go.SetActive(true); go.transform.localRotation = Quaternion.identity; go.transform.localScale = Vector3.one; choiceBtns.Add(go); }); // 菜单显示尺寸 width = choiceBtns[0].GetComponent <RectTransform>().rect.width; height = choiceBtns[0].GetComponent <RectTransform>().rect.height; choiceBtns[0].transform.localPosition = new Vector3(-width * 0.75f, 0, 0); choiceBtns[1].transform.localPosition = new Vector3(width * 0.75f, 0, 0); AdjustPos(); }
void RefreshCells() { var sz = MG.Room.MapSize; var cols = (int)sz.x; var rows = (int)sz.y; var n = 0; var cm = transform.Find("Cell").gameObject; FC.For2(cols, rows, (x, y) => { if (MG.Room.CheckSpareSpace(x, y, 1)) { return; } if (n >= cells.Count) { var c = Instantiate(cm) as GameObject; c.SetActive(true); c.transform.SetParent(transform, false); cells.Add(c); } cells[n++].transform.localPosition = new Vector3(x, 0.1f, y); }); FC.For(n, cells.Count, (i) => { cells[i].SetActive(false); }); }
protected override void Sync() { BeginSync(); SyncLong(ref Time); SyncString(ref MapName); if (IsWrite) { W.Write(Messages.Count); FC.ForEach(Messages, (i, msg) => { W.Write(msg.Length); W.Write(msg); }); } else { Messages.Clear(); var count = R.ReadInt(); FC.For(count, (i) => { var dataLen = R.ReadInt(); var data = R.ReadBytes(dataLen); Messages.Add(data); }); } EndSync(); }
// 直接添加单位 void OnAddUnitAtMsg(IReadableBuffer data) { var player = data.ReadInt(); var type = data.ReadString(); var num = data.ReadInt(); var pos = data.ReadVec2(); FC.For(num, (i) => { AddNewUnit(null, type, pos, player); }); }
// 隐藏出生点地块 public void HideRespawnGrid() { var Maptile = GameObject.FindGameObjectsWithTag("MapTile"); FC.For(Maptile.Length, (i) => { Maptile[i].transform.Find("RespawnPlace").gameObject.SetActive(false); }); }
// 随机打乱出生顺序 public void GetRandomRespawnPlace(List <MapData> RespawnList, SRandom rand) { FC.For(RespawnList.Count, (i) => { int RandomNum = rand.Next(RespawnList.Count); var temp = RespawnList[RandomNum]; RespawnList[RandomNum] = RespawnList[i]; RespawnList[i] = temp; }); }
// 直接放置单位 public void SrvAddUnitAt(int player, string type, int num, Vec2 pos) { FC.For(num, (i) => { AddNewUnit(null, type, pos, player); }); Broadcast("AddUnitAt", (buff) => { buff.Write(player); buff.Write(type); buff.Write(num); buff.Write(pos); }); }
// 清除攻击范围显示 public void RemoveShowAttackRange() { FC.For(pathATKRange.Count, (i) => { var avatar = BattleStage.GetAvatarAt(pathATKRange[i].X, pathATKRange[i].Y); if (avatar != null && avatar.AttackHint.activeSelf) { avatar.AttackHint.SetActive(false); } }); BattleStage.RemoveTile(pathATKRange); }
// 生成随机战斗卡牌 public BattleCard[] GenNextCards(int num) { var cards = new BattleCard[num]; FC.For(num, (i) => { var type = Srand.Next(0, BattleCard.BattleCardTypesNum); cards[i] = BattleCard.Create(BattleCard.CardTypes[type]); }); return(cards); }
public static Vec2[] ReadVec2Arr(this IReadableBuffer data) { var cnt = data.ReadInt(); if (cnt < 0) { return(null); } var arr = new Vec2[cnt]; FC.For(cnt, (i) => { var v = data.ReadVec2(); arr[i] = v; }); return(arr); }
public override void InitBuilding(Room r) { // 双方地方基地 cc1 = r.AddNewUnit(null, "Base", poses[0], 1, true); cc1.Hp = cc1.cfg.MaxHp; cc2 = r.AddNewUnit(null, "Base", MapSize - poses[0], 2, true); cc2.Hp = cc2.cfg.MaxHp; // 添加初始矿机 FC.For(4, (i) => { r.AddNewUnit(null, "CrystalMachine", r.FindNextCrystalMachinePos(cc1), 1, true).Owner = cc1; r.AddNewUnit(null, "CrystalMachine", r.FindNextCrystalMachinePos(cc2), 2, true).Owner = cc2; }); }
// 空投伞兵到指定位置,路径随机 public bool CreateSoldierCarrier(string type, int player, Vec2 dropPt) { var cfg = UnitConfiguration.GetDefaultConfig(type); var cost = cfg.Cost; var gasCost = cfg.GasCost; if (GetResource(player, "Money") < cost || GetResource(player, "Gas") < gasCost) { return(false); } else if (cfg.Prerequisites != null && GetAllUnitsByPlayer(player, (u) => u.BuildingCompleted && CheckPrerequisites(player, u.UnitType)).Length == 0) { return(false); } var aps = GetUnitsByType(UnitConfiguration.GetMainBuilder(type), player); if (aps.Length == 0) { return(false); } AddResource(player, "Money", -cost); AddResource(player, "Gas", -gasCost); // 随机从一个机场出发 var fromPt = aps[RandomNext(0, aps.Length)].Pos; var dir = dropPt - fromPt; var mr = MapSize.x > MapSize.y ? MapSize.x : MapSize.y; dir = dir.Length > 1 ? dir / dir.Length : Vec2.Zero; var toPt = dropPt + dir * mr; var stc = AddNewUnit(null, type, fromPt, player); var pType = cfg.Pets[0]; var pCnt = int.Parse(cfg.Pets[1]); FC.For(pCnt, (i) => { stc.UnitCosntructingWaitingList.Add(pType); }); stc.Dir = dir.Dir(); stc.MovePath.Add(dropPt); stc.MovePath.Add(toPt); return(true); }
// 获取出生位置 public void GetRespawnPlace() { FC.For(0, MapInfo.Count, (i) => { if (MapInfo[i].RespawnForChamp == true) { RespawnForChamp.Add(MapInfo[i]); } if (MapInfo[i].RespawnForEnemy == true) { RespawnForEnemy.Add(MapInfo[i]); } }); GetRandomRespawnPlace(RespawnForChamp, Battle.Srand); GetRandomRespawnPlace(RespawnForEnemy, Battle.Srand); }
public void UpdateSkill(Warrior warrior) { // 如果为敌军或者在空地则显示为地形改造按钮 if (warrior == null || !(warrior is Hero)) { UpdateItemUsage(); return; } skill.SetActive(true); ItemUsage.SetActive(false); if (warrior.GetDefaultActiveSkill() is ActiveSkill) // 若为主动技能 { skill.GetComponent <Image>().sprite = Resources.Load <Sprite>("UI/Skill/" + warrior.GetDefaultActiveSkill().ID) as Sprite; energyHint.SetActive(true); skillHint.SetActive(false); // 如果是主动技能则使用button skill.GetComponent <Button>().enabled = true; energy.text = (warrior.GetDefaultActiveSkill() as ActiveSkill).EnergyCost.ToString(); } else if (warrior.PatternSkill != null) // 若为pattern技能 { skill.GetComponent <Image>().sprite = Resources.Load <Sprite>("UI/Skill/" + warrior.PatternSkill.ID) as Sprite; energyHint.SetActive(false); skillHint.SetActive(true); // 如果是pattern技能则不使用button skill.GetComponent <Button>().enabled = false; // 先将显示技能提示区域变为不可见 FC.For(skillCards.Length, (i) => { skillCards[i].SetActive(false); }); // 将技能提示栏的图片更换为pattern技能的出招顺序 FC.For(warrior.PatternSkill.CardsPattern.Length, (i) => { skillCards[i].SetActive(true); skillCards[i].GetComponent <Image>().sprite = Resources.Load <Sprite>("UI/CardType/" + warrior.PatternSkill.CardsPattern[i]) as Sprite; }); } }
// 递归遍历所有子节点 public static bool TravelAllChild(Transform t, Func <Transform, bool> fun) { var continueTravel = fun(t); if (!continueTravel) { return(false); } var cnt = t.childCount; FC.For(cnt, (i) => { var child = t.GetChild(i); continueTravel = TravelAllChild(child, fun); }, () => continueTravel); return(continueTravel); }
static Transform FindFirstChildren(Transform t, string name) { Transform theChild = null; FC.For(t.childCount, (i) => { var c = t.GetChild(i); if (c.name == name) { theChild = c; } else { theChild = FindFirstChildren(c, name); } }, () => theChild == null); return(theChild); }
// 显示人物信息栏左下角buff栏 public void UpDateBUFF(Warrior warrior) { bool[] isBUFFPicTaken = new bool[BUFFPic.Length]; FC.For(BUFFPic.Length, (w) => BUFFPic[w].SetActive(false)); foreach (var buff in warrior.Buffs) { if (BuffDisplayList.BuffsToDisplay.Contains((name) => { return(name.Equals(buff.ID)); })) { for (int j = 0; j < BUFFPic.Length; j++) { if (!isBUFFPicTaken[j]) { BUFFPic[j].SetActive(true); BUFFPic[j].GetComponent <Image>().sprite = Resources.Load <Sprite>("UI/BUFFs/" + buff.ID) as Sprite; isBUFFPicTaken[j] = true; break; } } } } ; }
// 直接添加空降兵 void OnAddSoldierCarrierUnit4TestAnyway(int _, IReadableBuffer data) { var player = data.ReadInt(); var genType = data.ReadString(); var x = data.ReadInt(); var y = data.ReadInt(); Vec2 dropPt = new Vec2(x, y); var fromPt = player == 1 ? new Vec2(30, 5) : new Vec2(30, 235); var dir = dropPt - fromPt; var mr = MapSize.x > MapSize.y ? MapSize.x : MapSize.y; dir = dir.Length > 1 ? dir / dir.Length : Vec2.Zero; var toPt = dropPt + dir * mr; var stc = AddNewUnit(null, genType, fromPt, player); var cfg = UnitConfiguration.GetDefaultConfig(genType); var pType = cfg.Pets[0]; var pCnt = int.Parse(cfg.Pets[1]); FC.For(pCnt, (i) => { stc.UnitCosntructingWaitingList.Add(pType); }); stc.Dir = dir.Dir(); stc.MovePath.Add(dropPt); stc.MovePath.Add(toPt); if (stc != null) { Broadcast("AddSoldierCarrierUnit4TestAnyway", (buff) => { buff.Write(player); buff.Write(genType); buff.Write((int)dropPt.x); buff.Write((int)dropPt.y); }); } }
// 显示攻击范围 public void ShowAttackRange(float x, float y, Warrior worrior) { Debug.Assert(pathATKRange.Count == 0, "path range is not empty now."); FC.For(worrior.AttackRange.Length, (i) => { int minX = (x - worrior.AttackRange[i]) < 0 ? 0 : (int)(x - worrior.AttackRange[i]); int maxX = (x + worrior.AttackRange[i]) >= BattleStage.Map.Width ? BattleStage.Map.Width : (int)(x + worrior.AttackRange[i] + 1); int minY = (y - worrior.AttackRange[i]) < 0 ? 0 : (int)(y - worrior.AttackRange[i]); int maxY = (y + worrior.AttackRange[i]) >= BattleStage.Map.Height ? BattleStage.Map.Height : (int)(y + worrior.AttackRange[i] + 1); FC.For2(minX, maxX, minY, maxY, (tx, ty) => { if (MU.ManhattanDist((int)x, (int)y, tx, ty) == worrior.AttackRange[i]) { var tile = BattleStage.CreateMapTile(tx, ty); pathATKRange.Add(tile); var avatar = BattleStage.GetAvatarAt(tx, ty); if (avatar != null && avatar.Warrior.Team != worrior.Team) { avatar.AttackHint.SetActive(true); } } }); }); }
// 直接建造空降兵 void OnAddSoldierCarrierUnit4TestAnyway(IReadableBuffer data) { var player = data.ReadInt(); var type = data.ReadString(); var dropPt = new Vec2(data.ReadInt(), data.ReadInt()); var fromPt = player == 1 ? new Vec2(30, 5) : new Vec2(30, 235); var dir = dropPt - fromPt; var mr = MapSize.x > MapSize.y ? MapSize.x : MapSize.y; dir = dir.Length > 1 ? dir / dir.Length : Vec2.Zero; var toPt = dropPt + dir * mr; var stc = AddNewUnit(null, type, fromPt, player); var cfg = UnitConfiguration.GetDefaultConfig(type); var pType = cfg.Pets[0]; var pCnt = int.Parse(cfg.Pets[1]); FC.For(pCnt, (i) => { stc.UnitCosntructingWaitingList.Add(pType); }); stc.Dir = dir.Dir(); stc.MovePath.Add(dropPt); stc.MovePath.Add(toPt); }
// 显示范围 public void ShowRange(int cx, int cy, ActiveSkill skill, Action <int, int> onSelPos) { Debug.Assert(Range.Count == 0, "path asasrange is not empty now."); this.onSelPos = onSelPos; var map = BattleStage.Map; // 如果无释放范围的技能 if (!(skill is ISkillWithRange)) { // 需要过滤目标 if (skill is ISkillWithTargetFilter) { var targetList = (skill as ISkillWithTargetFilter).AllAvaliableTargets(); FC.For(targetList.Count, (i) => { var warrior = targetList[i] as Warrior; if (warrior != null) { // 建立用于显示技能范围的地块 var avatar = BattleStage.GetAvatarByWarrior(warrior); var mapTile = BattleStage.CreateMapTile(avatar.X, avatar.Y); mapTile.gameObject.SetActive(false); Range.Add(mapTile); // 显示人物身上的技能标识 if (warrior.Team == skill.Owner.Team) { avatar.FriendSkillDec.SetActive(true); } else { avatar.EnemySkillDec.SetActive(true); } } else { Debug.Assert(warrior != null, "the target is not warrior"); } }); } } else // 有释放范围的技能 { var range = (skill as ISkillWithRange).Range; FC.SquareFor(cx, cy, range, (x, y) => { if (x < 0 || x >= map.Width || y < 0 || y >= map.Height) { return; } var obj = map.GetAt <BattleMapObj>(x, y); if (MU.ManhattanDist(x, y, cx, cy) == range) { if (obj == null || (obj != null && obj is Hero)) { var tile = BattleStage.CreateMapTile(x, y); Range.Add(tile); } } }); } }
public void AutoSortCards(Warrior warrior) { // 没有pattern技能则不自动排序 if (warrior.PatternSkill == null) { return; } BattleCard [] AfterSortingCards = new BattleCard[AvailableCards.Count]; var skillOrder = warrior.PatternSkill.CardsPattern; bool[] visited = new bool[AvailableCards.Count]; int currentIndex = 0; int countNumber = 0; int[] StoreIndex = new int[AvailableCards.Count]; while (countNumber < AvailableCards.Count) { for (int i = 0; i < skillOrder.Length; i++) { for (int j = 0; j < AvailableCards.Count; j++) { if (!visited[j] && AvailableCards[j].Name.Equals(skillOrder[i])) { visited[j] = true; StoreIndex[currentIndex] = j; // 记录下排序后当前位置的卡牌原来的index currentIndex++; break; } } countNumber++; } // 判断是否应该将StoreIndex储存的卡牌更新到排序后的卡组 if (currentIndex % skillOrder.Length == 0 && currentIndex != 0) { FC.For(currentIndex - skillOrder.Length, currentIndex, (i) => { var j = StoreIndex[i]; AfterSortingCards[i] = AvailableCards[j]; }); } else // 将不符合组合的卡牌退回到剩余卡牌中 { var remainder = currentIndex % skillOrder.Length; FC.For(currentIndex - remainder, currentIndex, (i) => { visited[StoreIndex[i]] = false; }); currentIndex = currentIndex - remainder; break; } } // 将不符合组合条件的剩余卡牌放入排序后的卡组 for (int i = currentIndex; i < AfterSortingCards.Length; i++) { for (int j = 0; j < AvailableCards.Count; j++) { if (!visited[j]) { visited[j] = true; AfterSortingCards[i] = AvailableCards[j]; break; } } } // 将排序后的卡组赋给原来卡组 FC.For(AvailableCards.Count, (i) => { AvailableCards[i] = AfterSortingCards[i]; }); }
// 开始游戏,可能是新游戏,也可能是播放录像 public void StartGame(BattleReplay battleReplay = null) { var map = new BattleMap(10, 6, (x, y) => TileType.Grass); // test map var s = DateTime.Now.ToLocalTime().ToString(); var bt = new BattlePVE(map, 0, new PlayerInfo { ID = "tester:" + s, Name = "战斗测试:" + s }); // test battle var p = new Player(); // 载入地图 if (battleReplay == null) { map.MapInfo = MapReader.ReloadMapInfo(); bt.Replay.MapName = MapReader.MapNameList[MapReader.ArrayIndex]; } else { MapReader.ReloadMapByName(battleReplay.MapName); map.MapInfo = MapReader.Map; } map.GetRespawnPlace(); // 配置buff显示列表 BattleStageUI.CharacterInfoUI.BuffDisplayList = Configuration.Config(new BuffToDisplay()); // npcs FC.For(3, (i) => { bt.AddWarriorAt(map.RespawnForEnemy[i].X, map.RespawnForEnemy[i].Y, Configuration.Config(new Boar(map) { Team = 2 })); }); // heros // 黛丽万 var dlw = Configuration.Config(new DaiLiWan(bt) { Team = 1 }); dlw.AddRune(new DaiLiWanRune1()); dlw.AddRune(new DaiLiWanRune2()); dlw.AddRune(new DaiLiWanRune3()); dlw.AddRune(new DaiLiWanRune4()); dlw.RunAllRune2PrepareBattle(); bt.AddWarriorAt(map.RespawnForChamp[0].X, map.RespawnForChamp[0].Y, dlw); // 洛里斯 var lls = Configuration.Config(new LuoLiSi(bt) { Team = 1 }); lls.AddRune(new LuoLiSiRune1()); lls.AddRune(new LuoLiSiRune2()); lls.AddRune(new LuoLiSiRune3()); lls.AddRune(new LuoLiSiRune4()); lls.RunAllRune2PrepareBattle(); bt.AddWarriorAt(map.RespawnForChamp[1].X, map.RespawnForChamp[1].Y, lls); // 巴洛克 var blk = Configuration.Config(new BaLuoKe(bt) { Team = 1 }); blk.AddRune(new BaLuoKeRune1()); blk.AddRune(new BaLuoKeRune2()); blk.AddRune(new BaLuoKeRune3()); blk.AddRune(new BaLuoKeRune4()); blk.RunAllRune2PrepareBattle(); bt.AddWarriorAt(map.RespawnForChamp[2].X, map.RespawnForChamp[2].Y, blk); // 游川隐 var ycy = Configuration.Config(new YouChuanYin(bt) { Team = 1 }); ycy.AddRune(new YouChuanYinRune1()); ycy.AddRune(new YouChuanYinRune2()); ycy.AddRune(new YouChuanYinRune3()); ycy.AddRune(new YouChuanYinRune4()); ycy.RunAllRune2PrepareBattle(); bt.AddWarriorAt(map.RespawnForChamp[3].X, map.RespawnForChamp[3].Y, ycy); // 装备 var e1 = new Equip(); e1.AddAttr(new CollageAdd() { P0 = 1 }); e1.AddAttr(new StartAddShd() { P0 = 50 }); e1.AddAttr(new BackNoRange()); e1.AddAttr(new Spurt() { P0 = -50 }); p.AddEquip(e1); p.OnPreparingBattle(bt); // items // bt.AddItemAt(7, 2, Configuration.Config(new Trunk(map))); // bt.AddItemAt(7, 4, Configuration.Config(new Rock(map))); // test room var room = new BattleRoomClient(new BattlePVERoom(bt)) { PlayerMe = 1 }; room.BattleRoom.ReplayChanged += () => { if (!Recoder.Exists(bt.Replay)) { Recoder.AddReplay(bt.Replay); } Recoder.SaveAll(); }; // setup the fake message loop room.BMS = msgLooper; msgLooper.Clear(); room.RegisterBattleMessageHandlers(msgLooper); // build up the whole scene BattleStage.Build(room, (replay) => { // var aniPlayer = BattleStage.GetComponent<MapAniPlayer>(); // aniPlayer.AnimationTimeScaleFactor = 10000; StartGame(); PlayReplay(replay); }); // link the logic event to the stage and ui logic BattleStage.SetupEventHandler(room); BattleStage.SetupUIHandler(room); BattleStageUI.SetupEventHandler(room); this.SetupEventHandler(room); StartingUI.SetActive(false); PreparingUI.SetActive(true); BattleStage.gameObject.SetActive(true); BattleStage.StartPreparing(); }
// 重新排列所有选项 public void Refresh() { // 销毁原有的按钮 foreach (var btn in choiceBtns) { Destroy(btn.gameObject); } // 创建新按钮 FC.For(choices.Length, (i) => { var go = Instantiate(SelChoiceBtn(Choices[i])); go.transform.SetParent(SelectArea.transform); //go.GetComponentInChildren<Text>().text = ChoicesName[i]; if (!(Choices[i] == "DestroyBuilding" || Choices[i] == "Confirm" || Choices[i] == "Cancel")) { UnitDic.Add(Choices[i], go); ShowUnitInfo(Choices[i], go); } var name = go.transform.Find("Name"); name.GetComponent <Text>().text = ChoicesName[i]; if (Choices[i] == "DestroyBuilding") { name.GetComponent <Text>().color = Color.red; } var choiceTag = choices[i]; go.GetComponent <Button>().onClick.AddListener(() => { OnSelectOne(choiceTag); }); go.SetActive(true); go.transform.localRotation = Quaternion.identity; go.transform.localScale = Vector3.one; choiceBtns.Add(go); }); // 重排列所有按钮 var cnt = choiceBtns.Count; if (cnt == 0) { Hide(); return; } // 菜单显示尺寸 var w = choiceBtns[0].GetComponent <RectTransform>().rect.width; var h = choiceBtns[0].GetComponent <RectTransform>().rect.height; if (cnt == 1) { choiceBtns[0].transform.localPosition = Vector3.zero; } else if (cnt == 2) { choiceBtns[0].transform.localPosition = new Vector3(-w * 0.75f, 0, 0); choiceBtns[1].transform.localPosition = new Vector3(w * 0.75f, 0, 0); w *= 2.5f; } else if (cnt == 3) { choiceBtns[0].transform.localPosition = new Vector3(-w * 1.25f, 0, 0); choiceBtns[1].transform.localPosition = new Vector3(0, 0, 0); choiceBtns[2].transform.localPosition = new Vector3(w * 1.25f, 0, 0); w *= 3.75f; } else if (cnt < 6) { FC.For(cnt, (i) => { var y = i < 3 ? h / 2 : -h / 2; var x = (i % 3) * w - w; choiceBtns[i].transform.localPosition = new Vector3(x, y, 0); }); w *= 3; h *= 2; } else { FC.For(cnt, (i) => { var y = i < 3 ? h : (i < 6 ? 0 : -h); var x = (i % 3) * w - w; choiceBtns[i].transform.localPosition = new Vector3(x, y, 0); }); w *= 3; h *= 3; } // 检查边界调整位置 var parentArea = SelectArea.parent.GetComponent <RectTransform>().rect; var uiPos = SelectArea.transform.localPosition + Vector3.up * 40f; var uiPosX = uiPos.x.Clamp(w / 2, parentArea.width - w / 2); var uiPosY = uiPos.y.Clamp(h / 2, parentArea.height - h / 2); SelectArea.transform.localPosition = new Vector3(uiPosX, uiPosY, 0); }