diff --git a/DragonECS.csproj b/DragonECS.csproj
index 1d093cd..4f2db5b 100644
--- a/DragonECS.csproj
+++ b/DragonECS.csproj
@@ -10,7 +10,7 @@
DCFApixels.DragonECS
DragonECS
- 0.8.60
+ 0.8.61
DCFApixels
ECS Framework for Game Engines with C# and .Net Platform
DCFApixels
diff --git a/package.json b/package.json
index 59a5d8a..1051df6 100644
--- a/package.json
+++ b/package.json
@@ -8,7 +8,7 @@
"displayName": "DragonECS",
"description": "C# Entity Component System Framework",
"unity": "2020.3",
- "version": "0.8.60",
+ "version": "0.8.61",
"repository": {
"type": "git",
"url": "https://github.com/DCFApixels/DragonECS.git"
diff --git a/src/Builtin/Aspects.cs b/src/Builtin/Aspects.cs
index 708d64d..d8197ab 100644
--- a/src/Builtin/Aspects.cs
+++ b/src/Builtin/Aspects.cs
@@ -6,14 +6,14 @@ namespace DCFApixels.DragonECS
public sealed class SingleAspect : EcsAspect where TPool : IEcsPoolImplementation, new()
{
- public readonly TPool pool = CurrentBuilder.IncludePool();
+ public readonly TPool pool = B.IncludePool();
}
public sealed class CombinedAspect : EcsAspect
where A0 : EcsAspect, new()
where A1 : EcsAspect, new()
{
- public readonly A0 a0 = CurrentBuilder.Combine();
- public readonly A1 a1 = CurrentBuilder.Combine();
+ public readonly A0 a0 = B.Combine();
+ public readonly A1 a1 = B.Combine();
public void Deconstruct(out A0 a0, out A1 a1)
{
a0 = this.a0;
@@ -26,9 +26,9 @@ namespace DCFApixels.DragonECS
where A1 : EcsAspect, new()
where A2 : EcsAspect, new()
{
- public readonly A0 a0 = CurrentBuilder.Combine();
- public readonly A1 a1 = CurrentBuilder.Combine();
- public readonly A2 a2 = CurrentBuilder.Combine();
+ public readonly A0 a0 = B.Combine();
+ public readonly A1 a1 = B.Combine();
+ public readonly A2 a2 = B.Combine();
public void Deconstruct(out A0 a0, out A1 a1, out A2 a2)
{
a0 = this.a0;
@@ -43,10 +43,10 @@ namespace DCFApixels.DragonECS
where A2 : EcsAspect, new()
where A3 : EcsAspect, new()
{
- public readonly A0 a0 = CurrentBuilder.Combine();
- public readonly A1 a1 = CurrentBuilder.Combine();
- public readonly A2 a2 = CurrentBuilder.Combine();
- public readonly A3 a3 = CurrentBuilder.Combine();
+ public readonly A0 a0 = B.Combine();
+ public readonly A1 a1 = B.Combine();
+ public readonly A2 a2 = B.Combine();
+ public readonly A3 a3 = B.Combine();
public void Deconstruct(out A0 a0, out A1 a1, out A2 a2, out A3 a3)
{
a0 = this.a0;
@@ -63,11 +63,11 @@ namespace DCFApixels.DragonECS
where A3 : EcsAspect, new()
where A4 : EcsAspect, new()
{
- public readonly A0 a0 = CurrentBuilder.Combine();
- public readonly A1 a1 = CurrentBuilder.Combine();
- public readonly A2 a2 = CurrentBuilder.Combine();
- public readonly A3 a3 = CurrentBuilder.Combine();
- public readonly A4 a4 = CurrentBuilder.Combine();
+ public readonly A0 a0 = B.Combine();
+ public readonly A1 a1 = B.Combine();
+ public readonly A2 a2 = B.Combine();
+ public readonly A3 a3 = B.Combine();
+ public readonly A4 a4 = B.Combine();
public void Deconstruct(out A0 a0, out A1 a1, out A2 a2, out A3 a3, out A4 a4)
{
a0 = this.a0;
@@ -86,12 +86,12 @@ namespace DCFApixels.DragonECS
where A4 : EcsAspect, new()
where A5 : EcsAspect, new()
{
- public readonly A0 a0 = CurrentBuilder.Combine();
- public readonly A1 a1 = CurrentBuilder.Combine();
- public readonly A2 a2 = CurrentBuilder.Combine();
- public readonly A3 a3 = CurrentBuilder.Combine();
- public readonly A4 a4 = CurrentBuilder.Combine();
- public readonly A5 a5 = CurrentBuilder.Combine();
+ public readonly A0 a0 = B.Combine();
+ public readonly A1 a1 = B.Combine();
+ public readonly A2 a2 = B.Combine();
+ public readonly A3 a3 = B.Combine();
+ public readonly A4 a4 = B.Combine();
+ public readonly A5 a5 = B.Combine();
public void Deconstruct(out A0 a0, out A1 a1, out A2 a2, out A3 a3, out A4 a4, out A5 a5)
{
a0 = this.a0;
diff --git a/src/EcsAspect.cs b/src/EcsAspect.cs
index 98b7dfe..d025f82 100644
--- a/src/EcsAspect.cs
+++ b/src/EcsAspect.cs
@@ -6,6 +6,25 @@ using System.Collections.Generic;
namespace DCFApixels.DragonECS
{
+ public readonly struct Singleton where T : struct
+ {
+ public readonly short WorldID;
+ public Singleton(short worldID)
+ {
+ WorldID = worldID;
+ EcsWorld.GetData(worldID);
+ }
+ public EcsWorld World
+ {
+ get { return EcsWorld.GetWorld(WorldID); }
+ }
+ public ref T Value
+ {
+ get { return ref EcsWorld.GetDataUnchecked(WorldID); }
+ }
+
+ public static implicit operator Singleton(SingletonMarker a) { return new Singleton(a.Builder.World.ID); }
+ }
public abstract class EcsAspect : ITemplateNode, IComponentMask
{
#region Initialization Halpers
@@ -13,7 +32,7 @@ namespace DCFApixels.DragonECS
private static Builder[] _constructorBuildersStack;
[ThreadStatic]
private static int _constructorBuildersStackIndex;
- protected static Builder CurrentBuilder
+ protected static Builder B
{
get
{
@@ -24,17 +43,25 @@ namespace DCFApixels.DragonECS
return _constructorBuildersStack[_constructorBuildersStackIndex];
}
}
+ protected static Builder CurrentBuilder
+ {
+ get { return B; }
+ }
protected static IncludeMarker Inc
{
- get { return CurrentBuilder.Inc; }
+ get { return B.Inc; }
}
protected static ExcludeMarker Exc
{
- get { return CurrentBuilder.Exc; }
+ get { return B.Exc; }
}
protected static OptionalMarker Opt
{
- get { return CurrentBuilder.Opt; }
+ get { return B.Opt; }
+ }
+ protected static SingletonMarker Singleton
+ {
+ get { return B.Singleton; }
}
#endregion
@@ -102,6 +129,10 @@ namespace DCFApixels.DragonECS
{
get { return new OptionalMarker(this); }
}
+ public SingletonMarker Singleton
+ {
+ get { return new SingletonMarker(this); }
+ }
public EcsWorld World
{
get { return _world; }
@@ -164,6 +195,10 @@ namespace DCFApixels.DragonECS
#endregion
#region Include/Exclude/Optional/Combine/Except
+ public Singleton Get() where T : struct
+ {
+ return new Singleton(_world.ID);
+ }
public TPool IncludePool() where TPool : IEcsPoolImplementation, new()
{
var pool = CachePool();
@@ -265,7 +300,7 @@ namespace DCFApixels.DragonECS
{
if (pool.Has(entityID) == false)
{
- pool.AddRaw(entityID, null);
+ pool.AddEmpty(entityID);
}
}
#if DEBUG
@@ -397,5 +432,17 @@ namespace DCFApixels.DragonECS
return _builder.OptionalPool();
}
}
+ public readonly ref struct SingletonMarker
+ {
+ public readonly EcsAspect.Builder Builder;
+ public SingletonMarker(EcsAspect.Builder builder)
+ {
+ Builder = builder;
+ }
+ public T Get() where T : struct
+ {
+ return Builder.World.Get();
+ }
+ }
#endregion
}
\ No newline at end of file
diff --git a/src/Pools/EcsPool.cs b/src/Pools/EcsPool.cs
index c8d8045..c3f624b 100644
--- a/src/Pools/EcsPool.cs
+++ b/src/Pools/EcsPool.cs
@@ -259,6 +259,7 @@ namespace DCFApixels.DragonECS
#endregion
#region Other
+ void IEcsPool.AddEmpty(int entityID) { Add(entityID); }
void IEcsPool.AddRaw(int entityID, object dataRaw)
{
Add(entityID) = dataRaw == null ? default : (T)dataRaw;
diff --git a/src/Pools/EcsPoolBase.cs b/src/Pools/EcsPoolBase.cs
index 6f6f713..3bed942 100644
--- a/src/Pools/EcsPoolBase.cs
+++ b/src/Pools/EcsPoolBase.cs
@@ -88,6 +88,12 @@ namespace DCFApixels.DragonECS.Internal
{
#if (DEBUG && !DISABLE_DEBUG)
throw new NullInstanceException();
+#endif
+ }
+ void IEcsPool.AddEmpty(int entityID)
+ {
+#if (DEBUG && !DISABLE_DEBUG)
+ throw new NullInstanceException();
#endif
}
void IEcsPool.AddRaw(int entityID, object dataRaw)
@@ -101,7 +107,7 @@ namespace DCFApixels.DragonECS.Internal
#if (DEBUG && !DISABLE_DEBUG)
throw new NullInstanceException();
#else
- return null;
+ return null;
#endif
}
void IEcsPool.SetRaw(int entity, object dataRaw)
@@ -179,6 +185,7 @@ namespace DCFApixels.DragonECS
public interface IEcsPool : IEcsReadonlyPool
{
#region Methods
+ void AddEmpty(int entityID);
void AddRaw(int entityID, object dataRaw);
void SetRaw(int entityID, object dataRaw);
void Del(int entityID);
diff --git a/src/Pools/EcsTagPool.cs b/src/Pools/EcsTagPool.cs
index 893bacb..0fe8260 100644
--- a/src/Pools/EcsTagPool.cs
+++ b/src/Pools/EcsTagPool.cs
@@ -224,6 +224,7 @@ namespace DCFApixels.DragonECS
#endregion
#region Other
+ void IEcsPool.AddEmpty(int entityID) { Add(entityID); }
void IEcsPool.AddRaw(int entityID, object dataRaw) { Add(entityID); }
object IEcsReadonlyPool.GetRaw(int entityID)
{