示例#1
0
    public override float Evaluate(TacticalTaskConfig config)
    {
        // unpack config
        var target     = config.target;
        var controller = config.controller;
        var teammates  = config.teammates;
        var enemies    = config.enemies;


        // score wrt distance
        float distanceScore = 1.0f / Mathf.Min(Vector3.Distance(target.transform.position, controller.transform.position), 1.0f);

        // score wrt duplicate work
        bool duplicate = false;

        for (int i = 0; i < teammates.Count; i++)
        {
            // check if this teammate is doing the same
            var task = TacticalPlanner.CurrentTask(teammates[i]);
            if (task.prototype.type == this.type && task.target == target)
            {
                duplicate = true;
                break;
            }
        }
        float duplicateScore = duplicate ? 0.0f : 1.0f;


        // score wrt danger
        float dangerScoreBase = 0.25f;
        float dangerScore     = dangerScoreBase;

        for (int i = 0; i < enemies.Count; i++)
        {
            if (Vector3.Distance(enemies[i].transform.position, target.transform.position) < 20.0f)
            {
                dangerScore *= 2.0f;
            }
        }
        dangerScore -= dangerScoreBase;


        // score wrt easiness
        var   ps            = target.GetComponent <PowerSourceController>();
        float easinessScore = (ps.CurrentPower / ps.m_MaxPower);


        float initiative      = Random.Range(0.0f, 0.3f);
        float distanceWeight  = 3.0f;
        float duplicateWeight = -0.9f;
        float dangerWeight    = -0.5f;
        float easinessWeight  = 0.5f;

        float finalScore = initiative + distanceWeight * distanceScore + duplicateWeight * duplicateScore + dangerWeight * dangerScore + easinessWeight * easinessScore;

        return(Mathf.Clamp01(finalScore));
    }
示例#2
0
    public override float Evaluate(TacticalTaskConfig config)
    {
        var target     = config.target; // here target is an chokepoint area volume
        var controller = config.controller;
        var teammates  = config.teammates;
        var enemies    = config.enemies;

        float distanceScore = 1.0f / (Vector3.Distance(target.transform.position, controller.transform.position) + 1.0f);

        // score wrt duplicate work
        bool duplicate = false;

        for (int i = 0; i < teammates.Count; i++)
        {
            // check if this teammate is doing the same
            var task = TacticalPlanner.CurrentTask(teammates[i]);
            if (task.prototype.type == this.type && task.target == target)
            {
                duplicate = true;
                break;
            }
        }

        float duplicateScore = duplicate ? 0.0f : 1.0f;


        float dangerScoreBase = 0.25f;
        float dangerScore     = dangerScoreBase;

        for (int i = 0; i < enemies.Count; i++)
        {
            if (Vector3.Distance(enemies[i].transform.position, target.transform.position) < 20.0f)
            {
                dangerScore *= 2.0f;
            }
        }
        dangerScore -= dangerScoreBase;

        float initiative     = 0.0f; // = target.areaImportance * (1 - duplicateScore);
        float distanceWeight = 0.5f;
        float dangerWeight   = -0.2f;

        float finalScore = initiative + distanceWeight * distanceScore + dangerWeight * dangerScore;

        return(Mathf.Clamp01(finalScore));
    }
 public override void Act(AIStateController controller)
 {
     controller.TransitionToState(TacticalPlanner.NextState(controller));
 }