public override void Act(DecisionController controller)
        {
            var actionKey  = GetBestAction();
            var stateData  = m_StateManager.GetStateData(CurrentStateKey, false);
            var actionName = string.Empty;

            switch (actionKey.ActionGuid)
            {
            case var actionGuid when actionGuid == ActionScheduler.MoveDownGuid:
                actionName = nameof(MoveDown);
                break;

            case var actionGuid when actionGuid == ActionScheduler.MoveLeftGuid:
                actionName = nameof(MoveLeft);
                break;

            case var actionGuid when actionGuid == ActionScheduler.MoveRightGuid:
                actionName = nameof(MoveRight);
                break;

            case var actionGuid when actionGuid == ActionScheduler.MoveUpGuid:
                actionName = nameof(MoveUp);
                break;

            case var actionGuid when actionGuid == ActionScheduler.PickupKeyGuid:
                actionName = nameof(PickupKey);
                break;

            case var actionGuid when actionGuid == ActionScheduler.UseDoorLeftGuid:
                actionName = nameof(UseDoorLeft);
                break;

            case var actionGuid when actionGuid == ActionScheduler.UseDoorRightGuid:
                actionName = nameof(UseDoorRight);
                break;

            case var actionGuid when actionGuid == ActionScheduler.UseGateUpGuid:
                actionName = nameof(UseGateUp);
                break;
            }

            var executeInfos = controller.GetExecutionInfo(actionName);

            if (executeInfos == null)
            {
                return;
            }

            var argumentMapping = executeInfos.GetArgumentValues();
            var arguments       = new object[argumentMapping.Count()];
            var i = 0;

            foreach (var argument in argumentMapping)
            {
                var split = argument.Split('.');

                int parameterIndex       = -1;
                var traitBasedObjectName = split[0];

                if (string.IsNullOrEmpty(traitBasedObjectName))
                {
                    throw new ArgumentException($"An argument to the '{actionName}' callback on '{controller.name}' DecisionController is invalid");
                }

                switch (actionName)
                {
                case nameof(MoveDown):
                    parameterIndex = MoveDown.GetIndexForParameterName(traitBasedObjectName);
                    break;

                case nameof(MoveLeft):
                    parameterIndex = MoveLeft.GetIndexForParameterName(traitBasedObjectName);
                    break;

                case nameof(MoveRight):
                    parameterIndex = MoveRight.GetIndexForParameterName(traitBasedObjectName);
                    break;

                case nameof(MoveUp):
                    parameterIndex = MoveUp.GetIndexForParameterName(traitBasedObjectName);
                    break;

                case nameof(PickupKey):
                    parameterIndex = PickupKey.GetIndexForParameterName(traitBasedObjectName);
                    break;

                case nameof(UseDoorLeft):
                    parameterIndex = UseDoorLeft.GetIndexForParameterName(traitBasedObjectName);
                    break;

                case nameof(UseDoorRight):
                    parameterIndex = UseDoorRight.GetIndexForParameterName(traitBasedObjectName);
                    break;

                case nameof(UseGateUp):
                    parameterIndex = UseGateUp.GetIndexForParameterName(traitBasedObjectName);
                    break;
                }

                var traitBasedObjectIndex = actionKey[parameterIndex];
                if (split.Length > 1)
                {
                    switch (split[1])
                    {
                    case nameof(Character):
                        var traitCharacter = stateData.GetTraitOnObjectAtIndex <AI.Planner.Domains.Character>(traitBasedObjectIndex);
                        arguments[i] = split.Length == 3 ? traitCharacter.GetField(split[2]) : traitCharacter;
                        break;

                    case nameof(Waypoint):
                        var traitWaypoint = stateData.GetTraitOnObjectAtIndex <AI.Planner.Domains.Waypoint>(traitBasedObjectIndex);
                        arguments[i] = split.Length == 3 ? traitWaypoint.GetField(split[2]) : traitWaypoint;
                        break;

                    case nameof(ActivationLock):
                        var traitActivationLock = stateData.GetTraitOnObjectAtIndex <AI.Planner.Domains.ActivationLock>(traitBasedObjectIndex);
                        arguments[i] = split.Length == 3 ? traitActivationLock.GetField(split[2]) : traitActivationLock;
                        break;

                    case nameof(KeyLock):
                        var traitKeyLock = stateData.GetTraitOnObjectAtIndex <AI.Planner.Domains.KeyLock>(traitBasedObjectIndex);
                        arguments[i] = split.Length == 3 ? traitKeyLock.GetField(split[2]) : traitKeyLock;
                        break;

                    case nameof(Carrier):
                        var traitCarrier = stateData.GetTraitOnObjectAtIndex <AI.Planner.Domains.Carrier>(traitBasedObjectIndex);
                        arguments[i] = split.Length == 3 ? traitCarrier.GetField(split[2]) : traitCarrier;
                        break;

                    case nameof(Carriable):
                        var traitCarriable = stateData.GetTraitOnObjectAtIndex <AI.Planner.Domains.Carriable>(traitBasedObjectIndex);
                        arguments[i] = split.Length == 3 ? traitCarriable.GetField(split[2]) : traitCarriable;
                        break;

                    case nameof(Position):
                        var traitPosition = stateData.GetTraitOnObjectAtIndex <AI.Planner.Domains.Position>(traitBasedObjectIndex);
                        arguments[i] = split.Length == 3 ? traitPosition.GetField(split[2]) : traitPosition;
                        break;

                    case nameof(Item):
                        var traitItem = stateData.GetTraitOnObjectAtIndex <AI.Planner.Domains.Item>(traitBasedObjectIndex);
                        arguments[i] = split.Length == 3 ? traitItem.GetField(split[2]) : traitItem;
                        break;

                    case nameof(ActivationSwitch):
                        var traitActivationSwitch = stateData.GetTraitOnObjectAtIndex <AI.Planner.Domains.ActivationSwitch>(traitBasedObjectIndex);
                        arguments[i] = split.Length == 3 ? traitActivationSwitch.GetField(split[2]) : traitActivationSwitch;
                        break;

                    case nameof(EscapePoint):
                        var traitEscapePoint = stateData.GetTraitOnObjectAtIndex <AI.Planner.Domains.EscapePoint>(traitBasedObjectIndex);
                        arguments[i] = split.Length == 3 ? traitEscapePoint.GetField(split[2]) : traitEscapePoint;
                        break;
                    }
                }
                else
                {
                    var planStateId = stateData.GetTraitBasedObjectId(traitBasedObjectIndex);
                    ITraitBasedObjectData dataSource;
                    if (m_PlanStateToGameStateIdLookup.TryGetValue(planStateId.Id, out var gameStateId))
                    {
                        dataSource = m_DomainData.GetDataSource(new TraitBasedObjectId {
                            Id = gameStateId
                        });
                    }
                    else
                    {
                        dataSource = m_DomainData.GetDataSource(planStateId);
                    }

                    Type expectedType = executeInfos.GetParameterType(i);
                    if (typeof(ITraitBasedObjectData).IsAssignableFrom(expectedType))
                    {
                        arguments[i] = dataSource;
                    }
                    else
                    {
                        arguments[i] = null;
                        var obj = dataSource.ParentObject;
                        if (obj != null && obj is UnityEngine.GameObject gameObject)
                        {
                            if (expectedType == typeof(UnityEngine.GameObject))
                            {
                                arguments[i] = gameObject;
                            }

                            if (typeof(UnityEngine.Component).IsAssignableFrom(expectedType))
                            {
                                arguments[i] = gameObject == null ? null : gameObject.GetComponent(expectedType);
                            }
                        }
                    }
                }

                i++;
            }

            CurrentActionKey = actionKey;
            controller.StartAction(executeInfos, arguments);
        }
        public override void Act(DecisionController controller)
        {
            var actionKey  = GetBestAction();
            var stateData  = m_StateManager.GetStateData(CurrentStateKey, false);
            var actionName = string.Empty;

            switch (actionKey.ActionGuid)
            {
            case var actionGuid when actionGuid == ActionScheduler.SwapRightGuid:
                actionName = nameof(SwapRight);
                break;

            case var actionGuid when actionGuid == ActionScheduler.SwapUpGuid:
                actionName = nameof(SwapUp);
                break;
            }

            var executeInfos = controller.GetExecutionInfo(actionName);

            if (executeInfos == null)
            {
                return;
            }

            var argumentMapping = executeInfos.GetArgumentValues();
            var arguments       = new object[argumentMapping.Count()];
            var i = 0;

            foreach (var argument in argumentMapping)
            {
                var split = argument.Split('.');

                int parameterIndex       = -1;
                var traitBasedObjectName = split[0];

                if (string.IsNullOrEmpty(traitBasedObjectName))
                {
                    throw new ArgumentException($"An argument to the '{actionName}' callback on '{controller.name}' DecisionController is invalid");
                }

                switch (actionName)
                {
                case nameof(SwapRight):
                    parameterIndex = SwapRight.GetIndexForParameterName(traitBasedObjectName);
                    break;

                case nameof(SwapUp):
                    parameterIndex = SwapUp.GetIndexForParameterName(traitBasedObjectName);
                    break;
                }

                var traitBasedObjectIndex = actionKey[parameterIndex];
                if (split.Length > 1)
                {
                    switch (split[1])
                    {
                    case nameof(Game):
                        var traitGame = stateData.GetTraitOnObjectAtIndex <AI.Planner.Domains.Game>(traitBasedObjectIndex);
                        arguments[i] = split.Length == 3 ? traitGame.GetField(split[2]) : traitGame;
                        break;

                    case nameof(Coordinate):
                        var traitCoordinate = stateData.GetTraitOnObjectAtIndex <AI.Planner.Domains.Coordinate>(traitBasedObjectIndex);
                        arguments[i] = split.Length == 3 ? traitCoordinate.GetField(split[2]) : traitCoordinate;
                        break;

                    case nameof(Cell):
                        var traitCell = stateData.GetTraitOnObjectAtIndex <AI.Planner.Domains.Cell>(traitBasedObjectIndex);
                        arguments[i] = split.Length == 3 ? traitCell.GetField(split[2]) : traitCell;
                        break;

                    case nameof(Blocker):
                        var traitBlocker = stateData.GetTraitOnObjectAtIndex <AI.Planner.Domains.Blocker>(traitBasedObjectIndex);
                        arguments[i] = split.Length == 3 ? traitBlocker.GetField(split[2]) : traitBlocker;
                        break;
                    }
                }
                else
                {
                    var planStateId = stateData.GetTraitBasedObjectId(traitBasedObjectIndex);
                    ITraitBasedObjectData dataSource;
                    if (m_PlanStateToGameStateIdLookup.TryGetValue(planStateId.Id, out var gameStateId))
                    {
                        dataSource = m_DomainData.GetDataSource(new TraitBasedObjectId {
                            Id = gameStateId
                        });
                    }
                    else
                    {
                        dataSource = m_DomainData.GetDataSource(planStateId);
                    }

                    Type expectedType = executeInfos.GetParameterType(i);
                    if (typeof(ITraitBasedObjectData).IsAssignableFrom(expectedType))
                    {
                        arguments[i] = dataSource;
                    }
                    else
                    {
                        arguments[i] = null;
                        var obj = dataSource.ParentObject;
                        if (obj != null && obj is UnityEngine.GameObject gameObject)
                        {
                            if (expectedType == typeof(UnityEngine.GameObject))
                            {
                                arguments[i] = gameObject;
                            }

                            if (typeof(UnityEngine.Component).IsAssignableFrom(expectedType))
                            {
                                arguments[i] = gameObject == null ? null : gameObject.GetComponent(expectedType);
                            }
                        }
                    }
                }

                i++;
            }

            CurrentActionKey = actionKey;
            controller.StartAction(executeInfos, arguments);
        }
Exemple #3
0
        public override void Act(DecisionController controller)
        {
            var actionKey  = GetBestAction();
            var stateData  = m_StateManager.GetStateData(CurrentStateKey, false);
            var actionName = string.Empty;

            switch (actionKey.ActionGuid)
            {
            case var actionGuid when actionGuid == ActionScheduler.TakeAItemGuid:
                actionName = nameof(TakeAItem);
                break;

            case var actionGuid when actionGuid == ActionScheduler.MoveToGuid:
                actionName = nameof(MoveTo);
                break;

            case var actionGuid when actionGuid == ActionScheduler.PutOnItemGuid:
                actionName = nameof(PutOnItem);
                break;
            }

            var executeInfos = controller.GetExecutionInfo(actionName);

            if (executeInfos == null)
            {
                return;
            }

            var argumentMapping = executeInfos.GetArgumentValues();
            var arguments       = new object[argumentMapping.Count()];
            var i = 0;

            foreach (var argument in argumentMapping)
            {
                var split = argument.Split('.');

                int parameterIndex       = -1;
                var traitBasedObjectName = split[0];

                if (string.IsNullOrEmpty(traitBasedObjectName))
                {
                    throw new ArgumentException($"An argument to the '{actionName}' callback on '{controller.name}' DecisionController is invalid");
                }

                switch (actionName)
                {
                case nameof(TakeAItem):
                    parameterIndex = TakeAItem.GetIndexForParameterName(traitBasedObjectName);
                    break;

                case nameof(MoveTo):
                    parameterIndex = MoveTo.GetIndexForParameterName(traitBasedObjectName);
                    break;

                case nameof(PutOnItem):
                    parameterIndex = PutOnItem.GetIndexForParameterName(traitBasedObjectName);
                    break;
                }

                var traitBasedObjectIndex = actionKey[parameterIndex];
                if (split.Length > 1)
                {
                    switch (split[1])
                    {
                    case nameof(Baggage):
                        var traitBaggage = stateData.GetTraitOnObjectAtIndex <AI.Planner.Domains.Baggage>(traitBasedObjectIndex);
                        arguments[i] = split.Length == 3 ? traitBaggage.GetField(split[2]) : traitBaggage;
                        break;

                    case nameof(Location):
                        var traitLocation = stateData.GetTraitOnObjectAtIndex <Unity.AI.Planner.DomainLanguage.TraitBased.Location>(traitBasedObjectIndex);
                        arguments[i] = split.Length == 3 ? traitLocation.GetField(split[2]) : traitLocation;
                        break;

                    case nameof(Npc):
                        var traitNpc = stateData.GetTraitOnObjectAtIndex <AI.Planner.Domains.Npc>(traitBasedObjectIndex);
                        arguments[i] = split.Length == 3 ? traitNpc.GetField(split[2]) : traitNpc;
                        break;

                    case nameof(Item):
                        var traitItem = stateData.GetTraitOnObjectAtIndex <AI.Planner.Domains.Item>(traitBasedObjectIndex);
                        arguments[i] = split.Length == 3 ? traitItem.GetField(split[2]) : traitItem;
                        break;

                    case nameof(WayPoint):
                        var traitWayPoint = stateData.GetTraitOnObjectAtIndex <AI.Planner.Domains.WayPoint>(traitBasedObjectIndex);
                        arguments[i] = split.Length == 3 ? traitWayPoint.GetField(split[2]) : traitWayPoint;
                        break;

                    case nameof(Gate):
                        var traitGate = stateData.GetTraitOnObjectAtIndex <AI.Planner.Domains.Gate>(traitBasedObjectIndex);
                        arguments[i] = split.Length == 3 ? traitGate.GetField(split[2]) : traitGate;
                        break;

                    case nameof(GateSwitch):
                        var traitGateSwitch = stateData.GetTraitOnObjectAtIndex <AI.Planner.Domains.GateSwitch>(traitBasedObjectIndex);
                        arguments[i] = split.Length == 3 ? traitGateSwitch.GetField(split[2]) : traitGateSwitch;
                        break;

                    case nameof(Goal):
                        var traitGoal = stateData.GetTraitOnObjectAtIndex <AI.Planner.Domains.Goal>(traitBasedObjectIndex);
                        arguments[i] = split.Length == 3 ? traitGoal.GetField(split[2]) : traitGoal;
                        break;
                    }
                }
                else
                {
                    var planStateId = stateData.GetTraitBasedObjectId(traitBasedObjectIndex);
                    ITraitBasedObjectData dataSource;
                    if (m_PlanStateToGameStateIdLookup.TryGetValue(planStateId.Id, out var gameStateId))
                    {
                        dataSource = m_DomainData.GetDataSource(new TraitBasedObjectId {
                            Id = gameStateId
                        });
                    }
                    else
                    {
                        dataSource = m_DomainData.GetDataSource(planStateId);
                    }

                    Type expectedType = executeInfos.GetParameterType(i);
                    if (typeof(ITraitBasedObjectData).IsAssignableFrom(expectedType))
                    {
                        arguments[i] = dataSource;
                    }
                    else
                    {
                        arguments[i] = null;
                        var obj = dataSource.ParentObject;
                        if (obj != null && obj is UnityEngine.GameObject gameObject)
                        {
                            if (expectedType == typeof(UnityEngine.GameObject))
                            {
                                arguments[i] = gameObject;
                            }

                            if (typeof(UnityEngine.Component).IsAssignableFrom(expectedType))
                            {
                                arguments[i] = gameObject == null ? null : gameObject.GetComponent(expectedType);
                            }
                        }
                    }
                }

                i++;
            }

            CurrentActionKey = actionKey;
            controller.StartAction(executeInfos, arguments);
        }