이 글은 평범한 취준생이 평범하게 자신이 당일 배운것들과 느낀점들을 쓰기 때문에 정보가 정확하지 않을 수 있습니다
아마 오늘부터는 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;
}
}
}