Files
M-Gameton-06/Gameton-06/Assets/Gameton/Scripts/UI/CharaterCreateUI.cs

172 lines
6.3 KiB
C#

using System.Collections;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using TMPro;
using UnityEngine;
using UnityEngine.Assertions;
using UnityEngine.UI;
namespace TON
{
public class CharaterCreateUI : UIBase
{
[SerializeField] private Button cancelButton; // cancel 버튼 참조
[SerializeField] private Button confirmButton; // cancel 버튼 참조
[SerializeField] private Button createButton; // Create 버튼 참조
[SerializeField] private List<PlayerData> playerDatas;
[SerializeField] private TextMeshProUGUI nicknameCondition;
public TMP_InputField nicknameInputField;
public GameObject characterCreateUI_Modal;
public GameObject blackCat_Spotlight;
public GameObject whiteCat_Spotlight;
private string selectedCharacter; // 선택한 캐릭터의 타입 저장 (예: "MaleCat", "FemaleCat")
private void Start()
{
playerDatas = PlayerDataManager.Singleton.playersData;
// 처음에는 버튼을 비활성화
createButton.interactable = false;
// 입력 필드가 할당되지 않았다면 현재 게임 오브젝트의 InputField 컴포넌트를 가져옵니다.
if (nicknameInputField == null)
{
nicknameInputField = GetComponent<TMP_InputField>();
}
// 입력 필드의 문자 확인 이벤트에 메서드 연결
nicknameInputField.onValidateInput += ValidateInput;
}
public void SelectCharacter(string characterType)
{
selectedCharacter = characterType;
createButton.interactable = true; // 캐릭터가 선택되면 버튼 활성화
switch (characterType)
{
case "BlackCat":
blackCat_Spotlight.SetActive(true);
whiteCat_Spotlight.SetActive(false);
break;
case "WhiteCat":
blackCat_Spotlight.SetActive(false);
whiteCat_Spotlight.SetActive(true);
break;
}
}
public void OnClickCreateButton()
{
if (string.IsNullOrEmpty(selectedCharacter))
{
// 캐릭터 선택되지 않은 상태에서 버튼 동작 되지 않도록 적용
return;
}
// 선택된 캐릭터 인덱스 정보를 저장 (다음 씬에서도 사용할 수 있도록)
PlayerPrefs.SetInt("SelectedPlayerIndex", playerDatas.Count);
// 캐릭터 이름 입력 모달 활성화
characterCreateUI_Modal.SetActive(true);
}
private char ValidateInput(string text, int charIndex, char addedChar)
{
// 영문 대소문자만 허용 (A-Z, a-z)
if (Regex.IsMatch(addedChar.ToString(), @"^[a-zA-Z]+$"))
{
return addedChar;
}
// 영문 이외의 문자는 무시
return '\0';
}
// 추가 옵션: 기존 텍스트에 영문 이외의 문자가 있다면 제거하는 메서드
public void RemoveNonEnglishCharacters()
{
string englishOnly = Regex.Replace(nicknameInputField.text, @"[^a-zA-Z]", "");
nicknameInputField.text = englishOnly;
}
public void OnClickConfirmButton()
{
TMP_InputField characterName = characterCreateUI_Modal.GetComponentInChildren<TMP_InputField>();
string nickname = characterName.text.Trim();
// 입력 값 검증
if (string.IsNullOrEmpty(nickname) || nickname.Length > 12)
{
// 닉네임은 비어있을 수 없고, 12자 이내로만 생성 가능
return;
}
// 캐릭터 생성 및 취소 버튼을 비활성화 처리
cancelButton.interactable = false;
confirmButton.interactable = false;
// 서버에 닉네임을 추가로 업데이트 한다.
BackendManager.Singleton.ChangeNickname(nickname, (success, message) =>
{
// UI 업데이트 (메인 스레드에서 실행)
UnityMainThreadDispatcher.Instance().Enqueue(() =>
{
if (success)
{
// 생성한 캐릭터를 저장한다
PlayerData player = new PlayerData(playerDatas.Count, selectedCharacter, nickname);
playerDatas.Add(player);
Assert.IsTrue(JSONLoader.SaveUpdatedJsonToPersistentData(playerDatas, "player"));
PlayerDataManager.Singleton.SetCurrentUserData();
// 하트 시스템을 생성한다
HeartDataManager.Singleton.CreateNewHeartSystem(playerDatas.Count);
HeartDataManager.Singleton.SetCurrentUserHeart();
// 씬 변경
UIManager.Hide<CharaterCreateUI>(UIList.CharaterCreateUI);
Main.Singleton?.ChangeScene(SceneType.Lobby);
}
else
{
// 닉네임 중복체크
if (message.Equals("409"))
{
DuplicateNickname();
}
else
{
Debug.LogError("서버 오류 :: 캐릭터 닉네임 저장 실패");
}
cancelButton.interactable = true;
confirmButton.interactable = true;
}
});
});
}
private void DuplicateNickname()
{
nicknameCondition.text = "이미 사용중인 이름입니다.";
nicknameCondition.color = Color.yellow;
}
public void OnClickCancelButton()
{
// 캐릭터 이름 입력 모달 비활성화
characterCreateUI_Modal.SetActive(false);
TMP_InputField characterName = characterCreateUI_Modal.GetComponentInChildren<TMP_InputField>();
characterName.text = "";
}
}
}