Пример #1
0
    public float teamDistanceToTarget = 100.0f; //Tracks the distance from the teamCenterPoint to the teamTarget

    //=======================================================================================================================================

    /// <summary>
    /// Initializes a Commander_FSM object. Builds the strategic finite state machine.
    /// </summary>
    public void Start()
    {
        Team teamRED = GameManager.instance.teams[0];

        // The team will be triggered to use orders based on the current strategic state
        SetTeamUseOrders(false);

        teamCount  = teamRED.members.Count;
        teamTarget = GameManager.instance.teams[1].members[0];

        //Define Strategic Transitions
        var teammateDeath       = new Transition(State.Strategic_Regroup, (manager) => { return(teamCountDelta > 0); });
        var targetEliminated    = new Transition(State.Strategic_FocusFire, (manager) => { return(teamTarget.getHealth() <= 0.0f); });
        var teamFannedOut       = new Transition(State.Strategic_FocusFire, (manager) => { return(GetTeamAvgDistanceFromTeamCenter() > 6.0f); });
        var teamGrouped         = new Transition(State.Strategic_HoldPosition, (manager) => { return(GetTeamAvgDistanceFromTeamCenter() < 5.0f); });
        var teamLocationReached = new Transition(State.Strategic_FocusFire, (manager) =>
        {
            var TeamRED                = GameManager.instance.teams[0].members;
            bool inPosition            = false;
            int numberOfTeamInPosition = 0;
            foreach (var teammate in TeamRED)
            {
                if (Mathf.Abs(Vector3.Distance(teammate.transform.position, teammate.destination)) < 3.0f)
                {
                    numberOfTeamInPosition += 1;
                }
            }
            if (numberOfTeamInPosition == TeamRED.Count - 1)
            {
                inPosition = true;
            }
            return(inPosition);
        });

        var teamAmbush   = new Transition(State.Strategic_MoveToFiringPosition, (manager) => { return(teamDistanceToTarget < 12.0f); });
        var targetHidden = new Transition(State.Strategic_MoveToFiringPosition, (manager) => {
            var TeamRED         = GameManager.instance.teams[0].members;
            int numberOfVisible = 0;
            foreach (var teammate in TeamRED)
            {
                if (manager.tileManager.PositionCanSeePosition(teammate.transform.position, teamTarget.transform.position))
                {
                    numberOfVisible += 1;
                }
            }
            return(numberOfVisible > (TeamRED.Count / 2));
        });

        // Focus fire on an enemy when it becomes weak
        var enemyWeak = new Transition(State.Strategic_MoveToFiringPosition, (manager) =>
        {
            var teamBlue = manager.teams[1];
            foreach (var enemy in teamBlue.members)
            {
                if (enemy.HasLowHealth())
                {
                    return(true);
                }
            }
            return(false);
        });

        // Define null strategy transitions
        var nullTransitions = new List <Transition>();

        nullTransitions.Add(enemyWeak);

        //Define Regroup Transitions
        var regroupTransitions = new List <Transition>();

        regroupTransitions.Add(teamGrouped);

        //Define FanOut Transitions
        var fanOutTransitions = new List <Transition>();

        fanOutTransitions.Add(teamFannedOut);

        //Define FocusFire Transitions
        var focusFireTransitions = new List <Transition>();

        focusFireTransitions.Add(targetEliminated);
        focusFireTransitions.Add(targetHidden);
        focusFireTransitions.Add(teammateDeath);

        //Define MoveToFiringPosition Transitions
        var moveToFiringPositionTransitions = new List <Transition>();

        moveToFiringPositionTransitions.Add(teamLocationReached);

        //Define HoldPosition Transitions
        var holdPositionTransitions = new List <Transition>();

        holdPositionTransitions.Add(teamAmbush);
        holdPositionTransitions.Add(teammateDeath);

        //Define Dictionary of State/Transition Pairs - to be used by the Strategic State Machine
        var transitions = new Dictionary <State, IEnumerable <Transition> >();

        transitions.Add(State.Strategic_FanOut, fanOutTransitions);
        transitions.Add(State.Strategic_FocusFire, focusFireTransitions);
        transitions.Add(State.Strategic_Regroup, regroupTransitions);
        transitions.Add(State.Strategic_HoldPosition, holdPositionTransitions);
        transitions.Add(State.Strategic_MoveToFiringPosition, moveToFiringPositionTransitions);
        transitions.Add(State.Strategic_Null, nullTransitions);

        //Define and Create the Strategic State Machine
        strategyFSM = new StrategicStateMachine(State.Strategic_HoldPosition, transitions);
        strategyFSM.AddStateBehavior(State.Strategic_FanOut, new FanOutState());
        strategyFSM.AddStateBehavior(State.Strategic_FocusFire, new FocusFireState());
        strategyFSM.AddStateBehavior(State.Strategic_Regroup, new RegroupState());
        strategyFSM.AddStateBehavior(State.Strategic_MoveToFiringPosition, new MoveToFiringPosition());
        strategyFSM.AddStateBehavior(State.Strategic_HoldPosition, new HoldPositionState());
    }//END: Start() Function
Пример #2
0
    public float teamDistanceToTarget = 100.0f;   //Tracks the distance from the teamCenterPoint to the teamTarget
    //=======================================================================================================================================
    
    // Use this for initialization
    public void Start ()
    {
        Team teamRED = GameManager.instance.teams[0];

        foreach(var teammate in teamRED.members)
        {
            // Notifies agents to execute StrategicFSM Commands - rather than TacticalFSM Commands
            teammate.SetOrders(true);
        }

        teamCount = teamRED.members.Count;
        teamTarget = GameManager.instance.teams[1].members[0];

			
        //Define Strategic Transitions
        var teammateDeath = new Transition(State.Strategic_Regroup, (manager) => { return teamCountDelta > 0; });
        var targetEliminated = new Transition(State.Strategic_FocusFire, (manager) => { return teamTarget.getHealth() <= 0.0f; });
        var teamFannedOut = new Transition(State.Strategic_FocusFire, (manager) => { return GetTeamAvgDistanceFromTeamCenter() > 6.0f; });
        var teamGrouped = new Transition(State.Strategic_HoldPosition, (manager) => {  return GetTeamAvgDistanceFromTeamCenter() < 5.0f; });
        var teamLocationReached = new Transition(State.Strategic_FocusFire, (manager) => 
        { var TeamRED = GameManager.instance.teams[0].members;
            bool inPosition = false;
            int numberOfTeamInPosition = 0;
            foreach (var teammate in TeamRED)
            {
                if (Mathf.Abs(Vector3.Distance(teammate.transform.position, teammate.destination)) < 3.0f)
                { numberOfTeamInPosition += 1; }
            }
            if (numberOfTeamInPosition == TeamRED.Count - 1) { inPosition = true; }
            return inPosition; });
        var teamAmbush = new Transition(State.Strategic_MoveToFiringPosition, (manager) => { return teamDistanceToTarget < 7.0f; });
		var targetHidden = new Transition(State.Strategic_MoveToFiringPosition, (manager) => {
			var TeamRED = GameManager.instance.teams[0].members;
			int numberOfVisible = 0;
			foreach (var teammate in TeamRED)
			{
				if (manager.tileManager.PositionCanSeePosition(teammate.transform.position, teamTarget.transform.position))
				{ numberOfVisible += 1; }
			}
			return numberOfVisible > (TeamRED.Count / 2);});

        //Debug.Log("FannedOut fired");Debug.Log("TeamGrouped Fired");Debug.Log("TeammateDeath Fired");Debug.Log("Team Target is " + teamTarget);Debug.Log("Ambush Launched"); 

        //Define Regroup Transitions
        var regroupTransitions = new List<Transition>();
		regroupTransitions.Add(teamGrouped);

        //Define FanOut Transitions
        var fanOutTransitions = new List<Transition>();
        //fanOutTransitions.Add(teammateDeath);
        fanOutTransitions.Add(teamFannedOut);

        //Define FocusFire Transitions
        var focusFireTransitions = new List<Transition>();
        focusFireTransitions.Add(targetEliminated);
		focusFireTransitions.Add(targetHidden);
        focusFireTransitions.Add(teammateDeath);

        //Define MoveToFiringPosition Transitions
        var moveToFiringPositionTransitions = new List<Transition>();
        moveToFiringPositionTransitions.Add(teamLocationReached);

        //Define HoldPosition Transitions
        var holdPositionTransitions = new List<Transition>();
        holdPositionTransitions.Add(teamAmbush);
        holdPositionTransitions.Add(teammateDeath);


        var transitions = new Dictionary<State, IEnumerable<Transition>>();
        transitions.Add(State.Strategic_FanOut, fanOutTransitions);
        transitions.Add(State.Strategic_FocusFire, focusFireTransitions);
        transitions.Add(State.Strategic_Regroup, regroupTransitions);
        transitions.Add(State.Strategic_HoldPosition, holdPositionTransitions);
        transitions.Add(State.Strategic_MoveToFiringPosition, moveToFiringPositionTransitions);

        strategyFSM = new StrategicStateMachine(State.Strategic_MoveToFiringPosition, transitions);
        strategyFSM.AddStateBehavior(State.Strategic_FanOut, new FanOutState());
        strategyFSM.AddStateBehavior(State.Strategic_FocusFire, new FocusFireState());
        strategyFSM.AddStateBehavior(State.Strategic_Regroup, new RegroupState());
        strategyFSM.AddStateBehavior(State.Strategic_MoveToFiringPosition, new MoveToFiringPosition());
        strategyFSM.AddStateBehavior(State.Strategic_HoldPosition, new HoldPositionState());
        
    }//END: Start() Function