using UnityEngine; using System.Collections.Generic; using BehaviorDesigner.Runtime.Tasks; #if !UNITY_EDITOR && NETFX_CORE using System.Reflection; #endif namespace BehaviorDesigner.Runtime { [System.Serializable] public abstract class ExternalBehavior : ScriptableObject, IBehavior { [SerializeField] private BehaviorSource mBehaviorSource; public BehaviorSource BehaviorSource { get { return mBehaviorSource; } set { mBehaviorSource = value; } } public BehaviorSource GetBehaviorSource() { return mBehaviorSource; } public void SetBehaviorSource(BehaviorSource behaviorSource) { mBehaviorSource = behaviorSource; } public Object GetObject() { return this; } public string GetOwnerName() { return name; } private bool mInitialized; public bool Initialized { get { return mInitialized; } } public void Init() { CheckForSerialization(); mInitialized = true; } // Support blackboard variables: public SharedVariable GetVariable(string name) { CheckForSerialization(); return mBehaviorSource.GetVariable(name); } public void SetVariable(string name, SharedVariable item) { CheckForSerialization(); mBehaviorSource.SetVariable(name, item); } public void SetVariableValue(string name, object value) { var sharedVariable = GetVariable(name); if (sharedVariable != null) { sharedVariable.SetValue(value); } } public T FindTask() where T : Task { CheckForSerialization(); return FindTask(mBehaviorSource.RootTask); } private T FindTask(Task task) where T : Task { if (task.GetType().Equals(typeof(T))) { return (T)task; } ParentTask parentTask; if ((parentTask = task as ParentTask) != null) { if (parentTask.Children != null) { for (int i = 0; i < parentTask.Children.Count; ++i) { T foundTask = null; if ((foundTask = FindTask(parentTask.Children[i])) != null) { return foundTask; } } } } return null; } public List FindTasks() where T : Task { CheckForSerialization(); List tasks = new List(); FindTasks(mBehaviorSource.RootTask, ref tasks); return tasks; } private void FindTasks(Task task, ref List taskList) where T : Task { if (typeof(T).IsAssignableFrom(task.GetType())) { taskList.Add((T)task); } ParentTask parentTask; if ((parentTask = task as ParentTask) != null) { if (parentTask.Children != null) { for (int i = 0; i < parentTask.Children.Count; ++i) { FindTasks(parentTask.Children[i], ref taskList); } } } } public Task FindTaskWithName(string taskName) { CheckForSerialization(); return FindTaskWithName(taskName, mBehaviorSource.RootTask); } private void CheckForSerialization() { mBehaviorSource.Owner = this; mBehaviorSource.CheckForSerialization(false); } private Task FindTaskWithName(string taskName, Task task) { if (task.FriendlyName.Equals(taskName)) { return task; } ParentTask parentTask; if ((parentTask = task as ParentTask) != null) { if (parentTask.Children != null) { for (int i = 0; i < parentTask.Children.Count; ++i) { Task foundTask = null; if ((foundTask = FindTaskWithName(taskName, parentTask.Children[i])) != null) { return foundTask; } } } } return null; } public List FindTasksWithName(string taskName) { CheckForSerialization(); List tasks = new List(); FindTasksWithName(taskName, mBehaviorSource.RootTask, ref tasks); return tasks; } private void FindTasksWithName(string taskName, Task task, ref List taskList) { if (task.FriendlyName.Equals(taskName)) { taskList.Add(task); } ParentTask parentTask; if ((parentTask = task as ParentTask) != null) { if (parentTask.Children != null) { for (int i = 0; i < parentTask.Children.Count; ++i) { FindTasksWithName(taskName, parentTask.Children[i], ref taskList); } } } } } }