03/26 본캠프 #64

guno park·2024년 3월 26일
1

본캠프

목록 보기
64/77

람다식

엊그제 람다식을 사용해보고 있다고 작성했는데, 코드 작성에는 편리하고 좋으나, 다른 사람들과 협업할 때 알아보기 힘들것 같다는 생각이 들어 협업 시에는 최대한 정형화된 코드 컨벤션을 지켜 작업하도록 유념하며 작업해야겠다는 생각이 들었다.

대화 시스템 넘김 버튼 수정

어떻게 할까 고민하다가, 스킵 버튼과 확인 버튼이 On/off 되는 시점이 있는데, 그 부분에 Chatwindow의 버튼에 메서드를 구독/취소 해주는 방식으로 변경해보았더니 시중에서 보는 게임에서처럼 활용 가능하였다.

Place DB 구성

초안은 각 장소마다 0~9까지 ID가 배정되었지만, 한 장소 내에서도 이동할 수 있는 곳들이 분기되므로, 3자리 수로 다시 ID를 구성하였다.

첫번째 자리는 가장 큰 구획으로 구분하며, 다음으로 넘어갈수록 작은 구획이다. 3자리 수라고 하긴 했지만, 각 자리가 규격 외로 늘어나도 아마 Path와 Name을 활용하기 위한 값일 뿐, 직접 달아주는 작업으로 안정성을 보강할 예정이다.

오브젝트 캔버스에서 관리 방법

어제는 아이템에 관한 관리를 정리하였고, 이번에는 NPC에 관한 방법을 생각해보았다.

아이템은 만들어진 List의 idx로 관리하는 방법을 취해도 된다. 해당 위치의 캔버스에서 타입에 따라 사용되었을 때 더 이상 등장하지 않아야되거나, 계속 등장하거나 하는 것은 간단하게 처리가 가능하다.

하지만 NPC는 똑같은 개체라도 장소에 따라 조건이 달라진다. 또 시간대에 따라 등장 여부가 달라지기에 저장해서 관리하는 것보다 자체적으로 On/Off할 수 있도록 변경해주었다.

[SerializeField] private bool[] check = new bool[3];
  //시간대에 따라 On할것인지 OFF할것인지 결정.

  protected override void Start()
  {
      base.Start();
      
      GameManager.Instance.OnDayTimeChange += onoff;
  }

  void onoff()
  {
      if (check[(int)GameManager.Instance.Playerinformation.dayTime])
      {
          gameObject.SetActive(true);
      }
      else
      {
          gameObject.SetActive(false);
      }
  }

간단하게 DayTime이라는 값이 변경 될 때, On/Off에 관한 메서드를 실행 시킨다.
이 메서드는 현재 객체의 bool배열에 설정된 값(시간대)을 이용하여 알아서 오브젝트를 켜고 끈다.

이렇게 할 경우 NPC에 관해 저장할 내용을 줄일 방안도 고민해보아야 할 것이다.

클로저 문제 (Closure)

출처: https://doublsb.tistory.com/73 [더블즈비의 기묘한 공방:티스토리]

클로저(Closure)란, 외부 변수나 필드와 같은 '환경'을 저장하고 있는 함수이다.
람다식을 사용해 전달할 때, 외부의 변수나 필드를 사용하는 경우 클로저로 처리된다.

for (int i = 0; i < interactList.Length; i++)
	{
	int a = i; //TODO : 임시 테스트용 나중에 변경할 것.
	interactableItem.gameObject.GetComponent<Button>().onClick.AddListener(()=> StateChange(a));
	}

위 식에서 int a가 들어가지 않고 i가 매개변수로 직접 들어가게 된다면, 이 메서드는 i를 클로저로서 처리하며 이 변수 자체를 값이 아닌 참조형태로 저장하게 된다.

버튼 이벤트의 경우 이 반복문 외부에서 실행되기에 i=Length+1로 저장되어 있다.

따라서 for문 안에서 람다식으로 매개변수를 전달하고 싶다면 매번 새롭게 값을 고정할 수 있는 객체를 만들어 참조하도록 하면 의도하는 기능을 만들 수 있다.

0개의 댓글