[Unity] Project. DayLight_8

Lingtea_luv·2025년 6월 26일

Project

목록 보기
34/38
post-thumbnail

Project. DayLight


오전에는 빌드 테스트를 진행했다. 일주일 만에 처음 빌드를 해서 걱정이 많았는데, 역시 첫 시도에 빌드가 되는 기적은 일어나지 않았다.

  1. 사용하지 않는 namespace 정리
  2. 어셈블리 설정 변경 -> 이후 삭제

문제는 크게 2가지였는데, 참조할 수 없는 namespace 오류와 Assembly 선언으로 Editor 폴더의 파일도 함께 빌드되는 오류였다.

namespace의 경우 외부 메서드를 사용할 때 자동으로 추가해주는 기능이 문제였던 것 같다. 사용하고자 하는 namespace가 아닌 엉뚱한 namespace를 가져와 빌드 과정에서 오류가 난 것인데, 이후로 사용하지 않는 namespace를 정리하는 작업을 통해 해결했다.

Assembly 선언의 경우 에셋을 사용하기 위해 선언한 Assembly에 빌드 과정에서 Editor 폴더 파일을 예외처리 해주는 코드를 작성하지 않아서 생긴 문제로 보였다. 하지만 여러 시도 끝에 결국 Assembly를 삭제하는 것으로 결정됐고, 일부 에셋을 다른 것으로 대체하기로 했는데 다행히 없어도 잘 작동돼서 그대로 빌드하는 것이 가능했다.

작업 완료 기능

  1. 튜토리얼 문 상호작용 기능 추가
  2. 플레이어 프리팹 생성(통합)
  3. 맵 Nav Mesh Bake
  4. 크래프팅 기능 마무리, UI 연동 확인
  5. 팝업 창 기능 마무리, UI 연동 확인
  6. 투척 무기 구현

작업 중 기능

  1. 카메라 offset 기능 구현
  2. 몬스터 공격 로직 수정
  3. 개별 아이템 루팅 기능 구현
  4. 투척 무기 궤적, 모션 연동
  5. 빌드 테스트, 프로토타입 구현

공유 코드

CSV 파일에서의 개행

지금까지 CSV 파일을 읽어오고, 데이터를 바탕으로 S.O나 문장으로 팝업창에서 출력하는 기능들을 구현했다. 여기서 주의할 점이 있는데, 바로 개행이다.

기본적으로 CSV 파일은 하나의 row(행)가 단일 데이터 그룹으로 묶이기 때문에, 문서에서의 개행 즉 줄바꿈은 데이터의 추가를 의미한다. 하지만 만약 대사가 인게임에서 줄을 바꾸어 출력이 되어야할 때 이 경우 해당 대사를 어떻게 작성해야할까?

우선 개발자의 입장에서 말하자면 단순히 줄바꿈을 표시해주는 문자열이 있으면 된다. 예를 들어 이스케이프 시퀀스를 활용하여 \n을 개행 표시로 사용한다고 가정해보자.

나는 가끔\n눈물을 흘린다.

물론 유니티에서 CSV 파일을 변환할 때 string으로 작업하기 때문에 실제 이스케이프 시퀀스가 작동하지는 않지만, 이를 실제로 이스케이프 시퀀스로 바꿔주는 작업을 해주면 작동이 된다.

string str = "";
str += parts[2].Replace("\\n", "\n");

parts[2] 는 위의 문자열을 의미하고, 위의 코드는 단순 문자열 \n을 실제 이스케이프 시퀀스에 해당하는 \n 으로 바꿔주는 것이다.

따라서 이를 출력하게 되면 다음과 같다.

나는 가끔
눈물을 흘린다. 

다만 굳이 \n일 필요는 없다. 결국 약속한 문자열을 \n 개행 이스케이프 시퀀스로 바꿔주는 작업을 하기 때문에 사용하지 않는 |을 써도 동일한 결과를 얻게된다.

string str = "";
str += parts[2].Replace("|", "\n");

if UNITY_EDITOR

빌드 테스트 과정에서 생긴 오류를 다루다가 전처리기에 대해 확실히 이해한 내용이 있다.
일단 전처리기가 포함된 임시 클래스가 있다고 가정해보자.

public class Temp
{
	private void Awake()
    {
    	Init1();
        Init2();
    }

#if UNITY_EDITOR
	private void Init1()
	{
		...
	}
#endif

	public void Init2()
	{
		...
	}
}

여기서 3가지 질문을 통해 이 녀석의 동작 원리를 이해할 수 있다.
1. Editor에서 호출할 수 있는 메서드는?
2. Editor 내의 런타임 중에 Awake()에서 호출하는 메서드는?
3. 빌드 파일에 Awake()에서 호출되는 메서드는?

1번부터 살펴보면 Editor에서 호출할 수 있는 함수는 전처리기와 상관이 없다. 그냥 public으로 선언되어있는 메서드는 모두 호출할 수 있다.

2번의 경우 Editor내에서 실행 중에는 전처리기에 포함된 메서드까지 호출이 되기 때문에 Init1Init2 모두 호출된다.

마지막으로 3번은 전처리기에 포함된 메서드가 실제로 호출이 되도록 구현된 경우 애초에 빌드 자체가 안 된다. 그 이유는 빌드 시에 전처리기에 포함된 코드들은 제거가 되어 호출 과정에서 컴파일 에러가 나기 때문이다.

따라서 런타임에 사용되지 않는 메서드에 한정하여 전처리기로 감싸고, 이를 public으로 선언을 하여 Editor에서만 호출을 할 수 있도록 하는 것이 바람직하다.

이를 참고하여 가장 이상적인 구조를 작성한다면 다음과 같다.

public class Temp
{
	private void Awake()
    {
        Init2();
    }

#if UNITY_EDITOR
	public void Init1()
	{
		...
	}
#endif

	private void Init2()
	{
		...
	}
}

위에서 소개한 것처럼 CSV 파일에서의 개행이나 전처리기는 굉장히 사소해보이지만, 에디터 내의 런타임 환경과 빌드 환경의 차이를 보여주는 예시이다. 둘을 확실히 구분하고 현재 환경에서 어떤 코드가 포함되고 호출되는지 파악하고 있는 것은 프로젝트의 안정성을 위해서 도움이 될 것이라고 생각한다.

profile
뚠뚠뚠뚠

0개의 댓글