diff --git a/.idea/.idea.HALLUCINATE/.idea/workspace.xml b/.idea/.idea.HALLUCINATE/.idea/workspace.xml
index 8c0898b0..94dd0991 100644
--- a/.idea/.idea.HALLUCINATE/.idea/workspace.xml
+++ b/.idea/.idea.HALLUCINATE/.idea/workspace.xml
@@ -11,21 +11,12 @@
-
+
-
-
-
-
-
-
-
-
-
@@ -140,7 +131,8 @@
-
+
+
diff --git a/Assets/Scripts/UI/BaseUIController.cs b/Assets/Scripts/UI/BaseUIController.cs
index e375fa01..14ab964f 100644
--- a/Assets/Scripts/UI/BaseUIController.cs
+++ b/Assets/Scripts/UI/BaseUIController.cs
@@ -10,6 +10,8 @@ namespace Hallucinate.UI
protected VisualElement root;
protected UIManager uiManager;
+ public VisualElement Root => root; // Thêm thuộc tính này
+
public virtual void Initialize(VisualElement uxmlRoot, UIManager manager)
{
root = uxmlRoot;
diff --git a/Assets/Scripts/UI/FirebaseService.cs b/Assets/Scripts/UI/FirebaseService.cs
new file mode 100644
index 00000000..2a3264a1
--- /dev/null
+++ b/Assets/Scripts/UI/FirebaseService.cs
@@ -0,0 +1,43 @@
+using System;
+using System.Collections;
+using System.Threading.Tasks;
+using UnityEngine;
+using UnityEngine.Networking;
+
+namespace Hallucinate.UI
+{
+ public static class FirebaseService
+ {
+ // Thay link database của bạn vào đây
+ private const string BASE_URL = "https://YOUR_FIREBASE_URL.firebaseio.com/users";
+
+ public static async Task IsUsernameTaken(string username)
+ {
+ string url = $"{BASE_URL}/{username}.json";
+ using (UnityWebRequest request = UnityWebRequest.Get(url))
+ {
+ var operation = request.SendWebRequest();
+ while (!operation.isDone) await Task.Yield();
+
+ if (request.result != UnityWebRequest.Result.Success) return false;
+
+ // Nếu kết quả trả về không phải "null" nghĩa là user đã tồn tại
+ return request.downloadHandler.text != "null";
+ }
+ }
+
+ public static async Task RegisterUser(string username)
+ {
+ string url = $"{BASE_URL}/{username}.json";
+ string jsonData = "{\"created_at\": \"" + DateTime.Now.ToString() + "\"}";
+
+ using (UnityWebRequest request = UnityWebRequest.Put(url, jsonData))
+ {
+ var operation = request.SendWebRequest();
+ while (!operation.isDone) await Task.Yield();
+
+ return request.result == UnityWebRequest.Result.Success;
+ }
+ }
+ }
+}
diff --git a/Assets/Scripts/UI/FirebaseService.cs.meta b/Assets/Scripts/UI/FirebaseService.cs.meta
new file mode 100644
index 00000000..0eceeca4
--- /dev/null
+++ b/Assets/Scripts/UI/FirebaseService.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: bf13e7d21e483574882c6b687a6ae19c
\ No newline at end of file
diff --git a/Assets/Scripts/UI/LoginController.cs b/Assets/Scripts/UI/LoginController.cs
new file mode 100644
index 00000000..1a2c8f82
--- /dev/null
+++ b/Assets/Scripts/UI/LoginController.cs
@@ -0,0 +1,90 @@
+using UnityEngine;
+using UnityEngine.UIElements;
+using System.Threading.Tasks;
+
+namespace Hallucinate.UI
+{
+ public class LoginController : BaseUIController
+ {
+ private TextField _nameInput;
+ private Label _errorLabel;
+ private Button _confirmBtn;
+
+ public override void Initialize(VisualElement uxmlRoot, UIManager manager)
+ {
+ base.Initialize(uxmlRoot, manager);
+
+ _nameInput = root.Q("UsernameInput");
+ _errorLabel = root.Q