(re)added nucleus arrays
This commit is contained in:
parent
90350b625b
commit
e477ce4814
@ -62,7 +62,6 @@
|
|||||||
<Compile Include="Assets/NanoBrain/LinearAlgebra/src/Vector2Float.cs" />
|
<Compile Include="Assets/NanoBrain/LinearAlgebra/src/Vector2Float.cs" />
|
||||||
<Compile Include="Assets/NanoBrain/LinearAlgebra/test/SwingTwistTest.cs" />
|
<Compile Include="Assets/NanoBrain/LinearAlgebra/test/SwingTwistTest.cs" />
|
||||||
<Compile Include="Assets/NanoBrain/LinearAlgebra/src/Vector3Int.cs" />
|
<Compile Include="Assets/NanoBrain/LinearAlgebra/src/Vector3Int.cs" />
|
||||||
<Compile Include="Assets/NanoBrain/PercepteiArray.cs" />
|
|
||||||
<Compile Include="Assets/NanoBrain/LinearAlgebra/src/Vector3Float.cs" />
|
<Compile Include="Assets/NanoBrain/LinearAlgebra/src/Vector3Float.cs" />
|
||||||
<Compile Include="Assets/NanoBrain/Receptor.cs" />
|
<Compile Include="Assets/NanoBrain/Receptor.cs" />
|
||||||
<Compile Include="Assets/NanoBrain/LinearAlgebra/src/Matrix.cs" />
|
<Compile Include="Assets/NanoBrain/LinearAlgebra/src/Matrix.cs" />
|
||||||
@ -83,6 +82,7 @@
|
|||||||
<Compile Include="Assets/NanoBrain/LinearAlgebra/test/Vector3IntTest.cs" />
|
<Compile Include="Assets/NanoBrain/LinearAlgebra/test/Vector3IntTest.cs" />
|
||||||
<Compile Include="Assets/NanoBrain/Neuroid.cs" />
|
<Compile Include="Assets/NanoBrain/Neuroid.cs" />
|
||||||
<Compile Include="Assets/NanoBrain/LinearAlgebra/src/Angle.cs" />
|
<Compile Include="Assets/NanoBrain/LinearAlgebra/src/Angle.cs" />
|
||||||
|
<Compile Include="Assets/NanoBrain/NucleusArray.cs" />
|
||||||
<Compile Include="Assets/NanoBrain/LinearAlgebra/src/Float.cs" />
|
<Compile Include="Assets/NanoBrain/LinearAlgebra/src/Float.cs" />
|
||||||
<Compile Include="Assets/NanoBrain/Nucleus.cs" />
|
<Compile Include="Assets/NanoBrain/Nucleus.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|||||||
@ -21,6 +21,13 @@ public class Cluster : ScriptableObject, INucleus {
|
|||||||
private readonly List<Synapse> _synapses = new();
|
private readonly List<Synapse> _synapses = new();
|
||||||
public List<Synapse> synapses => _synapses;
|
public List<Synapse> synapses => _synapses;
|
||||||
|
|
||||||
|
public NucleusArray array { get; set; }
|
||||||
|
|
||||||
|
public INucleus Clone() {
|
||||||
|
Cluster clone = CreateInstance<Cluster>();
|
||||||
|
// Lots to add here...
|
||||||
|
return clone;
|
||||||
|
}
|
||||||
|
|
||||||
// Call this function to ensure that there is at least one nucleus
|
// Call this function to ensure that there is at least one nucleus
|
||||||
// This is an invariant and should be ensured before the nucleus is used
|
// This is an invariant and should be ensured before the nucleus is used
|
||||||
@ -42,9 +49,10 @@ public class Cluster : ScriptableObject, INucleus {
|
|||||||
get => output.receivers;
|
get => output.receivers;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddSynapse(IReceptor sender) {
|
public Synapse AddSynapse(IReceptor sender) {
|
||||||
Synapse synapse = new(sender, 1.0f);
|
Synapse synapse = new(sender, 1.0f);
|
||||||
synapses.Add(synapse);
|
synapses.Add(synapse);
|
||||||
|
return synapse;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void GarbageCollection() {
|
public void GarbageCollection() {
|
||||||
|
|||||||
@ -10,7 +10,9 @@ public interface INucleus : IReceptor {
|
|||||||
|
|
||||||
// Senders
|
// Senders
|
||||||
public List<Synapse> synapses { get; }
|
public List<Synapse> synapses { get; }
|
||||||
public void AddSynapse(IReceptor sender);
|
public Synapse AddSynapse(IReceptor sender);
|
||||||
|
|
||||||
|
public NucleusArray array { get; set; }
|
||||||
|
|
||||||
#endregion static struct
|
#endregion static struct
|
||||||
|
|
||||||
@ -21,6 +23,8 @@ public interface INucleus : IReceptor {
|
|||||||
public void IncreaseAge();
|
public void IncreaseAge();
|
||||||
|
|
||||||
#endregion dynamic state
|
#endregion dynamic state
|
||||||
|
|
||||||
|
public INucleus Clone();
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface IReceptor {
|
public interface IReceptor {
|
||||||
|
|||||||
@ -16,6 +16,28 @@ public class Neuroid : Nucleus {
|
|||||||
|
|
||||||
public Neuroid(string name) : base(name) { }
|
public Neuroid(string name) : base(name) { }
|
||||||
|
|
||||||
|
public override INucleus Clone() {
|
||||||
|
Neuroid clone = new(this.name) {
|
||||||
|
cluster = this.cluster,
|
||||||
|
array = this.array,
|
||||||
|
curve = this.curve,
|
||||||
|
curvePreset = this.curvePreset,
|
||||||
|
curveMax = this.curveMax,
|
||||||
|
average = this.average
|
||||||
|
};
|
||||||
|
if (clone.cluster != null)
|
||||||
|
clone.cluster.nuclei.Add(clone);
|
||||||
|
|
||||||
|
foreach (Synapse synapse in this.synapses) {
|
||||||
|
Synapse clonedSynapse = clone.AddSynapse(synapse.nucleus);
|
||||||
|
clonedSynapse.weight = synapse.weight;
|
||||||
|
}
|
||||||
|
foreach (INucleus receiver in this.receivers) {
|
||||||
|
clone.AddReceiver(receiver);
|
||||||
|
}
|
||||||
|
return clone;
|
||||||
|
}
|
||||||
|
|
||||||
public void SetWeight(Neuroid input, float weight) {
|
public void SetWeight(Neuroid input, float weight) {
|
||||||
this.SetWeight((Nucleus)input, weight);
|
this.SetWeight((Nucleus)input, weight);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,7 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEditor;
|
|
||||||
|
|
||||||
[Serializable]
|
[Serializable]
|
||||||
public class Nucleus : INucleus {
|
public class Nucleus : INucleus {
|
||||||
@ -23,6 +22,7 @@ public class Nucleus : INucleus {
|
|||||||
private List<INucleus> _receivers = new();
|
private List<INucleus> _receivers = new();
|
||||||
public List<INucleus> receivers => _receivers;
|
public List<INucleus> receivers => _receivers;
|
||||||
|
|
||||||
|
public NucleusArray array { get; set; }
|
||||||
#region Serialization
|
#region Serialization
|
||||||
|
|
||||||
[SerializeField]
|
[SerializeField]
|
||||||
@ -67,31 +67,31 @@ public class Nucleus : INucleus {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void Rebuild(NanoBrain brain) {
|
// public virtual void Rebuild(NanoBrain brain) {
|
||||||
if (this.synapses != null) {
|
// if (this.synapses != null) {
|
||||||
foreach (Synapse synapse in synapses)
|
// foreach (Synapse synapse in synapses)
|
||||||
synapse.Rebuild(brain);
|
// synapse.Rebuild(brain);
|
||||||
}
|
// }
|
||||||
// foreach (INucleus receiver in receivers.ToArray()) {
|
// // foreach (INucleus receiver in receivers.ToArray()) {
|
||||||
// if (receiver.Rebuild(brain) == false) {
|
// // if (receiver.Rebuild(brain) == false) {
|
||||||
// Debug.Log("Rebuilding failed, removing receiver.");
|
// // Debug.Log("Rebuilding failed, removing receiver.");
|
||||||
// receivers.Remove(receiver);
|
// // receivers.Remove(receiver);
|
||||||
// }
|
// // }
|
||||||
// }
|
// // }
|
||||||
}
|
// }
|
||||||
|
|
||||||
public static Nucleus RebuildType(NanoBrain brain, Nucleus nucleus) {
|
// public static Nucleus RebuildType(NanoBrain brain, Nucleus nucleus) {
|
||||||
if (string.IsNullOrEmpty(nucleus.nucleusType) == false) {
|
// if (string.IsNullOrEmpty(nucleus.nucleusType) == false) {
|
||||||
Type nucleusType = Type.GetType(nucleus.nucleusType);
|
// Type nucleusType = Type.GetType(nucleus.nucleusType);
|
||||||
if (nucleusType != null) {
|
// if (nucleusType != null) {
|
||||||
object[] args = new object[] { brain, nucleus.name };
|
// object[] args = new object[] { brain, nucleus.name };
|
||||||
Nucleus rebuiltNucleus = (Nucleus)Activator.CreateInstance(nucleusType, args);
|
// Nucleus rebuiltNucleus = (Nucleus)Activator.CreateInstance(nucleusType, args);
|
||||||
rebuiltNucleus.Deserialize(nucleus);
|
// rebuiltNucleus.Deserialize(nucleus);
|
||||||
return rebuiltNucleus;
|
// return rebuiltNucleus;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
return nucleus;
|
// return nucleus;
|
||||||
}
|
// }
|
||||||
|
|
||||||
public virtual void Deserialize(Nucleus nucleus) { }
|
public virtual void Deserialize(Nucleus nucleus) { }
|
||||||
|
|
||||||
@ -133,10 +133,29 @@ public class Nucleus : INucleus {
|
|||||||
this.id = this.GetHashCode();
|
this.id = this.GetHashCode();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public virtual INucleus Clone() {
|
||||||
|
Nucleus clone = new(this.name) {
|
||||||
|
cluster = this.cluster,
|
||||||
|
array = this.array,
|
||||||
|
curve = this.curve,
|
||||||
|
curvePreset = this.curvePreset,
|
||||||
|
curveMax = this.curveMax
|
||||||
|
};
|
||||||
|
if (clone.cluster != null)
|
||||||
|
clone.cluster.nuclei.Add(clone);
|
||||||
|
|
||||||
|
foreach (Synapse synapse in this.synapses) {
|
||||||
|
Synapse clonedSynapse = clone.AddSynapse(synapse.nucleus);
|
||||||
|
clonedSynapse.weight = synapse.weight;
|
||||||
|
}
|
||||||
|
foreach (INucleus receiver in this.receivers) {
|
||||||
|
clone.AddReceiver(receiver);
|
||||||
|
}
|
||||||
|
return clone;
|
||||||
|
}
|
||||||
|
|
||||||
public virtual void AddReceiver(INucleus receivingNucleus) {
|
public virtual void AddReceiver(INucleus receivingNucleus) {
|
||||||
// this.receivers.Add(new Receiver(receivingNucleus));
|
|
||||||
this.receivers.Add(receivingNucleus);
|
this.receivers.Add(receivingNucleus);
|
||||||
//receivingNucleus.SetWeight(this, 1.0f);
|
|
||||||
receivingNucleus.AddSynapse(this);
|
receivingNucleus.AddSynapse(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -182,9 +201,10 @@ public class Nucleus : INucleus {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddSynapse(IReceptor sendingNucleus) {
|
public Synapse AddSynapse(IReceptor sendingNucleus) {
|
||||||
Synapse synapse = new(sendingNucleus, 1.0f);
|
Synapse synapse = new(sendingNucleus, 1.0f);
|
||||||
this.synapses.Add(synapse);
|
this.synapses.Add(synapse);
|
||||||
|
return synapse;
|
||||||
}
|
}
|
||||||
public void SetWeight(Nucleus nucleus, float weight) {
|
public void SetWeight(Nucleus nucleus, float weight) {
|
||||||
foreach (Synapse synapse in synapses) {
|
foreach (Synapse synapse in synapses) {
|
||||||
@ -211,32 +231,4 @@ public class Nucleus : INucleus {
|
|||||||
receiver.UpdateState();
|
receiver.UpdateState();
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// [Serializable]
|
|
||||||
// public class Receiver {
|
|
||||||
// [NonSerialized]
|
|
||||||
// public INucleus nucleus;
|
|
||||||
// //public int nucleusId;
|
|
||||||
|
|
||||||
// public Receiver(INucleus nucleus) {
|
|
||||||
// this.nucleus = nucleus;
|
|
||||||
// //this.nucleusId = nucleus.id;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// public bool Rebuild(NanoBrain brain) {
|
|
||||||
// if (brain == null) {
|
|
||||||
// return false;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// // Use SerializedReference instead?
|
|
||||||
// // foreach (Nucleus nucleus in brain.nuclei) {
|
|
||||||
// // if (nucleus.id == this.nucleusId) {
|
|
||||||
// // this.nucleus = nucleus;
|
|
||||||
// // return true;
|
|
||||||
// // }
|
|
||||||
// // }
|
|
||||||
// //Debug.LogWarning($"Receiver deserialization error: could not find nucleus with id {this.nucleusId}");
|
|
||||||
// return false;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
45
Assets/NanoBrain/NucleusArray.cs
Normal file
45
Assets/NanoBrain/NucleusArray.cs
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
[System.Serializable]
|
||||||
|
public class NucleusArray {
|
||||||
|
[SerializeReference]
|
||||||
|
public INucleus[] nuclei;
|
||||||
|
public string name;
|
||||||
|
|
||||||
|
public NucleusArray(INucleus nucleus) {
|
||||||
|
this.name = nucleus.name;
|
||||||
|
this.nuclei = new INucleus[1];
|
||||||
|
this.nuclei[0] = nucleus;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddNucleus() {
|
||||||
|
if (this.nuclei.Length == 0) {
|
||||||
|
Debug.LogError("Empty perceptoid array, cannot add");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int newLength = this.nuclei.Length + 1;
|
||||||
|
INucleus[] newArray = new INucleus[newLength];
|
||||||
|
|
||||||
|
for (int i = 0; i < this.nuclei.Length; i++)
|
||||||
|
newArray[i] = this.nuclei[i];
|
||||||
|
newArray[newLength - 1] = this.nuclei[0].Clone();
|
||||||
|
|
||||||
|
this.nuclei = newArray;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RemoveNucleus() {
|
||||||
|
int newLength = this.nuclei.Length - 1;
|
||||||
|
if (newLength == 0) {
|
||||||
|
Debug.LogWarning("Perceptoid array cannot be empty");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
INucleus[] newPerceptei = new INucleus[newLength];
|
||||||
|
for (int i = 0; i < newLength; i++)
|
||||||
|
newPerceptei[i++] = this.nuclei[i];
|
||||||
|
// Delete the last perception
|
||||||
|
Nucleus.Delete(this.nuclei[newLength]);
|
||||||
|
|
||||||
|
this.nuclei = newPerceptei;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,61 +0,0 @@
|
|||||||
using UnityEngine;
|
|
||||||
|
|
||||||
[System.Serializable]
|
|
||||||
public class PercepteiArray {
|
|
||||||
[SerializeReference]
|
|
||||||
public Perceptoid[] perceptei;
|
|
||||||
public string name;
|
|
||||||
|
|
||||||
// public PercepteiArray(NanoBrain brain, int thingType, string baseName, uint count) {
|
|
||||||
// this.name = baseName;
|
|
||||||
// this.perceptei = new Perceptoid[count];
|
|
||||||
// for (uint i = 0; i < count; i++) {
|
|
||||||
// this.perceptei[i] = new Perceptoid(brain, thingType, $"{baseName}[{i}]") {
|
|
||||||
// array = this
|
|
||||||
// };
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
public PercepteiArray(Perceptoid perceptoid) {
|
|
||||||
this.name = perceptoid.baseName;
|
|
||||||
this.perceptei = new Perceptoid[1];
|
|
||||||
this.perceptei[0] = perceptoid;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void AddPerceptoid() {
|
|
||||||
if (this.perceptei.Length == 0) {
|
|
||||||
Debug.LogError("Empty perceptoid array, cannot add");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
int newLength = this.perceptei.Length + 1;
|
|
||||||
Perceptoid[] newPerceptei = new Perceptoid[newLength];
|
|
||||||
|
|
||||||
for (int i = 0; i < this.perceptei.Length; i++)
|
|
||||||
newPerceptei[i] = this.perceptei[i];
|
|
||||||
newPerceptei[newLength - 1] = new Perceptoid(this);
|
|
||||||
|
|
||||||
this.perceptei = newPerceptei;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void RemovePerceptoid() {
|
|
||||||
int newLength = this.perceptei.Length - 1;
|
|
||||||
if (newLength == 0) {
|
|
||||||
Debug.LogWarning("Perceptoid array cannot be empty");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
Perceptoid[] newPerceptei = new Perceptoid[newLength];
|
|
||||||
for (int i = 0; i < newLength; i++)
|
|
||||||
newPerceptei[i++] = this.perceptei[i];
|
|
||||||
// Delete the last perception
|
|
||||||
Nucleus.Delete(this.perceptei[newLength]);
|
|
||||||
|
|
||||||
this.perceptei = newPerceptei;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// public class ArrayPerceptoid : Perceptoid {
|
|
||||||
// public PercepteiArray array;
|
|
||||||
|
|
||||||
// public ArrayPerceptoid(NanoBrain brain, int thingType, string name = "sensor") : base(brain, thingType, name) {
|
|
||||||
// }
|
|
||||||
|
|
||||||
// }
|
|
||||||
@ -1,3 +1,4 @@
|
|||||||
|
/*
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
|
||||||
[System.Serializable]
|
[System.Serializable]
|
||||||
@ -101,3 +102,4 @@ public class Perceptoid : Neuroid {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
@ -10,18 +10,12 @@ public class Receptor : IReceptor {
|
|||||||
set => _name = value;
|
set => _name = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Cluster cluster;
|
|
||||||
//public INucleus nucleus;
|
|
||||||
|
|
||||||
//[SerializeField]
|
|
||||||
[SerializeReference]
|
[SerializeReference]
|
||||||
private List<INucleus> _receivers = new();
|
private List<INucleus> _receivers = new();
|
||||||
public List<INucleus> receivers => _receivers;
|
public List<INucleus> receivers => _receivers;
|
||||||
|
|
||||||
public virtual void AddReceiver(INucleus receivingNucleus) {
|
public virtual void AddReceiver(INucleus receivingNucleus) {
|
||||||
//this.receivers.Add(new Receiver(receivingNucleus));
|
|
||||||
this.receivers.Add(receivingNucleus);
|
this.receivers.Add(receivingNucleus);
|
||||||
//receivingNucleus.SetWeight(this, 1.0f);
|
|
||||||
receivingNucleus.AddSynapse(this);
|
receivingNucleus.AddSynapse(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -35,18 +29,18 @@ public class Receptor : IReceptor {
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// The list of perceptoid which can process stimuli from this receptor
|
/// The list of perceptoid which can process stimuli from this receptor
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public List<Perceptoid> perceptei = new();
|
//public List<Perceptoid> perceptei = new();
|
||||||
|
|
||||||
private int _thingType = 0;
|
// private int _thingType = 0;
|
||||||
public int thingType {
|
// public int thingType {
|
||||||
get { return _thingType; }
|
// get { return _thingType; }
|
||||||
set {
|
// set {
|
||||||
_thingType = value;
|
// _thingType = value;
|
||||||
foreach (Perceptoid perceptoid in perceptei) {
|
// foreach (Perceptoid perceptoid in perceptei) {
|
||||||
perceptoid.thingType = _thingType;
|
// perceptoid.thingType = _thingType;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
public Vector3 localPosition;
|
public Vector3 localPosition;
|
||||||
public float distanceResolution = 0.1f;
|
public float distanceResolution = 0.1f;
|
||||||
public float directionResolution = 5;
|
public float directionResolution = 5;
|
||||||
@ -59,26 +53,24 @@ public class Receptor : IReceptor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public Receptor(NanoBrain brain, int thingType) {
|
// public Receptor(NanoBrain brain, int thingType) {
|
||||||
this.thingType = thingType;
|
// this.thingType = thingType;
|
||||||
//this.perceptei.Add(perceptoid);
|
// brain.receptors.Add(this);
|
||||||
brain.receptors.Add(this);
|
// }
|
||||||
}
|
|
||||||
|
|
||||||
public Receptor(Cluster cluster, INucleus nucleus) {
|
public Receptor(Cluster cluster, INucleus nucleus) {
|
||||||
this.cluster = cluster;
|
//this.cluster = cluster;
|
||||||
//nucleus.AddSynapse(this);
|
|
||||||
this.AddReceiver(nucleus);
|
this.AddReceiver(nucleus);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Receptor GetReceptor(NanoBrain brain, int thingType) {
|
// public static Receptor GetReceptor(NanoBrain brain, int thingType) {
|
||||||
foreach (Receptor receptor in brain.receptors) {
|
// foreach (Receptor receptor in brain.receptors) {
|
||||||
if (thingType == 0 || receptor.thingType == thingType)
|
// if (thingType == 0 || receptor.thingType == thingType)
|
||||||
return receptor;
|
// return receptor;
|
||||||
}
|
// }
|
||||||
Receptor newReceptor = new(brain, thingType);
|
// Receptor newReceptor = new(brain, thingType);
|
||||||
return newReceptor;
|
// return newReceptor;
|
||||||
}
|
// }
|
||||||
|
|
||||||
public static Receptor CreateReceptor(Cluster cluster, string nucleusName) {
|
public static Receptor CreateReceptor(Cluster cluster, string nucleusName) {
|
||||||
if (cluster == null)
|
if (cluster == null)
|
||||||
|
|||||||
@ -29,25 +29,25 @@ public class Synapse {
|
|||||||
this.weight = weight;
|
this.weight = weight;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Rebuild(NanoBrain brain) {
|
// public void Rebuild(NanoBrain brain) {
|
||||||
// if (brain == null) {
|
// // if (brain == null) {
|
||||||
// return;
|
// // return;
|
||||||
// }
|
// // }
|
||||||
|
|
||||||
// foreach (Nucleus nucleus in brain.nuclei) {
|
// // foreach (Nucleus nucleus in brain.nuclei) {
|
||||||
// if (nucleus.id == this.nucleusId) {
|
// // if (nucleus.id == this.nucleusId) {
|
||||||
// this.nucleus = nucleus;
|
// // this.nucleus = nucleus;
|
||||||
// return;
|
// // return;
|
||||||
// }
|
// // }
|
||||||
// }
|
// // }
|
||||||
// foreach (Perceptoid perceptoid in brain.perceptei) {
|
// // foreach (Perceptoid perceptoid in brain.perceptei) {
|
||||||
// if (perceptoid.id == this.nucleusId) {
|
// // if (perceptoid.id == this.nucleusId) {
|
||||||
// this.nucleus = perceptoid;
|
// // this.nucleus = perceptoid;
|
||||||
// return;
|
// // return;
|
||||||
// }
|
// // }
|
||||||
// }
|
// // }
|
||||||
// Debug.LogError($"Synapse deserialization error: could not find nucleus with id {this.nucleusId}");
|
// // Debug.LogError($"Synapse deserialization error: could not find nucleus with id {this.nucleusId}");
|
||||||
}
|
// }
|
||||||
|
|
||||||
// public AnimationCurve GenerateCurve() {
|
// public AnimationCurve GenerateCurve() {
|
||||||
// switch (this.curvePreset) {
|
// switch (this.curvePreset) {
|
||||||
|
|||||||
@ -6,11 +6,11 @@ using System.Linq;
|
|||||||
public class BrainPickerWindow : EditorWindow
|
public class BrainPickerWindow : EditorWindow
|
||||||
{
|
{
|
||||||
private Vector2 scroll;
|
private Vector2 scroll;
|
||||||
private NanoBrain[] items = new NanoBrain[0];
|
private Cluster[] items = new Cluster[0];
|
||||||
private Action<NanoBrain> onPicked;
|
private Action<Cluster> onPicked;
|
||||||
private string search = "";
|
private string search = "";
|
||||||
|
|
||||||
public static void ShowPicker(Action<NanoBrain> onPicked, string title = "Select NanoBrain")
|
public static void ShowPicker(Action<Cluster> onPicked, string title = "Select NanoBrain")
|
||||||
{
|
{
|
||||||
var w = CreateInstance<BrainPickerWindow>();
|
var w = CreateInstance<BrainPickerWindow>();
|
||||||
w.titleContent = new GUIContent(title);
|
w.titleContent = new GUIContent(title);
|
||||||
@ -26,7 +26,7 @@ public class BrainPickerWindow : EditorWindow
|
|||||||
{
|
{
|
||||||
var guids = AssetDatabase.FindAssets("t:NanoBrain");
|
var guids = AssetDatabase.FindAssets("t:NanoBrain");
|
||||||
items = guids
|
items = guids
|
||||||
.Select(g => AssetDatabase.LoadAssetAtPath<NanoBrain>(AssetDatabase.GUIDToAssetPath(g)))
|
.Select(g => AssetDatabase.LoadAssetAtPath<Cluster>(AssetDatabase.GUIDToAssetPath(g)))
|
||||||
.Where(b => b != null)
|
.Where(b => b != null)
|
||||||
.OrderBy(b => b.name)
|
.OrderBy(b => b.name)
|
||||||
.ToArray();
|
.ToArray();
|
||||||
@ -52,7 +52,7 @@ public class BrainPickerWindow : EditorWindow
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
EditorGUILayout.BeginHorizontal();
|
EditorGUILayout.BeginHorizontal();
|
||||||
EditorGUILayout.LabelField(EditorGUIUtility.ObjectContent(it, typeof(NanoBrain)), 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);
|
||||||
|
|||||||
@ -271,25 +271,14 @@ public class ClusterInspector : Editor {
|
|||||||
float margin = 10 + spacing / 2;
|
float margin = 10 + spacing / 2;
|
||||||
|
|
||||||
int row = 0;
|
int row = 0;
|
||||||
List<PercepteiArray> drawnArrays = new();
|
List<NucleusArray> drawnArrays = new();
|
||||||
foreach (Synapse synapse in nucleus.synapses) {
|
foreach (Synapse synapse in nucleus.synapses) {
|
||||||
Vector3 pos = new(250, margin + row * spacing, 0.0f);
|
Vector3 pos = new(250, margin + row * spacing, 0.0f);
|
||||||
Handles.color = Color.white;
|
Handles.color = Color.white;
|
||||||
Handles.DrawLine(parentPos, pos);
|
Handles.DrawLine(parentPos, pos);
|
||||||
// if (synapse.nucleus is Perceptoid perceptoid && perceptoid.array != null) {
|
|
||||||
// // if (drawnArrays.Contains(perceptoid.array))
|
|
||||||
// // // We already drawn this array
|
|
||||||
// // continue;
|
|
||||||
|
|
||||||
// drawnArrays.Add(perceptoid.array);
|
|
||||||
// DrawArray(perceptoid.array, pos, size);
|
|
||||||
// }
|
|
||||||
// else {
|
|
||||||
|
|
||||||
if (synapse.nucleus != null)
|
if (synapse.nucleus != null)
|
||||||
DrawNucleus(synapse.nucleus, pos, maxValue, size);
|
DrawNucleus(synapse.nucleus, pos, maxValue, size);
|
||||||
row++;
|
row++;
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -315,12 +304,12 @@ public class ClusterInspector : Editor {
|
|||||||
normal = { textColor = Color.white },
|
normal = { textColor = Color.white },
|
||||||
fontStyle = FontStyle.Bold,
|
fontStyle = FontStyle.Bold,
|
||||||
};
|
};
|
||||||
if (nucleus is Perceptoid perceptoid) {
|
if (nucleus is Nucleus perceptoid) {
|
||||||
if (perceptoid.array == null || perceptoid.array.perceptei == null || perceptoid.array.perceptei.Length == 0)
|
if (perceptoid.array == null || perceptoid.array.nuclei == null || perceptoid.array.nuclei.Length == 0)
|
||||||
perceptoid.array = new PercepteiArray(perceptoid);
|
perceptoid.array = new NucleusArray(perceptoid);
|
||||||
|
|
||||||
if (perceptoid.array.perceptei.Length > 1) {
|
if (perceptoid.array.nuclei.Length > 1) {
|
||||||
Handles.Label(labelPosition, perceptoid.array.perceptei.Length.ToString(), style);
|
Handles.Label(labelPosition, perceptoid.array.nuclei.Length.ToString(), style);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -344,46 +333,15 @@ public class ClusterInspector : Editor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DrawArray(PercepteiArray array, Vector3 position, float size) {
|
|
||||||
Vector3 offset = new(size / 4, size / 4, 0);
|
|
||||||
Handles.color = Color.black;
|
|
||||||
Handles.DrawSolidDisc(position, Vector3.forward, size);
|
|
||||||
|
|
||||||
GUIStyle style = new(EditorStyles.label) {
|
|
||||||
alignment = TextAnchor.UpperCenter,
|
|
||||||
normal = { textColor = Color.white },
|
|
||||||
fontStyle = FontStyle.Bold
|
|
||||||
};
|
|
||||||
Handles.Label(position, array.perceptei.Length.ToString(), style);
|
|
||||||
Vector3 labelPos = position - Vector3.down * (size + 0.2f); // below disc along up axis
|
|
||||||
Handles.Label(labelPos, array.name, style);
|
|
||||||
|
|
||||||
// To do: add HandleClick (see above) to expand the array
|
|
||||||
}
|
|
||||||
|
|
||||||
private void HandleMouseHover(IReceptor nucleus, Rect rect) {
|
private void HandleMouseHover(IReceptor nucleus, Rect rect) {
|
||||||
GUIContent tooltip;
|
GUIContent tooltip;
|
||||||
if (nucleus is Perceptoid perceptoid) {
|
if (nucleus is INucleus n) {
|
||||||
if (perceptoid.receptor != null) {
|
|
||||||
tooltip = new(
|
|
||||||
$"{perceptoid.name}" +
|
|
||||||
$"\nType {perceptoid.receptor.thingType}" +
|
|
||||||
$" Thing {perceptoid.thingId}" +
|
|
||||||
$"\nValue: {nucleus.outputValue}");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
tooltip = new(
|
|
||||||
$"{perceptoid.name}" +
|
|
||||||
$"\nThing {perceptoid.thingId}" +
|
|
||||||
$"\nValue: {nucleus.outputValue}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (nucleus is INucleus n) {
|
|
||||||
tooltip = new(
|
tooltip = new(
|
||||||
$"{nucleus.name}" +
|
$"{nucleus.name}" +
|
||||||
$"\nsynapse count {n.synapses.Count}" +
|
$"\nsynapse count {n.synapses.Count}" +
|
||||||
$"\nValue: {nucleus.outputValue}");
|
$"\nValue: {nucleus.outputValue}");
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
tooltip = new(
|
tooltip = new(
|
||||||
$"{nucleus.name}" +
|
$"{nucleus.name}" +
|
||||||
$"\nValue: {nucleus.outputValue}");
|
$"\nValue: {nucleus.outputValue}");
|
||||||
@ -400,8 +358,8 @@ public class ClusterInspector : Editor {
|
|||||||
|
|
||||||
private void HandleClicked(IReceptor nucleus) {
|
private void HandleClicked(IReceptor nucleus) {
|
||||||
if (nucleus is INucleus n) {
|
if (nucleus is INucleus n) {
|
||||||
this.currentNucleus = n;
|
this.currentNucleus = n;
|
||||||
BuildLayers();
|
BuildLayers();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -424,29 +382,30 @@ public class ClusterInspector : Editor {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
this.currentNucleus.name = EditorGUILayout.TextField(this.currentNucleus.name);
|
this.currentNucleus.name = EditorGUILayout.TextField(this.currentNucleus.name);
|
||||||
if (this.currentNucleus is Perceptoid perceptoid) {
|
if (this.currentNucleus is Nucleus perceptoid) {
|
||||||
perceptoid.receptor.thingType = EditorGUILayout.IntField("Thing Type", perceptoid.receptor.thingType);
|
// perceptoid.receptor.thingType = EditorGUILayout.IntField("Thing Type", perceptoid.receptor.thingType);
|
||||||
|
|
||||||
if (perceptoid.array == null || perceptoid.array.perceptei == null || perceptoid.array.perceptei.Length == 0)
|
if (perceptoid.array == null || perceptoid.array.nuclei == null || perceptoid.array.nuclei.Length == 0)
|
||||||
perceptoid.array = new PercepteiArray(perceptoid);
|
perceptoid.array = new NucleusArray(perceptoid);
|
||||||
EditorGUILayout.BeginHorizontal();
|
EditorGUILayout.BeginHorizontal();
|
||||||
EditorGUILayout.IntField("Array size", perceptoid.array.perceptei.Length);
|
EditorGUILayout.IntField("Array size", perceptoid.array.nuclei.Length);
|
||||||
if (GUILayout.Button("Add"))
|
if (GUILayout.Button("Add"))
|
||||||
perceptoid.array.AddPerceptoid();
|
perceptoid.array.AddNucleus();
|
||||||
if (GUILayout.Button("Del"))
|
if (GUILayout.Button("Del"))
|
||||||
perceptoid.array.RemovePerceptoid();
|
perceptoid.array.RemoveNucleus();
|
||||||
EditorGUILayout.EndHorizontal();
|
|
||||||
}
|
|
||||||
else if (this.currentNucleus is Nucleus neuroid) {
|
|
||||||
EditorGUILayout.BeginHorizontal();
|
|
||||||
EditorGUILayout.LabelField("Activation Curve", GUILayout.Width(150));
|
|
||||||
if (neuroid.curveMax > 0)
|
|
||||||
EditorGUILayout.CurveField(neuroid.curve, Color.cyan, new Rect(0, 0, 1, neuroid.curveMax));
|
|
||||||
else
|
|
||||||
EditorGUILayout.CurveField(neuroid.curve, Color.cyan, new Rect(0, neuroid.curveMax, 1, -neuroid.curveMax));
|
|
||||||
neuroid.curvePreset = (Neuroid.CurvePresets)EditorGUILayout.EnumPopup(neuroid.curvePreset, GUILayout.Width(100));
|
|
||||||
EditorGUILayout.EndHorizontal();
|
EditorGUILayout.EndHorizontal();
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
if (this.currentNucleus is Nucleus neuroid) {
|
||||||
|
EditorGUILayout.BeginHorizontal();
|
||||||
|
EditorGUILayout.LabelField("Activation Curve", GUILayout.Width(150));
|
||||||
|
if (neuroid.curveMax > 0)
|
||||||
|
EditorGUILayout.CurveField(neuroid.curve, Color.cyan, new Rect(0, 0, 1, neuroid.curveMax));
|
||||||
|
else
|
||||||
|
EditorGUILayout.CurveField(neuroid.curve, Color.cyan, new Rect(0, neuroid.curveMax, 1, -neuroid.curveMax));
|
||||||
|
neuroid.curvePreset = (Neuroid.CurvePresets)EditorGUILayout.EnumPopup(neuroid.curvePreset, GUILayout.Width(100));
|
||||||
|
EditorGUILayout.EndHorizontal();
|
||||||
|
}
|
||||||
|
|
||||||
if (Application.isPlaying)
|
if (Application.isPlaying)
|
||||||
EditorGUILayout.FloatField("Output", this.currentNucleus.outputValue.magnitude);
|
EditorGUILayout.FloatField("Output", this.currentNucleus.outputValue.magnitude);
|
||||||
@ -465,14 +424,6 @@ public class ClusterInspector : Editor {
|
|||||||
else {
|
else {
|
||||||
EditorGUILayout.BeginHorizontal();
|
EditorGUILayout.BeginHorizontal();
|
||||||
EditorGUILayout.LabelField(synapse.nucleus.name);
|
EditorGUILayout.LabelField(synapse.nucleus.name);
|
||||||
// if (synapse.nucleus is Perceptoid perceptoid) {
|
|
||||||
// if (perceptoid.array == null || perceptoid.array.perceptei == null || perceptoid.array.perceptei.Length == 0) {
|
|
||||||
// perceptoid.array = new PercepteiArray(perceptoid);
|
|
||||||
// }
|
|
||||||
// EditorGUILayout.IntField(perceptoid.array.perceptei.Length);
|
|
||||||
// if (GUILayout.Button("Add"))
|
|
||||||
// perceptoid.array.AddPerceptoid();
|
|
||||||
// }
|
|
||||||
if (GUILayout.Button("Disconnect"))
|
if (GUILayout.Button("Disconnect"))
|
||||||
synapse.nucleus.RemoveReceiver(this.currentNucleus);
|
synapse.nucleus.RemoveReceiver(this.currentNucleus);
|
||||||
EditorGUILayout.EndHorizontal();
|
EditorGUILayout.EndHorizontal();
|
||||||
@ -491,8 +442,6 @@ public class ClusterInspector : Editor {
|
|||||||
ConnectNucleus(cluster, this.currentNucleus);
|
ConnectNucleus(cluster, this.currentNucleus);
|
||||||
if (GUILayout.Button("Add Input Neuron"))
|
if (GUILayout.Button("Add Input Neuron"))
|
||||||
AddInputNeuron(this.currentNucleus);
|
AddInputNeuron(this.currentNucleus);
|
||||||
// if (GUILayout.Button("Add Input Perceptoid"))
|
|
||||||
// AddPerceptoid(this.currentNucleus);
|
|
||||||
if (GUILayout.Button("Add Input Cluster"))
|
if (GUILayout.Button("Add Input Cluster"))
|
||||||
AddCluster(this.currentNucleus);
|
AddCluster(this.currentNucleus);
|
||||||
|
|
||||||
@ -501,7 +450,6 @@ public class ClusterInspector : Editor {
|
|||||||
if (GUILayout.Button("Delete this neuron"))
|
if (GUILayout.Button("Delete this neuron"))
|
||||||
DeleteNeuron(this.currentNucleus);
|
DeleteNeuron(this.currentNucleus);
|
||||||
|
|
||||||
//DisconnectNucleus(this.currentNucleus);
|
|
||||||
|
|
||||||
if (this.gameObject != null) {
|
if (this.gameObject != null) {
|
||||||
Vector3 worldVector = this.gameObject.transform.TransformVector(this.currentNucleus.outputValue);
|
Vector3 worldVector = this.gameObject.transform.TransformVector(this.currentNucleus.outputValue);
|
||||||
@ -534,19 +482,12 @@ public class ClusterInspector : Editor {
|
|||||||
BuildLayers();
|
BuildLayers();
|
||||||
}
|
}
|
||||||
|
|
||||||
// protected virtual void AddPerceptoid(INucleus nucleus) {
|
|
||||||
// Perceptoid newPerceptoid = new(this.brain, 0, "New Perceptoid");
|
|
||||||
// newPerceptoid.AddReceiver(nucleus);
|
|
||||||
// this.currentNucleus = newPerceptoid;
|
|
||||||
// BuildLayers();
|
|
||||||
// }
|
|
||||||
|
|
||||||
protected virtual void AddCluster(INucleus nucleus) {
|
protected virtual void AddCluster(INucleus nucleus) {
|
||||||
BrainPickerWindow.ShowPicker(brain => OnClusterPicked(nucleus, brain), "Select Cluster");
|
BrainPickerWindow.ShowPicker(brain => OnClusterPicked(nucleus, brain), "Select Cluster");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnClusterPicked(INucleus nucleus, NanoBrain brain) {
|
private void OnClusterPicked(INucleus nucleus, Cluster brain) {
|
||||||
NanoBrain brainInstance = Instantiate(brain);
|
Cluster brainInstance = Instantiate(brain);
|
||||||
brainInstance.AddReceiver(nucleus);
|
brainInstance.AddReceiver(nucleus);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -555,7 +496,7 @@ public class ClusterInspector : Editor {
|
|||||||
if (cluster == null)
|
if (cluster == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
IEnumerable<string> synapseNuclei = this.currentNucleus.synapses.Select(synapse => synapse.nucleus != null ? synapse.nucleus.name: "");
|
IEnumerable<string> synapseNuclei = this.currentNucleus.synapses.Select(synapse => synapse.nucleus != null ? synapse.nucleus.name : "");
|
||||||
//IEnumerable<string> perceptei = this.currentNucleus.brain.perceptei.Select(i => i.name).Except(synapseNuclei);
|
//IEnumerable<string> perceptei = this.currentNucleus.brain.perceptei.Select(i => i.name).Except(synapseNuclei);
|
||||||
IEnumerable<string> nuclei = cluster.nuclei.Select(i => i.name).Except(synapseNuclei);
|
IEnumerable<string> nuclei = cluster.nuclei.Select(i => i.name).Except(synapseNuclei);
|
||||||
//string[] names = perceptei.Concat(nuclei).ToArray();
|
//string[] names = perceptei.Concat(nuclei).ToArray();
|
||||||
@ -572,7 +513,7 @@ public class ClusterInspector : Editor {
|
|||||||
// n.AddReceiver(this.currentNucleus);
|
// n.AddReceiver(this.currentNucleus);
|
||||||
// }
|
// }
|
||||||
INucleus n = cluster.nuclei[selectedIndex];
|
INucleus n = cluster.nuclei[selectedIndex];
|
||||||
n.AddReceiver(this.currentNucleus);
|
n.AddReceiver(this.currentNucleus);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,3 +1,4 @@
|
|||||||
|
/*
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using UnityEditor;
|
using UnityEditor;
|
||||||
@ -364,7 +365,7 @@ public class NanoBrainInspector : Editor {
|
|||||||
if (perceptoid.receptor != null) {
|
if (perceptoid.receptor != null) {
|
||||||
tooltip = new(
|
tooltip = new(
|
||||||
$"{perceptoid.name}" +
|
$"{perceptoid.name}" +
|
||||||
$"\nType {perceptoid.receptor.thingType}" +
|
// $"\nType {perceptoid.receptor.thingType}" +
|
||||||
$" Thing {perceptoid.thingId}" +
|
$" Thing {perceptoid.thingId}" +
|
||||||
$"\nValue: {nucleus.outputValue}");
|
$"\nValue: {nucleus.outputValue}");
|
||||||
}
|
}
|
||||||
@ -423,7 +424,7 @@ public class NanoBrainInspector : Editor {
|
|||||||
|
|
||||||
this.currentNucleus.name = EditorGUILayout.TextField(this.currentNucleus.name);
|
this.currentNucleus.name = EditorGUILayout.TextField(this.currentNucleus.name);
|
||||||
if (this.currentNucleus is Perceptoid perceptoid) {
|
if (this.currentNucleus is Perceptoid perceptoid) {
|
||||||
perceptoid.receptor.thingType = EditorGUILayout.IntField("Thing Type", perceptoid.receptor.thingType);
|
// perceptoid.receptor.thingType = EditorGUILayout.IntField("Thing Type", perceptoid.receptor.thingType);
|
||||||
|
|
||||||
if (perceptoid.array == null || perceptoid.array.perceptei == null || perceptoid.array.perceptei.Length == 0)
|
if (perceptoid.array == null || perceptoid.array.perceptei == null || perceptoid.array.perceptei.Length == 0)
|
||||||
perceptoid.array = new PercepteiArray(perceptoid);
|
perceptoid.array = new PercepteiArray(perceptoid);
|
||||||
@ -615,6 +616,7 @@ public class NeuroidLayer {
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
public class GraphNodeWrapper : ScriptableObject {
|
public class GraphNodeWrapper : ScriptableObject {
|
||||||
// expose fields that map to GraphNode
|
// expose fields that map to GraphNode
|
||||||
//public string title;
|
//public string title;
|
||||||
@ -640,3 +642,4 @@ public class GraphNodeWrapper : ScriptableObject {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
@ -1,3 +1,4 @@
|
|||||||
|
/*
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
@ -58,7 +59,7 @@ public class NanoBrain : ScriptableObject, ISerializationCallbackReceiver {
|
|||||||
this.cluster.GarbageCollection();
|
this.cluster.GarbageCollection();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
public void GarbageCollection() {
|
public void GarbageCollection() {
|
||||||
HashSet<INucleus> visitedNuclei = new();
|
HashSet<INucleus> visitedNuclei = new();
|
||||||
MarkNuclei(visitedNuclei, this.output);
|
MarkNuclei(visitedNuclei, this.output);
|
||||||
@ -96,5 +97,6 @@ public class NanoBrain : ScriptableObject, ISerializationCallbackReceiver {
|
|||||||
nucleus.receivers.RemoveAll(receiver => visitedReceivers.Contains(receiver) == false);
|
nucleus.receivers.RemoveAll(receiver => visitedReceivers.Contains(receiver) == false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
Loading…
x
Reference in New Issue
Block a user