Merge branch 'dev'

This commit is contained in:
DCFApixels 2024-11-12 16:38:44 +08:00
commit 138a0f2e25
7 changed files with 85 additions and 29 deletions

View File

@ -10,7 +10,7 @@
<RootNamespace>DCFApixels.DragonECS</RootNamespace> <RootNamespace>DCFApixels.DragonECS</RootNamespace>
<Title>DragonECS</Title> <Title>DragonECS</Title>
<Version>0.8.60</Version> <Version>0.8.61</Version>
<Authors>DCFApixels</Authors> <Authors>DCFApixels</Authors>
<Description>ECS Framework for Game Engines with C# and .Net Platform</Description> <Description>ECS Framework for Game Engines with C# and .Net Platform</Description>
<Copyright>DCFApixels</Copyright> <Copyright>DCFApixels</Copyright>

View File

@ -8,7 +8,7 @@
"displayName": "DragonECS", "displayName": "DragonECS",
"description": "C# Entity Component System Framework", "description": "C# Entity Component System Framework",
"unity": "2020.3", "unity": "2020.3",
"version": "0.8.60", "version": "0.8.61",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/DCFApixels/DragonECS.git" "url": "https://github.com/DCFApixels/DragonECS.git"

View File

@ -6,14 +6,14 @@ namespace DCFApixels.DragonECS
public sealed class SingleAspect<TPool> : EcsAspect where TPool : IEcsPoolImplementation, new() public sealed class SingleAspect<TPool> : EcsAspect where TPool : IEcsPoolImplementation, new()
{ {
public readonly TPool pool = CurrentBuilder.IncludePool<TPool>(); public readonly TPool pool = B.IncludePool<TPool>();
} }
public sealed class CombinedAspect<A0, A1> : EcsAspect public sealed class CombinedAspect<A0, A1> : EcsAspect
where A0 : EcsAspect, new() where A0 : EcsAspect, new()
where A1 : EcsAspect, new() where A1 : EcsAspect, new()
{ {
public readonly A0 a0 = CurrentBuilder.Combine<A0>(); public readonly A0 a0 = B.Combine<A0>();
public readonly A1 a1 = CurrentBuilder.Combine<A1>(); public readonly A1 a1 = B.Combine<A1>();
public void Deconstruct(out A0 a0, out A1 a1) public void Deconstruct(out A0 a0, out A1 a1)
{ {
a0 = this.a0; a0 = this.a0;
@ -26,9 +26,9 @@ namespace DCFApixels.DragonECS
where A1 : EcsAspect, new() where A1 : EcsAspect, new()
where A2 : EcsAspect, new() where A2 : EcsAspect, new()
{ {
public readonly A0 a0 = CurrentBuilder.Combine<A0>(); public readonly A0 a0 = B.Combine<A0>();
public readonly A1 a1 = CurrentBuilder.Combine<A1>(); public readonly A1 a1 = B.Combine<A1>();
public readonly A2 a2 = CurrentBuilder.Combine<A2>(); public readonly A2 a2 = B.Combine<A2>();
public void Deconstruct(out A0 a0, out A1 a1, out A2 a2) public void Deconstruct(out A0 a0, out A1 a1, out A2 a2)
{ {
a0 = this.a0; a0 = this.a0;
@ -43,10 +43,10 @@ namespace DCFApixels.DragonECS
where A2 : EcsAspect, new() where A2 : EcsAspect, new()
where A3 : EcsAspect, new() where A3 : EcsAspect, new()
{ {
public readonly A0 a0 = CurrentBuilder.Combine<A0>(); public readonly A0 a0 = B.Combine<A0>();
public readonly A1 a1 = CurrentBuilder.Combine<A1>(); public readonly A1 a1 = B.Combine<A1>();
public readonly A2 a2 = CurrentBuilder.Combine<A2>(); public readonly A2 a2 = B.Combine<A2>();
public readonly A3 a3 = CurrentBuilder.Combine<A3>(); public readonly A3 a3 = B.Combine<A3>();
public void Deconstruct(out A0 a0, out A1 a1, out A2 a2, out A3 a3) public void Deconstruct(out A0 a0, out A1 a1, out A2 a2, out A3 a3)
{ {
a0 = this.a0; a0 = this.a0;
@ -63,11 +63,11 @@ namespace DCFApixels.DragonECS
where A3 : EcsAspect, new() where A3 : EcsAspect, new()
where A4 : EcsAspect, new() where A4 : EcsAspect, new()
{ {
public readonly A0 a0 = CurrentBuilder.Combine<A0>(); public readonly A0 a0 = B.Combine<A0>();
public readonly A1 a1 = CurrentBuilder.Combine<A1>(); public readonly A1 a1 = B.Combine<A1>();
public readonly A2 a2 = CurrentBuilder.Combine<A2>(); public readonly A2 a2 = B.Combine<A2>();
public readonly A3 a3 = CurrentBuilder.Combine<A3>(); public readonly A3 a3 = B.Combine<A3>();
public readonly A4 a4 = CurrentBuilder.Combine<A4>(); public readonly A4 a4 = B.Combine<A4>();
public void Deconstruct(out A0 a0, out A1 a1, out A2 a2, out A3 a3, out A4 a4) public void Deconstruct(out A0 a0, out A1 a1, out A2 a2, out A3 a3, out A4 a4)
{ {
a0 = this.a0; a0 = this.a0;
@ -86,12 +86,12 @@ namespace DCFApixels.DragonECS
where A4 : EcsAspect, new() where A4 : EcsAspect, new()
where A5 : EcsAspect, new() where A5 : EcsAspect, new()
{ {
public readonly A0 a0 = CurrentBuilder.Combine<A0>(); public readonly A0 a0 = B.Combine<A0>();
public readonly A1 a1 = CurrentBuilder.Combine<A1>(); public readonly A1 a1 = B.Combine<A1>();
public readonly A2 a2 = CurrentBuilder.Combine<A2>(); public readonly A2 a2 = B.Combine<A2>();
public readonly A3 a3 = CurrentBuilder.Combine<A3>(); public readonly A3 a3 = B.Combine<A3>();
public readonly A4 a4 = CurrentBuilder.Combine<A4>(); public readonly A4 a4 = B.Combine<A4>();
public readonly A5 a5 = CurrentBuilder.Combine<A5>(); public readonly A5 a5 = B.Combine<A5>();
public void Deconstruct(out A0 a0, out A1 a1, out A2 a2, out A3 a3, out A4 a4, out A5 a5) public void Deconstruct(out A0 a0, out A1 a1, out A2 a2, out A3 a3, out A4 a4, out A5 a5)
{ {
a0 = this.a0; a0 = this.a0;

View File

@ -6,6 +6,25 @@ using System.Collections.Generic;
namespace DCFApixels.DragonECS namespace DCFApixels.DragonECS
{ {
public readonly struct Singleton<T> where T : struct
{
public readonly short WorldID;
public Singleton(short worldID)
{
WorldID = worldID;
EcsWorld.GetData<T>(worldID);
}
public EcsWorld World
{
get { return EcsWorld.GetWorld(WorldID); }
}
public ref T Value
{
get { return ref EcsWorld.GetDataUnchecked<T>(WorldID); }
}
public static implicit operator Singleton<T>(SingletonMarker a) { return new Singleton<T>(a.Builder.World.ID); }
}
public abstract class EcsAspect : ITemplateNode, IComponentMask public abstract class EcsAspect : ITemplateNode, IComponentMask
{ {
#region Initialization Halpers #region Initialization Halpers
@ -13,7 +32,7 @@ namespace DCFApixels.DragonECS
private static Builder[] _constructorBuildersStack; private static Builder[] _constructorBuildersStack;
[ThreadStatic] [ThreadStatic]
private static int _constructorBuildersStackIndex; private static int _constructorBuildersStackIndex;
protected static Builder CurrentBuilder protected static Builder B
{ {
get get
{ {
@ -24,17 +43,25 @@ namespace DCFApixels.DragonECS
return _constructorBuildersStack[_constructorBuildersStackIndex]; return _constructorBuildersStack[_constructorBuildersStackIndex];
} }
} }
protected static Builder CurrentBuilder
{
get { return B; }
}
protected static IncludeMarker Inc protected static IncludeMarker Inc
{ {
get { return CurrentBuilder.Inc; } get { return B.Inc; }
} }
protected static ExcludeMarker Exc protected static ExcludeMarker Exc
{ {
get { return CurrentBuilder.Exc; } get { return B.Exc; }
} }
protected static OptionalMarker Opt protected static OptionalMarker Opt
{ {
get { return CurrentBuilder.Opt; } get { return B.Opt; }
}
protected static SingletonMarker Singleton
{
get { return B.Singleton; }
} }
#endregion #endregion
@ -102,6 +129,10 @@ namespace DCFApixels.DragonECS
{ {
get { return new OptionalMarker(this); } get { return new OptionalMarker(this); }
} }
public SingletonMarker Singleton
{
get { return new SingletonMarker(this); }
}
public EcsWorld World public EcsWorld World
{ {
get { return _world; } get { return _world; }
@ -164,6 +195,10 @@ namespace DCFApixels.DragonECS
#endregion #endregion
#region Include/Exclude/Optional/Combine/Except #region Include/Exclude/Optional/Combine/Except
public Singleton<T> Get<T>() where T : struct
{
return new Singleton<T>(_world.ID);
}
public TPool IncludePool<TPool>() where TPool : IEcsPoolImplementation, new() public TPool IncludePool<TPool>() where TPool : IEcsPoolImplementation, new()
{ {
var pool = CachePool<TPool>(); var pool = CachePool<TPool>();
@ -265,7 +300,7 @@ namespace DCFApixels.DragonECS
{ {
if (pool.Has(entityID) == false) if (pool.Has(entityID) == false)
{ {
pool.AddRaw(entityID, null); pool.AddEmpty(entityID);
} }
} }
#if DEBUG #if DEBUG
@ -397,5 +432,17 @@ namespace DCFApixels.DragonECS
return _builder.OptionalPool<T>(); return _builder.OptionalPool<T>();
} }
} }
public readonly ref struct SingletonMarker
{
public readonly EcsAspect.Builder Builder;
public SingletonMarker(EcsAspect.Builder builder)
{
Builder = builder;
}
public T Get<T>() where T : struct
{
return Builder.World.Get<T>();
}
}
#endregion #endregion
} }

View File

@ -259,6 +259,7 @@ namespace DCFApixels.DragonECS
#endregion #endregion
#region Other #region Other
void IEcsPool.AddEmpty(int entityID) { Add(entityID); }
void IEcsPool.AddRaw(int entityID, object dataRaw) void IEcsPool.AddRaw(int entityID, object dataRaw)
{ {
Add(entityID) = dataRaw == null ? default : (T)dataRaw; Add(entityID) = dataRaw == null ? default : (T)dataRaw;

View File

@ -88,6 +88,12 @@ namespace DCFApixels.DragonECS.Internal
{ {
#if (DEBUG && !DISABLE_DEBUG) #if (DEBUG && !DISABLE_DEBUG)
throw new NullInstanceException(); throw new NullInstanceException();
#endif
}
void IEcsPool.AddEmpty(int entityID)
{
#if (DEBUG && !DISABLE_DEBUG)
throw new NullInstanceException();
#endif #endif
} }
void IEcsPool.AddRaw(int entityID, object dataRaw) void IEcsPool.AddRaw(int entityID, object dataRaw)
@ -101,7 +107,7 @@ namespace DCFApixels.DragonECS.Internal
#if (DEBUG && !DISABLE_DEBUG) #if (DEBUG && !DISABLE_DEBUG)
throw new NullInstanceException(); throw new NullInstanceException();
#else #else
return null; return null;
#endif #endif
} }
void IEcsPool.SetRaw(int entity, object dataRaw) void IEcsPool.SetRaw(int entity, object dataRaw)
@ -179,6 +185,7 @@ namespace DCFApixels.DragonECS
public interface IEcsPool : IEcsReadonlyPool public interface IEcsPool : IEcsReadonlyPool
{ {
#region Methods #region Methods
void AddEmpty(int entityID);
void AddRaw(int entityID, object dataRaw); void AddRaw(int entityID, object dataRaw);
void SetRaw(int entityID, object dataRaw); void SetRaw(int entityID, object dataRaw);
void Del(int entityID); void Del(int entityID);

View File

@ -224,6 +224,7 @@ namespace DCFApixels.DragonECS
#endregion #endregion
#region Other #region Other
void IEcsPool.AddEmpty(int entityID) { Add(entityID); }
void IEcsPool.AddRaw(int entityID, object dataRaw) { Add(entityID); } void IEcsPool.AddRaw(int entityID, object dataRaw) { Add(entityID); }
object IEcsReadonlyPool.GetRaw(int entityID) object IEcsReadonlyPool.GetRaw(int entityID)
{ {