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>
<Title>DragonECS</Title>
<Version>0.8.60</Version>
<Version>0.8.61</Version>
<Authors>DCFApixels</Authors>
<Description>ECS Framework for Game Engines with C# and .Net Platform</Description>
<Copyright>DCFApixels</Copyright>

View File

@ -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"

View File

@ -6,14 +6,14 @@ namespace DCFApixels.DragonECS
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
where A0 : EcsAspect, new()
where A1 : EcsAspect, new()
{
public readonly A0 a0 = CurrentBuilder.Combine<A0>();
public readonly A1 a1 = CurrentBuilder.Combine<A1>();
public readonly A0 a0 = B.Combine<A0>();
public readonly A1 a1 = B.Combine<A1>();
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<A0>();
public readonly A1 a1 = CurrentBuilder.Combine<A1>();
public readonly A2 a2 = CurrentBuilder.Combine<A2>();
public readonly A0 a0 = B.Combine<A0>();
public readonly A1 a1 = B.Combine<A1>();
public readonly A2 a2 = B.Combine<A2>();
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<A0>();
public readonly A1 a1 = CurrentBuilder.Combine<A1>();
public readonly A2 a2 = CurrentBuilder.Combine<A2>();
public readonly A3 a3 = CurrentBuilder.Combine<A3>();
public readonly A0 a0 = B.Combine<A0>();
public readonly A1 a1 = B.Combine<A1>();
public readonly A2 a2 = B.Combine<A2>();
public readonly A3 a3 = B.Combine<A3>();
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<A0>();
public readonly A1 a1 = CurrentBuilder.Combine<A1>();
public readonly A2 a2 = CurrentBuilder.Combine<A2>();
public readonly A3 a3 = CurrentBuilder.Combine<A3>();
public readonly A4 a4 = CurrentBuilder.Combine<A4>();
public readonly A0 a0 = B.Combine<A0>();
public readonly A1 a1 = B.Combine<A1>();
public readonly A2 a2 = B.Combine<A2>();
public readonly A3 a3 = B.Combine<A3>();
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)
{
a0 = this.a0;
@ -86,12 +86,12 @@ namespace DCFApixels.DragonECS
where A4 : EcsAspect, new()
where A5 : EcsAspect, new()
{
public readonly A0 a0 = CurrentBuilder.Combine<A0>();
public readonly A1 a1 = CurrentBuilder.Combine<A1>();
public readonly A2 a2 = CurrentBuilder.Combine<A2>();
public readonly A3 a3 = CurrentBuilder.Combine<A3>();
public readonly A4 a4 = CurrentBuilder.Combine<A4>();
public readonly A5 a5 = CurrentBuilder.Combine<A5>();
public readonly A0 a0 = B.Combine<A0>();
public readonly A1 a1 = B.Combine<A1>();
public readonly A2 a2 = B.Combine<A2>();
public readonly A3 a3 = B.Combine<A3>();
public readonly A4 a4 = B.Combine<A4>();
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)
{
a0 = this.a0;

View File

@ -6,6 +6,25 @@ using System.Collections.Generic;
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
{
#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<T> Get<T>() where T : struct
{
return new Singleton<T>(_world.ID);
}
public TPool IncludePool<TPool>() where TPool : IEcsPoolImplementation, new()
{
var pool = CachePool<TPool>();
@ -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<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
}

View File

@ -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;

View File

@ -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);

View File

@ -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)
{