namespace XCEngine { public sealed class GameObject : Object { 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[] GetComponents() where T : Component { Component[] components = InternalCalls.GameObject_GetComponents(UUID, typeof(T)); if (components == null || components.Length == 0) { return System.Array.Empty(); } if (components is T[] typedComponents) { return typedComponents; } T[] result = new T[components.Length]; for (int index = 0; index < components.Length; ++index) { result[index] = components[index] as T; } return result; } public T GetComponentInChildren() where T : Component { return InternalCalls.GameObject_GetComponentInChildren(UUID, typeof(T)) as T; } public T GetComponentInParent() where T : Component { return InternalCalls.GameObject_GetComponentInParent(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; } } }