|
|
|
@ -81,11 +81,27 @@ public unsafe sealed class EntityRef |
|
|
|
|
return (ptr != null) ? (T)((GCHandle)Unsafe.Read<nint>(ptr)).Target! : null; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public override ref T GetRef<T>() |
|
|
|
|
public override ref T GetRefOrNull<T>() |
|
|
|
|
{ |
|
|
|
|
var comp = Universe.LookupOrThrow<T>(); |
|
|
|
|
var @ref = ecs_ref_init_id(Universe, this, comp); |
|
|
|
|
var ptr = ecs_ref_get_id(Universe, &@ref, comp); |
|
|
|
|
return ref (ptr != null) ? ref Unsafe.AsRef<T>(ptr) : ref Unsafe.NullRef<T>(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public override ref T GetRefOrThrow<T>() |
|
|
|
|
{ |
|
|
|
|
ref var ptr = ref GetRefOrNull<T>(); |
|
|
|
|
if (Unsafe.IsNullRef(ref ptr)) throw new Exception( |
|
|
|
|
$"Component {typeof(T)} not found on {this}"); |
|
|
|
|
return ref ptr; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public override ref T GetMut<T>() |
|
|
|
|
{ |
|
|
|
|
var comp = Universe.LookupOrThrow<T>(); |
|
|
|
|
var ptr = ecs_get_mut_id(Universe, this, comp); |
|
|
|
|
if (ptr == null) throw new Exception($"Component {typeof(T)} not found on {this}"); |
|
|
|
|
// NOTE: Value is added if it doesn't exist on the entity. |
|
|
|
|
return ref Unsafe.AsRef<T>(ptr); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|