강좌/Minecraft Mod 제작2015. 11. 4. 08:03

강의 환경 : forge-1.7.10-10.13.0.1160-1.7.10

선행 과정 : [1.7.10] 모드기반제작

강의 목표 :

1. 기본적인 블록을 제작할 있다.

 

이 강좌에서는 기본적인 블록을 제작하는 방법을 알아보도록 하겠습니다.

 

이를 통해 블록 타입에 해당하는 객체를 만들고, 마인크래프트에 등록해주는 작업을 하게 될 것입니다.

 

 

그럼, 우선 블록의 성질을 결정하게 될 클래스를 만들어 봅시다.

 

보통 블록, 아이템 각각에 대해 block, item과 같은 패키지를 만들어 관리하는데,

 

저도 이 관례를 따라 abr.tutorial.block에 블록 클래스들을 두기로 하였습니다.

 

굳이 이를 따르실 필요는 없습니다.

 

이제 Block을 상속한 블록 클래스를 만들면 됩니다. 저는 BlockTutorial라는 클래스를 만들었습니다.

 

그럼 이렇게 컴파일 오류가 발생합니다. 자동으로 해결해 보면,

 

 

여기서 Material이 생성자의 인자로 들어가야 한다는 사실을 알 수 있습니다.

 

이렇게 블록에는 항상 Material을 지정해 주어야 하는데,

 

여기서 Material은 블록의 재질을 나타내며, 공기/액체/고체 여부와 블록을 밟았을 때의 소리 등을 결정합니다.

 

보통 블록은 고정된 재질을 가지므로 다음과 같이 super에 원하는 재질을 넣어주시면 됩니다.

 

저는 적당히 돌(Material.rock) 로 하기로 결정했습니다.

 

다른 재질을 원하신다면, Material의 전역변수 중에서 찾으시면 됩니다.

 

 

이제 생성자에서 블록의 몇 가지 성질을 지정할 수 있습니다.

 

기본적으로 Block#setBlockName(String name)으로 블록의 이름을 설정할 수 있고,

 

Block#setCreativeTab(CreativeTabs tab)으로 크리에이티브 탭을 설정할 수 있습니다.

 

여기서 CreativeTabs의 인자로 넣을 탭 객체는 보통 CreativeTabs의 전역변수 중에서 찾아볼 수 있습니다.

 

저는 이름은 tutorial로, 크리에이티브 탭은 기타(Miscellaneous) 탭에 해당하는 CreativeTabs.tabMisc를 쓰기로 결정했습니다.

 

 

이제 텍스쳐를 할당해 보도록 합시다.

 

여기서는 간단히 하나의 텍스처를 모든 면에 대해 적용하는 방법만 알아보고,

 

각 면에 따라 다른 텍스처를 이용하는 방법은 추후에 강좌를 올리도록 하겠습니다.

 

우이를 위해서, Block#setBlockTextureName을 이용해 텍스처 이름을 설정해 주되,

 

반드시 모드ID (MODID) 뒤에 :를 붙인 후 텍스처 이름을 써 주셔야 합니다.

 

예를 들어 텍스처 이름이 tutorial(.png)이면, 다음과 같이 하시면 됩니다.

 

 

이제 텍스처를 위치시켜 봅시다.

 

(프로젝트 위치)/src/main/resources/assets/(MODID)/texture/blocks 위치에 지정한 이름의 png 텍스처 파일을 위치시키면 됩니다.

 

저의 경우 다음과 같습니다.

 

 

여기까지 하면 기본적인 블록의 형태는 완성이 된 것입니다.

 

이제 추가적인 성질들을 설정해 봅시다.

 

블록에는 다음과 같은 성질들이 있습니다.

 

인자

역할

설정 방법

경도

(Hardness)

float

블록을 캘 때 걸리는 시간을 결정합니다.

Block#setHardness

나무: 2, 흑요석: 20

위키 링크(영어)

폭발 저항 강도

(Resistance)

float

블록의 폭발 저항 강도를 결정합니다.

Block#setResistance

나무: 15, 흑요석: 6,000

위키 링크(영어)

스텝 소리

(StepSound)

SoundType

블록 위를 걸어갈 때 나는 소리를 설정합니다.

Block#setStepSound

대부분 Block 클래스에 전역 변수로 설정

돌: #soundTypeStone

나무: #soundTypeWood

캐는 도구 설정

(HarvestLevel)

String toolclass, int level

블록을 캘 때 필요한 도구와 그 레벨을 결정합니다.

Block#setHarvestLevel

Toolclass: 곡괭이 "pickaxe", 삽 "shovel", 도끼 "axe";

level: Wood: 0, Stone: 1

Iron: 2, Diamond: 3

 

저는 적당한 강도에 돌 소리가 나며 돌 곡괭이 이상으로 캘 수 있도록 다음과 같이 설정하였습니다.

 

 

마지막으로 이렇게 구성한 블록을 등록해 줄 차례입니다.

 

preInit에서 블록의 인스턴스를 다음과 같이 만들어 등록해 주시면 됩니다. (저번에도 설명했지만 반드시 preInit이어야 합니다!)

 

GameRegistry#registerBlock(Block block, String id)를 이용해 간편히 등록할 수 있습니다.

 

저의 경우 다음과 같이 되었지요.

 

 

* Block#getUnlocalizedName()을 이용하는 실수는 하지 마시길 바랍니다.

저는 실수로 넣었지만, tile.tutorial같은 이상한 ID로 등록하는 바람에 버그가 발생하는 것을 원치 않으신다면

그냥 직접 타이핑하시는 것을 추천드립니다.)

 

이때, 반드시 클래스가 아닌 객체 형태로 등록해야 합니다.

 

블록 타입을 나타내는 것은 블록 클래스가 아니라 객체이기 때문입니다.

 

또한 이 객체는 나중에 이용하실 일이 많기 때문에, 미리 저장해 두시는 것을 추천합니다.

 

 

이제 우리의 새로운 블록이 추가되었는지 확인해 봅시다.

 

 

저렇게 잘 추가되었음을 볼 수 있습니다.

 

(이름이 tile.tutorial.name인 것은 아직 현지화 단계를 거치지 않았기 때문입니다.

현지화 강좌는 이곳에서 확인해 보실 수 있습니다!)

 

여기까지 기본적인 블록을 제작해 보았습니다.

 

다음 강좌에서는 메타데이터에 대해 알아보고 이를 다루는 법에 대해 알아보도록 하겠습니다!

Posted by Abastro