public void Add(ArmyCtrl armyCtrl) { //armyCtrl.Init(cardDto, mapPointCtrl , armyprefab); armyCtrl.ArmySelectEvent = processArmySelect; ArmySkillManager.Instance.BindSkill(ref armyCtrl);//绑定技能 CardCtrllist.Add(armyCtrl); }
private bool processArmySelect(ArmyCtrl armyCtrl) { if (armyCtrl == null) { return(false); } if (LastSelectArmyCtrl == null) { //第一次选择 LastSelectArmyCtrl = armyCtrl; armyCtrl.isSelect = true; return(true); } else if (armyCtrl != LastSelectArmyCtrl) { //和上次选择不一样 LastSelectArmyCtrl.isSelect = false; LastSelectArmyCtrl.CheckIsA(); //LastSelectArmyCtrl.transform.localScale /= 2; armyCtrl.isSelect = true; LastSelectArmyCtrl = armyCtrl; return(true); } else { //和上次选择一样 LastSelectArmyCtrl.isSelect = false; LastSelectArmyCtrl.CheckIsA(); LastSelectArmyCtrl = null; return(false); } }
/// <summary> /// 处理反击结果 /// </summary> /// <param name="active"></param> private void processBackAttackResult(bool active) { if (active)//如果选择了反击 { //减血 attackCtrl.armyState.Hp -= defenseCtrl.armyState.Damage; socketMsg.Change(OpCode.FIGHT, FightCode.DEAL_BACKATTACK_CREQ, true); Dispatch(AreoCode.NET, NetEvent.SENDMSG, socketMsg); //移除反击手牌 Dispatch(AreoCode.CHARACTER, CharacterEvent.REMOVE_MY_CARDS, backAttackCardCtrl.cardDto); } else { socketMsg.Change(OpCode.FIGHT, FightCode.DEAL_BACKATTACK_CREQ, false); Dispatch(AreoCode.NET, NetEvent.SENDMSG, socketMsg); } //关闭箭头 Dispatch(AreoCode.UI, UIEvent.CLOSE_ATTACK_ARROW, "关闭箭头"); //关闭隐藏面板 Dispatch(AreoCode.UI, UIEvent.CLOSE_HIDE_PLANE, "关闭隐藏面板"); defenseCtrl = null; attackCtrl = null; Dispatch(AreoCode.UI, UIEvent.SHOW_HIDE_PLANE, "显示遮挡面板"); Dispatch(AreoCode.UI, UIEvent.SHOW_WAIT_PANEL, "");//显示等待面板 }
/// <summary> /// 获取防御和攻击兵种的信息 /// </summary> private void getArmy(out ArmyCtrl defenseCtrl, out OtherArmyCtrl attackCtrl, MapAttackDto mapAttackDto) { //镜像对称 int totalX = 12; int totalZ = 8; MapPoint attackpoint = new MapPoint(totalX - mapAttackDto.AttacklMapPoint.X, totalZ - mapAttackDto.AttacklMapPoint.Z); MapPoint defensepoint = new MapPoint(totalX - mapAttackDto.DefenseMapPoint.X, totalZ - mapAttackDto.DefenseMapPoint.Z);; int attackmovetype = mapAttackDto.AttackMoveType; int defensemovetype = mapAttackDto.DefenseMoveType; MapPointCtrl attackPointCtrl = null; MapPointCtrl defensePointCtrl = null; //OtherArmyCtrl attackCtrl; //ArmyCtrl defenseCtrl; foreach (var item in MapManager.mapPointCtrls) { if (item.mapPoint.X == attackpoint.X && item.mapPoint.Z == attackpoint.Z) { attackPointCtrl = item; } else if (item.mapPoint.X == defensepoint.X && item.mapPoint.Z == defensepoint.Z) { defensePointCtrl = item; } if (attackPointCtrl != null && defensePointCtrl != null) { break; } } if (attackmovetype == ArmyMoveType.LAND && attackPointCtrl.LandArmy != null) { attackCtrl = attackPointCtrl.LandArmy.GetComponent <OtherArmyCtrl>(); } else if (attackmovetype == ArmyMoveType.SKY && attackPointCtrl.SkyArmy != null) { attackCtrl = attackPointCtrl.SkyArmy.GetComponent <OtherArmyCtrl>(); } else { attackCtrl = null; } if (defensemovetype == ArmyMoveType.LAND && defensePointCtrl.LandArmy != null) { defenseCtrl = defensePointCtrl.LandArmy.GetComponent <ArmyCtrl>(); } else if (defensemovetype == ArmyMoveType.SKY && defensePointCtrl.SkyArmy != null) { defenseCtrl = defensePointCtrl.SkyArmy.GetComponent <ArmyCtrl>(); } else { defenseCtrl = null; } }
/// <summary> /// 先祖头盔协程 /// </summary> /// <returns></returns> private IEnumerator AncestorHelmets() { //开始选择兵种控制器 if (selectOtherCardCtrl == null) { Dispatch(AreoCode.UI, UIEvent.PROMPT_PANEL_EVENTCODE, "请先选择非指令卡"); yield break; } bool hasInfantry = false; foreach (var item in myArmyCtrlManager.CardCtrllist) { if (item.armyState.Name == OrcArmyCardType.Infantry) { //如果场上有兽族步兵 hasInfantry = true; break; } } if (!hasInfantry) { //如果场上没有兽族步兵 Dispatch(AreoCode.UI, UIEvent.PROMPT_PANEL_EVENTCODE, "场上没有兽族步兵"); yield break; } /*if (selectArmyCtrl == null) * { * Dispatch(AreoCode.UI, UIEvent.PROMPT_PANEL_EVENTCODE, "请先选择使用单位"); * yield break; * }*/ foreach (var item in myArmyCtrlManager.CardCtrllist) { if (item.armyState.Name == OrcArmyCardType.Infantry) { //所有在场上的兽族步兵血量加一,最大血量不变 item.armyState.Hp++; } } //发送消息给其他人 socketMsg.Change(OpCode.FIGHT, FightCode.USE_OTHERCARD_CREQ, selectOtherCardCtrl.cardDto); Dispatch(AreoCode.NET, NetEvent.SENDMSG, socketMsg); //提示消息 Dispatch(AreoCode.UI, UIEvent.PROMPT_PANEL_EVENTCODE, "先祖头盔使用成功"); //移除先祖头盔卡牌 Dispatch(AreoCode.CHARACTER, CharacterEvent.REMOVE_MY_CARDS, selectOtherCardCtrl.cardDto); //状态重置 selectArmyCtrl = null; selectOtherCardCtrl = null; }
/// <summary> /// 绑定技能 /// </summary> /// <param name="armyState"></param> public void BindSkill(ref ArmyCtrl armyCtrl) { //this.armyState = armyState; switch (armyCtrl.armyState.Race) { case RaceType.ORC: switch (armyCtrl.armyState.Name) { case OrcArmyCardType.Hero: armyCtrl.gameObject.AddComponent <OrcHeroSkill>(); // armyCtrl.armySkill = new OrcHeroSkill(ref armyCtrl); armyCtrl.gameObject.GetComponent <OrcHeroSkill>().SetArmyCtrl(ref armyCtrl); armyCtrl.armySkill = armyCtrl.gameObject.GetComponent <OrcHeroSkill>(); break; case OrcArmyCardType.Raven_Shaman: //armyCtrl.armySkill = new OrcRavenShamanSkill(ref armyCtrl); armyCtrl.gameObject.AddComponent <OrcRavenShamanSkill>(); armyCtrl.gameObject.GetComponent <OrcRavenShamanSkill>().SetArmyCtrl(ref armyCtrl); armyCtrl.armySkill = armyCtrl.gameObject.GetComponent <OrcRavenShamanSkill>(); break; case OrcArmyCardType.Giant_mouthed_Frog: //巨口蛙 armyCtrl.gameObject.AddComponent <OrcGiantSkill>(); armyCtrl.gameObject.GetComponent <OrcGiantSkill>().SetArmyCtrl(ref armyCtrl); armyCtrl.armySkill = armyCtrl.gameObject.GetComponent <OrcGiantSkill>(); break; default: armyCtrl.armySkill = new ArmySkillBase(); break; } break; default: armyCtrl.armySkill = new ArmySkillBase(); break; } }
public override void Execute(int eventcode, object message) { switch (eventcode) { case UIEvent.SHOW_ARMY_MENU_PANEL: //armyState = message as ArmyCardBase; armyCtrl = message as ArmyCtrl; //给指令卡管理器传送单位控制器 OrderCardManager.Instance.selectArmyCtrlDelegate.Invoke(armyCtrl); OtherCardManager.Instance.selectArmyCtrlDelegate.Invoke(armyCtrl); //SetPanelActive(true); processShowMenuPanel(); break; case UIEvent.CLOSE_ARMY_MENU_PANEL: SetPanelActive(false); //解除屏蔽选择 foreach (var item in MyArmyCtrlManager.Instance.CardCtrllist) { item.canBeSeletced = true; } StopAllCoroutines(); break; /*case UIEvent.SET_SELECK_ATTACK: * defenseArmyType = (int)message; * break;*/ case UIEvent.IS_ATTACK_SUCCESS: processIsAttackSuccess((bool)message); break; case UIEvent.IS_BACKATTACK: processIsBackAttack((bool)message); break; } }
/// <summary> /// 攻击协程 /// </summary> /// <returns></returns> private IEnumerator useAttack() { //开始选择兵种控制器 //isNeedGetArmyCtrl = true; if (selectOrderCardCtrl == null) { Dispatch(AreoCode.UI, UIEvent.PROMPT_PANEL_EVENTCODE, "请先选择指令卡"); yield break; } if (selectArmyCtrl == null) { //yield return new WaitUntil(isGetArmyCtrl); Dispatch(AreoCode.UI, UIEvent.PROMPT_PANEL_EVENTCODE, "请先选择使用单位"); yield break; /*if (selectOrderCardCtrl == null) * { * yield break; * }*/ } /*if (selectArmyCtrl == null) * { * yield return new WaitUntil(isGetArmyCtrl); * if (selectOrderCardCtrl == null) * { * yield break; * } * }*/ /*if (isSelectMulArmy && SelectUseArmy()) * { * //如果有两个单位 * isSelectMulArmy = false; * isContinueProcessID = 0; * yield break; * }*/ if (selectArmyCtrl.armyState.Class == ArmyClassType.Ordinary) { Dispatch(AreoCode.UI, UIEvent.PROMPT_PANEL_EVENTCODE, "普通兵种不能使用攻击卡"); //isNeedGetArmyCtrl = false; selectArmyCtrl = null; selectOrderCardCtrl = null; yield break; } else if (!selectArmyCtrl.canUseAttack) { Dispatch(AreoCode.UI, UIEvent.PROMPT_PANEL_EVENTCODE, "该种单位本回合已使用过攻击卡"); //isNeedGetArmyCtrl = false; selectArmyCtrl = null; selectOrderCardCtrl = null; yield break; } foreach (var item in myArmyCtrlManager.CardCtrllist) { if (item.armyState.Name == selectArmyCtrl.armyState.Name) { //将该兵种设置为能攻击 item.canAttack = true; item.canUseAttack = false; } } //刷新兵种菜单面板 Dispatch(AreoCode.UI, UIEvent.SHOW_ARMY_MENU_PANEL, selectArmyCtrl); //移除攻击卡牌 Dispatch(AreoCode.CHARACTER, CharacterEvent.REMOVE_MY_CARDS, selectOrderCardCtrl.cardDto); //发送消息 socketMsg.Change(OpCode.FIGHT, FightCode.DEAL_ATTACK_CREQ, "使用攻击卡"); Dispatch(AreoCode.NET, NetEvent.SENDMSG, socketMsg); //状态重置 //isNeedGetArmyCtrl = false; selectArmyCtrl = null; selectOrderCardCtrl = null; //isSelectMulArmy = true; //isContinueProcessID = -1; //Dispatch(AreoCode.UI, UIEvent.CLOSE_ARMY_MENU_PANEL, "关闭面板"); }
/// <summary> /// 修养协程 /// </summary> /// <returns></returns> private IEnumerator useRest() { //开始选择兵种控制器 //isNeedGetArmyCtrl = true; if (selectOrderCardCtrl == null) { Dispatch(AreoCode.UI, UIEvent.PROMPT_PANEL_EVENTCODE, "请先选择指令卡"); yield break; } if (selectArmyCtrl == null) { //yield return new WaitUntil(isGetArmyCtrl); Dispatch(AreoCode.UI, UIEvent.PROMPT_PANEL_EVENTCODE, "请先选择使用单位"); yield break; /*if (selectOrderCardCtrl == null) * { * yield break; * }*/ } /*if (isSelectMulArmy && SelectUseArmy()) * { * //如果有两个单位 * isSelectMulArmy = false; * isContinueProcessID = 1; * yield break; * }*/ if (selectArmyCtrl.armyState.Hp >= selectArmyCtrl.armyState.MaxHp) { Dispatch(AreoCode.UI, UIEvent.PROMPT_PANEL_EVENTCODE, "已达到血量上限"); //isNeedGetArmyCtrl = false; selectArmyCtrl = null; selectOrderCardCtrl = null; yield break; } foreach (var item in myArmyCtrlManager.CardCtrllist) { if (item.armyState.Name == selectArmyCtrl.armyState.Name && item.ArmymapPointCtrl == selectArmyCtrl.ArmymapPointCtrl) { //血量加一 item.armyState.Hp++; //发送消息给其他人 if (item.armyState.MoveType == ArmyMoveType.SKY) { //如果是飞行单位 mapPointDto.Change(item.armyState.Position, -1, -1, item.armyState.Race, item.armyState.Name); } else { //如果是陆地单位 mapPointDto.Change(item.armyState.Position, item.armyState.Race, item.armyState.Name, -1, -1); } socketMsg.Change(OpCode.FIGHT, FightCode.DEAL_REST_CREQ, mapPointDto); Dispatch(AreoCode.NET, NetEvent.SENDMSG, socketMsg); Dispatch(AreoCode.UI, UIEvent.PROMPT_PANEL_EVENTCODE, "回复血量成功"); break; } } //移除修养卡牌 Dispatch(AreoCode.CHARACTER, CharacterEvent.REMOVE_MY_CARDS, selectOrderCardCtrl.cardDto); //状态重置 //isNeedGetArmyCtrl = false; selectArmyCtrl = null; selectOrderCardCtrl = null; //isSelectMulArmy = true; //isContinueProcessID = -1; //Dispatch(AreoCode.UI, UIEvent.CLOSE_ARMY_MENU_PANEL, "关闭面板"); }
/// <summary> /// 处理传送单位控制器委托 /// </summary> /// <param name="armyCtrl"></param> private void processSelectArmyDelegate(ArmyCtrl armyCtrl) { selectArmyCtrl = armyCtrl; }
/// <summary> /// 询问是我方否出闪避 /// </summary> private void pcoessdealDodge(MapAttackDto mapAttackDto) { if (mapAttackDto == null) { socketMsg.Change(OpCode.FIGHT, FightCode.DEAL_DODGE_CREQ, false); Dispatch(AreoCode.NET, NetEvent.SENDMSG, socketMsg); return; } bool hasDodge = false;//手牌中是否有闪避 dodgeCardctrl = hasCardType(CardType.ORDERCARD, OrderCardType.DODGE); if (dodgeCardctrl != null) { hasDodge = true; } else { hasDodge = false; } //获取攻击和防御的兵种 getArmy(out defenseCtrl, out attackCtrl, mapAttackDto); if (defenseCtrl == null || attackCtrl == null) { //发送消息 socketMsg.Change(OpCode.FIGHT, FightCode.DEAL_DODGE_CREQ, false); Dispatch(AreoCode.NET, NetEvent.SENDMSG, socketMsg); return; } //如果没有闪避或是普通兵种直接减血 if (!hasDodge || defenseCtrl.armyState.Class == ArmyClassType.Ordinary) { defenseCtrl.armyState.Hp -= attackCtrl.armyState.Damage; //发送消息 socketMsg.Change(OpCode.FIGHT, FightCode.DEAL_DODGE_CREQ, false); Dispatch(AreoCode.NET, NetEvent.SENDMSG, socketMsg); //关闭箭头 //Dispatch(AreoCode.UI, UIEvent.CLOSE_ATTACK_ARROW, "关闭箭头"); //关闭隐藏面板 //Dispatch(AreoCode.UI, UIEvent.CLOSE_HIDE_PLANE, "关闭隐藏面板"); //发送提示 Dispatch(AreoCode.UI, UIEvent.PROMPT_PANEL_EVENTCODE, "我方(" + defenseCtrl.armyState.Position.X + "," + defenseCtrl.armyState.Position.Z + ")" + "单位被攻击"); if (defenseCtrl.armyState.Race == RaceType.ORC && defenseCtrl.armyState.Name == OrcArmyCardType.Pangolin) { Dispatch(AreoCode.UI, UIEvent.PROMPT_PANEL_EVENTCODE, "穿山甲发动反击背刺"); //如果是兽族穿山甲 attackCtrl.armyState.Hp--;//受到技能伤害 SkillDto skillDto = new SkillDto(defenseCtrl.armyState.Race, defenseCtrl.armyState.Name , attackCtrl.armyState.Name, attackCtrl.armyState.Position); socketMsg.Change(OpCode.FIGHT, FightCode.ARMY_USE_SKILL_CREQ, skillDto); Dispatch(AreoCode.NET, NetEvent.SENDMSG, socketMsg); } if (defenseCtrl.armyState.Class == ArmyClassType.Ordinary) { //发送反击消息 socketMsg.Change(OpCode.FIGHT, FightCode.DEAL_BACKATTACK_CREQ, false); Dispatch(AreoCode.NET, NetEvent.SENDMSG, socketMsg); return;//普通兵种不能反击 } //其他阶级兵种可以反击 backAttackCardCtrl = hasCardType(CardType.ORDERCARD, OrderCardType.BACKATTACK); if (backAttackCardCtrl != null && defenseCtrl.armyState.Hp > 0) { //反击 Dispatch(AreoCode.UI, UIEvent.SHOW_HIDE_PLANE, "显示遮挡平面"); Dispatch(AreoCode.UI, UIEvent.SHOW_DEAL_BACKATTACK_PANEL, "你的单位在敌人的攻击中存活下来了,是否进行反击?"); } else//不反击 { //关闭箭头 Dispatch(AreoCode.UI, UIEvent.CLOSE_ATTACK_ARROW, "关闭箭头"); //关闭隐藏面板 Dispatch(AreoCode.UI, UIEvent.CLOSE_HIDE_PLANE, "关闭隐藏面板"); //发送反击消息 socketMsg.Change(OpCode.FIGHT, FightCode.DEAL_BACKATTACK_CREQ, false); Dispatch(AreoCode.NET, NetEvent.SENDMSG, socketMsg); defenseCtrl = null; attackCtrl = null; Dispatch(AreoCode.UI, UIEvent.SHOW_HIDE_PLANE, "显示遮挡面板"); Dispatch(AreoCode.UI, UIEvent.SHOW_WAIT_PANEL, ""); } return; } //有闪避且被攻击单位为非普通阶级单位 //显示箭头 Vector3 pos = new Vector3(defenseCtrl.armyState.Position.X, 1, defenseCtrl.armyState.Position.Z); Dispatch(AreoCode.UI, UIEvent.SHOW_ATTACK_ARROW, pos); //显示出闪避面板 string str = ""; if (defenseCtrl.armyState.MoveType == ArmyMoveType.SKY) { str = "我方位于箭头所指处的飞行单位被攻击,是否进行闪避?"; } else if (defenseCtrl.armyState.MoveType == ArmyMoveType.LAND) { str = "我方位于箭头所指处的陆地单位被攻击,是否进行闪避?"; } Dispatch(AreoCode.UI, UIEvent.SHOW_DEAL_DODGE_PANEL, str); Dispatch(AreoCode.UI, UIEvent.SHOW_HIDE_PLANE, "显示遮挡平面"); }
/// <summary> /// 处理出闪面板发来的消息 /// </summary> /// <param name="active"></param> private void processDodgeResult(bool active) { if (active)//出闪 { //移除手牌 Dispatch(AreoCode.CHARACTER, CharacterEvent.REMOVE_MY_CARDS, dodgeCardctrl.cardDto); //defenseCtrl = null; //attackCtrl = null; //发送消息 socketMsg.Change(OpCode.FIGHT, FightCode.DEAL_DODGE_CREQ, true); Dispatch(AreoCode.NET, NetEvent.SENDMSG, socketMsg); //关闭箭头 //Dispatch(AreoCode.UI, UIEvent.CLOSE_ATTACK_ARROW, "关闭箭头"); //关闭隐藏面板 //Dispatch(AreoCode.UI, UIEvent.CLOSE_HIDE_PLANE, "关闭隐藏面板"); //发送反击消息 //socketMsg.Change(OpCode.FIGHT, FightCode.DEAL_BACKATTACK_CREQ, false); //Dispatch(AreoCode.NET, NetEvent.SENDMSG, socketMsg); } else//不出闪 { //减血 defenseCtrl.armyState.Hp -= attackCtrl.armyState.Damage; //发送消息 socketMsg.Change(OpCode.FIGHT, FightCode.DEAL_DODGE_CREQ, false); Dispatch(AreoCode.NET, NetEvent.SENDMSG, socketMsg); if (defenseCtrl.armyState.Race == RaceType.ORC && defenseCtrl.armyState.Name == OrcArmyCardType.Pangolin) { Dispatch(AreoCode.UI, UIEvent.PROMPT_PANEL_EVENTCODE, "穿山甲发动反击背刺"); //如果是兽族穿山甲 attackCtrl.armyState.Hp--;//受到技能伤害 SkillDto skillDto = new SkillDto(defenseCtrl.armyState.Race, defenseCtrl.armyState.Name , attackCtrl.armyState.Name, attackCtrl.armyState.Position); socketMsg.Change(OpCode.FIGHT, FightCode.ARMY_USE_SKILL_CREQ, skillDto); Dispatch(AreoCode.NET, NetEvent.SENDMSG, socketMsg); } } //是否反击 backAttackCardCtrl = hasCardType(CardType.ORDERCARD, OrderCardType.BACKATTACK); if (backAttackCardCtrl != null && defenseCtrl.armyState.Hp > 0) { //反击 Dispatch(AreoCode.UI, UIEvent.SHOW_DEAL_BACKATTACK_PANEL, "你的单位在敌人的攻击中存活下来了,是否进行反击?"); } else//不反击 { //关闭箭头 Dispatch(AreoCode.UI, UIEvent.CLOSE_ATTACK_ARROW, "关闭箭头"); //关闭隐藏面板 Dispatch(AreoCode.UI, UIEvent.CLOSE_HIDE_PLANE, "关闭隐藏面板"); //发送反击消息 socketMsg.Change(OpCode.FIGHT, FightCode.DEAL_BACKATTACK_CREQ, false); Dispatch(AreoCode.NET, NetEvent.SENDMSG, socketMsg); defenseCtrl = null; attackCtrl = null; Dispatch(AreoCode.UI, UIEvent.SHOW_HIDE_PLANE, "显示遮挡面板"); Dispatch(AreoCode.UI, UIEvent.SHOW_WAIT_PANEL, "对方回合"); } //defenseCtrl = null; //attackCtrl = null; }
public void SetArmyCtrl(ref ArmyCtrl armyCtrl) { this.armyCtrl = armyCtrl; }
/// <summary> /// 地图上设置兵种 /// </summary> private void Build() { if (Input.GetMouseButtonDown(0)) { if (!EventSystem.current.IsPointerOverGameObject()) { //没有点在UI上 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; /*bool hasArmy = Physics.Raycast(ray, out hit, 1000, LayerMask.GetMask("MyArmy")); * Queue<Collider> colliders = new Queue<Collider>(); * while (hasArmy) * { * Collider collider = hit.collider.GetComponent<Collider>(); * collider.enabled = false; * colliders.Enqueue(collider); * hasArmy = Physics.Raycast(ray, out hit, 1000, LayerMask.GetMask("MapPoint")); * }*/ bool isCollider = Physics.Raycast(ray, out hit, 1000, LayerMask.GetMask("MapPoint")); if (isCollider) { turnDelegate.Invoke(ref TurnCount);//获取回合数 MapPointCtrl mapPointCtrl = hit.collider.GetComponent <MapPointCtrl>(); if (selectArmyCard != null && armyPrefab != null) { if (selectArmyCard.Class == ArmyClassType.Hero && hit.collider.tag != "BossStart") { //如果是英雄单位只能箭头处 Dispatch(AreoCode.UI, UIEvent.PROMPT_PANEL_EVENTCODE, "英雄单位只能箭头处"); return; } else if (selectArmyCard.Class != ArmyClassType.Hero && hit.collider.tag == "BossStart") { Dispatch(AreoCode.UI, UIEvent.PROMPT_PANEL_EVENTCODE, "非英雄单位不能箭头处"); return; } if (TurnCount <= 1) { if (hit.collider.tag != "StartAreo" && hit.collider.tag != "Winline" && hit.collider.tag != "BossStart") { //如果第一回合不在屯兵区放置 Dispatch(AreoCode.UI, UIEvent.PROMPT_PANEL_EVENTCODE, "初始阶段只能后三排"); return; } } else { if (hit.collider.tag != "StartAreo" && hit.collider.tag != "Winline" && hit.collider.tag != "BossStart" && hit.collider.tag != "FeatureArea") { Dispatch(AreoCode.UI, UIEvent.PROMPT_PANEL_EVENTCODE, "只能放置在后五排"); return; } } switch (selectArmyCard.MoveType) { case ArmyMoveType.LAND: //陆地单位 if (mapPointCtrl.HasLandArmy()) { Dispatch(AreoCode.UI, UIEvent.PROMPT_PANEL_EVENTCODE, "此处已有陆地单位"); return; } //放置陆地单位 GameObject army; army = mapPointCtrl.SetLandArmy(armyPrefab, true); mapPointCtrl.LandArmyRace = selectArmyCard.Race; mapPointCtrl.LandArmyName = selectArmyCard.Name; //向我的兵种控制器集合添加兵种管理器 ArmyCtrl armyctrl = army.GetComponent <ArmyCtrl>(); armyctrl.Init(selectArmyCard, mapPointCtrl, army); armyctrl.armyState.MoveType = (ushort)selectArmyCard.MoveType; //更新地图点控制器 mapPointCtrl.UpdateLandArmy(army); myArmyCtrls.Add(armyctrl); //向发送发送出牌消息,让其他人消除卡牌 socketMsg.Change(OpCode.FIGHT, FightCode.DEAL_ARMYCARD_CREQ, selectArmyCard); Dispatch(AreoCode.NET, NetEvent.SENDMSG, socketMsg); //移除卡牌 Dispatch(AreoCode.CHARACTER, CharacterEvent.REMOVE_MY_CARDS, selectArmyCard); //向服务器发送消息 pointDto.Change(mapPointCtrl.mapPoint, mapPointCtrl.LandArmyRace, mapPointCtrl.LandArmyName, mapPointCtrl.SkyArmyRace, mapPointCtrl.SkyArmyName); socketMsg.Change(OpCode.FIGHT, FightCode.MAP_SET_ARMY_CREQ, pointDto); Dispatch(AreoCode.NET, NetEvent.SENDMSG, socketMsg); //向发送发送出牌消息,让其他人消除卡牌 //socketMsg.Change(OpCode.FIGHT, FightCode.DEAL_CARD_CREQ, "出牌请求"); //socketMsg.Change(OpCode.FIGHT, FightCode.DEAL_ARMYCARD_CREQ, selectArmyCard); //Dispatch(AreoCode.NET, NetEvent.SENDMSG, socketMsg); break; case ArmyMoveType.SKY: if (mapPointCtrl.HasSkyArmy()) { Dispatch(AreoCode.UI, UIEvent.PROMPT_PANEL_EVENTCODE, "此处已有飞行单位"); return; } //放置飞行单位 army = mapPointCtrl.SetSkyArmy(armyPrefab, true); //mapPointCtrl.SkyArmyCard = selectArmyCard; mapPointCtrl.SkyArmyRace = selectArmyCard.Race; mapPointCtrl.SkyArmyName = selectArmyCard.Name; //向我的兵种控制器集合添加兵种管理器 armyctrl = army.GetComponent <ArmyCtrl>(); armyctrl.Init(selectArmyCard, mapPointCtrl, army); armyctrl.armyState.MoveType = (ushort)selectArmyCard.MoveType; //更新地图点控制器 mapPointCtrl.UpdateSkyArmy(army); myArmyCtrls.Add(armyctrl); //向发送发送出牌消息,让其他人消除卡牌 socketMsg.Change(OpCode.FIGHT, FightCode.DEAL_ARMYCARD_CREQ, selectArmyCard); Dispatch(AreoCode.NET, NetEvent.SENDMSG, socketMsg); //移除卡牌 Dispatch(AreoCode.CHARACTER, CharacterEvent.REMOVE_MY_CARDS, selectArmyCard); //向服务器发送消息 pointDto.Change(mapPointCtrl.mapPoint, mapPointCtrl.LandArmyRace, mapPointCtrl.LandArmyName, mapPointCtrl.SkyArmyRace, mapPointCtrl.SkyArmyName); socketMsg.Change(OpCode.FIGHT, FightCode.MAP_SET_ARMY_CREQ, pointDto); Dispatch(AreoCode.NET, NetEvent.SENDMSG, socketMsg); /*//向发送发送出牌消息,让其他人消除卡牌 * socketMsg.Change(OpCode.FIGHT, FightCode.DEAL_ARMYCARD_CREQ, selectArmyCard); * Dispatch(AreoCode.NET, NetEvent.SENDMSG, socketMsg);*/ break; } /*while(colliders.Count != 0) * { * colliders.Dequeue().enabled = true; * }*/ foreach (var item in MyArmyCtrlManager.Instance.CardCtrllist) { item.canBeSeletced = true;//所有单位可交互 } } } } } }
// Update is called once per frame void Update() { healArmyctrl = getArmyCtrlByMouse(); }
private IEnumerator heal() { healArmyctrl = null; //isStartSelect = true; Dispatch(AreoCode.UI, UIEvent.CURSOR_SET_HEART, "治疗光标"); List <MapPoint> canhealPoints = MapSkillType.Instance.GetSkillRange(armyCtrl.armyState); List <MapPointCtrl> canhealMapCtrls = MapTools.getMapCtrlByMapPoint(canhealPoints); MapTools.setMappointCtrlColor(canhealMapCtrls, healcolor); yield return(new WaitUntil(isSelecthealArmy)); bool canHeal = false; foreach (var item in canhealMapCtrls) { if (healArmyctrl.armyState.Position.X == item.mapPoint.X && healArmyctrl.armyState.Position.Z == item.mapPoint.Z) { canHeal = true; break; } } if (!canHeal) { Dispatch(AreoCode.UI, UIEvent.CURSOR_SET_NORMAL, "正常光标"); Dispatch(AreoCode.UI, UIEvent.PROMPT_PANEL_EVENTCODE, "不在治疗范围内"); MapTools.setMappointCtrlColor(canhealMapCtrls); healArmyctrl = null; yield break; } if (healArmyctrl.armyState.Hp >= healArmyctrl.armyState.MaxHp) { Dispatch(AreoCode.UI, UIEvent.CURSOR_SET_NORMAL, "正常光标"); Dispatch(AreoCode.UI, UIEvent.PROMPT_PANEL_EVENTCODE, "该单位血量已经达到上限"); MapTools.setMappointCtrlColor(canhealMapCtrls); healArmyctrl = null; yield break; } healArmyctrl.armyState.Hp++; Dispatch(AreoCode.UI, UIEvent.CURSOR_SET_NORMAL, "正常光标"); Dispatch(AreoCode.UI, UIEvent.PROMPT_PANEL_EVENTCODE, "治疗成功"); Dispatch(AreoCode.UI, UIEvent.CLOSE_ARMY_MENU_PANEL, "关闭单位功能面板"); Dispatch(AreoCode.UI, UIEvent.SHOW_ARMY_MENU_PANEL, armyCtrl); isUsed = true; //给对方发送消息 MapPoint targetMappoint = healArmyctrl.armyState.Position; skillDto.Change(armyCtrl.armyState.Race, armyCtrl.armyState.Name, healArmyctrl.armyState.Name, targetMappoint); socketMsg.Change(OpCode.FIGHT, FightCode.ARMY_USE_SKILL_CREQ, skillDto); Dispatch(AreoCode.NET, NetEvent.SENDMSG, socketMsg); MapTools.setMappointCtrlColor(canhealMapCtrls); }
/// <summary> /// 选择兵种协程 /// </summary> /// <returns></returns> private IEnumerator selectArmy() { //清空上一次的选择结果 SelectArmyType = -1;//能解决诸多BUG yield return(new WaitUntil(isSelectArmyType)); if (SelectArmyType == ArmyMoveType.LAND) { //选择了陆地兵种 ArmyCtrl armyCtrl = ArmymapPointCtrl.LandArmy.GetComponent <ArmyCtrl>(); if (armyCtrl.ArmySelectEvent.Invoke(armyCtrl)) { //和上次选择不一样或第一次选择 Dispatch(AreoCode.UI, UIEvent.SHOW_ARMY_MENU_PANEL, armyCtrl); if (armyCtrl.CanturnMove) { foreach (var item in MyArmyCtrlManager.Instance.CardCtrllist) { item.canBeSeletced = false; } armyCtrl.canBeSeletced = true; armyCtrl.GetCanMoveMapPoint(); } } else { //和上次选择一样 Dispatch(AreoCode.UI, UIEvent.CLOSE_ARMY_MENU_PANEL, "关闭面板"); //解蔽选择屏蔽 foreach (var item in MyArmyCtrlManager.Instance.CardCtrllist) { item.canBeSeletced = true; } } } else if (SelectArmyType == ArmyMoveType.SKY) { //如果选择了飞行单位 ArmyCtrl armyCtrl = ArmymapPointCtrl.SkyArmy.GetComponent <ArmyCtrl>(); if (armyCtrl.ArmySelectEvent.Invoke(armyCtrl)) { //和上次选择不一样或第一次选择 Dispatch(AreoCode.UI, UIEvent.SHOW_ARMY_MENU_PANEL, armyCtrl); if (armyCtrl.CanturnMove) { foreach (var item in MyArmyCtrlManager.Instance.CardCtrllist) { item.canBeSeletced = false; } armyCtrl.canBeSeletced = true; armyCtrl.GetCanMoveMapPoint(); } } else { //和上次选择一样 Dispatch(AreoCode.UI, UIEvent.CLOSE_ARMY_MENU_PANEL, "关闭面板"); //解蔽选择屏蔽 foreach (var item in MyArmyCtrlManager.Instance.CardCtrllist) { item.canBeSeletced = true; } } } }