Files
Fishing2Server/Fantasy/Fantays.Console/Runtime/Core/Entitas/EntityReference.cs
2025-06-30 10:51:37 +08:00

59 lines
1.8 KiB
C#

// ReSharper disable ConditionIsAlwaysTrueOrFalseAccordingToNullableAPIContract
#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable.
#pragma warning disable CS8625 // Cannot convert null literal to non-nullable reference type.
#pragma warning disable CS8603 // Possible null reference return.
namespace Fantasy.Entitas
{
/// <summary>
/// 实体引用检查组件
/// </summary>
/// <typeparam name="T"></typeparam>
public struct EntityReference<T> where T : Entity
{
private T _entity;
private readonly long _runTimeId;
private EntityReference(T t)
{
if (t == null)
{
_entity = null;
_runTimeId = 0;
return;
}
_entity = t;
_runTimeId = t.RuntimeId;
}
/// <summary>
/// 将一个实体转换为EntityReference
/// </summary>
/// <param name="t">实体泛型类型</param>
/// <returns>返回一个EntityReference</returns>
public static implicit operator EntityReference<T>(T t)
{
return new EntityReference<T>(t);
}
/// <summary>
/// 将一个EntityReference转换为实体
/// </summary>
/// <param name="v">实体泛型类型</param>
/// <returns>当实体已经被销毁过会返回null</returns>
public static implicit operator T(EntityReference<T> v)
{
if (v._entity == null)
{
return null;
}
if (v._entity.RuntimeId != v._runTimeId)
{
v._entity = null;
}
return v._entity;
}
}
}