First setup

This commit is contained in:
Pascal Serrarens 2026-01-21 15:17:25 +01:00
parent 14436cbfba
commit 4b72e6c712
13 changed files with 268 additions and 114 deletions

View File

@ -10,6 +10,7 @@ public class Cluster : ScriptableObject, INucleus {
[SerializeReference] [SerializeReference]
public List<IReceptor> nuclei = new(); public List<IReceptor> nuclei = new();
public List<Cluster> subClusters = new();
public INucleus output => this.nuclei[0] as INucleus; public INucleus output => this.nuclei[0] as INucleus;
@ -33,6 +34,18 @@ public class Cluster : ScriptableObject, INucleus {
public NucleusArray array { get; set; } public NucleusArray array { get; set; }
public List<INucleus> receivers {
get { return this.output.receivers; }
set { this.output.receivers = value; }
}
public List<Cluster> clusterReceivers {
get { return this.output.clusterReceivers; }
set { this.output.clusterReceivers = clusterReceivers; }
}
public IEnumerable<INucleus> allReceivers {
get => output.allReceivers;
}
public INucleus Clone() { public INucleus Clone() {
Cluster clone = CreateInstance<Cluster>(); Cluster clone = CreateInstance<Cluster>();
// Lots to add here... // Lots to add here...
@ -48,19 +61,27 @@ public class Cluster : ScriptableObject, INucleus {
new Neuron(this, "Output"); // Every cluster should have at least 1 neuron new Neuron(this, "Output"); // Every cluster should have at least 1 neuron
} }
public void AddReceiver(INucleus receiver) { public void AddReceiver(INucleus receivingNucleus) {
output.AddReceiver(receiver); //output.AddReceiver(receiver);
this.output.receivers.Add(receivingNucleus);
receivingNucleus.AddClusterSynapse(this);
}
public void AddClusterReceiver(Cluster clusterReceiver) {
this.output.clusterReceivers.Add(clusterReceiver);
clusterReceiver.AddClusterSynapse(this);
} }
public void RemoveReceiver(INucleus receiver) { public void RemoveReceiver(INucleus receiver) {
output.RemoveReceiver(receiver); output.RemoveReceiver(receiver);
} }
public List<INucleus> receivers {
get => output.receivers;
}
public Synapse AddSynapse(IReceptor sender) { public Synapse AddSynapse(IReceptor sender) {
Synapse synapse = new(sender, 1.0f); Synapse synapse = new(sender);
synapses.Add(synapse);
return synapse;
}
public Synapse AddClusterSynapse(Cluster sender) {
Synapse synapse = new(sender);
synapses.Add(synapse); synapses.Add(synapse);
return synapse; return synapse;
} }
@ -89,9 +110,9 @@ public class Cluster : ScriptableObject, INucleus {
} }
nucleus.synapses.RemoveAll(synapse => visitedSynapses.Contains(synapse) == false); nucleus.synapses.RemoveAll(synapse => visitedSynapses.Contains(synapse) == false);
} }
if (nucleus.receivers != null) { if (nucleus.allReceivers != null) {
HashSet<INucleus> visitedReceivers = new(); HashSet<INucleus> visitedReceivers = new();
foreach (INucleus receiver in nucleus.receivers) { foreach (INucleus receiver in nucleus.allReceivers) {
if (receiver != null && receiver != null) { if (receiver != null && receiver != null) {
visitedReceivers.Add(receiver); visitedReceivers.Add(receiver);
visitedNuclei.Add(receiver); visitedNuclei.Add(receiver);

View File

@ -1,7 +1,4 @@
using System.Collections.Generic; using System.Collections.Generic;
using UnityEngine;
using Unity.Burst;
using Unity.Collections;
using Unity.Mathematics; using Unity.Mathematics;
public interface INucleus : IReceptor { public interface INucleus : IReceptor {
@ -14,6 +11,7 @@ public interface INucleus : IReceptor {
// Senders // Senders
public List<Synapse> synapses { get; } public List<Synapse> synapses { get; }
public Synapse AddSynapse(IReceptor sender); public Synapse AddSynapse(IReceptor sender);
public Synapse AddClusterSynapse(Cluster clusterSender);
public NucleusArray array { get; set; } public NucleusArray array { get; set; }
@ -35,8 +33,12 @@ public interface IReceptor {
public string name { get; set; } public string name { get; set; }
// Receivers // Receivers
public List<INucleus> receivers { get; } public List<INucleus> receivers { get; set; }
public List<Cluster> clusterReceivers { get; set; }
public IEnumerable<INucleus> allReceivers { get; }
public void AddReceiver(INucleus receiver); public void AddReceiver(INucleus receiver);
public void AddClusterReceiver(Cluster clusterReceiver);
public void RemoveReceiver(INucleus receiverNucleus); public void RemoveReceiver(INucleus receiverNucleus);
#endregion static #endregion static

View File

@ -0,0 +1,60 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 60a957541c24c57e78018c202ebb1d9b, type: 3}
m_Name: Identity
m_EditorClassIdentifier: Assembly-CSharp::Cluster
nuclei:
- rid: 2243601242842202169
references:
version: 2
RefIds:
- rid: 2243601242842202169
type: {class: Neuron, ns: , asm: Assembly-CSharp}
data:
_name: Output
_synapses: []
_receivers: []
_array:
rid: 2243601242842202170
_curvePreset: 0
curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 1
tangentMode: 0
weightedMode: 0
inWeight: 0
outWeight: 0
- serializedVersion: 3
time: 1000
value: 1000
inSlope: 1
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
curveMax: 1
average: 0
- rid: 2243601242842202170
type: {class: NucleusArray, ns: , asm: Assembly-CSharp}
data:
nuclei:
- rid: 2243601242842202169
name: Output

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 5f4d2ea0d0115b3549f8e9aa5e669163
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using UnityEngine; using UnityEngine;
using Unity.Mathematics; using Unity.Mathematics;
using static Unity.Mathematics.math; using static Unity.Mathematics.math;
@ -20,7 +21,25 @@ public class Neuron : INucleus {
[SerializeReference] [SerializeReference]
private List<INucleus> _receivers = new(); private List<INucleus> _receivers = new();
public List<INucleus> receivers => _receivers; public List<INucleus> receivers {
get { return _receivers; }
set { _receivers = value; }
}
private List<Cluster> _clusterReceivers = new();
public List<Cluster> clusterReceivers {
get { return _clusterReceivers; }
set { _clusterReceivers = value; }
}
public IEnumerable<INucleus> allReceivers { //=> _receivers.Concat(_clusterReceivers);
get {
if (_receivers == null)
return _clusterReceivers;
else if (_clusterReceivers == null)
return _receivers;
else
return _receivers.Concat(_clusterReceivers);
}
}
[SerializeReference] [SerializeReference]
private NucleusArray _array; private NucleusArray _array;
@ -133,28 +152,32 @@ public class Neuron : INucleus {
Synapse clonedSynapse = clone.AddSynapse(synapse.nucleus); Synapse clonedSynapse = clone.AddSynapse(synapse.nucleus);
clonedSynapse.weight = synapse.weight; clonedSynapse.weight = synapse.weight;
} }
foreach (INucleus receiver in this.receivers) { foreach (INucleus receiver in this.allReceivers) {
clone.AddReceiver(receiver); clone.AddReceiver(receiver);
} }
return clone; return clone;
} }
public virtual void AddReceiver(INucleus receivingNucleus) { public virtual void AddReceiver(INucleus receivingNucleus) {
this.receivers.Add(receivingNucleus); this._receivers.Add(receivingNucleus);
receivingNucleus.AddSynapse(this); receivingNucleus.AddSynapse(this);
} }
public void AddClusterReceiver(Cluster receivingCluster) {
this._clusterReceivers.Add(receivingCluster);
receivingCluster.AddSynapse(this);
}
public void RemoveReceiver(INucleus receiverNucleus) { public void RemoveReceiver(INucleus receiverNucleus) {
this.receivers.RemoveAll(receiver => receiver == receiverNucleus); this._receivers.RemoveAll(receiver => receiver == receiverNucleus);
receiverNucleus.synapses.RemoveAll(synapse => synapse.nucleus == this); receiverNucleus.synapses.RemoveAll(synapse => synapse.nucleus == this);
} }
public static void Delete(INucleus nucleus) { public static void Delete(INucleus nucleus) {
foreach (Synapse synapse in nucleus.synapses) { foreach (Synapse synapse in nucleus.synapses) {
if (synapse.nucleus is Neuron synapse_nucleus) { if (synapse.nucleus is Neuron synapse_nucleus) {
if (synapse_nucleus.receivers.Count > 1) { if (synapse_nucleus._receivers.Count > 1) {
// there is another nucleus feeding into this input nucleus // there is another nucleus feeding into this input nucleus
synapse_nucleus.receivers.RemoveAll(r => r == nucleus); synapse_nucleus._receivers.RemoveAll(r => r == nucleus);
} }
else { else {
// No other links, delete it. // No other links, delete it.
@ -162,7 +185,7 @@ public class Neuron : INucleus {
} }
} }
} }
foreach (INucleus receiver in nucleus.receivers) { foreach (INucleus receiver in nucleus.allReceivers) {
if (receiver != null && receiver.synapses != null) if (receiver != null && receiver.synapses != null)
receiver.synapses.RemoveAll(s => s.nucleus == nucleus); receiver.synapses.RemoveAll(s => s.nucleus == nucleus);
} }
@ -174,7 +197,12 @@ public class Neuron : INucleus {
} }
public Synapse AddSynapse(IReceptor sendingNucleus) { public Synapse AddSynapse(IReceptor sendingNucleus) {
Synapse synapse = new(sendingNucleus, 1.0f); Synapse synapse = new(sendingNucleus);
this.synapses.Add(synapse);
return synapse;
}
public Synapse AddClusterSynapse(Cluster sendingCluster) {
Synapse synapse = new(sendingCluster);
this.synapses.Add(synapse); this.synapses.Add(synapse);
return synapse; return synapse;
} }
@ -222,7 +250,7 @@ public class Neuron : INucleus {
// } // }
this.outputValue = result; this.outputValue = result;
foreach (INucleus receiver in this.receivers) foreach (INucleus receiver in this.allReceivers)
receiver.UpdateState(); receiver.UpdateState();
} }

View File

@ -5,6 +5,7 @@ using UnityEngine;
public class NucleusArray { public class NucleusArray {
[SerializeReference] [SerializeReference]
public INucleus[] nuclei; public INucleus[] nuclei;
public Cluster[] clusters;
public string name; public string name;
public NucleusArray(INucleus nucleus) { public NucleusArray(INucleus nucleus) {

View File

@ -1,4 +1,5 @@
using System; using System;
using System.Linq;
using System.Collections.Generic; using System.Collections.Generic;
using UnityEngine; using UnityEngine;
using Unity.Mathematics; using Unity.Mathematics;
@ -25,17 +26,30 @@ public class Receptor : IReceptor {
[SerializeReference] [SerializeReference]
private List<INucleus> _receivers = new(); private List<INucleus> _receivers = new();
public List<INucleus> receivers => _receivers; public List<INucleus> receivers {
get { return _receivers; }
set { _receivers = value; }
}
private List<Cluster> _clusterReceivers = new();
public List<Cluster> clusterReceivers {
get { return _clusterReceivers; }
set { _clusterReceivers = value; }
}
public IEnumerable<INucleus> allReceivers => _receivers.Concat(_clusterReceivers);
protected int[] thingIds; // every receiver can handle a thing with this id protected int[] thingIds; // every receiver can handle a thing with this id
public virtual void AddReceiver(INucleus receivingNucleus) { public virtual void AddReceiver(INucleus receivingNucleus) {
this.receivers.Add(receivingNucleus); this._receivers.Add(receivingNucleus);
receivingNucleus.AddSynapse(this); receivingNucleus.AddSynapse(this);
} }
public void AddClusterReceiver(Cluster receivingCluster) {
this._clusterReceivers.Add(receivingCluster);
receivingCluster.AddSynapse(this);
}
public void RemoveReceiver(INucleus receiverNucleus) { public void RemoveReceiver(INucleus receiverNucleus) {
this.receivers.RemoveAll(receiver => receiver == receiverNucleus); this._receivers.RemoveAll(receiver => receiver == receiverNucleus);
receiverNucleus.synapses.RemoveAll(synapse => synapse.nucleus == this); receiverNucleus.synapses.RemoveAll(synapse => synapse.nucleus == this);
} }
@ -88,7 +102,7 @@ public class Receptor : IReceptor {
receptor.AddReceiver(nucleus); receptor.AddReceiver(nucleus);
} }
} }
if (receptor.receivers.Count == 0) if (receptor._receivers.Count == 0)
return null; return null;
else else
return receptor; return receptor;
@ -97,12 +111,12 @@ public class Receptor : IReceptor {
public virtual void ProcessStimulus(int thingId, Vector3 newLocalPositionVector, string thingName = null) { public virtual void ProcessStimulus(int thingId, Vector3 newLocalPositionVector, string thingName = null) {
this.localPosition = newLocalPositionVector; this.localPosition = newLocalPositionVector;
thingIds ??= new int[this.receivers.Count]; thingIds ??= new int[this._receivers.Count];
int receiverIx = 0; int receiverIx = 0;
INucleus selectedReceiver = null; INucleus selectedReceiver = null;
int selectedReceiverIx = 0; int selectedReceiverIx = 0;
foreach (INucleus receiver in this.receivers) { foreach (INucleus receiver in this.allReceivers) {
// selectedReceiver = receiver; // selectedReceiver = receiver;
// receiverIx++; // receiverIx++;

View File

@ -4,12 +4,16 @@ using UnityEditor;
[Serializable] [Serializable]
public class Synapse { public class Synapse {
//[NonSerialized] // Support access to cluster of basic nucleus
[SerializeReference] public IReceptor nucleus => clusterNucleus != null ? clusterNucleus : basicNucleus;
public IReceptor nucleus;
[SerializeReference] [SerializeReference]
private IReceptor basicNucleus;
// The Cluster is a ScriptableObject and can therefore not be serialized using [SerializeReference]
private Cluster clusterNucleus;
public Cluster cluster; public Cluster cluster;
//public int nucleusId;
public float weight; public float weight;
public enum CurvePresets { public enum CurvePresets {
@ -19,55 +23,16 @@ public class Synapse {
Reciprocal, Reciprocal,
Custom Custom
} }
// public CurvePresets curvePreset;
// public AnimationCurve curve;
public float curveMax = 1.0f; public float curveMax = 1.0f;
public Synapse(IReceptor nucleus, float weight) { public Synapse(IReceptor nucleus, float weight = 1.0f) {
this.nucleus = nucleus; this.basicNucleus = nucleus;
//this.nucleusId = nucleus.id; this.weight = weight;
}
public Synapse(Cluster cluster, float weight = 1.0f) {
this.clusterNucleus = cluster;
this.weight = weight; this.weight = weight;
} }
// public void Rebuild(NanoBrain brain) {
// // if (brain == null) {
// // return;
// // }
// // foreach (Nucleus nucleus in brain.nuclei) {
// // if (nucleus.id == this.nucleusId) {
// // this.nucleus = nucleus;
// // return;
// // }
// // }
// // foreach (Perceptoid perceptoid in brain.perceptei) {
// // if (perceptoid.id == this.nucleusId) {
// // this.nucleus = perceptoid;
// // return;
// // }
// // }
// // Debug.LogError($"Synapse deserialization error: could not find nucleus with id {this.nucleusId}");
// }
// public AnimationCurve GenerateCurve() {
// switch (this.curvePreset) {
// case CurvePresets.Linear:
// this.curveMax = this.weight;
// return Presets.Linear(this.weight);
// case CurvePresets.Power:
// this.curveMax = this.weight;
// return Presets.Power(2.0f, this.weight);
// case CurvePresets.Sqrt:
// this.curveMax = this.weight;
// return Presets.Power(0.5f, this.weight);
// case CurvePresets.Reciprocal:
// this.curveMax = 1 / 0.01f * this.weight;
// return Presets.Reciprocal(this.weight);
// default:
// this.curveMax = weight;
// return AnimationCurve.Constant(0, 1, weight);
// }
// }
public static class Presets { public static class Presets {
private const int samples = 32; private const int samples = 32;

View File

@ -3,15 +3,13 @@ using UnityEngine;
using System; using System;
using System.Linq; using System.Linq;
public class BrainPickerWindow : EditorWindow public class BrainPickerWindow : EditorWindow {
{
private Vector2 scroll; private Vector2 scroll;
private Cluster[] items = new Cluster[0]; private Cluster[] items = new Cluster[0];
private Action<Cluster> onPicked; private Action<Cluster> onPicked;
private string search = ""; private string search = "";
public static void ShowPicker(Action<Cluster> onPicked, string title = "Select NanoBrain") public static void ShowPicker(Action<Cluster> onPicked, string title = "Select Cluster") {
{
var w = CreateInstance<BrainPickerWindow>(); var w = CreateInstance<BrainPickerWindow>();
w.titleContent = new GUIContent(title); w.titleContent = new GUIContent(title);
w.minSize = new Vector2(360, 320); w.minSize = new Vector2(360, 320);
@ -22,9 +20,8 @@ public class BrainPickerWindow : EditorWindow
private void OnEnable() => RefreshList(); private void OnEnable() => RefreshList();
private void RefreshList() private void RefreshList() {
{ var guids = AssetDatabase.FindAssets("t:Cluster");
var guids = AssetDatabase.FindAssets("t:NanoBrain");
items = guids items = guids
.Select(g => AssetDatabase.LoadAssetAtPath<Cluster>(AssetDatabase.GUIDToAssetPath(g))) .Select(g => AssetDatabase.LoadAssetAtPath<Cluster>(AssetDatabase.GUIDToAssetPath(g)))
.Where(b => b != null) .Where(b => b != null)
@ -32,11 +29,10 @@ public class BrainPickerWindow : EditorWindow
.ToArray(); .ToArray();
} }
private void OnGUI() private void OnGUI() {
{
EditorGUILayout.Space(); EditorGUILayout.Space();
EditorGUILayout.BeginHorizontal(); EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("Choose NanoBrain:", EditorStyles.boldLabel); EditorGUILayout.LabelField("Choose Cluster:", EditorStyles.boldLabel);
if (GUILayout.Button("Refresh", GUILayout.Width(80))) RefreshList(); if (GUILayout.Button("Refresh", GUILayout.Width(80))) RefreshList();
GUILayout.FlexibleSpace(); GUILayout.FlexibleSpace();
EditorGUILayout.EndHorizontal(); EditorGUILayout.EndHorizontal();
@ -46,15 +42,13 @@ public class BrainPickerWindow : EditorWindow
EditorGUILayout.Space(); EditorGUILayout.Space();
scroll = EditorGUILayout.BeginScrollView(scroll); scroll = EditorGUILayout.BeginScrollView(scroll);
foreach (var it in items) foreach (var it in items) {
{
if (!string.IsNullOrEmpty(search) && it.name.IndexOf(search, StringComparison.OrdinalIgnoreCase) < 0) if (!string.IsNullOrEmpty(search) && it.name.IndexOf(search, StringComparison.OrdinalIgnoreCase) < 0)
continue; continue;
EditorGUILayout.BeginHorizontal(); EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField(EditorGUIUtility.ObjectContent(it, typeof(Cluster)), GUILayout.Height(20)); EditorGUILayout.LabelField(EditorGUIUtility.ObjectContent(it, typeof(Cluster)), GUILayout.Height(20));
if (GUILayout.Button("Select", GUILayout.Width(70))) if (GUILayout.Button("Select", GUILayout.Width(70))) {
{
onPicked?.Invoke(it); onPicked?.Invoke(it);
Close(); Close();
return; return;

View File

@ -156,8 +156,8 @@ public class ClusterInspector : Editor {
return; return;
NeuroidLayer currentLayer = new() { ix = layerIx }; NeuroidLayer currentLayer = new() { ix = layerIx };
if (selectedNucleus.receivers != null) { if (selectedNucleus.allReceivers != null) {
foreach (INucleus receiver in selectedNucleus.receivers) { foreach (INucleus receiver in selectedNucleus.allReceivers) {
INucleus outputNeuroid = receiver; INucleus outputNeuroid = receiver;
if (outputNeuroid != null) { if (outputNeuroid != null) {
AddToLayer(currentLayer, outputNeuroid); AddToLayer(currentLayer, outputNeuroid);
@ -201,19 +201,6 @@ public class ClusterInspector : Editor {
} }
// void OnMouseDown(MouseDownEvent e) {
// if (e.button == 2) { draggingCanvas = true; lastMouse = e.mousePosition; e.StopPropagation(); }
// }
// void OnMouseMove(MouseMoveEvent e) {
// if (draggingCanvas) {
// var delta = e.mousePosition - lastMouse;
// pan += delta;
// //content.style.left = pan.x;
// //content.style.top = pan.y;
// lastMouse = e.mousePosition;
// }
// }
// void OnMouseUp(MouseUpEvent e) { if (e.button == 2) draggingCanvas = false; }
public void OnIMGUI() { public void OnIMGUI() {
if (currentNucleus == null) if (currentNucleus == null)
@ -285,12 +272,12 @@ public class ClusterInspector : Editor {
} }
private void DrawReceivers(INucleus nucleus, Vector3 parentPos, float size) { private void DrawReceivers(INucleus nucleus, Vector3 parentPos, float size) {
int nodeCount = nucleus.receivers.Count; int nodeCount = nucleus.allReceivers.Count();
// Determine the maximum value in this layer // Determine the maximum value in this layer
// This is used to 'scale' the output value colors of the nuclei // This is used to 'scale' the output value colors of the nuclei
float maxValue = 0; float maxValue = 0;
foreach (INucleus receiver in nucleus.receivers) { foreach (INucleus receiver in nucleus.allReceivers) {
if (receiver is Neuron neuroid) { if (receiver is Neuron neuroid) {
float value = length(neuroid.outputValue); float value = length(neuroid.outputValue);
if (value > maxValue) if (value > maxValue)
@ -303,7 +290,7 @@ public class ClusterInspector : Editor {
float margin = 10 + spacing / 2; float margin = 10 + spacing / 2;
int row = 0; int row = 0;
foreach (INucleus receiver in nucleus.receivers) { foreach (INucleus receiver in nucleus.allReceivers) {
INucleus receiverNucleus = receiver; INucleus receiverNucleus = receiver;
if (receiverNucleus == null) if (receiverNucleus == null)
continue; continue;
@ -414,9 +401,14 @@ public class ClusterInspector : Editor {
} }
else { else {
style.alignment = TextAnchor.UpperCenter; style.alignment = TextAnchor.UpperCenter;
Vector3 labelPos = position - Vector3.down * (size + 0.2f); // below disc along up axis Vector3 labelPos = position - Vector3.down * (size + 10f); // below disc along up axis
Handles.Label(labelPos, nucleus.name, style); Handles.Label(labelPos, nucleus.name, style);
} }
if (nucleus is Cluster cluster) {
Handles.color = Color.white;
Handles.DrawWireDisc(position, Vector3.forward, size + 10);
}
} }
else { else {
style.alignment = TextAnchor.UpperCenter; style.alignment = TextAnchor.UpperCenter;
@ -592,7 +584,7 @@ public class ClusterInspector : Editor {
return; return;
if (nucleus.cluster != null) if (nucleus.cluster != null)
this.currentNucleus = nucleus.cluster.output; this.currentNucleus = nucleus.cluster.output;
foreach (INucleus receiver in nucleus.receivers) { foreach (INucleus receiver in nucleus.allReceivers) {
if (receiver != null) { if (receiver != null) {
this.currentNucleus = receiver; this.currentNucleus = receiver;
break; break;
@ -606,9 +598,9 @@ public class ClusterInspector : Editor {
BrainPickerWindow.ShowPicker(brain => OnClusterPicked(nucleus, brain), "Select Cluster"); BrainPickerWindow.ShowPicker(brain => OnClusterPicked(nucleus, brain), "Select Cluster");
} }
private void OnClusterPicked(INucleus nucleus, Cluster brain) { private void OnClusterPicked(INucleus nucleus, Cluster cluster) {
Cluster brainInstance = Instantiate(brain); Cluster clusterInstance = Instantiate(cluster);
brainInstance.AddReceiver(nucleus); clusterInstance.AddReceiver(nucleus);
} }
// Connect to another nucleus in the same cluster // Connect to another nucleus in the same cluster

View File

@ -0,0 +1,62 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 60a957541c24c57e78018c202ebb1d9b, type: 3}
m_Name: New Cluster
m_EditorClassIdentifier: Assembly-CSharp::Cluster
nuclei:
- rid: 2243601242842202217
subClusters: []
references:
version: 2
RefIds:
- rid: 2243601242842202217
type: {class: Neuron, ns: , asm: Assembly-CSharp}
data:
_name: Output
_synapses: []
_receivers: []
_array:
rid: 2243601242842202218
_curvePreset: 0
curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 1
tangentMode: 0
weightedMode: 0
inWeight: 0
outWeight: 0
- serializedVersion: 3
time: 1000
value: 1000
inSlope: 1
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
curveMax: 1
average: 0
- rid: 2243601242842202218
type: {class: NucleusArray, ns: , asm: Assembly-CSharp}
data:
nuclei:
- rid: 2243601242842202217
clusters: []
name: Output

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 4160a4557d16d7c03833982ab779d28e
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@ -32,7 +32,6 @@ public class Boid : MonoBehaviour {
// boidVelocityReceptor = Receptor.GetReceptor(nanoBrain.brain, BoidVelocityType); // boidVelocityReceptor = Receptor.GetReceptor(nanoBrain.brain, BoidVelocityType);
boundaryReceptor = Receptor.CreateReceptor(nanoBrain.brain, "Avoidance"); boundaryReceptor = Receptor.CreateReceptor(nanoBrain.brain, "Avoidance");
boundaryReceptor.name = "Boundary"; boundaryReceptor.name = "Boundary";
boundaryReceptor.receivers[0].synapses[0].weight = -1;
boidReceptor = Receptor.CreateReceptor(nanoBrain.brain, "Boid"); boidReceptor = Receptor.CreateReceptor(nanoBrain.brain, "Boid");
boidVelocityReceptor = Receptor.CreateReceptor(nanoBrain.brain, "Alignment"); boidVelocityReceptor = Receptor.CreateReceptor(nanoBrain.brain, "Alignment");