Beispiel #1
0
        /// <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));
        }
Beispiel #2
0
        /// <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);
        }
Beispiel #3
0
        /// <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);
        }
Beispiel #4
0
        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);
 }
Beispiel #7
0
 /// <summary>
 /// 対象プランから記憶オブジェクトを検索
 /// </summary>
 Memory FindMemory(PlanBase plan)
 {
     return(AllMemories.Find(m => m.Plan == plan));
 }