using System; using System.Collections; using System.Collections.Generic; using System.Text.RegularExpressions; using TMPro; using UnityEngine; using UnityEngine.Networking; using UnityEngine.Serialization; using UnityEngine.UI; public struct SignupData { public string email; public string nickname; public string password; public int imageIndex; } public class SignupPanelController : MonoBehaviour { [SerializeField] private TMP_InputField emailInputField; [SerializeField] private TMP_InputField nicknameInputField; [SerializeField] private TMP_InputField passwordInputField; [SerializeField] private TMP_InputField confirmPasswordInputField; [SerializeField] private Toggle[] imageSelectToggles; private int _selectedImageIndex = 0; private bool _emailValid = false; private void Start() { SetToggleInit(); } private void SetToggleInit() { // 각 프로필 이미지 선택 버튼에 클릭 이벤트 추가 for (int i = 0; i < imageSelectToggles.Length; i++) { int index = i; // 클로저 문제 방지 imageSelectToggles[i].onValueChanged.AddListener((bool value) => OnValueChanged(value, index)); } // 선택된 버튼 초기화 imageSelectToggles[_selectedImageIndex].isOn = true; } public void OnValueChanged(bool value, int index) { // 현재 토글을 끄려고 할 때 (value가 false) if (!value && index == _selectedImageIndex) { // 현재 켜져 있는 토글을 다시 켜지 않게 하고 imageSelectToggles[index].onValueChanged.RemoveAllListeners(); // 다른 토글을 켬 (현재 선택된 인덱스가 아닌 다음 토글을 켬) int nextIndex = (index + 1) % imageSelectToggles.Length; _selectedImageIndex = nextIndex; imageSelectToggles[nextIndex].isOn = true; // 이벤트 리스너 다시 추가 int capturedIndex = index; imageSelectToggles[index].onValueChanged.AddListener((bool val) => OnValueChanged(val, capturedIndex)); return; } // 새로운 토글을 선택했을 때 if (value) { int previousIndex = _selectedImageIndex; _selectedImageIndex = index; // 선택된 토글이 변경되었을 때만 이전 토글을 끔 if (previousIndex != index) { imageSelectToggles[previousIndex].isOn = false; } } } public void OnClickConfirmButton() { var email = emailInputField.text; var nickname = nicknameInputField.text; var password = passwordInputField.text; var confirmPassword = confirmPasswordInputField.text; if (string.IsNullOrEmpty(email) || !_emailValid || string.IsNullOrEmpty(nickname) || string.IsNullOrEmpty(password) || string.IsNullOrEmpty(confirmPassword)) { // 입력 내용 누락 팝업 표시 GameManager.Instance.panelManager.OpenConfirmPanel("입력 내용이 누락되었습니다.", () => {}); Debug.Log("입력 내용이 누락되었습니다."); return; } if (password.Equals(confirmPassword)) { SignupData signupData = new SignupData(); signupData.email = email; signupData.nickname = nickname; signupData.password = password; signupData.imageIndex = _selectedImageIndex; // 서버로 SignupData 전달하면서 회원가입 진행 NetworkManager.Instance.Signup(signupData, () => { Destroy(gameObject); }, () => { emailInputField.text = ""; nicknameInputField.text = ""; passwordInputField.text = ""; confirmPasswordInputField.text = ""; }); } else { // 비밀번호 오류 팝업 표시 Debug.Log("비밀번호가 서로 다릅니다."); GameManager.Instance.panelManager.OpenConfirmPanel("비밀번호가 서로 다릅니다.", () => { passwordInputField.text = ""; confirmPasswordInputField.text = ""; }); } } public void OnClickCancelButton() { Destroy(gameObject); } // 이메일 입력을 완료하면 유효성 검사를 진행함 public void OnChangeEndEmail(string emailText) { const string emailPattern = @"^[^\s@]+@[^\s@]+\.[^\s@]+$"; // 입력이 끝났을 때 이메일 형식 검사 _emailValid = Regex.IsMatch(emailText, emailPattern); // 이메일이 비어있지 않은 경우에만 색상 변경 if (!string.IsNullOrEmpty(emailText)) { if (_emailValid) return; emailInputField.textComponent.color = Color.red; // 이메일 유효하지 않음 GameManager.Instance.panelManager.OpenConfirmPanel("올바른 이메일 주소를 입력하세요.", () => {}); Debug.Log("이메일 유효성 X"); } } // 이메일 인풋을 선택했을 때 이메일이 유효하지 않았으면 텍스트를 초기화함 public void OnSelectEmail() { if (!_emailValid) { emailInputField.textComponent.color = Color.black; emailInputField.text = String.Empty; } } // 닉네임 글자 6자 초과하면 마지막 글자를 잘라서 6자로 만듬 public void OnChangeNickname(string nicknameText) { const int maxNicknameLength = 6; if (nicknameText.Length > maxNicknameLength) { // 글자수가 제한을 초과하면 처음 6글자만 남김 string limitedText = nicknameText.Substring(0, maxNicknameLength); nicknameInputField.text = limitedText; } } // 비밀번호 유효성 검사 public void OnChangeEndPassword(string passwordText) { // 비밀번호가 비어 있으면 검사하지 않음 if (string.IsNullOrEmpty(passwordText)) return; // 비밀번호 글자수 제한 확인 if (passwordText.Length < 6 || passwordText.Length > 18) { // 비밀번호 글자 수 제한 GameManager.Instance.panelManager.OpenConfirmPanel("비밀번호는 6자 이상 18자 이하로 입력해주세요.", () => {}); Debug.Log("비밀번호 글자 수 제한"); } } }