/// <summary> /// プランに応じてゴールを選択する /// </summary> /// <param name="plan"></param> /// <returns></returns> IGoal GetGoalByPlan(PlanBase plan) { switch (plan.GoalType) { // あたりを探し回る case GoalType.Wander: { return(new GoalWander <T>(_owner)); } // エネルギー/パワーを得る case GoalType.GetEnergy: case GoalType.GetPower: { var memory = FindMemory(plan); return(new GoalGetItem <T>(_owner, memory.Target)); } // 敵を攻撃 case GoalType.Attack: { var memory = FindMemory(plan); return(new GoalAttackTarget <T>(_owner, memory.Target)); } } return(new Goal <T>(_owner)); }
/// <summary> /// プランを評価する /// 方針は、できるだけエネルギーを蓄えつつ、パワーを拡充していく性格。 /// つまりエネルギーの補充に充填を置く挙動にする。 /// </summary> public override float EvaluatePlan(PlanBase plan) { float value = 0f; // 攻撃プランの場合は、オーナーの状態を見て攻撃に転じるかを判断する if (plan.GoalType == GoalType.Attack) { // パワーがない場合は攻撃できない if (_owner.AttackPower == 0.0f) { return(0f); } value += Mathf.Pow(_owner.Energy, 2f); value += Mathf.Pow(_owner.AttackPower, 1.5f); return(value); } foreach (var reward in plan.RewardProspects) { switch (reward.RewardType) { case RewardType.Enegy: value += Mathf.Pow(1f - _owner.Energy, 2f) * reward.Value; break; case RewardType.Power: value += Mathf.Pow(1f - _owner.AttackPower, 3f) * reward.Value; break; } } return(value); }
/// <summary> /// 選択中のプランからプランを変更する /// </summary> /// <param name="newPlan"></param> void ChangePlan(PlanBase newPlan) { Debug.Log("Change plan to " + newPlan); _currentPlan = newPlan; RemoveAllSubgoals(); var goal = GetGoalByPlan(newPlan); AddSubgoal(goal); }
public override Status Process() { ActivateIfInactive(); PlanBase selectedPlan = EvaluatePlans(); bool needsChangePlan = (selectedPlan != null) && (_currentPlan != selectedPlan); if (needsChangePlan) { ChangePlan(selectedPlan); } return(ProcessSubgoals()); }
/// <summary> /// プランリストを評価して、報酬見込みが一番高いものを返す /// </summary> /// <param name="plans">評価対象のプランリスト</param> /// <returns>選択されたプラン</returns> public virtual PlanBase Evaluate(List <PlanBase> plans) { float maxValue = 0f; PlanBase selectedPlan = null; foreach (var plan in plans) { float value = EvaluatePlan(plan); if (maxValue <= value) { maxValue = value; selectedPlan = plan; } } return(selectedPlan); }
/// <summary> /// プランを評価する /// </summary> /// <param name="plan">評価対象のプラン</param> /// <returns>オーナーの現在の状態を加味したプランに応じた報酬見込み値</returns> public virtual float EvaluatePlan(PlanBase plan) { return(0f); }
/// <summary> /// 対象プランから記憶オブジェクトを検索 /// </summary> Memory FindMemory(PlanBase plan) { return(AllMemories.Find(m => m.Plan == plan)); }