예제 #1
0
        public List <float> Evaluate(AiContext context, int len = 1)
        {
            var pick = new List <float>();

            if (evaluatedContextVariable != AiContextVariable.None)
            {
                if (context.GetParameter(evaluatedContextVariable) is List <float> evaluatedParams)
                {
                    for (var i = 0; i < evaluatedParams.Count; i++)
                    {
                        pick.Add(EvaluateAt(evaluatedParams[i]));
                    }
                }
                else
                {
                    if (context.GetParameter(evaluatedContextVariable) is float evaluatedParam)
                    {
                        pick = new List <float>();
                        var score = EvaluateAt(evaluatedParam);
                        for (var i = 0; i < len; i++)
                        {
                            pick.Add(score);
                        }
                    }
                }
            }
            return(pick);
        }
예제 #2
0
 public void GoToCover(AiContext context, UtilityPick pick)
 {
     if (pick.UtilityAction is PickerAction picker)
     {
         var choices = context.GetParameter(picker.evaluatedParamName) as List <Vector3>;
         var owner   = context.owner as NpcMainScript;
         if (pick.SelectorIdx != -1)
         {
             owner._agent.SetDestination(choices[pick.SelectorIdx]);
         }
     }
 }
예제 #3
0
        private float[] GetSumScores(AiContext context)
        {
            var vetoIndices = new List <int>();
            var count       = (context.GetParameter(evaluatedParamName) as IEnumerable).Cast <object>().Count();

            if (count == 0)
            {
                return(null);
            }
            var averageScores = new float[count];

            foreach (var inputConsideration in considerations)
            {
                if (!inputConsideration.isEnabled)
                {
                    continue;
                }
                var scores = inputConsideration.Evaluate(context, count);
                for (var i = 0; i < scores.Count; i++)
                {
                    var score = Mathf.Round(scores[i] * 1e+3f) / 1e+3f;
                    if (score == 0 && inputConsideration.canApplyVeto)
                    {
                        vetoIndices.Add(i);
                        continue;
                    }
                    averageScores[i] += score;
                }
            }

            foreach (var vetoIndex in vetoIndices)
            {
                averageScores[vetoIndex] = 0f;
            }

            return(averageScores);
        }