카테고리 없음

2025_05_15 TIL

chajungto0211 2025. 5. 15. 23:39
이 글은 평범한 취준생이 평범하게 자신이 당일 배운것들과 느낀점들을 쓰기 때문에 정보가 정확하지 않을 수 있습니다

아마 오늘부터는 TIl을 조금 짧게 쓸것 같다. 이제 팀 프로젝트 막바지인데 디버깅하느라 새로 배울 것도 거의 없고 늘 하던거의 반복된 내용을 옮긴거일 뿐이라서 그럴 것 같다. 일단 밑은 오늘 내가 한 일중 제일 힘들었던 작업이다.

 

탈출 미니게임 패널 수정

정확히는 이런 버그들이 있었다.

  • C를 한번더 누를 시에 없어져야 할 패널들이 사라지지 않음
  • 예/ 아니오 버튼 여부와 관계없이 무조건 실행되는 칼 획득 사건

일단, 여기서 고려해야할 점은 같은 NormalPanel을 사용하는 두 물체가 서로 다른 행동을 한다는 점이었다. 그래서, 다른 점을 살펴보았더니, 대사가 하나만 있는지 판별하는 함수가 하나에만 적용되어 있었다. 그래서 이를 그냥 부모 스크립트에 올려 모두가 사용할 수 있게 한 뒤에 해당 함수에도 적용시켜주었다. 밑은 해당 코드이다.

    //z키 Player일 경우 해당 오브젝트와 상호작용하기
    void OnSelect(InputValue value)
    {
        //대전제 : currentInteractObj는 null이 아님
        if(CurrentInteract != null && CurrentInteract.CanInteract)
        {
            CurrentInteract.Panel.OpenPanel();
            CurrentInteract.Panel.SetSentance(CurrentInteract.Talk);
            //여기서 NormalPanel을 사용하는 것만 고르기
            if (CurrentInteract.Panel is NormalPanel NP)
            {
                if(CurrentInteract is not GetKeyObject) CurrentInteract.FirstCheck();
            }
            ChangeInputToUI();
        }

        if (_talkBox.gameObject.activeSelf)
        {
            _talkBox.ProceedToNextDialogue();
        }
    }
using System.Collections.Generic;
using UnityEngine;

public abstract class Interactable : MonoBehaviour
{
    //임시로 SO로 받은 질문 리스트 => 어드레서블로 바꿀 예정
    public TalkList TList;
    //질문 딕셔너리
    public Dictionary<int, string> TDict = new Dictionary<int, string>();       

    public string Talk;                         //현재 질문 text
    public bool CanInteract;                    //상호작용 가능 여부

    protected int _tCount;                      //질문 개수
    protected int _currentCount;                //현재 실행한 질문의 개수

    public BasePanel Panel;                     // 각 Interactable에 맞는 패널

    private void Start()
    {
        Init();
    }

    //초기화 작업
    public virtual void Init()
    {
        //SO로 받은 질문 리스트를 Dictionary 대입
        for (int i = 0; i < TList.Talks.Count; i++)
        {
            TDict[i] = TList.Talks[i].Replace("\\n", "\n"); ;
        }

        //각 값들 초기 설정
        CanInteract = true;
        _tCount = TDict.Count;
        _currentCount = 0;
        Talk = TDict[_currentCount];
    }

    //다음 질문을 실행시켜주는 함수
    public virtual void DisplayNextTalk()
    {
        //질문이 끝나질 않을 경우 (더블 체크)
        if (!isTalkFinished())
        {
            _currentCount++;
            //질문이 끝나질 않을 경우
            if (!isTalkFinished())
            {
                Talk = TDict[_currentCount];
                Panel.SetSentance(Talk);
            }
            //0부터 시작하므로 1을 더해서 판별
            if (_currentCount + 1 >= _tCount)
            {
                CanInteract = false;
            }
        }
    }

    //총 질문 개수와 현재 질문 수가 일치하는지
    public virtual bool isTalkFinished()
    {
        return _currentCount == _tCount;
    }
    
    //원래 NormalObject에 있던 함수

    public void FirstCheck()
    {
        if (_currentCount + 1 >= _tCount)
        {
            CanInteract = false;
        }
    }
}