게임 프로그래밍을 하면서 확장 코딩 작업을 해야할 때 있는데

 

확장할 때 기존에 정상작동 하는 부분들은 그대로 동작하면서 확장시켜야 한다.

 

확장할 때마다 매번 새롭게 모든걸 작업할 수는 없는 노릇이니...ㅎㅎㅎ

 

그럴때 유용한 Try-Catch문이 있다! 오늘은 이 문법을 공부하면서 개발을 진행해보자.


1. 먼저 기존에 UI 작업 -> 새로운 확장 메서드 추가 -  ShowActionUI( )

    // 플레이어 턴 UI 표시
    public void ShowActionUI(System.Action attackCallback, System.Action moveCallback)
    {
        playerActionUI.SetActive(true);
        onAttackSelected = attackCallback;
        onMoveSelected = moveCallback;  
    }

 

이제는 UI 표시가 공격, 이동 뿐 아니라 스킬들 까지 추가해야 되서 오버로딩으로 메서드를 만들었다!

 // UI 표시 버튼 리스트 버전
 public void ShowActionUI(BasePlayer player, SkillManager skillManager,
 				System.Action attackCallback, System.Action moveCallback)
 {
     playerActionUI.SetActive(true);
     onAttackSelected = attackCallback;
     onMoveSelected = moveCallback;

     // 기존 스킬 버튼 삭제
     ClearSkillButtons();

     // 플레이어가 선택한 스킬 가져오기
     if (skillManager.playerSkills.TryGetValue(player, out List<Player_SkillData> selectedSkills))
     {
         foreach (var skill in selectedSkills)
         {
             CreateSkillButton(skill);
         }
     }
 }

 // 스킬 버튼 동적 생성
 private void CreateSkillButton(Player_SkillData skill)
 {
     GameObject newButtonObj = Instantiate(skillButtonPrefab, skillButtonParent);
     Button newButton = newButtonObj.GetComponent<Button>();
     newButton.GetComponentInChildren<Text>().text = skill.skill_Name; // 버튼 텍스트 설정
     newButton.onClick.AddListener(() => UseSkill(skill));
     skillButtons.Add(newButton);
 }


 // 스킬 버튼 삭제 (UI 초기화)
 private void ClearSkillButtons()
 {
     foreach (var button in skillButtons)
     {
         Destroy(button.gameObject);
     }
     skillButtons.Clear();
 }

 

ShowActionUI() 메서드를 확인하면 매개변수들을 추가한 확장된 메서드로 개발할려고 한다.


2. 호출받는 메서드 확인: StartPlayerTurn( )

    // 플레이어 턴 시작
    public void StartPlayerTurn()
    {
        playerActionUI.ShowActionUI(currentPlayer, skillManager, OnAttackSelected, OnMoveSelected);
        MouseClick();
    }

해당 UI 메서드는 플레이어의 턴이 시작되면 호출받는다. 

(MouseClick() 은 임의로 만들었던 마우스 클릭 메서드이다.)

 

이제 오버로딩으로 확장한 메서드를 테스트할 차례이다.


3. Try-Catch 문을 사용하기: StartPlayerTurn()

    // 플레이어 턴 시작
    public void StartPlayerTurn()
    {
        try
        {
            playerActionUI.ShowActionUI(currentPlayer, skillManager, OnAttackSelected, OnMoveSelected);
        }
        catch (System.Exception e)
        {
            Debug.LogWarning($"오류 발생: {e.Message}, 기본 UI를 호출.");
            playerActionUI.ShowActionUI(OnAttackSelected, OnMoveSelected);
        }
        finally
        {
            MouseClick();
        }
    }

 

try { } : 내부에 있는 코드를 실행해본다. 오류가 발생하지 않으면 정상적으로 작동한다.

catch { } : 오류가 발생하면 Catch문의 내용이 실행된다.

finally { } : try-catch문과 관계없이 항상 실행된다.


테스트 결과

try-catch문 결과

 

아직 UI 관련된 내용을 하이어라키에 만들지 않았으므로

오류가 발생하기 때문에 Catch문을 통해서 기존 UI 메서드로 실행된다.

 

개발함에 있어서 확장이라는 개념에서 기존에 정상작동 하는 기능들은 건들지 말아야 하기 때문에

유용한 방법 중 하나인 try-catch 문을 학습해 보았다!

+ Recent posts