본문 바로가기

로그라이크

몬스터를 아스키 코드로 표시하기

이번 장에서는 몬스터 오브젝트의 뷰를 만들 차례입니다. 몬스터도 플레이어 처럼 하나의 아스키 코드로 표현 됩니다. 몬스터의 알파벳 첫글자를 따서 'M'이라고 하도록 하죠. 잠깐 몬스터 뷰를 개발하기 전에 유니티의 '프리팹'이라는 것에 대해 잠깐 알아보고 가도록 하겠습니다.(이미 잘 알고 계신다면 그냥 넘어 가셔도 괜찮습니다)


프리팹?

유니티 게임 오브젝트를 인스턴스화 하는 방법은 두가지가 있습니다. 하나는 프로그래밍적으로 코드를 사용하여 인스턴스를 만드는 것이고, 다른 하나는 에디터상에서 미리 만들어진 프리팹을 로딩하는 것입니다. 프리팹을 사용 했을시 코드 상으로 최소 몇줄 이상 되어야 하는 코드들을 한줄로 줄일 수 있고, 런타임에 속성들을 변경하여 테스트 해볼 수 있습니다.

  • 프리팹은 내부적으로 하나( 혹은 이상)의 게임 오브젝트 또는 컴포넌트가 시리얼라이즈 된 데이터 스트림입니다. 
  • 프리팹의 개념은 에디터에만 존재하며 프리팹의 수정은 유니티 빌드 시 일반 시리얼라이즈 스트림으로 저장됩니다.
  • 프리팹이 인스턴스화 되어 게임 오브젝트화 되면 에디터에서는 해당 게임 오브젝트가 프리팹이었는지 오리지널 게임 오브젝트였는지에 대한 구분이 없습니다.


플레이어와 몬스터가 같이 사용할 뷰 프리팹 만들기 
몬스터 뷰와 플레이어 뷰는 단지 아스키 코드 하나로 표현 됩니다. 두 뷰간엔 @를 그려 주느냐 M을 그려주느냐 외에는 별다는 차이가 없습니다. 그렇다면 매번 오브젝트가 생길때 마다 새로운 뷰를 만들어 줄것이 아니라 프리팹으로 만들어 놓고 필요 할때 마다 표시되는 아스키 코드만 바꿔서 사용할 수 있도록 만들어 보겠습니다.

이전 장에서 만들었던 Hierachy 탭의 PlayerView를 몬스터와 플레이어가 공통으로 사용할수 있을 만한 이름인 ObjectView로 수정합니다. Project 탭에 Resources 라는 폴더를 만듭니다. 'Resources' 폴더는 유니티에서 특별한 의미를 가지며 어플리케이션이 런타임에 로드해야하는 리소스들을 담고 있습니다. 우리는 ObjectView 게임 오브젝트를 Resources 폴더 드래그 앤 드롭해서 프리팹화 시키고 오브젝트의 뷰가 필요할 때 마다 로딩해서 쓸 예정입니다.

Resoruces - http://docs.unity3d.com/ScriptReference/Resources.html

    • Assets 폴더 밑 어느 곳에라도 Resources 폴더를 만들고 asset들을 넣어두면 Resources.Load 함수를 이용하여 런타임에 해당 리소스를 로딩할 수 있습니다.
    • 필자는 처음에 이 Resources 폴더를 어디에 두어야 할지 한참을 고민했었는데 그냥 Assets 밑에 아무곳에나 두어도 상관 없습니다.

이제 Hierarchy 탭의 ObjectView를 프로젝트 탭의 Resources 폴더로 드래그 앤 드롭 합니다.

그리하면 위와 같이 ObjectView는 파란색으로 변하고 Resources 폴더 밑에 프리팹이 생성되었습니다. 이게 전부 입니다. 'Hierarchy 탭에 있는 게임 오브젝트를 Project 탭으로 이동'하면 프리팹이 생성 됩니다. 이렇게 프리팹이 완성 되었습니다. 그럼 이제부터는 프리팹을 로딩하는 스크립트를 작성해 보도록 하겠습니다.


PlayerView.cs 스크립트도 ObjectView.cs로 이름을 변경합니다. 그리고 무엇 보다 먼저 먼저 클래스 이름을 PlayerView에서 ObjectView로 이름을 변경합니다. 유니티에서는 MonoBehaviour를 상속받는 클래스가 파일의 이름과 다르다면 실행시 해당 객체를 제대로 인스턴스화 시키지 못합니다(http://kukuta.tistory.com/180 참고).

이제 프리팹을 로딩하는 함수를 작성해 보도록 하지요. 위에서 'Resources' 폴더에 들어 있는 asset은 Resources.Load 함수를 통해 로드 할수 있다고 이야기 했습니다.

위 Create 함수는 Resources 폴더에서 프리팹을 로드하여 인스턴스화 한 후, ObjectView 혹은 ObjectView를 상속 받은 클래스 객체를 리턴합니다. 우리가 프리팹으로 만들었던 ObjectView 게임 오브젝트는 사실 Text 외에는 아무런 정보도 가지고 있지 않습니다. 그래서 실제 컨트롤을 위해 ObjectView 클래스를 AddComponent함수를 통해 게임 오브젝트에 추가합니다.


이제 MonsterData 클래스에 뷰를 생성하는 부분을 추가 해봅시다.

MonsterData 클래스에 ObjectView 변수를 추가하고 생성자에서 표시될 텍스트와 컬러를 지정했습니다. 그리고 SetPosition 함수에서는 ObjectView의 좌표를 지정하는 부분을 추가하였습니다. 우리는 이미 이전 장에서 MonsterManager를 통해 몬스터 데이터를 생성하는 부분을 만들어 놓았으므로 플레이모드를 실행하게 되면 화면상에 플레이어를 나타내는 녹색 '@'과 몬스터를 나타내는 붉은색 'M'을 볼수 있습니다.


Player 클래스도 동일하게 ObjectView 변수를 추가하고, 생성자에서 텍스트와 컬러를 지정하며, SetPosition함수에서 ObjectView의 위치를 조정할 수 있도록 변경하도록 합니다.

유익한 글이었다면 공감(❤) 버튼 꾹!! 추가 문의 사항은 댓글로!!