diff --git a/Package/Runtime/CrashKonijn.Goap.Runtime/Scriptables/AgentTypeScriptable.cs b/Package/Runtime/CrashKonijn.Goap.Runtime/Scriptables/AgentTypeScriptable.cs index 89a605d8..4aafba25 100644 --- a/Package/Runtime/CrashKonijn.Goap.Runtime/Scriptables/AgentTypeScriptable.cs +++ b/Package/Runtime/CrashKonijn.Goap.Runtime/Scriptables/AgentTypeScriptable.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using System.Linq; using CrashKonijn.Goap.Core; using UnityEngine; using UnityEngine.Serialization; @@ -16,17 +15,40 @@ public class AgentTypeScriptable : ScriptableObject public IAgentTypeConfig Create() { - var configs = this.capabilities - .Select(behaviour => behaviour.Create()) - .ToList(); + // Aggregate lists + var allGoals = new List(); + var allActions = new List(); + var allWorldSensors = new List(); + var allTargetSensors = new List(); + var allMultiSensors = new List(); + + for (int i = 0; i < this.capabilities.Count; i++) + { + var capabilityConfig = this.capabilities[i].Create(); + + if (capabilityConfig.Goals != null) + allGoals.AddRange(capabilityConfig.Goals); + + if (capabilityConfig.Actions != null) + allActions.AddRange(capabilityConfig.Actions); + + if (capabilityConfig.WorldSensors != null) + allWorldSensors.AddRange(capabilityConfig.WorldSensors); + + if (capabilityConfig.TargetSensors != null) + allTargetSensors.AddRange(capabilityConfig.TargetSensors); + + if (capabilityConfig.MultiSensors != null) + allMultiSensors.AddRange(capabilityConfig.MultiSensors); + } return new AgentTypeConfig(this.name) { - Goals = configs.SelectMany(x => x.Goals).ToList(), - Actions = configs.SelectMany(x => x.Actions).ToList(), - WorldSensors = configs.SelectMany(x => x.WorldSensors).ToList(), - TargetSensors = configs.SelectMany(x => x.TargetSensors).ToList(), - MultiSensors = configs.SelectMany(x => x.MultiSensors).ToList(), + Goals = allGoals, + Actions = allActions, + WorldSensors = allWorldSensors, + TargetSensors = allTargetSensors, + MultiSensors = allMultiSensors, }; } } diff --git a/Package/Runtime/CrashKonijn.Goap.Runtime/Scriptables/CapabilityConfigScriptable.cs b/Package/Runtime/CrashKonijn.Goap.Runtime/Scriptables/CapabilityConfigScriptable.cs index 496f64e6..cb51aa1e 100644 --- a/Package/Runtime/CrashKonijn.Goap.Runtime/Scriptables/CapabilityConfigScriptable.cs +++ b/Package/Runtime/CrashKonijn.Goap.Runtime/Scriptables/CapabilityConfigScriptable.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using System.Linq; using CrashKonijn.Goap.Core; using UnityEditor; using UnityEngine; @@ -39,31 +38,55 @@ public List GetActions(GeneratorScriptable generator) var actionClasses = generator.GetActions(); var targetClasses = generator.GetTargetKeys(); - - return this.actions.Select(x => new ActionConfig + var worldKeys = generator.GetWorldKeys(); + + var configs = new List(); + + foreach (var x in this.actions) { - Name = x.action.Name, - ClassType = x.action.GetScript(actionClasses).GetFullName(), - BaseCost = x.baseCost, - Target = x.target.GetScript(targetClasses).GetInstance(), - StoppingDistance = x.stoppingDistance, - ValidateTarget = x.validateTarget, - RequiresTarget = x.requiresTarget, - ValidateConditions = x.validateConditions, - Conditions = x.conditions.Select(y => new Condition + var conditions = new ICondition[x.conditions.Count]; + + for (var i = 0; i < x.conditions.Count; i++) + { + var condition = x.conditions[i]; + conditions[i] = new Condition + { + WorldKey = condition.worldKey.GetScript(worldKeys).GetInstance(), + Comparison = condition.comparison, + Amount = condition.amount, + }; + } + + var effects = new IEffect[x.effects.Count]; + + for (var i = 0; i < x.effects.Count; i++) { - WorldKey = y.worldKey.GetScript(generator.GetWorldKeys()).GetInstance(), - Comparison = y.comparison, - Amount = y.amount, - }).Cast().ToArray(), - Effects = x.effects.Select(y => new Effect + var effect = x.effects[i]; + effects[i] = new Effect + { + WorldKey = effect.worldKey.GetScript(worldKeys).GetInstance(), + Increase = effect.effect == EffectType.Increase, + }; + } + + configs.Add(new ActionConfig { - WorldKey = y.worldKey.GetScript(generator.GetWorldKeys()).GetInstance(), - Increase = y.effect == EffectType.Increase, - }).Cast().ToArray(), - MoveMode = x.moveMode, - Properties = x.properties, - }).Cast().ToList(); + Name = x.action.Name, + ClassType = x.action.GetScript(actionClasses).GetFullName(), + BaseCost = x.baseCost, + Target = x.target.GetScript(targetClasses).GetInstance(), + StoppingDistance = x.stoppingDistance, + ValidateTarget = x.validateTarget, + RequiresTarget = x.requiresTarget, + ValidateConditions = x.validateConditions, + Conditions = conditions, + Effects = effects, + MoveMode = x.moveMode, + Properties = x.properties, + }); + } + + return configs; } public List GetGoals(GeneratorScriptable generator) @@ -72,18 +95,33 @@ public List GetGoals(GeneratorScriptable generator) return new List(); var goalClasses = generator.GetGoals(); - - return this.goals.Select(x => new GoalConfig + var worldKeys = generator.GetWorldKeys(); + + var configs = new List(); + + foreach (var goal in this.goals) { - Name = x.goal.Name, - ClassType = x.goal.GetScript(goalClasses).GetFullName(), - Conditions = x.conditions.Select(y => new Condition + var conditions = new List(); + + foreach (var condition in goal.conditions) + { + conditions.Add(new Condition + { + WorldKey = condition.worldKey.GetScript(worldKeys).GetInstance(), + Comparison = condition.comparison, + Amount = condition.amount, + }); + } + + configs.Add(new GoalConfig { - WorldKey = y.worldKey.GetScript(generator.GetWorldKeys()).GetInstance(), - Comparison = y.comparison, - Amount = y.amount, - }).Cast().ToList(), - }).Cast().ToList(); + Name = goal.goal.Name, + ClassType = goal.goal.GetScript(goalClasses).GetFullName(), + Conditions = conditions, + }); + } + + return configs; } public List GetWorldSensors(GeneratorScriptable generator) @@ -92,13 +130,21 @@ public List GetWorldSensors(GeneratorScriptable generator) return new List(); var sensorClasses = generator.GetWorldSensors(); - - return this.worldSensors.Select(x => new WorldSensorConfig + var worldKeys = generator.GetWorldKeys(); + + var configs = new List(this.worldSensors.Count); + + foreach (var worldSensor in this.worldSensors) { - Name = x.sensor.Name, - ClassType = x.sensor.GetScript(sensorClasses).GetFullName(), - Key = x.worldKey.GetScript(generator.GetWorldKeys()).GetInstance(), - }).Cast().ToList(); + configs.Add(new WorldSensorConfig + { + Name = worldSensor.sensor.Name, + ClassType = worldSensor.sensor.GetScript(sensorClasses).GetFullName(), + Key = worldSensor.worldKey.GetScript(worldKeys).GetInstance(), + }); + } + + return configs; } public List GetTargetSensors(GeneratorScriptable generator) @@ -107,13 +153,21 @@ public List GetTargetSensors(GeneratorScriptable generator) return new List(); var sensorClasses = generator.GetTargetSensors(); + var targetKeys = generator.GetTargetKeys(); + + var configs = new List(this.targetSensors.Count); - return this.targetSensors.Select(x => new TargetSensorConfig + foreach (var targetSensor in this.targetSensors) { - Name = x.sensor.Name, - ClassType = x.sensor.GetScript(sensorClasses).GetFullName(), - Key = x.targetKey.GetScript(generator.GetTargetKeys()).GetInstance(), - }).Cast().ToList(); + configs.Add(new TargetSensorConfig + { + Name = targetSensor.sensor.Name, + ClassType = targetSensor.sensor.GetScript(sensorClasses).GetFullName(), + Key = targetSensor.targetKey.GetScript(targetKeys).GetInstance(), + }); + } + + return configs; } public List GetMultiSensors(GeneratorScriptable generator) @@ -122,12 +176,19 @@ public List GetMultiSensors(GeneratorScriptable generator) return new List(); var sensorClasses = generator.GetMultiSensors(); + + var configs = new List(this.multiSensors.Count); - return this.multiSensors.Select(x => new MultiSensorConfig + foreach (var multiSensor in this.multiSensors) { - Name = x.sensor.Name, - ClassType = x.sensor.GetScript(sensorClasses).GetFullName(), - }).Cast().ToList(); + configs.Add(new MultiSensorConfig + { + Name = multiSensor.sensor.Name, + ClassType = multiSensor.sensor.GetScript(sensorClasses).GetFullName(), + }); + } + + return configs; } public GeneratorScriptable GetGenerator()