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 + ")."); } }
/// <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; } } } }