void RefreshSkill() { m_curItemList.Clear(); var zhaoshis = m_currentRole.GetZhaoshis(true).ToList(); childMgr.RefreshChildCount(zhaoshis.Count); List <Transform> childTransList = childMgr.GetUsingTransList(); for (int i = 0; i < zhaoshis.Count; i++) { SkillUIItem item = GameUtil.GetOrAddComponent <SkillUIItem>(childTransList[i]); item.RefreshSkill(zhaoshis[i]); item.SetSelect(m_selectItem == item); Button btn = item.GetComponent <Button>(); BindListener(btn, () => { OnItemClick(item); }); m_curItemList.Add(item); } }
public void GetAIResultClassic(RoleInstance role, Action <AIResult> callback) { //初始化范围逻辑 //rangeLogic = new RangeLogic(BattleboxHelper.Instance.IsBlockExists, BattleModel.BlockHasRole); //获得角色移动能力 int moveAbility = role.GetMoveAbility(); //行动范围 var range = rangeLogic.GetMoveRange(role.Pos.X, role.Pos.Y, moveAbility); //可使用招式 var zhaoshis = role.GetZhaoshis(false); //TODO:攻击计算缓存 by Cherubinxxx //AttackResultCache cache = new AttackResultCache(currentSprite, Field); //AI算法:穷举每个点,使用招式,取最大收益 AIResult result = null; double maxscore = 0; foreach (var zhaoshi in zhaoshis) { if (zhaoshi.GetStatus() != BattleZhaoshiInstance.ZhaoshiStatus.OK) { continue; } GetMoveAndCastPos(role, zhaoshi, range); BattleBlockVector[] tmp = m_GetMoveAndCastPosResult; if (tmp != null && tmp.Length == 2 && tmp[0] != null) { BattleBlockVector movePos = tmp[0]; BattleBlockVector castPos = tmp[1]; double score = GetSkillCastResultScore(role, zhaoshi, movePos.X, movePos.Y, castPos.X, castPos.Y, true); // yield return 0; //分帧 //if (score <= 0 && rst.HitEnemyCount > 0) //{ // score = ToolsShared.GetRandom(0, 1); //} if (score > maxscore) { maxscore = score; result = new AIResult { AttackX = castPos.X, AttackY = castPos.Y, MoveX = movePos.X, MoveY = movePos.Y, Zhaoshi = zhaoshi, IsRest = false }; } } } //考虑吃药 if (role.Items.Count > 0 && (role.Hp < 0.2 * role.MaxHp || role.Mp < 0.2 * role.MaxMp || role.Tili < 0.2 * Jyx2Consts.MaxTili)) { List <Jyx2Item> items = GetAvailableItems(role, 3); //只使用药物 foreach (var item in items) { double score = 0; //尽量吃刚刚好的药 if (item.AddHp > 0) { score += Mathf.Min(item.AddHp, role.MaxHp - role.Hp) - item.AddHp / 10; } if (item.AddMp > 0) { score += Mathf.Min(item.AddMp, role.MaxMp - role.Mp) / 2 - item.AddMp / 10; } if (item.AddTili > 0) { score += Mathf.Min(item.AddTili, Jyx2Consts.MaxTili - role.Tili) - item.AddTili / 10; } if (score > 0) { score *= 1.5;//自保系数大 } if (score > maxscore) { maxscore = score; var tmp = GetFarestEnemyBlock(role, range); result = new AIResult { MoveX = tmp.X, MoveY = tmp.Y, IsRest = false, Item = item }; } } } List <Jyx2Item> anqis = GetAvailableItems(role, 4); //获取暗器 //使用暗器 if (anqis.Count > 0) { foreach (var anqi in anqis) { BattleZhaoshiInstance anqizhaoshi = new AnqiZhaoshiInstance(role.Anqi, anqi); if (anqizhaoshi.GetStatus() != BattleZhaoshiInstance.ZhaoshiStatus.OK) { continue; } GetMoveAndCastPos(role, anqizhaoshi, range); BattleBlockVector[] tmp = m_GetMoveAndCastPosResult; if (tmp != null && tmp.Length == 2 && tmp[0] != null) { BattleBlockVector movePos = tmp[0]; BattleBlockVector castPos = tmp[1]; double score = GetSkillCastResultScore(role, anqizhaoshi, movePos.X, movePos.Y, castPos.X, castPos.Y, true); if (score > maxscore) { maxscore = score; result = new AIResult { AttackX = castPos.X, AttackY = castPos.Y, MoveX = movePos.X, MoveY = movePos.Y, Zhaoshi = anqizhaoshi, IsRest = false }; } } } } //Debug.Log(Time.realtimeSinceStartup); if (result != null) { callback(result); return; } //否则靠近自己最近的敌人 result = MoveToNearestEnemy(role, range); if (result != null) { callback(result); return; } //否则原地休息 callback(Rest(role)); return; }