강좌/Minecraft Mod 제작2015. 12. 14. 01:06

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

배경 지식 : 텍스처

선행 과정 : 커스텀 블록 제작, 블록 메타데이터

강의 목표 :

  1. 블록에 텍스처를 부여할 있다.

  2. 메타데이터 값을 불러오고 이용하는 방법을 안다.

주의: 이 강좌는 1.8+에서 완전히 변경된 부분에 대한 강좌입니다.

 

지금까지 여러분은 자신만의 블록을 만들어 볼 수 있었습니다!

 

하지만 슬프게도 분홍색과 검은색 체크무늬가 그려진 모습밖에 보실 수 없었겠지요.

 

그래서 이번 강좌에서는 블록에 텍스처를 부여하는 방법 강좌를 하고자 합니다.

 

1. 블록의 6면에 같은 텍스처 부여하기

이 부분은 커스텀 블록 제작 강좌에서 이미 다뤘던 내용입니다.

 

Block#setTextureName(String textureName)을 이용하시면 됩니다.

 

 

이때 textureName은 '(모드 ID):(텍스처 이름)' 의 형식이고,

 

실제 경로는 '프로젝트 경로/src/main/resources/assets/(모드 ID)/textures/blocks/(텍스처 이름).png' 에 해당하게 됩니다.

 

이제 6면이 같은 색으로 된 블록을 확인하실 수 있습니다.

 

 

2. 방향과 메타데이터에 따라 다른 블록 텍스처 적용하기

 

이번에는 방향과 메타데이터에 따라 다른 블록 텍스처를 적용하는 방법을 알아봅시다.

 

그러기 위해 텍스처(Icon, 아이콘)을 등록하고, 배정하는 단계를 거쳐야 합니다.

 

  • 아이콘 등록하기

    우선 사용하고자 하는 텍스처를 아이콘으로 등록하는 방법을 알아봅시다.

     

    먼저 Block#registerBlockIcons(IIconRegister register)를 오버라이딩해야 합니다.

     

    이 메소드는 마인크래프트에 블록의 텍스처가 로딩될 때 자동으로 호출되며, 이 메소드가 갖는 인자 'IIconRegister register'를 통해 아이콘을 특정 경로로부터 가져올 수 있습니다.

     

    예를 들어, 다음과 같은 위치에 이미지가 있다고 합시다.

    '프로젝트 경로/src/main/resources/assets/(모드 ID)/textures/blocks/(텍스처 이름).png'

     

    이때 IIconRegister#registerIcon("(모드 ID):(텍스처 이름)")를 이용하여 이 이미지에 해당하는 아이콘(IIcon)을 가져올 수 있습니다.

     

    이렇게 가져온 아이콘을 저장해 주시면 됩니다.

     

    단, IIcon과 registerBlockIcons는 클라이언트(minecraft.exe)에만 존재하기 때문에, 관련 멤버변수나 메소드 선언시 @SideOnly(Side.CLIENT)를 반드시 윗줄에 써 주어야 합니다!

     

    다음은 예제입니다.

     

    텍스쳐 경로:

     

    코드:

     

  • 아이콘 배정하기

    이제 각 면에 메타데이터에 따라 다른 아이콘을 배정해 보아야겠죠?

     

    그러기 위해서는 Block#getIcon(int side, int meta)를 이용하시면 됩니다!

     

    이때 meta는 메타데이터이고, side는 다음과 같습니다.

    0 : DOWN, 아래 방향

    1 : UP, 위 방향

    2 : NORTH, 북쪽 방향

    3 : SOUTH, 남쪽 방향

    4 : WEST, 서쪽 방향

    5: EAST, 동쪽 방향

    각 경우에 맞도록 아이콘을 리턴해 주시면 됩니다. 단, 이 메소드 역시 @SideOnly(Side.CLIENT)가 필요합니다.

     

    예제로 돌아가서, 방향을 갖는 메타데이터 블록에 텍스처를 배정해 봅시다.

     

    앞면에는 tutorialfront, 윗면/아랫면에는 tutorialtop, 나머지에는 tutorial을 부여해서 방향을 구별하도록 합시다.

     

    위/아랫면의 경우 side는 0과 1이 되겠죠?

     

    그리고 앞면의 경우에는 향하는 방향을 메타데이터로 했으니, side와 일치하는 방향인지를 보면 됩니다.

    (이때 메타데이터는 4방향, side는 6방향을 표시하므로 값은 다릅니다. 다행히도 directionToFacing이라는 배열로 변환이 가능합니다.)

     

    결과적으로 다음과 같이 구현됩니다.

     

    다음과 같이 잘 된다는 것을 알 수 있습니다.

     

     

    • 포지forge-1.7.10-10.13.0.12xx-1.7.10 버전 이상에서는 수정해야 할 사항이 하나 있습니다.

      TileEntity가 아닌 모든 블록에 대해 onBlockAdded가 onBlockPlaced 호출 전후에 1번씩 호출되므로,

      메타데이터가 0인 경우에만 onBlockAdded에서 메타데이터를 설정하도록 해 주어야 합니다. 다음과 같이.

       

 

3. 위치에 따라 블록의 텍스처 적용하기

이제 위치에 따라 다른 블록 텍스처를 적용하는 방법을 알아봅시다. (멀티블록 구조와 타일엔티티에 필요합니다.)

 

우선 2번의 아이콘 등록 단계는 똑같이 해 주시고, 배정 단계만 달리해 주시면 됩니다.

 

여기서는 meta와 side를 이용한 버전 대신 Block#getIcon(IBlockAccess world, int x, int y, int z, int side)를 이용해서 배정하면 됩니다.

 

world은 블록이 속한 월드이고, x, y, z는 좌표이며, side는 아까 알아봤던 방향입니다.

 

이렇게 작은 차이만 있으니 예제는 제공하지 않습니다. 한번 직접 해 보세요!

 

(+ 관련 예제를 타일엔티티 편에서 다룰 예정입니다)

 

Posted by Abastro