//点击了技能按钮 private void OnClickedSkillItem() { //获取当前点击对象 string btnName = EventSystem.current.currentSelectedGameObject.name; int skillIdx = -1; if (int.TryParse(btnName.Replace(EGameConstL.STR_SkillBtn, string.Empty), out skillIdx)) { SO_BattleSkill skill = battleUnit.battleUnitAttribute.battleSkills[skillIdx]; if (skill != null) { if (battleUnit.battleUnitAttribute.energy >= skill.energyCost && BattleFieldRenderer.Instance != null) { BattleFieldRenderer.Instance.BattleUnitUseSkill(battleUnit, skill); UpdateComboNotes(battleUnit.battleUnitAttribute.ComboStatus); } else { UtilityHelper.LogWarning(string.Format("能量不足:{0}/{1}", battleUnit.battleUnitAttribute.energy, skill.energyCost)); } } else { UtilityHelper.LogError("Skill item error ->" + btnName); } } else { UtilityHelper.LogError("Skill item name error ->" + btnName); } }
//运行英雄动作 public IEnumerator RunHeroAction(BattleUnitActionEvent heroAction) { if (heroAction == null) { yield break; } switch (heroAction.battleUnitActionType) { case BattleUnitActionType.EnterBattleField: yield return(PlayEnterBattleFieldAction(heroAction as BattleUnitEnterBattleFieldAction)); break; case BattleUnitActionType.ChangeTarget: yield return(PlayChangeTargetAction(heroAction as BattleUnitChangeTargetAction)); break; case BattleUnitActionType.MoveToTarget: yield return(PlayMotionAction(heroAction as BattleUnitMotionAction)); break; case BattleUnitActionType.UseSkill: yield return(PlaySkillAction(heroAction as BattleUnitSkillAction)); break; case BattleUnitActionType.AttributeUpdate: yield return(PlayAttributeUpdateAction(heroAction as BattleUnitAttributeUpdate)); break; case BattleUnitActionType.ManualOperate: yield return(PlayManualAction(heroAction as BattleUnitManualAction)); break; case BattleUnitActionType.PickupItem: yield return(PlayPickupItemAction(heroAction as BattleUnitPickupItemAction)); break; case BattleUnitActionType.UseItem: yield return(PlayUseItemAction(heroAction as BattleUnitUseItemAction)); break; case BattleUnitActionType.Warning: UtilityHelper.LogWarning(heroAction.ToString()); yield return(EGameConstL.WaitForTouchScreen); break; default: break; } yield return(null); }
/// <summary> /// 尝试使用道具 /// </summary> /// <param name="itemID"></param> /// <param name="useCount"></param> /// <returns>使用数量</returns> public int TryUseItem(int itemID, int useCount, ref int finalCount) { if (items == null || items.Count == 0) { UtilityHelper.LogError(string.Format("Use item failed. Do not have this item -> {0}", itemID)); return(0); } for (int i = items.Count - 1; i >= 0; --i) { if (items[i].item.itemID == itemID) { //使用道具 if (items[i].count < useCount) { UtilityHelper.LogWarning(string.Format("Use item warning. {0}/{1}", useCount, items[i].count)); useCount = items[i].count; } //使用道具 items[i].count -= useCount; //判断是否还有剩余 if (items[i].count <= 0) { items[i].Reset(); } finalCount = items[i].count; return(useCount); } } UtilityHelper.LogError(string.Format("Use item failed. Do not have this item -> {0}", itemID)); return(0); }
/// <summary> /// 尝试添加道具 /// </summary> /// <param name="itemID"></param> /// <param name="addition"></param> /// <returns>是否成功</returns> public bool TryAddItem(int itemID, int addition, ref int finalCount) { if (items == null) { items = new List <PackageItem>(); } BattleUnitPickupItemAction action = null; PackageItem emptyItem = null; for (int i = 0; i < items.Count; i++) { if (items[i].item != null && items[i].item.itemID == itemID) { items[i].count += addition; finalCount = items[i].count; return(true); } else if (items[i].item == null) { emptyItem = items[i]; } } //找到了一个空位 if (emptyItem != null) { emptyItem.item = PackageItemManager.Instance.GetItem(itemID); if (emptyItem.item != null) { emptyItem.count += addition; finalCount = emptyItem.count; return(true); } } //背包已满 if (items.Count >= capacity) { UtilityHelper.LogWarning(string.Format("Add item failed. Package if full : {0} -> {1}/{2}", itemID, items.Count, capacity)); return(false); } //添加一个道具 emptyItem = PackageItem.CreateInstance(); emptyItem.item = PackageItemManager.Instance.GetItem(itemID); if (emptyItem.item != null) { items.Add(emptyItem); } emptyItem.count += addition; finalCount = emptyItem.count; return(true); }
//注册 public RegEventResult AddEventHandler(string listener, GameEventHandler handler, int time) { #if UNITY_EDITOR //编辑器模式需要做一个重复检查 for (int i = 0; i < eventInfos.Count; i++) { if (eventInfos[i].handler == handler && string.Compare(eventInfos[i].listener, listener, true) == 0) { eventInfos[i].time = time; UtilityHelper.LogWarning(string.Format("Add event --> {0} <-- handler repeatedly !", eventKey)); return(RegEventResult.Failed); } } #endif eventInfos.Add(new EventInfo(listener, handler, time)); gameEvent += handler; return(RegEventResult.Success); }
//开始战斗 private void Fight() { battleState = BattleState.Fighting; BattleUnit actionUnit = null; do { //连接渲染器,则一步一更新 //没有连接渲染器,则一直计算直到结束 actionUnit = actionQueue.Peek(); if (firstFight) { firstFight = false; } else { if (actionUnit.BPStage) { UtilityHelper.Log("We are in BP stage, continue to fight"); actionUnit.battleUnitAttribute.BPUsed(); } else { UtilityHelper.Log("change queue order"); if (actionUnit.battleUnitAttribute.BPUsingStage()) { actionUnit.battleUnitAttribute.OutOfBPAction(); } actionQueue.Dequeue(); CalculateNextAction(actionUnit); actionUnit = actionQueue.Peek(); } } //增加BP值 if (actionUnit.battleUnitAttribute.manualOperation && actionUnit.battleUnitAttribute.BPUsingStage() == false) { if (actionUnit.battleUnitAttribute.BP < EGameConstL.BPMax) { actionUnit.battleUnitAttribute.BP++; } } if (actionUnit == null) { battleState = BattleState.End; break; } if (actionUnit.CanAction) { HeroActionState state = actionUnit.BattleAction(); switch (state) { case HeroActionState.Normal: battleState = BattleState.Fighting; break; case HeroActionState.WaitForPlayerChoose: battleState = BattleState.WaitForPlayer; break; case HeroActionState.Error: battleState = BattleState.Exception; break; case HeroActionState.Warn: battleState = BattleState.Exception; UtilityHelper.LogWarning(string.Format("Warning: battle action state warning -> {0}", actionUnit.ToString())); break; default: break; } } if (battleFieldEvents.Count > EGameConstL.BattleFieldMaxActions) { UtilityHelper.LogError("Battle actions overflow max limit."); battleState = BattleState.Exception; } else { //只在这种情况下做战斗结束的判断 if (!actionUnit.CanAction || actionUnit.targetBattleUnit == null || !actionUnit.targetBattleUnit.CanAction) { CheckBattleEnd(); } } } while (battleFieldRenderer == null && battleState != BattleState.End && battleState != BattleState.Exception); //连接了渲染器,一步一表现 if (battleFieldRenderer != null) { if (battleState == BattleState.WaitForPlayer) { battleFieldRenderer.PlayBattle(null); } else { battleFieldRenderer.PlayBattle(Run); } } else { Run(); } }