🇰🇷 한국어 (Korean - South Korea)
🇰🇷 한국어 (Korean - South Korea)
외관
🇰🇷 한국어 (Korean - South Korea)
🇰🇷 한국어 (Korean - South Korea)
외관
This page is written for version:
1.21
This page is written for version:
1.21
블록 상태는 속성의 형태로 한 블록의 모든 정보를 포함하는 Minecraft 세계에서 단일 블록에 등록된 데이터의 조각입니다. 바닐라가 블록 상태에 저장하는 몇 가지 속성의 예시입니다:
세계의 용량을 줄이고, TPS 문제를 막아주기 때문에 — 또한 블록 엔티티 안에 NBT 데이터를 저장하는 것의 필요가 없습니다. — 아마도 이것들이 왜 유용한지 알 수 있습니다.
블록 상태 정의는 assets/<mod id here>/blockstates
폴더에서 찾을 수 있습니다.
Minecraft는 이미 빠르게 특정 종류의 블록을 만들 수 있도록 하는 몇 가지의 맞춤 클래스가 이미 있습니다. 이 예시는 "Condensed Oak Log" 블록을 생성하여 axis
속성을 사용하여 블록을 생성하는 과정을 보여 줍니다.
바닐라 PillarBlock
클래스는 블록이 X, Y 혹은 Z축에 배치할 수 있도록 합니다.
public static final Block CONDENSED_OAK_LOG = register(
new PillarBlock(
AbstractBlock.Settings.create()
.sounds(BlockSoundGroup.WOOD)
), "condensed_oak_log", true
);
ItemGroupEvents.modifyEntriesEvent(ModItems.CUSTOM_ITEM_GROUP_KEY).register((itemGroup) -> {
itemGroup.add(ModBlocks.CONDENSED_DIRT.asItem());
});
기둥 블록은 두 가지의 텍스처 — 윗면과 옆면 — 이 있습니다. block/cube_column
모델을 사용합니다.
언제나 모든 블록 텍스처들의 경우, 텍스처 파일은 assets/<mod id here>/textures/block
에서 찾을 수 있습니다.
기둥 블록이 두 개의 위치 — 수평과 수직 — 이 있기 때문에, 분리된 각각의 모델 파일을 만들어야 합니다.
block/cube_column_horizontal
모델을 확장하는 condensed_oak_log_horizontal.json
.block/cube_column
모델을 확장하는 condensed_oak_log.json
.condensed_oak_log_horizontal.json
파일의 예시:
{
"parent": "block/cube_column_horizontal",
"textures": {
"end": "fabric-docs-reference:block/condensed_oak_log_top",
"side": "fabric-docs-reference:block/condensed_oak_log"
}
}
INFO
Remember, blockstate files can be found in the assets/<mod id here>/blockstates
folder, the name of the blockstate file should match the block ID used when registering your block in the ModBlocks
class. For instance, if the block ID is condensed_oak_log
, the file should be named condensed_oak_log.json
.
모든 블록 상태 파일 안의 수정자에 대한 더 자세한 보기는 Minecraft 위키 - 모델 문단 (Block States) (영어)에 있습니다.
다음으로, 블록 상태 파일을 생성하여야 합니다. 블록 상태 파일은 마법이 일어나는 곳입니다. 기둥 블록은 세 개의 축이 있으므로, 다음 상황에서 특정 모델을 사용할 것입니다:
axis=x
- 블록이 X축을 따라 설치되면, 양의 X축 방향을 향하도록 모델을 회전할 것입니다.axis=y
- 블록이 Y축을 따라 설치되면, 기본 수직 모델을 사용할 것입니다.axis=z
- 블록이 Z축을 따라 설치되면, 양의 Z축 방향을 향하도록 모델을 회전할 것입니다.{
"variants": {
"axis=x": {
"model": "mod_id:block/condensed_oak_log_horizontal",
"x": 90,
"y": 90
},
"axis=y": {
"model": "mod_id:block/condensed_oak_log"
},
"axis=z": {
"model": "mod_id:block/condensed_oak_log_horizontal",
"x": 90
}
}
}
언제나, 블록에 대한 번역과 두 모델 중 하나의 부모격이 되는 아이템 모델을 만들어야 할 것입니다.
사용자 지정 블록 상태는 블록이 고유한 속성을 가지고 있을 때 유용합니다. 때때로 바닐라 속성을 재사용하여 만든 블록을 발견할 수도 있습니다.
이 예시는 activated
라 불리는 고유한 불 (boolean) 속성을 생성할 것입니다. 플레이어가 블록에 오른쪽 클릭할 때, activated=false
에서 activated=true
로 변환하여서 이에 따라 텍스처를 변경합니다.
먼저, 속성이 불이기 때문에 속성 자체를 만들어야 합니다. BooleanProperty.of
메서드를 사용할 것입니다.
public class PrismarineLampBlock extends Block {
public static final BooleanProperty ACTIVATED = BooleanProperty.of("activated");
}
다음으로, appendProperties
메서드에 있는 블록 상태 관리자에 속성을 추가하여야 합니다. 빌더에 접근하기 위하여 메서드를 덮어써야 할 것입니다:
@Override
protected void appendProperties(StateManager.Builder<Block, BlockState> builder) {
builder.add(ACTIVATED);
}
또한 사용자 정의 블록의 생성자에서 activated
속성의 기본 상태를 설정하여야 합니다.
public PrismarineLampBlock(Settings settings) {
super(settings);
// Set the default state of the block to be deactivated.
setDefaultState(getDefaultState().with(ACTIVATED, false));
}
WARNING
Block
대신 사용자 지정 클래스를 이용하여 블록을 등록하는 것을 잊지 마세요!
이 예시는 플레이어가 블록과 상호작용을 할 때 불 activated
속성을 뒤집습니다. 이를 위하여 onUse
메서드를 재정의할 수 있습니다:
@Override
protected ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, BlockHitResult hit) {
if (!player.getAbilities().allowModifyWorld) {
// Skip if the player isn't allowed to modify the world.
return ActionResult.PASS;
} else {
// Get the current value of the "activated" property
boolean activated = state.get(ACTIVATED);
// Flip the value of activated and save the new blockstate.
world.setBlockState(pos, state.with(ACTIVATED, !activated));
// Play a click sound to emphasise the interaction.
world.playSound(player, pos, SoundEvents.BLOCK_COMPARATOR_CLICK, SoundCategory.BLOCKS, 1.0F, 1.0F);
return ActionResult.SUCCESS;
}
}
블록 상태 파일을 만들기 전, 블록 모델과 같이 블록이 활성화되었을 때와 비활성화되었을 때의 텍스처를 제공하여야 합니다.
블록의 두 모델 — 활성화된 상태와 비활성화된 상태 — 을 만들기 위하여 블록 모델의 지식을 이용하세요. 끝난 다음, 블록 상태 파일을 계속하여 만들 수 있습니다.
새 속성을 만들었으면, 그 속성을 설명하기 위하여 블록에 대한 블록 상태 파일을 업데이트하여야 합니다.
만약 블록에 여러 개의 속성이 있는 경우, 가능한 모든 조합을 고려하여야 합니다. 예시로, activated
와 axis
는 6개의 조합으로 이어집니다. (activated
가 가능한 두 개의 값과, axis
가 가능한 세 개의 값).
블록이 오직 두 개의 가능한 변형이 있고, 오직 한 개의 속성 (activated
)가 있으므로, 블록 상태 JSON 파일은 다음과 같을 것입니다.
{
"variants": {
"activated=false": {
"model": "fabric-docs-reference:block/prismarine_lamp"
},
"activated=true": {
"model": "fabric-docs-reference:block/prismarine_lamp_on"
}
}
}
예시 블록이 바다 랜턴이기 때문에, 또한 activated
속성이 true (참)일 때 발광하도록 만들어야 합니다. 이는 블록을 등록할 때 생성자로 전달된 블록 설정을 통하여 완료될 수 있습니다.
luminance
메서드를 통하여 블록이 발광할 때의 빛 단계를 조정할 수 있고, activated
속성에 기반한 빛 단계를 반환하기 위하여 PrismarineLampBlock
클래스에 정적 메서드를 만들 수 있으며, 메서드 참조로서 luminance
메서드에 대하여 전달할 수도 있습니다:
public static int getLuminance(BlockState currentBlockState) {
// Get the value of the "activated" property.
boolean activated = currentBlockState.get(PrismarineLampBlock.ACTIVATED);
// Return a light level if activated = true
return activated ? 15 : 0;
}
public static final Block PRISMARINE_LAMP = register(
new PrismarineLampBlock(
AbstractBlock.Settings.create()
.sounds(BlockSoundGroup.LANTERN)
.luminance(PrismarineLampBlock::getLuminance)
), "prismarine_lamp", true
);
모든 작업을 완료하면, 최종 결과는 다음과 같이 보일 것입니다: