무엇인가를 생성하는 것을 어떻게 하면 단순화 할 수 있을까...
에 대해 이런 저런 고민을 하고 있었다.
왜냐면 코드중에 이런 막짜가 있기 때문인데
보다시피 string 으로 분기하여 무슨 일을 할 지 (건물을 만들지, 에어컨을 만들지, 터렛을 만들지...)를 정해주고 있다.
당연히도 객체지향적으로
'빌딩, 에어컨, 터렛을 어떤 IConstructable 같은 인터페이스나 상위 클래스로 묶어주는 식으로 처리하면 되겠군..'
하는 생각을 하다가 뭔가 뭔가 중간과정만 자꾸 만드는 것 같아서 고민을 좀 해봄.
그러다 떠오른 생각이
'게임의 모든 정보들이 고유한 이름을 가지면, 이름과 클래스타입을 정의하는 딕셔너리 하나로 모든 상속구조를 해쳐나갈 수 있겠다'
이게 뭔 개소리냐면
우리가 보통 '오크'라고 하면 '뛰어댕기는 몬스터 오크' 를 생각하지 아이템으로서의 오크나 무기로서의 오크를 생각하진 않을 것이라는 것이다.
즉, 우리가 쓰는 일상어에 이미 해당 클래스의 타입이 어느정도 정해져 있다는 것이다.
그러면 다음 테이블만 하나 별도로 존재하면 된다!
[이름-타입 테이블]
"오크"/몬스터
"참피"/몬스터
"지구인"/사람
"엑스칼리버"/아이템
"콘페이토"/아이템
이 테이블이 있다면, 간단하게
SpawnEntity ("오크", vector2(10,20));
한줄만으로 뭘 만들어야 할지 컴퓨터에게 시킬 수 있게 된다.
컴퓨터는 "오크"라는 이름이 '몬스터' 타입인 것을 저 테이블을 통해 알 수 있으므로
위 코드를 해석하여 (분기하여) SpawnMonster()를 호출할 수 있다는 것.
개발자가 무언가를 '간단하게 명령할 수 있다' 는 것은 강력하다.
이 방법의 문제는 같은 이름이 2곳에서 사용될 수 없다는 것.
'엑스칼리버' 라는 이름의 몬스터와 무기, 지명이 동시에 존재할 수 없다.
게임이 굉장히 커지다보면 이름-타입 테이블에서 충돌이 일어날 수 있을 것 같기도 한데 (mmo급)
인디 스케일에서는 어지간해서는 괜찮을 것 같기도 하다.
지금 쓰고 있는 아이템 템플릿인데, 여기 들어있는 Type 이 Name-Type 테이블의 정보로 사용될 수 있을 것 같다.
비슷한 생각을 해봤거나
잘못된 생각이라 생각하는 게이는 댓글 좀 달아줘.
(야근하고 난 후 갑자기 든 생각이라 뻘소리일 확률 90% 이상임.)
유니티에서 태그라고 사용하는거랑 동일한 목적 같네요 - dc App
그리고 키 충돌의 경우 타입+이름+계층 같이 이름에 속성을 담으면 충돌할일이 없을거같은데 M오크1 이런식으로여 스크립트상으로만 사용할거면 이 키를 해쉬함수로 정수로 만들면 더 편할거구요 - dc App