
https://learn.microsoft.com/ko-kr/dotnet/csharp/misc/cs0101

언리얼 엔진의 플러그인이란, 개발자가 프로젝트 단위로 에디터 내에서 활성화/비활성화 할 수 있는 코드 집합이다. 기존에 C++로 개발했던 언리얼 프로젝트에 Gameplay Abilities 플러그인을 활성화하였으나, cs0101 에러가 발생했다.
우선 해당 에러는 Target.cs 파일과 Target.Editor.cs 파일에서 발생했다. 해당 C# 파일은 언리얼 빌드 툴(UBT)이 빌드할 때 참고하는 설정 파일이다. 해당 파일 내에 사용하는 엔진 버전이나, 어떤 실행파일로 빌드할지 = 타겟(게임, 서버, 에디터)를 기재해주면 UBT가 해당 내용을 읽는다.
cs0101 에러는 이미 네임스페이스에 type에 정의가 포함되어있다는 에러이다. 즉, 같은 네임스페이스를 쓰는 코드 내에서 같은 이름으로 클래스를 만들어서 컴파일러에서 식별이 안된다는 뜻이다.
지피티에게 물어보니 .NET SDK가 9.0이라서 그렇다는 둥, 임시 생성 파일을 모아두는 폴더인 Intermediate 폴더를 지우라는 둥 여러 해결책을 주었다. .NET SDK를 8.0으로도 바꿔보고, 빌드 후 생성되는 폴더 & sln 파일을 모두 지우고 빌드도 해보고, AppData에 UBT 캐시 폴더를 지우고도 빌드해봤지만 모두 도움이 되지 못했다.

에러가 발생한 파일을 돌이켜보자. Target.cs 파일과 Target.Editor.cs 파일이다. 결론은 해당 파일들의 경로가 문제였다.
언리얼 엔진의 경우 프로젝트 생성 시 blueprint 프로젝트로 생성할 것인지, C++ 프로젝트로 생성할 것인지 옵션이 있다. 중간에 blueprint 프로젝트로 생성하고 추후 C++ 프로젝트로 확장할 수 있는데, 그럴 경우 주 게임 모듈 폴더 내에 Target.cs 파일과 Target.Editor.cs 파일이 위치한다.

하지만 C++ 프로젝트에서 UBT가 해당 파일들의 위치를 찾으려면 루트 폴더 내에 위치해야한다. 아니라면, UBT가 C++ 프로젝트가 아니라고 인식하고 Intermediate/Source 내에 임시 cs 파일들을 생성해주기 때문이다. 이것 때문에 임시 cs 파일과 기존 cs 파일이 같은 클래스 네임을 가지고 있어, 네임스페이스 오류가 발생한것이다.

한줄요약 : Target.cs 파일과 Target.Editor.cs 파일을 Source 디렉터리로 옮겨주면 해결된다.
그렇다면, 기존에도 C++을 사용하는 프로젝트였는데 왜 오류가 안나고 제대로 UBT에서 cs 파일을 인식했을까? 지피티에게 물어보았다.

플러그인 추가 시 UBT가 빌드 그래프를 다시 생성한다고 하는데, 어떤 것인지는 잘 모르겠지만 이때 source 디렉터리에 cs 파일이 없어서 C++ 프로젝트로 인식을 못한 것이라고 한다. 이전에는 이미 cs 파일의 위치를 스캔해서 기존 target 정보가 있는 상태이기 때문에 정상적으로 동작했을 것이다 .. 라고 하더이다. 추후 빌드 그래프에 대해 공부해보면 좋을 것 같다.