using Mirror; using Rive; using Rive.Components; using TMPro; using UnityEngine; public class RiveLoginController : MonoBehaviour { [Header("Rive")] [SerializeField] private RiveWidget riveWidget; [SerializeField] private string startTriggerName = "startClicked"; [Header("Login")] [Tooltip("Still needed username until Rive has a bound string property.")] [SerializeField] private TMP_InputField usernameInput; [SerializeField] private LoginUI loginUI; private ViewModelInstanceTriggerProperty startTrigger; private void Awake() { if (riveWidget == null) riveWidget = GetComponent(); } private void OnEnable() { if (riveWidget == null) return; riveWidget.OnWidgetStatusChanged += HandleWidgetStatusChanged; HandleWidgetStatusChanged(); } private void OnDisable() { if (riveWidget != null) riveWidget.OnWidgetStatusChanged -= HandleWidgetStatusChanged; if (startTrigger != null) startTrigger.OnTriggered -= OnStartClicked; } private void HandleWidgetStatusChanged() { if (riveWidget.Status != WidgetStatus.Loaded) return; ViewModelInstance vm = riveWidget.StateMachine?.ViewModelInstance; if (vm == null) { Debug.LogError("RiveLoginController: ViewModelInstance is null. Set Data Binding Mode to Auto Bind Default."); return; } if (startTrigger != null) startTrigger.OnTriggered -= OnStartClicked; startTrigger = vm.GetTriggerProperty(startTriggerName); if (startTrigger == null) { Debug.LogError($"RiveLoginController: Trigger '{startTriggerName}' not found."); return; } startTrigger.OnTriggered += OnStartClicked; } private void OnStartClicked() { StartMultiplayerSession(); } public void StartMultiplayerSession() { string username = usernameInput != null ? usernameInput.text.Trim() : string.Empty; Debug.Log($"[RiveLoginController] StartMultiplayerSession called. Username length: {username.Length}"); if (string.IsNullOrWhiteSpace(username)) { Debug.LogWarning("[RiveLoginController] Client start blocked because the username is empty."); if (loginUI != null && loginUI.errorText != null) { loginUI.errorText.text = "Enter a username"; loginUI.errorText.gameObject.SetActive(true); } else { Debug.LogWarning("RiveLoginController: Username is empty"); } return; } ChatAuthenticator auth = NetworkManager.singleton.GetComponent(); if (auth != null) { Debug.Log("[RiveLoginController] Assigning username to ChatAuthenticator."); auth.SetPlayerName(username); } else Debug.LogWarning("RiveLoginController: ChatAuthenticator not found on NetworkManager"); Debug.Log($"[RiveLoginController] Starting client. Network address: '{NetworkManager.singleton.networkAddress}'"); NetworkManager.singleton.StartClient(); } }