namespace XCEngine { public sealed class GameObject { private readonly ulong m_uuid; internal GameObject(ulong uuid) { m_uuid = uuid; } public ulong UUID => m_uuid; public static GameObject Find(string name) { ulong uuid = InternalCalls.GameObject_Find(name ?? string.Empty); return uuid != 0 ? new GameObject(uuid) : null; } public static GameObject Create(string name) { return Create(name, null); } public static GameObject Create(string name, GameObject parent) { ulong uuid = InternalCalls.GameObject_Create(name ?? string.Empty, parent?.UUID ?? 0); return uuid != 0 ? new GameObject(uuid) : null; } public string Name { get => InternalCalls.GameObject_GetName(UUID) ?? string.Empty; set => InternalCalls.GameObject_SetName(UUID, value ?? string.Empty); } public string name { get => Name; set => Name = value; } public bool activeSelf => InternalCalls.GameObject_GetActiveSelf(UUID); public bool activeInHierarchy => InternalCalls.GameObject_GetActiveInHierarchy(UUID); public void SetActive(bool value) { InternalCalls.GameObject_SetActive(UUID, value); } public void Destroy() { InternalCalls.GameObject_Destroy(UUID); } public Transform Transform => GetComponent(); public Transform transform => Transform; public bool HasComponent() where T : Component { return InternalCalls.GameObject_HasComponent(UUID, typeof(T)); } public T GetComponent() where T : Component { return InternalCalls.GameObject_GetComponent(UUID, typeof(T)) as T; } public T AddComponent() where T : Component { return InternalCalls.GameObject_AddComponent(UUID, typeof(T)) as T; } public bool TryGetComponent(out T component) where T : Component { component = GetComponent(); return component != null; } } }