3. 에러 코드 공부 AlertUI
오늘은 경고 ui 스크립트에 대해서 적어보겠습니다
에러 관련 ui 공부 openui 관련된 내용은 2장 참고
-키워드 : [Header("")],TMP_text
[Header("기본 에러 UI")]
[SerializeField] private Image _alertTitleImage; //경고 제목 이미지( 초록색 바)
[SerializeField] private TMP_Text _alertTitleText; // 텍스트 " 제목 "
[SerializeField] private TMP_Text _alertInfoText; //텍스트 "에러가 발생했습니다 타이틀 화면으로 돌아갑니다."
[SerializeField] private Button _customButton; //초록색창 확인 버튼
[Header("에러 세부 정보 관련 UI")]
[SerializeField] private GameObject _errorDetailGroup; // 전체 그룹
[SerializeField] private TMP_Text _errorDetailText; //텍스트 프로 가져올때 씀
[SerializeField] private Button _openDetailInfoButton; //에러 상세 정보
[SerializeField] private Button _closeDetailInfoButton; // 빨간색 창 닫기 버튼
public delegate void ClickConfirmButton();
private string _detailError;
에러
에러 세부 정보 관련 ui 선언
TMP_text 는 텍스트 프로를 부를때씀
-키워드 : 상세정보 버튼클릭시 코루틴 호출 , 에러 정보 비활성화
// 각 버튼에 기능을 할당하는 초기화 함수
public void Init()
{
_openDetailInfoButton.onClick.AddListener(() => StartCoroutine(OpenDetailGroup()));
_closeDetailInfoButton.onClick.AddListener(CloseDetailGroup);
_errorDetailGroup.SetActive(false);
}
코르틴은 별도의 스레드를 생성하지 않고 , 주 스레드에서 비동기 작업을 수행할 수 있게 해준다.
그말즉 1에서 2로 이동할떄 1사이에서 프로그램 없이 무슨 행동을 할수있게 해준다
AddListener 함수는 이벤트 함수속성중 하나이다.
-키워드 : 경고화면에 ! 버튼눌러서 상세 내용버튼
public void OpenAlertUI(string title,string infoText) {
_openDetailInfoButton.gameObject.SetActive(false);
_alertTitleImage.color = new Color32(61,138,0,255);
OpenUI(title, infoText, null);
}
에러 상세 정보 ! 버튼 상세정보 띄우는 화면
이컬러로 경고 메시지 띄우는 것
-키워드 : 제목 이미지 컬러
// 확인 시 알람 화면만 비활성화되는 '확인' 전용 UI
public void OpenAlertUI(string title,string infoText) {
_openDetailInfoButton.gameObject.SetActive(false);
_alertTitleImage.color = new Color32(61,138,0,255); // 경고 제목이미지 컬러
OpenUI(title, infoText, null); // 확인전용 ui 오픈하기위해서 선언
}
-키워드 : 오버로딩 , 안내 경고창
public void OpenWarningUI(string titleText, string infoText) {
OpenWarningUI(titleText, infoText, null);
}
public void OpenWarningUI(string titleText, string infoText, ClickConfirmButton clickConfirmButton) {
_openDetailInfoButton.gameObject.SetActive(false);
_alertTitleImage.color = new Color32(203,88,0,255);
OpenUI(titleText, infoText, clickConfirmButton);
}
오버로딩이라는 개념을 이용하고 있다.
똑같은 함수를 쓰지만 효율 적으로 쓸수있다. 다른곳에 함수를 불러쓸려면
a 패널은 openwarningui("a","b"); 이런식으로 갯수에 맞게 적으면 불러올 수있다.
-키워드 : 경고화면 , 보간기능
// '타이틀로' 버튼만 있는 경고 안내 UI 띄우는 함수
public void OpenErrorUI(string className, string functionName, Exception e) {
OpenErrorUI(className,functionName, e.ToString());
}
public void OpenErrorUI(string className, string functionName, string errorDetail) {
StaticManager.Backend.StopUpdate();
string error = $"{className} : {functionName}\n{errorDetail}";
Debug.LogError(error);
_alertTitleImage.color = new Color32(135,0,0,255);
_openDetailInfoButton.gameObject.SetActive(true); //에러 상세 정보 띄움
_detailError = error;
StaticManager.Backend.SendBugReport(className, functionName, errorDetail);
OpenUI("에러 발생!", "오류가 발생하였습니다.\n타이틀로 돌아갑니다.", GoTitle);
}
$"{className} : {functionName}\n{errorDetail}" 이 부분은 문자열 보간(String Interpolation)이라는 기능을 사용하고 있는데, 이는 문자열 안에 변수의 값을 직접 삽입할 수 있게 해줍니다.
문자열 보간에 대해서 잠시 설명하자면
string name = " 깡딱 "
string gtreet= $"안녕하세요 ,{name}님!";
이것이 보간 개념
-키워드 : 초록창 에러 텍스트
public void OpenErrorUIWithText(string title, string content) {
StaticManager.Backend.StopUpdate();
_alertTitleImage.color = new Color32(135,0,0,255); //경고 제목 이미지( 초록색 바)
OpenUI(title, content, GoTitle);
}
업데이트를 멈추고
경고 제목 이미지 색깔 바꿈
그리고 text 불러옴
-키워드 : delegate , 델리게이트 , 버튼속성
public delegate void ClickConfirmButton();
// 모든 안내 UI 띄우는 메인 함수
private void OpenUI(string titleText, string infoText,
ClickConfirmButton clickConfirmButton) {
gameObject.SetActive(true);
_alertTitleText.text = titleText; //텍스트 제목
_alertInfoText.text = infoText; //타이틀에 오류발생 텍스트
_customButton.onClick.RemoveAllListeners(); //초록색 창 확인 버튼
_customButton.onClick.AddListener(() => { // 초록색 창 확인버튼
CloseUI();
if (clickConfirmButton != null) {
clickConfirmButton.Invoke();
}
});
}
텍스트제목 타이틀 오류 발생시 넣는거
초록색
알아두면 좋은 버튼 속성
AddListener(): 이 메서드는 새로운 리스너(즉, 이벤트가 발생했을 때 호출될 메서드)를 onClick 이벤트에 추가합니다.
AddListener()의 파라미터로는 델리게이트 형식의 메서드가 들어갑니다.
RemoveListener(): 이 메서드는 특정 리스너를 onClick 이벤트에서 제거합니다.
RemoveListener()의 파라미터로는 제거하고 싶은 리스너 메서드가 들어갑니다.
RemoveAllListeners(): 이 메서드는 onClick 이벤트에 등록된 모든 리스너를 제거합니다. 파라미터는 필요하지 않습니다.
Invoke(): 이 메서드는 onClick 이벤트에 등록된 모든 리스너를 즉시 호출합니다. 이 메서드는 주로 테스트나 디버깅에 사용됩니다.
- 키워드 : 로그인 에러 텍스트
public void SetYetLoginErrorText() {
_alertTitleText.text += "(로그인 X)";
}
- 키워드 : UI패널 닫기
private void CloseUI() {
_openDetailInfoButton.gameObject.SetActive(false);
//에러 상세 정보 ! 버튼 비활성화
gameObject.SetActive(false);
//비활성화
}
에러 상세 버튼 비활성화 및 게임 오브젝트 들 전부다 비활성화
- 키워드 : UI패널 닫기
private void CloseUI() {
_openDetailInfoButton.gameObject.SetActive(false);
// //에러 상세 정보 ! 버튼 비활성화
gameObject.SetActive(false);
//비활성화
}
에러 상세정보 ( ! ) 버튼 비활성화 및 전체 컴포넌트 비활성화
- 키워드 : 버튼 클릭시 로그인화면으로 이동 , 페이드 기능
// 버튼 클릭 시, 페이드 기능과 함꼐 로그인화면으로 이동한다.
private void GoTitle() {
StaticManager.UI.SetLoadingIcon(false);
StaticManager.Instance.ChangeScene("LoginScene");
}
이 내용이 이해가 안되지만 일단 적음
StaticManager.UI.SetLoadingIcon(false);
이 코드를 보면, StaticManager라는 클래스의 UI라는 속성을 통해 SetLoadingIcon이라는 메소드를 호출하고 있습니다.
여기서 UI는 StaticManager 클래스 내에 정의된 UIManager 타입의 속성입니다. 즉, UI는 UIManager 클래스의 인스턴스를 참조하고 있습니다.
UIManager 클래스 내에는 SetLoadingIcon이라는 메소드가 있습니다. 이 메소드는 로딩 아이콘의 활성화 상태를 변경하는 역할을 합니다.
따라서, StaticManager.UI.SetLoadingIcon(false);라는 코드는 StaticManager 클래스의 UI 속성(즉, UIManager 인스턴스)를 통해 SetLoadingIcon 메소드를 호출하고 있습니다. 이를 통해 로딩 아이콘의 활성화 상태를 변경하고 있습니다.
이해를 돕기 위한 예시로, 만약 StaticManager가 하나의 건물이라면, UI는 그 건물의 한 층(즉, UIManager 인스턴스)을 나타내고, SetLoadingIcon은 그 층에 있는 특정한 방(즉, 메소드)을 나타내는 것입니다. StaticManager.UI.SetLoadingIcon(false);라는 코드는 그 방의 문을 열고(즉, 메소드를 호출하고) 그 안에서 일을 처리하는 것(즉, 로딩 아이콘의 상태를 변경하는 것)과 같습니다.
-키워드 : 코루틴 수행내용
IEnumerator OpenDetailGroup() {
_errorDetailGroup.SetActive(true);
_errorDetailText.text = _detailError;
//text에서 길이를 측정하고 적용하기까지 한번의 Update가 호출되어야한다.
yield return new WaitForFixedUpdate();
float textHeight = _errorDetailText.rectTransform.rect.height;
float textParentHeight = _errorDetailText.transform.parent.GetComponent<RectTransform>().rect.height;
// 내용이 적을 경우, 가운데 정렬 / 내용이 많을 경우 위에서부터 4~5줄만 보이게 정렬
if (textHeight > textParentHeight) {
_errorDetailText.rectTransform.pivot = new Vector2(0.5f, 1);
_errorDetailText.rectTransform.anchorMax = new Vector2(0.5f, 0.9f);
}
else {
_errorDetailText.rectTransform.pivot = new Vector2(0.5f, 0.5f);
_errorDetailText.rectTransform.anchorMax = new Vector2(0.5f, 0.5f);
}
//정렬한 후 수정되는 포지션 원위치
_errorDetailText.rectTransform.anchoredPosition = new Vector2(0, 0);
}
// 2023년 11월 22일 21:43분 경고화면까지
// 2023년 11월 23일 12:08분 로그인 에러 텍스트까지
// 2023년 11월 23일 16:16분