add
This commit is contained in:
27
Assets/CoolapeFrame/3rd/Hivemind/Scripts/Nodes/ActionBase.cs
Normal file
27
Assets/CoolapeFrame/3rd/Hivemind/Scripts/Nodes/ActionBase.cs
Normal file
@@ -0,0 +1,27 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using Hivemind;
|
||||
|
||||
#if UNITY_EDITOR
|
||||
using UnityEditor;
|
||||
#endif
|
||||
|
||||
public abstract class ActionBase
|
||||
{
|
||||
public abstract Hashtable Serialize ();
|
||||
|
||||
public abstract void Deserialize (Hashtable map);
|
||||
|
||||
public static ActionBase newAction (Hashtable map)
|
||||
{
|
||||
if (map == null) {
|
||||
return null;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
#if UNITY_EDITOR
|
||||
public abstract void DrawInspector (Node node);
|
||||
#endif
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c8d2fae72e25943db8b4cd1c62acb0c3
|
||||
timeCreated: 1501582378
|
||||
licenseType: Pro
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
77
Assets/CoolapeFrame/3rd/Hivemind/Scripts/Nodes/NodeAction.cs
Normal file
77
Assets/CoolapeFrame/3rd/Hivemind/Scripts/Nodes/NodeAction.cs
Normal file
@@ -0,0 +1,77 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using Hivemind;
|
||||
|
||||
#if UNITY_EDITOR
|
||||
using UnityEditor;
|
||||
#endif
|
||||
using Coolape;
|
||||
using System;
|
||||
|
||||
namespace Hivemind
|
||||
{
|
||||
public class NodeAction : Node
|
||||
{
|
||||
public ActionBase action;
|
||||
|
||||
#if UNITY_EDITOR
|
||||
MonoScript _monoScript;
|
||||
public MonoScript monoScript{
|
||||
get {
|
||||
return _monoScript;
|
||||
}
|
||||
set {
|
||||
if(_monoScript != value && value != null) {
|
||||
Type tp = value.GetClass ();
|
||||
action = Activator.CreateInstance (tp) as ActionBase;
|
||||
}
|
||||
_monoScript = value;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
public virtual void OnEnable() {
|
||||
#if UNITY_EDITOR
|
||||
if (monoScript == null) {
|
||||
monoScript = AssetDatabase.LoadAssetAtPath ("Assets/CoolapeFrame/Hivemind/Test/MyAction.cs", typeof(MonoScript)) as MonoScript;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
public override Hashtable Serialize ()
|
||||
{
|
||||
Hashtable m = base.Serialize ();
|
||||
if (action != null) {
|
||||
m ["action"] = action.Serialize ();
|
||||
}
|
||||
#if UNITY_EDITOR
|
||||
if (monoScript != null) {
|
||||
string actionClass = AssetDatabase.GetAssetPath (monoScript);
|
||||
m ["actionClass"] = actionClass;
|
||||
}
|
||||
#endif
|
||||
return m;
|
||||
}
|
||||
|
||||
public override void Deserialize (Hashtable map)
|
||||
{
|
||||
#if UNITY_EDITOR
|
||||
base.Deserialize (map);
|
||||
string actionClass = MapEx.getString (map, "actionClass");
|
||||
if (string.IsNullOrEmpty (actionClass)) {
|
||||
monoScript = null;
|
||||
} else {
|
||||
monoScript = AssetDatabase.LoadAssetAtPath (actionClass, typeof(MonoScript)) as MonoScript;
|
||||
if (monoScript != null) {
|
||||
Type tp = monoScript.GetClass ();
|
||||
action = Activator.CreateInstance (tp) as ActionBase;
|
||||
if (action != null) {
|
||||
action.Deserialize (MapEx.getMap (map, "action"));
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 456f96f74bcae48cf8a2d9317b960e9f
|
||||
timeCreated: 1501551538
|
||||
licenseType: Pro
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
203
Assets/CoolapeFrame/3rd/Hivemind/Scripts/Nodes/NodeBranch.cs
Normal file
203
Assets/CoolapeFrame/3rd/Hivemind/Scripts/Nodes/NodeBranch.cs
Normal file
@@ -0,0 +1,203 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using Hivemind;
|
||||
using Coolape;
|
||||
|
||||
namespace Hivemind
|
||||
{
|
||||
public class NodeBranch : NodeAction
|
||||
{
|
||||
|
||||
// 要结束的节点
|
||||
public List<Node> KillLeftNodes = new List<Node>();
|
||||
public List<Node> KillRightNodes = new List<Node>();
|
||||
|
||||
public virtual void ConnectKillLeftChild(Node child)
|
||||
{
|
||||
if (!KillLeftNodes.Contains(child) && !ChildrenLeft.Contains(child)) {
|
||||
KillLeftNodes.Add(child);
|
||||
child.ParentKillNodes.Add(this);
|
||||
}
|
||||
}
|
||||
|
||||
public virtual void DisconnectKillLeftChild(Node child)
|
||||
{
|
||||
if (KillLeftNodes.Contains(child)) {
|
||||
KillLeftNodes.Remove(child);
|
||||
child.ParentKillNodes.Remove(this);
|
||||
}
|
||||
}
|
||||
|
||||
public virtual void ConnectKillRightChild(Node child)
|
||||
{
|
||||
if (!KillRightNodes.Contains(child) && !ChildrenRight.Contains(child)) {
|
||||
KillRightNodes.Add(child);
|
||||
}
|
||||
}
|
||||
|
||||
public virtual void DisconnectKillRightChild(Node child)
|
||||
{
|
||||
if (KillRightNodes.Contains(child)) {
|
||||
KillRightNodes.Remove(child);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
[SerializeField]
|
||||
public List<Node> _childrenLeft = new List<Node>();
|
||||
[SerializeField]
|
||||
public List<Node> _childrenRight = new List<Node>();
|
||||
|
||||
public virtual List<Node> ChildrenLeft { get { return _childrenLeft; } }
|
||||
|
||||
public virtual List<Node> ChildrenRight { get { return _childrenRight; } }
|
||||
|
||||
public virtual bool inLeft(Node node)
|
||||
{
|
||||
if (node == null)
|
||||
return false;
|
||||
return ChildrenLeft.Contains(node);
|
||||
}
|
||||
|
||||
public virtual bool inRight(Node node)
|
||||
{
|
||||
if (node == null)
|
||||
return false;
|
||||
return ChildrenRight.Contains(node);
|
||||
}
|
||||
|
||||
public virtual void ConnectLeftChild(Node child)
|
||||
{
|
||||
if (child == null)
|
||||
return;
|
||||
if (!ChildrenLeft.Contains(child) && !KillLeftNodes.Contains(child)) {
|
||||
ChildrenLeft.Add(child);
|
||||
child.setParent(this);
|
||||
}
|
||||
}
|
||||
|
||||
public virtual void ConnectRightChild(Node child)
|
||||
{
|
||||
if (child == null)
|
||||
return;
|
||||
if (!ChildrenRight.Contains(child) && !KillRightNodes.Contains(child)) {
|
||||
ChildrenRight.Add(child);
|
||||
child.setParent (this);
|
||||
}
|
||||
}
|
||||
|
||||
public virtual void DisconnectLeftChild(Node child)
|
||||
{
|
||||
if (child == null)
|
||||
return;
|
||||
if (ChildrenLeft.Contains(child)) {
|
||||
ChildrenLeft.Remove(child);
|
||||
child.Unparent(this);
|
||||
}
|
||||
}
|
||||
|
||||
public virtual void DisconnectRightChild(Node child)
|
||||
{
|
||||
if (child == null)
|
||||
return;
|
||||
if (ChildrenRight.Contains(child)) {
|
||||
ChildrenRight.Remove(child);
|
||||
child.Unparent(this);
|
||||
}
|
||||
}
|
||||
|
||||
public override void DisconnectChild(Node child)
|
||||
{
|
||||
if (child == null)
|
||||
return;
|
||||
base.DisconnectChild(child);
|
||||
DisconnectLeftChild(child);
|
||||
DisconnectRightChild(child);
|
||||
}
|
||||
|
||||
public override void Disconnect()
|
||||
{
|
||||
base.Disconnect();
|
||||
|
||||
// Disconnect children
|
||||
for (int i = ChildrenLeft.Count - 1; i >= 0; i--) {
|
||||
DisconnectLeftChild(ChildrenLeft [i]);
|
||||
}
|
||||
for (int i = ChildrenRight.Count - 1; i >= 0; i--) {
|
||||
DisconnectRightChild(ChildrenRight [i]);
|
||||
}
|
||||
|
||||
for (int i = KillLeftNodes.Count - 1; i >= 0; i--) {
|
||||
DisconnectKillLeftChild(KillLeftNodes [i]);
|
||||
}
|
||||
for (int i = KillRightNodes.Count - 1; i >= 0; i--) {
|
||||
DisconnectKillRightChild(KillRightNodes [i]);
|
||||
}
|
||||
}
|
||||
|
||||
public override Hashtable Serialize()
|
||||
{
|
||||
Hashtable map = base.Serialize();
|
||||
ArrayList lefts = new ArrayList();
|
||||
for (int i = 0; i < ChildrenLeft.Count; i++) {
|
||||
lefts.Add(ChildrenLeft [i].id);
|
||||
}
|
||||
map ["ChildrenLeft"] = lefts;
|
||||
|
||||
ArrayList rights = new ArrayList();
|
||||
for (int i = 0; i < ChildrenRight.Count; i++) {
|
||||
rights.Add(ChildrenRight [i].id);
|
||||
}
|
||||
map ["ChildrenRight"] = rights;
|
||||
|
||||
ArrayList killlefts = new ArrayList();
|
||||
for (int i = 0; i < KillLeftNodes.Count; i++) {
|
||||
killlefts.Add(KillLeftNodes [i].id);
|
||||
}
|
||||
map ["KillLeftNodes"] = killlefts;
|
||||
|
||||
ArrayList killrights = new ArrayList();
|
||||
for (int i = 0; i < KillRightNodes.Count; i++) {
|
||||
if (KillRightNodes [i] == null)
|
||||
continue;
|
||||
killrights.Add(KillRightNodes [i].id);
|
||||
}
|
||||
map ["KillRightNodes"] = killrights;
|
||||
|
||||
return map;
|
||||
}
|
||||
|
||||
public override void DeserializeChildren(Hashtable map)
|
||||
{
|
||||
ArrayList children = MapEx.getList(map, "ChildrenLeft");
|
||||
Node node = null;
|
||||
for (int i = 0; i < children.Count; i++) {
|
||||
int id = int.Parse(children [i].ToString());
|
||||
node = behaviorTree.getNodeByID(id);
|
||||
ConnectLeftChild(node);
|
||||
}
|
||||
|
||||
children = MapEx.getList(map, "ChildrenRight");
|
||||
for (int i = 0; i < children.Count; i++) {
|
||||
int id = int.Parse(children [i].ToString());
|
||||
node = behaviorTree.getNodeByID(id);
|
||||
ConnectRightChild(node);
|
||||
}
|
||||
|
||||
children = MapEx.getList(map, "KillLeftNodes");
|
||||
for (int i = 0; i < children.Count; i++) {
|
||||
int id = int.Parse(children [i].ToString());
|
||||
node = behaviorTree.getNodeByID(id);
|
||||
ConnectKillLeftChild(node);
|
||||
}
|
||||
|
||||
children = MapEx.getList(map, "KillRightNodes");
|
||||
for (int i = 0; i < children.Count; i++) {
|
||||
int id = int.Parse(children [i].ToString());
|
||||
node = behaviorTree.getNodeByID(id);
|
||||
ConnectKillRightChild(node);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8296fe6385d2a4398a4edc55236087ed
|
||||
timeCreated: 1501552530
|
||||
licenseType: Pro
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,12 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using Hivemind;
|
||||
using Coolape;
|
||||
|
||||
namespace Hivemind
|
||||
{
|
||||
public class NodeTogether : NodeAction
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0cb0498c85a854d1f92a5b6602aad53e
|
||||
timeCreated: 1502099325
|
||||
licenseType: Pro
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
146
Assets/CoolapeFrame/3rd/Hivemind/Scripts/Nodes/Root.cs
Normal file
146
Assets/CoolapeFrame/3rd/Hivemind/Scripts/Nodes/Root.cs
Normal file
@@ -0,0 +1,146 @@
|
||||
|
||||
// Root ------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
using Hivemind;
|
||||
using UnityEngine;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections;
|
||||
using Coolape;
|
||||
|
||||
#if UNITY_EDITOR
|
||||
using UnityEditor;
|
||||
#endif
|
||||
using System;
|
||||
|
||||
namespace Hivemind
|
||||
{
|
||||
[System.Serializable]
|
||||
public class Root : Node
|
||||
{
|
||||
public int begainIndex = 0;
|
||||
public int maxIndex = 0;
|
||||
|
||||
public ActionBase attr;
|
||||
#if UNITY_EDITOR
|
||||
MonoScript _monoScript;
|
||||
public MonoScript monoScript{
|
||||
get {
|
||||
return _monoScript;
|
||||
}
|
||||
set {
|
||||
if(_monoScript != value && value != null) {
|
||||
Type tp = value.GetClass ();
|
||||
attr = Activator.CreateInstance (tp) as ActionBase;
|
||||
}
|
||||
_monoScript = value;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
public virtual void OnEnable() {
|
||||
#if UNITY_EDITOR
|
||||
if (monoScript == null) {
|
||||
monoScript = AssetDatabase.LoadAssetAtPath ("Assets/CoolapeFrame/Hivemind/Test/MyRoot.cs", typeof(MonoScript)) as MonoScript;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
// Child connections
|
||||
[SerializeField]
|
||||
Node _child;
|
||||
|
||||
public override void ConnectChild (Node child)
|
||||
{
|
||||
if (_child == null) {
|
||||
_child = child;
|
||||
child.setParent(this);
|
||||
} else {
|
||||
throw new System.InvalidOperationException (string.Format ("{0} already has a connected child, cannot connect {1}", this, child));
|
||||
}
|
||||
}
|
||||
|
||||
public override void DisconnectChild (Node child)
|
||||
{
|
||||
if (_child == child) {
|
||||
_child = null;
|
||||
child.Unparent(this);
|
||||
} else {
|
||||
throw new System.InvalidOperationException (string.Format ("{0} is not a child of {1}", child, this));
|
||||
}
|
||||
}
|
||||
|
||||
public override List<Node> Children {
|
||||
get {
|
||||
List<Node> nodeList = new List<Node> ();
|
||||
nodeList.Add (_child);
|
||||
return nodeList;
|
||||
}
|
||||
}
|
||||
|
||||
public override int ChildCount {
|
||||
get { return _child != null ? 1 : 0; }
|
||||
}
|
||||
|
||||
public override bool CanConnectChild {
|
||||
get { return _child == null; }
|
||||
}
|
||||
|
||||
public override bool ContainsChild (Node child)
|
||||
{
|
||||
return _child == child;
|
||||
}
|
||||
|
||||
public override Hashtable Serialize ()
|
||||
{
|
||||
Hashtable map = base.Serialize ();
|
||||
#if UNITY_EDITOR
|
||||
map ["begainIndex"] = begainIndex;
|
||||
map ["maxIndex"] = maxIndex;
|
||||
|
||||
if (attr != null) {
|
||||
map ["attr"] = attr.Serialize ();
|
||||
}
|
||||
|
||||
if (monoScript != null) {
|
||||
string actionClass = AssetDatabase.GetAssetPath (monoScript);
|
||||
map ["actionClass"] = actionClass;
|
||||
}
|
||||
|
||||
#endif
|
||||
return map;
|
||||
}
|
||||
|
||||
public override void Deserialize (Hashtable map)
|
||||
{
|
||||
#if UNITY_EDITOR
|
||||
base.Deserialize (map);
|
||||
begainIndex = MapEx.getInt (map, "begainIndex");
|
||||
maxIndex = MapEx.getInt (map, "maxIndex");
|
||||
|
||||
string actionClass = MapEx.getString (map, "actionClass");
|
||||
if (string.IsNullOrEmpty (actionClass)) {
|
||||
monoScript = null;
|
||||
} else {
|
||||
monoScript = AssetDatabase.LoadAssetAtPath (actionClass, typeof(MonoScript)) as MonoScript;
|
||||
if (monoScript != null) {
|
||||
Type tp = monoScript.GetClass ();
|
||||
attr = Activator.CreateInstance (tp) as ActionBase;
|
||||
if (attr != null) {
|
||||
attr.Deserialize (MapEx.getMap (map, "attr"));
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
// Runtime
|
||||
|
||||
public override Status Tick (GameObject agent, Context context)
|
||||
{
|
||||
Status result = Status.Error;
|
||||
if (_child != null) {
|
||||
result = behaviorTree.Tick (_child, agent, context);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
12
Assets/CoolapeFrame/3rd/Hivemind/Scripts/Nodes/Root.cs.meta
Normal file
12
Assets/CoolapeFrame/3rd/Hivemind/Scripts/Nodes/Root.cs.meta
Normal file
@@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f48fda5512bad4dc3835524f7ed477ba
|
||||
timeCreated: 1501502853
|
||||
licenseType: Pro
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user