mirror of
https://github.com/tym1116/BH3.git
synced 2025-12-18 17:34:45 +01:00
203 lines
5.6 KiB
C#
203 lines
5.6 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Reflection;
|
|
using BehaviorDesigner.Runtime.Tasks;
|
|
using UnityEngine;
|
|
|
|
namespace BehaviorDesigner.Runtime
|
|
{
|
|
public class TaskReferences : MonoBehaviour
|
|
{
|
|
public static void CheckReferences(BehaviorSource behaviorSource)
|
|
{
|
|
if (behaviorSource.RootTask != null)
|
|
{
|
|
CheckReferences(behaviorSource, behaviorSource.RootTask);
|
|
}
|
|
if (behaviorSource.DetachedTasks != null)
|
|
{
|
|
for (int i = 0; i < behaviorSource.DetachedTasks.Count; i++)
|
|
{
|
|
CheckReferences(behaviorSource, behaviorSource.DetachedTasks[i]);
|
|
}
|
|
}
|
|
}
|
|
|
|
private static void CheckReferences(BehaviorSource behaviorSource, Task task)
|
|
{
|
|
FieldInfo[] allFields = TaskUtility.GetAllFields(task.GetType());
|
|
for (int i = 0; i < allFields.Length; i++)
|
|
{
|
|
if (!allFields[i].FieldType.IsArray && (allFields[i].FieldType.Equals(typeof(Task)) || allFields[i].FieldType.IsSubclassOf(typeof(Task))))
|
|
{
|
|
Task task2 = allFields[i].GetValue(task) as Task;
|
|
if (task2 != null)
|
|
{
|
|
Task task3 = FindReferencedTask(behaviorSource, task2);
|
|
if (task3 != null)
|
|
{
|
|
allFields[i].SetValue(task, task3);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (!allFields[i].FieldType.IsArray || (!allFields[i].FieldType.GetElementType().Equals(typeof(Task)) && !allFields[i].FieldType.GetElementType().IsSubclassOf(typeof(Task))))
|
|
{
|
|
continue;
|
|
}
|
|
Task[] array = allFields[i].GetValue(task) as Task[];
|
|
if (array == null)
|
|
{
|
|
continue;
|
|
}
|
|
IList list = Activator.CreateInstance(typeof(List<>).MakeGenericType(allFields[i].FieldType.GetElementType())) as IList;
|
|
for (int j = 0; j < array.Length; j++)
|
|
{
|
|
Task task4 = FindReferencedTask(behaviorSource, array[j]);
|
|
if (task4 != null)
|
|
{
|
|
list.Add(task4);
|
|
}
|
|
}
|
|
Array array2 = Array.CreateInstance(allFields[i].FieldType.GetElementType(), list.Count);
|
|
list.CopyTo(array2, 0);
|
|
allFields[i].SetValue(task, array2);
|
|
}
|
|
}
|
|
if (!task.GetType().IsSubclassOf(typeof(ParentTask)))
|
|
{
|
|
return;
|
|
}
|
|
ParentTask parentTask = task as ParentTask;
|
|
if (parentTask.Children != null)
|
|
{
|
|
for (int k = 0; k < parentTask.Children.Count; k++)
|
|
{
|
|
CheckReferences(behaviorSource, parentTask.Children[k]);
|
|
}
|
|
}
|
|
}
|
|
|
|
private static Task FindReferencedTask(BehaviorSource behaviorSource, Task referencedTask)
|
|
{
|
|
int iD = referencedTask.ID;
|
|
Task result;
|
|
if (behaviorSource.RootTask != null && (result = FindReferencedTask(behaviorSource.RootTask, iD)) != null)
|
|
{
|
|
return result;
|
|
}
|
|
if (behaviorSource.DetachedTasks != null)
|
|
{
|
|
for (int i = 0; i < behaviorSource.DetachedTasks.Count; i++)
|
|
{
|
|
if ((result = FindReferencedTask(behaviorSource.DetachedTasks[i], iD)) != null)
|
|
{
|
|
return result;
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
private static Task FindReferencedTask(Task task, int referencedTaskID)
|
|
{
|
|
if (task.ID == referencedTaskID)
|
|
{
|
|
return task;
|
|
}
|
|
if (task.GetType().IsSubclassOf(typeof(ParentTask)))
|
|
{
|
|
ParentTask parentTask = task as ParentTask;
|
|
if (parentTask.Children != null)
|
|
{
|
|
for (int i = 0; i < parentTask.Children.Count; i++)
|
|
{
|
|
Task result;
|
|
if ((result = FindReferencedTask(parentTask.Children[i], referencedTaskID)) != null)
|
|
{
|
|
return result;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public static void CheckReferences(Behavior behavior, List<Task> taskList)
|
|
{
|
|
for (int i = 0; i < taskList.Count; i++)
|
|
{
|
|
CheckReferences(behavior, taskList[i], taskList);
|
|
}
|
|
}
|
|
|
|
private static void CheckReferences(Behavior behavior, Task task, List<Task> taskList)
|
|
{
|
|
if (TaskUtility.CompareType(task.GetType(), "BehaviorDesigner.Runtime.Tasks.ConditionalEvaluator"))
|
|
{
|
|
FieldInfo field = task.GetType().GetField("conditionalTask");
|
|
object value = field.GetValue(task);
|
|
if (value != null)
|
|
{
|
|
task = value as Task;
|
|
}
|
|
}
|
|
FieldInfo[] allFields = TaskUtility.GetAllFields(task.GetType());
|
|
for (int i = 0; i < allFields.Length; i++)
|
|
{
|
|
if (!allFields[i].FieldType.IsArray && (allFields[i].FieldType.Equals(typeof(Task)) || allFields[i].FieldType.IsSubclassOf(typeof(Task))))
|
|
{
|
|
Task task2 = allFields[i].GetValue(task) as Task;
|
|
if (task2 != null && !task2.Owner.Equals(behavior))
|
|
{
|
|
Task task3 = FindReferencedTask(task2, taskList);
|
|
if (task3 != null)
|
|
{
|
|
allFields[i].SetValue(task, task3);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (!allFields[i].FieldType.IsArray || (!allFields[i].FieldType.GetElementType().Equals(typeof(Task)) && !allFields[i].FieldType.GetElementType().IsSubclassOf(typeof(Task))))
|
|
{
|
|
continue;
|
|
}
|
|
Task[] array = allFields[i].GetValue(task) as Task[];
|
|
if (array == null)
|
|
{
|
|
continue;
|
|
}
|
|
IList list = Activator.CreateInstance(typeof(List<>).MakeGenericType(allFields[i].FieldType.GetElementType())) as IList;
|
|
for (int j = 0; j < array.Length; j++)
|
|
{
|
|
Task task4 = FindReferencedTask(array[j], taskList);
|
|
if (task4 != null)
|
|
{
|
|
list.Add(task4);
|
|
}
|
|
}
|
|
Array array2 = Array.CreateInstance(allFields[i].FieldType.GetElementType(), list.Count);
|
|
list.CopyTo(array2, 0);
|
|
allFields[i].SetValue(task, array2);
|
|
}
|
|
}
|
|
}
|
|
|
|
private static Task FindReferencedTask(Task referencedTask, List<Task> taskList)
|
|
{
|
|
int referenceID = referencedTask.ReferenceID;
|
|
for (int i = 0; i < taskList.Count; i++)
|
|
{
|
|
if (taskList[i].ReferenceID == referenceID)
|
|
{
|
|
return taskList[i];
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
}
|
|
}
|