/// <summary> /// 设置回合目标角色 /// </summary> /// <param name="roundActionCharacter"></param> public void SetRoundTargetCharacter(NpcAIMiniGameCombatCpt roundActionCharacter) { SetRoundTargetCharacter(new List <NpcAIMiniGameCombatCpt>() { roundActionCharacter }); }
/// <summary> /// 回合准备 /// </summary> public IEnumerator RoundForPre(MiniGameCharacterForCombatBean gameCharacterData) { //获取角色 NpcAIMiniGameCombatCpt npcCpt = GetCharacter(gameCharacterData); //设置当前回合行动的角色 miniGameData.SetRoundActionCharacter(npcCpt); //执行效果 yield return(StartCoroutine(npcCpt.CombatEffectExecute())); //如果角色死亡 if (gameCharacterData.characterCurrentLife <= 0) { StartNextRound(); } else { //如果是敌方 if (gameCharacterData.characterType == 0) { //电脑开始行动 miniGameData.SetCombatStatus(MiniGameCombatStatusEnum.EnemyRound); npcCpt.OpenAI(); } //如果是友方 else if (gameCharacterData.characterType == 1) { //友方行动 miniGameData.SetCombatStatus(MiniGameCombatStatusEnum.OurRound); uiMiniGameCombat.OpenCombatCommand(); } //开启选中特效 SelectCharacter(npcCpt); } }
public override void Close() { base.Close(); uiComponent.isSelecting = false; listSelectNpc.Clear(); CptUtil.RemoveChildsByActive(objSelectIconContainer); currentSelectNpc = null; }
/// <summary> /// 创建角色 /// </summary> /// <param name="miniGameCharacterData"></param> public NpcAIMiniGameCombatCpt CreateCharacter(Vector3 combatPosition, MiniGameCharacterBean miniGameCharacterData) { GameObject objPlayer = Instantiate(objPlayerContainer, objPlayerModel, combatPosition); NpcAIMiniGameCombatCpt npcCpt = objPlayer.GetComponent <NpcAIMiniGameCombatCpt>(); npcCpt.SetData((MiniGameCharacterForCombatBean)miniGameCharacterData); return(npcCpt); }
/// <summary> /// 结束回合 /// </summary> public void EndRound() { roundActionCharacter = null; roundListTargetCharacter = null; roundActionPowerTest = 0; roundActionItemsId = 0; roundActionSkill = null; roundCombatCommand = MiniGameCombatCommand.None; }
/// <summary> /// 协程 战斗 /// </summary> /// <returns></returns> private IEnumerator CoroutineForCommandFight() { NpcAIMiniGameCombatCpt actionNpc = miniGameData.GetRoundActionCharacter(); NpcAIMiniGameCombatCpt targetNpc = miniGameData.GetRoundTargetCharacter(); //获取属性 actionNpc.characterData.GetAttributes(actionNpc.characterMiniGameData, out CharacterAttributesBean actionCharacterAttributes); //让行动角色移动到被攻击对象面前 Vector3 offsetPosition; //根据角色朝向决定位置 if (targetNpc.GetCharacterFace() == 1) { offsetPosition = new Vector3(-1, 0); } else { offsetPosition = new Vector3(1, 0); } //记录之前的位置 Vector3 oldPosition = actionNpc.transform.position; //行动角色移动到目标角色面前 actionNpc.transform.DOMove(targetNpc.transform.position + offsetPosition, 0.5f); yield return(new WaitForSeconds(0.5f)); //TODO 计算闪避(待定) float dodgeRate = UnityEngine.Random.Range(0f, 1f); if (dodgeRate <= 1) { //力量测试加成 float damagePowerRate = (miniGameData.GetRoundActionPowerTest() + 0.2f); //计算伤害 int damage = (int)(damagePowerRate * actionCharacterAttributes.force); //伤害减免 damage = targetNpc.characterMiniGameData.GetTotalDef(damage); //角色伤害 targetNpc.UnderAttack(damagePowerRate, damage); AudioHandler.Instance.PlaySound(AudioSoundEnum.Fight); } else { //角色闪避了 targetNpc.ShowTextInfo(TextHandler.Instance.manager.GetTextById(14001), Color.blue); } //行动角色回到自己的位置 yield return(new WaitForSeconds(0.5f)); actionNpc.transform.DOMove(oldPosition, 0.5f); }
/// <summary> /// 指令 技能 /// </summary> public void CommandSkill() { AudioHandler.Instance.PlaySound(AudioSoundEnum.ButtonForNormal); uiComponent.miniGameData.SetRoundActionCommand(MiniGameCombatCommand.Skill); NpcAIMiniGameCombatCpt npcCpt = uiComponent.miniGameData.GetRoundActionCharacter(); //获取角色拥有的技能 List <long> listSkill = npcCpt.characterMiniGameData.characterData.attributes.listSkills; DialogBean dialogData = new DialogBean(); PickForSkillDialogView pickForSkillDialog = DialogHandler.Instance.CreateDialog <PickForSkillDialogView>(DialogEnum.PickForSkill, this, dialogData); Dictionary <long, int> listUsedSkill = npcCpt.characterMiniGameData.listUsedSkill; pickForSkillDialog.SetData(listSkill, listUsedSkill); }
/// <summary> /// 获取某一个角色 /// </summary> /// <param name="gameCharacterData"></param> public NpcAIMiniGameCombatCpt GetCharacter(MiniGameCharacterBean gameCharacterData) { List <NpcAIMiniGameCombatCpt> listCharacter = miniGameBuilder.GetAllCharacter(); for (int i = 0; i < listCharacter.Count; i++) { NpcAIMiniGameCombatCpt itemNpc = listCharacter[i]; if (itemNpc.characterMiniGameData == gameCharacterData) { return(itemNpc); } } return(null); }
/// <summary> /// 增加效果 /// </summary> /// <param name="effectTypeData"></param> /// <param name="effectDetailsData"></param> public void AddCombatEffect(NpcAIMiniGameCombatCpt actionCharacter, string effectTypeData, string effectDetailsData, Sprite spIcon) { List <EffectTypeBean> listTypeData = EffectTypeEnumTools.GetListEffectData(effectTypeData); EffectDetailsEnumTools.GetEffectDetailsForCombat(effectDetailsData, out string effectPSName, out int durationForRound); MiniGameCombatEffectBean gameCombatEffectData = new MiniGameCombatEffectBean(); gameCombatEffectData.listEffectTypeData = listTypeData; gameCombatEffectData.durationForRound = durationForRound; gameCombatEffectData.effectPSName = effectPSName; gameCombatEffectData.iconMarkId = SystemUtil.GetUUID(SystemUtil.UUIDTypeEnum.N); gameCombatEffectData.actionCharacter = actionCharacter; gameCombatEffectData.targetCharacter = this; foreach (EffectTypeBean itemType in listTypeData) { //设置技能的备用图标 EffectTypeEnumTools.GetEffectDetails(itemType, spIcon); //如果是持续 则需要加上BUFF图标 if (durationForRound > 0) { Sprite spEffect; if (itemType.spIconRemark != null) { spEffect = itemType.spIconRemark; } else { spEffect = itemType.spIcon; } AddStatusIconForEffect(spEffect, Color.white, gameCombatEffectData.iconMarkId); } } //播放粒子特效 if (!CheckUtil.StringIsNull(effectPSName)) { MiniGameHandler.Instance.handlerForCombat.miniGameBuilder.CreateCombatEffect(effectPSName, transform.position + new Vector3(0, 0.5f)); } if (durationForRound > 0) { characterMiniGameData.listCombatEffect.Add(gameCombatEffectData); } else { //回合数小于0的立即执行 CombatEffectExecute(gameCombatEffectData, out bool isDead); } }
/// <summary> /// 创建敌方角色 /// </summary> /// <param name="listCharacterData"></param> public void CreateEnemyCharacter(Vector3 combatPosition, List <MiniGameCharacterBean> listCharacterData) { listEnemyCharacter.Clear(); float characterPositionY = combatPosition.y + ((listCharacterData.Count - 1) / 2f) * 1.5f; for (int i = 0; i < listCharacterData.Count; i++) { Vector3 characterPosition = new Vector3(combatPosition.x + 3, characterPositionY); characterPositionY -= 1.5f; MiniGameCharacterBean itemData = listCharacterData[i]; NpcAIMiniGameCombatCpt npcCpt = CreateCharacter(characterPosition, itemData); listEnemyCharacter.Add(npcCpt); //设置角色朝向 npcCpt.SetCharacterFace(1); } }
/// <summary> /// 获取角色造成的总伤害 /// </summary> /// <param name="gameItemsManager"></param> /// <param name="actionCharacterData"></param> /// <param name="listData"></param> /// <returns></returns> public static int GetTotalDamage(NpcAIMiniGameCombatCpt actionNpc, List <EffectTypeBean> listData) { float damageAdd = 0; float damageAddRate = 1; actionNpc.characterData.GetAttributes(actionNpc.characterMiniGameData, out CharacterAttributesBean characterAttributes); foreach (EffectTypeBean itemData in listData) { switch (itemData.dataType) { case EffectTypeEnum.Damage: damageAdd += float.Parse(itemData.data); break; case EffectTypeEnum.DamageRate: damageAddRate += float.Parse(itemData.data); break; case EffectTypeEnum.DamageRateForLucky: damageAdd += characterAttributes.lucky * float.Parse(itemData.data); break; case EffectTypeEnum.DamageRateForCook: damageAdd += characterAttributes.cook * float.Parse(itemData.data); break; case EffectTypeEnum.DamageRateForSpeed: damageAdd += characterAttributes.speed * float.Parse(itemData.data); break; case EffectTypeEnum.DamageRateForAccount: damageAdd += characterAttributes.account * float.Parse(itemData.data); break; case EffectTypeEnum.DamageRateForCharm: damageAdd += characterAttributes.charm * float.Parse(itemData.data); break; case EffectTypeEnum.DamageRateForForce: damageAdd += characterAttributes.force * float.Parse(itemData.data); break; } } return((int)Mathf.Round(damageAdd * damageAddRate)); }
/// <summary> /// 协程 技能使用 /// </summary> /// <returns></returns> private IEnumerator CoroutineForCommandSkill() { NpcAIMiniGameCombatCpt actionNpc = miniGameData.GetRoundActionCharacter(); List <NpcAIMiniGameCombatCpt> listTargetNpc = miniGameData.GetRoundTargetListCharacter(); SkillInfoBean skillData = miniGameData.GetRoundActionSkill(); Sprite spSkill = IconDataHandler.Instance.manager.GetIconSpriteByName(skillData.icon_key); //喊出技能名字 actionNpc.SetShout(skillData.name); yield return(new WaitForSeconds(1f)); actionNpc.characterMiniGameData.AddUsedSkill(skillData.id, 1); //增加技能效果 foreach (NpcAIMiniGameCombatCpt itemNpc in listTargetNpc) { itemNpc.AddCombatEffect(actionNpc, skillData.effect, skillData.effect_details, spSkill); } yield return(new WaitForSeconds(1f)); }
private void Update() { //设置选中角色图标 if (listSelectNpc != null && listSelectNpc.Count != 0) { foreach (var itemSelect in listSelectNpc) { NpcAIMiniGameCombatCpt itemNpc = itemSelect.Key; GameObject objCursor = itemSelect.Value; GameUtil.WorldPointToUILocalPoint(UIHandler.Instance.manager.GetContainer(), itemNpc.transform.position + new Vector3(0, 0.5f), (RectTransform)objCursor.transform); } } //设置指定角色图标 if (currentSelectCursor != null && currentSelectNpc != null) { GameUtil.WorldPointToUILocalPoint(UIHandler.Instance.manager.GetContainer(), currentSelectNpc.transform.position + new Vector3(0, 0.5f), (RectTransform)currentSelectCursor.transform); } }
/// <summary> /// 协程 物品使用 /// </summary> /// <returns></returns> private IEnumerator CoroutineForCommandItems() { NpcAIMiniGameCombatCpt actionNpc = miniGameData.GetRoundActionCharacter(); List <NpcAIMiniGameCombatCpt> listTargetNpc = miniGameData.GetRoundTargetListCharacter(); long itemsId = miniGameData.GetRoundActionItemsId(); ItemsInfoBean itemsInfo = GameItemsHandler.Instance.manager.GetItemsById(itemsId); //从物品栏移除物品 GameDataBean gameData = GameDataHandler.Instance.manager.GetGameData(); gameData.AddItemsNumber(itemsInfo.id, -1); Sprite spItems = GeneralEnumTools.GetGeneralSprite(itemsInfo); //增加物品效果 foreach (NpcAIMiniGameCombatCpt itemNpc in listTargetNpc) { itemNpc.AddCombatEffect(actionNpc, itemsInfo.effect, itemsInfo.effect_details, spItems); } yield return(new WaitForSeconds(1f)); }
/// <summary> /// 协程意图-攻击 /// </summary> public IEnumerator CoroutineForIntentFight(List <NpcAIMiniGameCombatCpt> relativeOurList, List <NpcAIMiniGameCombatCpt> relativeEnemyList) { MiniGameHandler.Instance.handlerForCombat.miniGameData.SetRoundActionCommand(MiniGameCombatCommand.Fight); MiniGameHandler.Instance.handlerForCombat.miniGameData.SetRoundActionPowerTest(0.8f); //选择血最少的 NpcAIMiniGameCombatCpt targetNpc = null; //for (int i = 0; i < relativeEnemyList.Count; i++) //{ // NpcAIMiniGameCombatCpt itemNPC = relativeEnemyList[i]; // if (targetNpc == null) // { // targetNpc = itemNPC; // } // else // { // //选择血少的 // if (targetNpc.characterMiniGameData.characterCurrentLife > itemNPC.characterMiniGameData.characterCurrentLife) // { // targetNpc = itemNPC; // } // else if (targetNpc.characterMiniGameData.characterCurrentLife == itemNPC.characterMiniGameData.characterCurrentLife) // { // if (Random.Range(0, 2) == 1) // { // targetNpc = itemNPC; // } // } // } //} //随机选一个 targetNpc = RandomUtil.GetRandomDataByList(relativeEnemyList); MiniGameHandler.Instance.handlerForCombat.miniGameData.SetRoundTargetCharacter(targetNpc); yield return(new WaitForSeconds(1)); MiniGameHandler.Instance.handlerForCombat.RoundForAction(); }
/// <summary> /// 选择角色 /// </summary> /// <param name="character"></param> public void SelectCharacter(NpcAIMiniGameCombatCpt character) { miniGameBuilder.DeleteAllEffect(); miniGameBuilder.CreateSelectEffect(character.transform.position); SetCameraPosition(character.transform.position); }
/// <summary> /// 改变选择的角色 /// </summary> /// <param name="selectType"></param> /// <param name="isAddCurrent">是否增加上一个角色</param> public void ChangeCharacter(int next) { AudioHandler.Instance.PlaySound(AudioSoundEnum.ChangeSelect); List <NpcAIMiniGameCombatCpt> listData = new List <NpcAIMiniGameCombatCpt>(); //友方 if (selectType == 1) { listData = MiniGameHandler.Instance.handlerForCombat.miniGameBuilder.GetUserCharacter(); } //敌方 else if (selectType == 2) { listData = MiniGameHandler.Instance.handlerForCombat.miniGameBuilder.GetEnemyCharacter(); } //通用 else { listData = MiniGameHandler.Instance.handlerForCombat.miniGameBuilder.GetAllCharacter(); } //如果选择的人数大于=一共的对象,那么默认选择全部 if (selectNumber >= listData.Count) { selectNumber = 0; } //如果还没有选择角色 则选择第一个 if (currentSelectNpc == null) { currentSelectNpc = listData[0]; } //如果有选择角色则改变为下一个 else { //如果不是全选 则先删除上一个 if (selectNumber != 0) { if (currentSelectCursor != null) { Destroy(currentSelectCursor); } } int changeNumber = 0; for (int i = 0; i < listData.Count; i++) { NpcAIMiniGameCombatCpt itemCharacter = listData[i]; if (itemCharacter == currentSelectNpc) { changeNumber = (i + next); if (changeNumber >= listData.Count) { changeNumber = 0; } else if (changeNumber < 0) { changeNumber = listData.Count - 1; } break; } } currentSelectNpc = listData[changeNumber]; } //镜头对准选中的角色 MiniGameHandler.Instance.handlerForCombat.SetCameraPosition(currentSelectNpc.transform.position); //如果是全选 if (selectNumber == 0) { //如果还没有选中所有 if (listSelectNpc == null || listSelectNpc.Count == 0) { foreach (NpcAIMiniGameCombatCpt itemNpc in listData) { GameObject itemCursor = Instantiate(objSelectIconContainer, objSelectIconModel); listSelectNpc.Add(itemNpc, itemCursor); } } } else { if (!listSelectNpc.ContainsKey(currentSelectNpc)) { currentSelectCursor = Instantiate(objSelectIconContainer, objSelectIconModel); } } }
/// <summary> /// 设置回合行动角色 /// </summary> /// <param name="roundActionCharacter"></param> public void SetRoundActionCharacter(NpcAIMiniGameCombatCpt roundActionCharacter) { this.roundActionCharacter = roundActionCharacter; }
/// <summary> /// 选中一个角色 /// </summary> /// <param name="npcAI"></param> public void ChangeCharacter(NpcAIMiniGameCombatCpt currentNpc) { }