예제 #1
0
    public void Update()
    {
        AI_Params.PushCharacter(AI_Params.PlayerID, ECharacterType.CharacterTypePlayer, Vector3.zero, Vector3.zero, Vector3.zero, true);
        //AI_Params.PushEvent(EEventType.EventTypeActionStarted, AI_Params.PlayerID, AI_Params.UnknownID, EActionCode.ActionCodeAttackLight);
        //if (Time.time > 2.0) AI_Params.PushEvent(EEventType.EventTypeGameEnd);
        AI_Params.Send(Time.time);
        AI_Order order = AI_Orders.GetOrderForCharacter(AI_Params.PlayerID);

        if (order != null)
        {
            Debug.Log("[Game] Order received (id: " + order.CharacterID + ", code: " + order.ActionCode + ").");
        }
    }
예제 #2
0
    /// <summary>
    /// Thinks the orders for AI characters.
    /// </summary>
    public void ThinkAction()
    {
        Debug.Assert(this.Characters.ContainsKey(AI_Params.PlayerID), "[AI] Invalid player ID (" + AI_Params.PlayerID + ").");
        AI_Character player = this.Characters[AI_Params.PlayerID];

        foreach (AI_Character c in this.Characters.Values)
        {
            if (!c.IsPlayer && c.IsAlive && c.IsIdle)
            {
                AI_DeepLearningNetwork network;
                float[] outputs;

                float[] actions = new float[(int)EActionCode.Count];
                for (EActionCode code = EActionCode.ActionCodeNoAction; code < EActionCode.Count; code++)
                {
                    actions[(int)code] = 0.0f;
                }

                for (EActionCode code = EActionCode.ActionCodeNoAction; code < EActionCode.Count; code++)
                {
                    // Action
                    network = this.Networks_Action[code];
                    outputs = network.Think(new float[] {
                        Vector3.Distance(c.Position, player.Position),
                        Vector3.Angle(c.Direction, player.Position - c.Position),
                        Vector3.Angle(player.Direction, c.Position - player.Position)
                    }, network.Variance);
                    actions[(int)code] = outputs[0];

                    // Reaction
                    if (player.CurrentAction != null)
                    {
                        network = this.Networks_Reaction[code][player.CurrentAction.ActionCode];
                        outputs = network.Think(new float[] {
                            Vector3.Distance(c.Position, player.Position),
                            Vector3.Angle(c.Direction, player.Position - c.Position),
                            Vector3.Angle(player.Direction, c.Position - player.Position),
                            this.LastUpdateTime - player.CurrentAction.CastTime
                        }, network.Variance);
                        actions[(int)code] = actions[(int)code] * outputs[0] - outputs[1];
                    }
                    else
                    {
                        network = this.Networks_Reaction[code][this.Anticipation_ActionCode];
                        outputs = network.Think(new float[] {
                            Vector3.Distance(c.Position, player.Position),
                            Vector3.Angle(c.Direction, player.Position - c.Position),
                            Vector3.Angle(player.Direction, c.Position - player.Position),
                            this.LastUpdateTime - this.Anticipation_ActionTime
                        }, network.Variance);
                        actions[(int)code] = actions[(int)code] * outputs[0] - outputs[1];
                    }
                }

                // Choosing the best action
                float       best_action_value = 0.0f;
                EActionCode best_action_code  = EActionCode.ActionCodeNoAction;
                for (EActionCode code = EActionCode.ActionCodeNoAction; code < EActionCode.Count; code++)
                {
                    if (best_action_value < actions[(int)code])
                    {
                        best_action_value = actions[(int)code];
                        best_action_code  = code;
                    }
                }

                // Setting the new order
                switch (best_action_code)
                {
                case EActionCode.ActionCodeAttackLight:
                case EActionCode.ActionCodeAttackHeavy:
                case EActionCode.ActionCodeGuard:
                    Debug.Log("[AI] Set order for character " + c.CharacterID + " : " + best_action_code + ".");
                    AI_Orders.SetOrderForCharacter(c.CharacterID, best_action_code, c.Position, Vector3.Normalize(player.Position - c.Position));
                    break;

                case EActionCode.ActionCodeRoll:
                    Debug.Log("[AI] Set order for character " + c.CharacterID + " : " + best_action_code + ".");
                    float   left_or_right    = (UnityEngine.Random.value >= 0.5) ? 1.0f : -1.0f;
                    Vector3 direction_player = Vector3.Normalize(player.Position - c.Position);
                    Vector3 direction_roll   = new Vector3(-direction_player.x, direction_player.y, direction_player.z) * left_or_right;
                    AI_Orders.SetOrderForCharacter(c.CharacterID, best_action_code, c.Position, direction_roll);
                    break;

                case EActionCode.ActionCodeNoAction:
                    if (Vector3.Distance(player.Position, c.Position) < 100.0f)
                    {
                        Debug.Log("[AI] Set order for character " + c.CharacterID + " : " + best_action_code + " (stay in position).");
                        AI_Orders.SetOrderForCharacter(c.CharacterID, EActionCode.ActionCodeNoAction, c.Position, Vector3.Normalize(player.Position - c.Position));
                    }
                    else
                    {
                        Debug.Log("[AI] Set order for character " + c.CharacterID + " : " + best_action_code + " (move towards player).");
                        AI_Orders.SetOrderForCharacter(c.CharacterID, EActionCode.ActionCodeNoAction, player.Position, Vector3.Normalize(player.Position - c.Position));
                    }
                    break;
                }
            }
        }
    }