마인크래프트 모딩 튜토리얼:기본적인 아이템 만들기
마인크래프트 모딩 튜토리얼:기본적인 아이템 만들기
엔티머입니다. 이번엔 내 모드에 아주 간단한 아이템을 만들어 볼겁니다. 아무런 기능도 없는 기타 아이템이죠.
자 그럼 기본적인 아이템 추가 과정을 간단히 요약해 보죠.
1. Item클래스를 상속받는 기반 클래스를 만든다. 이 클래스는 아이템의 이름, 리소스 경로 등 정보를 저장한다.
2. 아이템 객체를 생성하고 게임에 등록하는 함수를 가진 클래스를 만든다.
3. 게임에 아이템을 등록해주는 함수 일부를 모드 메인 클래스 preInit()에서 호출한다.
4. 게임에 아이템을 등록해주는 함수 일부를 proxy클래스에서 호출한다. 당연히 프록시도 모드 메인 클래스에서 호출되어야 한다.
5. 해당 아이템의 json파일과 텍스쳐 파일을 특정 경로에 저장한다.
6. ㄲㅡㅌ!
일단은 이정도입니다. 복잡해보여도 그리 복잡하지 않습니다. 제가 장황하게 늘어놔서 그래 보일 뿐. 사실 마인크래프트 모딩은 체계가 잘 잡혀있어서 기능없는 아이템, 블록 추가쯤은 자바를 몰라도 따라만 하면 만들수 있는 수준입니다.
자 그럼 먼저 텍스쳐를 준비하겠습니다. 테스트용 아이템으로 한번 철 막대(Iron Stick)을 만들어 보죠. 마크의 텍스쳐 크기는 16의 배수여야 합니다. 16*16, 32*32, 64*64 처럼 말이죠. 기본적으로 16*16이니 저도 16*16을 쓰겠습니다. 뭐 고급 텍스쳐를 원한다면 얼마든 높여도 상관 없습니다.
위 그림처럼 텍스쳐가 완성되었습니다. 참고로 무조건 png 파일이여야 합니다. 이건 그냥 추천인데 전 텍스쳐를 pain.net이란 프로그램으로 그립니다. 무료고 투명배경 등 기능도 적절해서 사용합니다. 아무튼 만든 텍스쳐는 "모드폴더/src/main/resources/assets/모드ID/textures/items"에 저장합니다. 없는 폴더는 만드세요. 저같은 경우 "Tutorial Mod/src/main/resources/assets/tutorialmod/textures/items"가 되겠네요.
자 그럼 위의 스크린샷처럼 아이템 기반 클래스를 만들어야 합니다. 아이템 클래스는 Item을 상속받아야 하고 현지화되지 않은 이름(Unlocalized Name)과 등록이름(Registry Name)을 설정해야 합니다. 이름 설정은 this.setUnlocalizedName(), this.setRegistryName()함수로 해결합니다. 마지막으로 우리는 크리에이티브 탭이 있으니 this.setCreativeTab()으로 크리탭을 정해 줍니다.
그럼 이제 아이템을 게임에 등록하는 함수를 가진 클래스를 만들어 봅시다. 이 클래스는 init(), register(), registerItem(Item item), registerRenders(), registerRender(Item item)이렇게 총 5개의 함수로 이루어집니다. 주석 1과 init()은 아이템의 객체를 생성하는 부분입니다. register()는 게임에 등록할 아이템들을 registerItem(Item item)에다 넘기는 부분이고요. registerRenders()는 registerRender(Item item)에 넘겨 모델을 불러오는 부분입니다.
이제 실제 추가를 해봅시다. 먼저 "public static Item 아이템이름"으로 아이템 객체를 생성해줍니다. 그리고 init() 안에서 ironStick객체를 초기화 해줍니다. 이때 우리가 만든 아이템 기반 클래스(ItemBase)를 사용합니다. 왜냐면 철막대는 기능없는 일반 아이템이고 ItemBase는 그런 아이템을 위한 클래스이니까요. 그 다음 register()안에서 registerItem()을 호출하는데, 매개면수로 ironStick을 넘깁니다. 그럼 게임 ironStick이란 아이템이 등록되죠. 마지막으로 registerRenders()에서 registerRender()를 호출하며 ironStick을 매개변수로 넘겨줍니다. 그럼 아이템의 모델도 등록됩니다.
이제 CommonProxy클래스에 registerRenders()란 함수를 만든 뒤, ClientProxy에선 그걸 오버라이드 해서 아이템 등록 클래스의 registerRenders()를 호출합니다.
그 다음 모드 메인 클래스에의 preInit()안에 아이템 등록 클래스(TMItems)의 init()과 register()를 호출합니다. init이 꼭 앞에 와야 합니다. 그리고 프록시의 registerRenders()도 마지막 부분에 호출합니다.
이제 실행해서 보면 텍스쳐가 없고, 이름이 현지화되지 않은 ironStick을 볼수 있습니다. 이름이야 아직 현지화를 하지 않았으니 그렇다 치고 왜 텍스쳐가 없을까요? 1.8버전 이상의 마크는 텍스쳐를 바로 찾지 않고 json파일을 찾아가기 때문입니다. 우리는 json파일을 만들지 않았으니 찾지 못한 것이고 미싱 텍스쳐가 뜨는 거죠.
그럼 "모드폴더/src/main/resources/assets/모드ID/models/item"에다가 ironStick.txt파일을 만드세요.models 폴더는 json파일들이 들어갈 곳이고 item엔 아이템 모델들이 들어갈 곳입니다. 그리고 텍스트 파일에 아래와 같이 적으세요.
{ "parent": "item/generated", "textures": { "layer0": "tutorialmod:items/ironStick" } } |
"parent"는 이 모델이 어떻게 보여질 것인가를 결정한다고 보면 됩니다. item/generated는 일반적인 아이템처럼 보이게 되고, block/block은 블록처럼 보이죠.
"textures"는 텍스쳐의 경로입니다. "layer"는 텍스쳐 레이어죠. 여러개의 레이어를 쓸 일은 거의 없으니 대부분 layer0만 쓸겁니다. 그리고 텍스쳐 경로는 "모드id:텍스쳐 경로"가 됩니다. textures부터 시작하는 상대경로이니 여기서는 items/ironStick이면 됩니다. 참고로 모드id를 안쓰면 바닐라로 인식합니다. 만약 바닐라의 설탕 텍스쳐를 쓰려면 "items/sugar"만 쓰면 되겠죠.
텍스트 파일에 내용을 다 적었으면 확장자를 json으로 변경합니다.
이제 정상적으로 텍스쳐가 불려져 오는 것을 볼수 있습니다!
이제 이 이후로 아이템 추가하는건 단순 작업이 됩니다. 만약 ironPlate를 추가한다 가정하죠.
1. TMItems에 ironPlate객체를 생성하고 초기화한 뒤 registerItem(ironPlate), registerRender(ironPlate)를 적는다.
2. 텍스쳐와 json파일을 알맞게 만들어둔다.
3. 끝!
'모딩 이야기 > 엔티머의 모드 공방' 카테고리의 다른 글
마인크래프트 모딩 튜토리얼:크리에이티브 탭 만들기 (0) | 2017.02.28 |
---|---|
마인크래프트 모딩 튜토리얼:세팅하기 (2) | 2017.02.27 |
[개발근황] 판타지 무기(Fantasy Weapons) test1 버전 (8) | 2017.02.19 |
[개발근황] 3D Things 무기들과 쓰레기통 추가 (0) | 2017.02.16 |
[개발근황] 3D Things 타일엔티티 연습 (7) | 2017.02.13 |