다음을 통해 공유


개체 추가 안내

행동 팩과 리소스 팩을 사용하여 Minecraft: Bedrock Edition에 개체를 추가할 수 있습니다. 추천 튜토리얼에서 배웠듯이, 개체의 행동은 행동 팩으로 바꿀 수 있고 외형은 리소스 팩으로 바꿀 수 있습니다. 게임에 작동 개체를 추가하려면 두 팩이 모두 필요합니다. 이 가이드는 두 부분으로 구성되어 있습니다. 1부는 Minecraft에 사용자 정의 개체를 추가하는 데 필요한 파일 및 폴더 구조를 다루고, 2부에서는 동작 구성 요소와 애니메이션을 사용하여 개체에 생명력을 불어넣는 방법을 보여줍니다.

모델링 패키지에서 생성되는 파란색 고래의 이미지.

이 튜토리얼에서는 다음과 같은 사항을 안내해 드립니다.

  • 행동 및 리소스 팩을 사용하여 새 사용자 지정 개체를 만드는 방법
  • 구성 요소와 애니메이션을 포함한 다양한 기능을 개체에 적용하는 방법
  • 개체 이름을 번역하는 방법

요구 사항

튜토리얼을 시작하기 전에 아래 사항을 완료하시길 추천합니다.

다음 사항에 관한 지식이 있으면 이 문서를 더 잘 이해할 수 있습니다.

  • JSON 형식의 작동 방식
  • VSCode 같은 코드 편집기

파일 구조

행동 팩에서는 개체 파일이 서버 측에서 개체를 정의합니다. 리소스 팩에서는 클라이언트 개체 파일이 개체의 외형을 게임에 알리는 역할을 합니다. 다음 그래픽에서는 다양한 파일이 함께 작동하여 사용자 정의 개체를 만드는 방법을 확인할 수 있습니다.

리소스 팩과 행동 팩 간의 관계

로봇 개체 예시 - 최소 로봇

이 튜토리얼의 참고 자료로서, 월드에서 무작위로 생성되며 3가지 무작위 텍스처와 바퀴 애니메이션, 다양한 구성 요소와 사용자 정의 물 메커니즘이 적용되는 로봇이라는 동일한 개체가 두 가지 버전으로 제공됩니다. 다운로드 링크는 위의 요구 사항 섹션에 있습니다.

로봇이 작동하는 모습을 확인하려면 방금 다운로드한 리소스 팩과 행동 팩 세트 중 하나를 선택하세요. (지금은 최소 로봇을 시도하는 것을 권장합니다.) 리소스 팩과 동작 팩을 각각의 com.mojang 하위 폴더에 넣고 치트가 활성화된 월드를 시작한 다음 /summon compass:robot을 사용하세요.

완성된 "최소 로봇" 행동 팩과 리소스 팩의 구조는 다음과 같습니다.

완성된 최소 로봇 개체의 파일 구조

정보가 많아 보이지만 이름에 "robot"이 포함된 파일과 파일이 저장되는 위치만 생각하면 됩니다.

로봇이 게임에서 어떻게 작동하는지 파악한 후에는, 이 튜토리얼의 단계에 따라 완성된 로봇 리소스 팩과 동작 팩을 제거하고 처음부터 다시 생성하여 모든 파일이 어떻게 함께 작동하는지에 대한 개념을 얻을 수 있습니다.

이전 튜토리얼에서 생성한 리소스 팩과 동작 팩을 사용하는 것에서부터 시작해 보세요. 공격 소 개체를 제거하느냐 마느냐는 개인 취향입니다.

이름 지정

개체를 생성할 때 개체에 어떤 ID를 부여할 것인지도 가장 먼저 고려해 봐야 합니다. 리소스 팩과 동작 팩의 파일은 여러분이 개체에 부여한 개체 ID를 사용하여 동기화해야 합니다. 이 ID는 쉼표로 구분된 네임스페이스와 이름으로 구성됩니다. 이전에 로봇을 소환할 때 사용했던 compass:robot ID입니다.

약식 버전의 팀 이름이나 제품 이름을 고유한 네임스페이스로 사용할 수 있습니다. ID에는 소문자와 숫자, 밑줄만 사용할 수 있습니다. "minecraft"는 사용자 정의 콘텐츠의 네임스페이스로 사용할 수 없습니다. "minecraft" 네임스페이스는 바닐라 리소스 전용이며, 따라서 바닐라 리소스를 덮어쓰는 경우에만 "minecraft"를 사용해야 합니다.

개체를 정의하는 파일은 대부분 JSON 파일입니다. 혼동되지 않도록 이러한 파일을 생성할 때 각각 연장된 파일 확장자를 사용하는 것이 좋습니다. 대부분의 경우 게임에서는 파일 이름이 무시되지만, 추가 콘텐츠 작업을 하는 동안 파일 이름이 복잡하면 혼동될 수 있습니다. 사용 가능한 확장은 다음과 같습니다.

파일 유형 파일 이름
클라이언트 개체 파일 entity_name.entity.json
모델 파일 entity_name.geo.json
애니메이션 파일 entity_name.animation.json
애니메이션 컨트롤러 entity_name.animation_controllers.json
렌더링 컨트롤러 entity_name.render_controllers.json

entity_name 개체 이름으로 교체해야 하며 네임스페이스는 제거해야 합니다.

형식 버전

모든 JSON 파일에는 format_version 태그가 있어야 합니다. 이 태그가 있어야 게임이 파일을 올바르게 읽을 수 있습니다. 기존 형식으로 제작된 파일은 게임 신규 버전에서도 계속 작동하지만, 형식 버전을 반드시 올바르게 설정해야 합니다. 잘못된 형식 버전은 오류의 대표적인 원인입니다.

행동 팩 정의

게임에 로봇을 추가하는 첫 번째 실습 단계는 행동 팩에서부터 시작됩니다. 행동 팩의 entities 폴더에 새 파일을 만들고 이름을 robot.json으로 지정합니다. 이 코드를 복사하여 붙여넣습니다.

{
    "format_version": "1.12.0",
    "minecraft:entity": {
        "description": {
            "identifier": "compass:robot",
            "is_spawnable": true,
            "is_summonable": true
        },
        "components": {}
    }
}

설명 태그에서 개체의 기본 특성을 정의합니다. identifier 개체의 ID를 설정합니다. is_spawnable 플레이어가 이 몹을 생성할 수 있게 하는 생성 알을 나중에 게임에 추가합니다. is_summonable /summon 명령어로 개체를 작동하게 합니다.

components 안에 구성 요소를 추가하여 개체의 행동을 바꿀 것입니다. 지금은 minecraft:physics 구성 요소만 추가하겠습니다. 이 구성 요소는 개체에 중력과 일반 충돌 행동을 부여합니다.

"components": {
    "minecraft:physics": {}
}

robot.json 파일을 저장하고 다음 단계로 이동하세요.

클라이언트 개체 정의

이제 개체를 리소스 팩에 추가하여 시각적 외형을 부여해야 합니다. 리소스 팩의 entity 폴더에 robot.entity.json이라는 새 JSON 파일을 만듭니다.

{
    "format_version": "1.10.0",
    "minecraft:client_entity": {
        "description": {
            "identifier": "compass:robot",
            "spawn_egg": {
                "base_color": "#505152",
                "overlay_color": "#3b9dff"
            }
        }
    }
}

이것은 파일의 기본 구조입니다. 지금까지는 이전 섹션에서 만든 행동 측 파일과 유사합니다. 하지만 개체가 아닌 client_entity를 사용한다는 점이 다릅니다. 이 문서 작성 시점에서는 1.10.0이 이 파일의 최신 형식 버전입니다.

spawn_egg 태그는 생성 알이 소지품에서 어떻게 보이는지를 정의합니다. 이 방법을 사용하면 바닐라 생성 알처럼 보이지만, 사용자 정의 색상이 적용됩니다.

시각적 요소

개체를 게임에 추가하려면 먼저 모델이 있어야 합니다. 개체 모델링 및 애니메이션 문서에서는 사용자 정의 모델과 텍스처를 만드는 방법을 설명합니다. 하지만 모델 생성을 위해서는 배워야 할 것이 많으며 이 튜토리얼은 아직 끝나지 않았습니다. 지금은 로봇 리소스 팩에서 파일을 복사하여 붙여넣는 방식으로 이미 모델을 생성했다고 가정하겠습니다. 나중에 동일한 단계를 사용하여 생성한 모델을 추가할 수 있습니다.

  • 모델을 models/entity 폴더 안에 robot.geo.json으로 저장합니다.
  • 텍스처를 textures/entityrobot.png로 저장합니다.

이제 모델 파일이 준비되었으므로 개체에 사용되는 모델, 텍스처, 재료를 연결하기 위한 렌더링 컨트롤러가 필요합니다.

리소스 팩의 entity 폴더에 있는 robot.entity.json 파일을 엽니다.

로봇과 같은 대부분의 개체에서는 게임에서 제공하는 기본 렌더링 컨트롤러를 사용할 수 있습니다. 렌더링 컨트롤러에 대해서는 이 튜토리얼의 후반부에서 보다 자세히 설명하겠습니다. 지금은 다음과 같은 내용을 다루며 대략적인 개요만 살펴보겠습니다.

{
    "format_version": "1.10.0",
    "minecraft:client_entity": {
        "description": {
            "identifier": "compass:robot",
            "materials": {
                "default": "entity"
            },
            "textures": {
                "default": "textures/entity/robot"
            },
            "geometry": {
                "default": "geometry.robot"
            },
            "render_controllers": [
                "controller.render.default"
            ],
            "spawn_egg": {
                "base_color": "#505152",
                "overlay_color": "#3b9dff"
            }
        }
    }
}

모델은 기하학적 도형 이름에서 참조합니다. Blockbench에서 모델을 생성하는 경우, 프로젝트 설정의 기하학적 도형 이름이 개체 이름으로 설정되어 있는지 확인하세요. 이 경우에는 "robot"입니다.

기하학적 도형과는 달리, 텍스처는 예시에서처럼 리소스 팩에서의 경로를 기준으로 연결되며 파일 확장자는 제외됩니다.

대부분의 경우에는 사용자 정의 재료가 필요 없습니다. 대신 기본 재료를 사용하면 됩니다. 이 예시에서는 entity를 사용합니다. 텍스처에 투명한 부분이 있다면 entity_alphatest를 사용하고, (스테인드글라스처럼) 텍스처가 반투명하다면 entity_alphablend를 사용하면 됩니다.

번역 문자열

지금은 개체와 생성 알 모두 올바른 게임 내 이름이 없습니다. 이름을 정의하려면 언어 파일이 필요합니다. 리소스 팩에 texts라는 새 폴더를 만들고 en_US.lang이라는 새 파일을 만듭니다. 사용자 정의 개체의 경우 이 언어 파일만 바꾸면 됩니다. 다른 언어는 모두 기본적으로 American English가 되기 때문입니다. 이 파일 안에 다음 두 줄을 추가합니다.

entity.compass:robot.name=Robot
item.spawn_egg.entity.compass:robot.name=Spawn Robot

첫 번째 줄은 개체의 이름을 정의합니다. 이 이름은 사망 메시지와 일부 명령어가 출력될 때 표시됩니다. 키와 값은 항상 등호로 구분됩니다. 첫 번째 줄은 다음과 같이 나눌 수 있습니다.

entity.<identifier>.name=<Name>

두 번째 줄은 생성 알의 아이템 이름을 정의합니다.

item.spawn_egg.entity.<identifier>.name=<Name>

테스트

조기에 자주 테스트하세요. 문제가 조기에 발생하면 쉽게 문제를 추적하여 해결할 수 있습니다. 변경 사항을 적용한 직후 테스트하면 문제를 쉽게 발견하고, 원인의 범위를 최신 변경 사항으로 제한할 수 있습니다.

생성 알이나 소환 명령어를 사용하여 게임에서 개체를 생성할 수 있습니다. 정적 개체가 필요하다면 개체를 바로 생성하면 됩니다. 하지만 개체를 더 많이 사용자 지정하고 싶다면 다음 내용을 계속 읽어 보세요.

로봇 개체 예시 - 완전 로봇

이제 완전 로봇 리소스 팩과 동작 팩을 사용해 보겠습니다. 폴더 및 파일 모음을 비교하세요. 그런 다음, 계속해서 기능을 추가할 수 있도록 최소 로봇 팩을 되돌려 놓으세요.

구성 요소

구성 요소는 개체가 게임에서 어떻게 행동하는지를 말해줍니다. 몇 가지 구성 요소를 추가하고 이들이 수행하는 작업을 자세히 설명하겠습니다.

behavior pack/entities/ 폴더에서 robot.json을 열고 "minecraft:physics": {} 의 단일 항목을 다음 모든 항목으로 대체합니다...

   "components": {
        "minecraft:physics": {},
        "minecraft:nameable": {},
        "minecraft:movement": {
            "value": 0.25
        },
        "minecraft:movement.basic": {},
        "minecraft:jump.static": {},
        "minecraft:navigation.walk": {
            "avoid_water": true
        },
        "minecraft:behavior.tempt": {
            "priority": 1,
            "speed_multiplier": 1.4,
            "items": ["diamond"],
            "within_radius": 7.0
        },
        "minecraft:behavior.random_stroll":
        {
            "priority": 3,
            "speed_multiplier": 0.8
        },
        "minecraft:experience_reward": {
            "on_death": 8
        }
   }
구성 요소 이름 설명
minecraft:nameable 플레이어가 이름 태그를 이용해 개체의 이름을 지정할 수 있게 합니다.
minecraft:movement 개체에게 빠르게 이동하는 방법을 알려줍니다. 0.25는 Minecraft 내 대부분의 동물의 일반 속도입니다.
minecraft:movement.basic 개체에 지상에서 이동하는 능력을 부여합니다.
minecraft:jump.static 개체가 점프하여 블록 위를 걷게 합니다.
minecraft:navigation.walk 개체가 월드를 탐색할 수 있게 합니다. 물 피하기는 이 구성 요소가 제공하는 대표적인 옵션입니다.
minecraft:behavior.tempt 개체가 머리에 다이아몬드가 있는 플레이어를 따라다니게 합니다. 이 행동은 우선순위가 높기 때문에 이 작업보다 우선적으로 실행됩니다(숫자가 낮을수록 우선순위가 높다는 뜻입니다).
minecraft:behavior.random_stroll 개체가 장소 주변을 무작위로 걷게 합니다. 높은 숫자의 우선순위를 설정하기 때문에 개체는 다른 작업이 없을 때만 이 작업을 수행합니다. 이 걷기 행동에서 속도 배수를 사용하면 속도가 줄어듭니다.
minecraft:experience_reward 플레이어가 사망하면 개체가 경험치를 드롭하게 합니다.

애니메이션

이 섹션에서는 간단한 바퀴 애니메이션을 로봇에 추가합니다. 애니메이션과 애니메이션 컨트롤러를 사용하는 방법, 그리고 Blockbench에서 애니메이션을 만드는 방법에 관해 자세히 알고 싶다면 이 가이드를 읽으세요.

애니메이션은 애니메이션 파일에 저장됩니다. 따라서 가장 먼저 할 일은 리소스 팩에 animations라는 폴더를 만들고 그 안에 robot.animation.json이라는 파일을 만드는 것입니다. 이 파일에서 animation.robot.drive라는 새 애니메이션을 만듭니다. 그리고 애니메이션이 계속 재생되도록 looptrue로 설정합니다. 파일은 다음과 같은 형식이어야 합니다.

{
    "format_version": "1.8.0",
    "animations": {
        "animation.robot.drive": {
            "loop": true
        }
    }
}

애니메이션을 사용하면 각 뼈의 위치, 회전과 크기에 움직임을 부여할 수 있습니다. (아직 이 맥락에서 "뼈"가 무엇을 의미하는지 모르더라도 괜찮습니다. Blockbench를 배울 때 뼈에 대해 배우게 될 것입니다. 지금은 다리나 바퀴와 같은 모델의 덩어리를 의미한다는 것만 알아두세요.) 애니메이션은 키프레임, 몰랑 표현식 또는 이 둘의 조합을 사용해 완성할 수 있습니다. 이 예시에서는 몰랑 표현식만 사용합니다.

몰랑은 리소스 및 행동 팩 전용 언어입니다. 이 언어를 사용하면 쿼리를 이용해 개체에서 다양한 숫자를 얻고, 수학 식을 이용해 이러한 숫자에서 결과를 계산할 수 있습니다. 예를 들어 query.modified_distance_moved 쿼리는 개체가 움직인 거리를 반환합니다. 이 쿼리를 사용하면 X축에서의 로봇 바퀴 회전을 계산하여, 로봇이 주행하는 것처럼 보이게 하는 애니메이션을 만들 수 있습니다. 다양한 숫자를 시험해봐야 하지만, 이 모델에서는 60이 적절합니다.

{
    "format_version": "1.8.0",
    "animations": {
        "animation.robot.drive": {
            "loop": true,
            "bones": {
                "wheel": {
                    "rotation":["query.modified_distance_moved*60", 0, 0]
                }
            }
        }
    }
}

애니메이션을 만들었으니 이제 클라이언트 개체 파일에 애니메이션을 연결해야 합니다. (리소스 팩은 클라이언트이므로 이 다음 단계에서 <resource pack>/entity/robot.entity.json을 열어야 합니다.) The animations태그는 개체에서 사용하는 모든 애니메이션과 애니메이션 컨트롤러를 연결합니다. 각 애니메이션에는 애니메이션 컨트롤러에서, 또는 파일에서 바로 애니메이션을 재생하는 데 사용하는 약식 이름이 있으며, 이 경우에는 drive입니다.

scriptsanimate 섹션을 사용하면 애니메이션을 바로 재생할 수 있습니다.

        "animations": {
            "drive": "animation.robot.drive"
        },
        "scripts": {
            "animate": ["drive"]
        }

클라이언트 개체 파일의 설명 태그에 두 태그를 추가하면, 주행 애니메이션은 항상 활성화되며 개체가 움직이는 동안 바퀴 회전이 진행됩니다.

렌더링 컨트롤러

렌더링 컨트롤러를 사용하면 몰랑을 이용해 개체의 기하학적 도형, 텍스처 및 재료를 변경할 수 있습니다. 다음 예시에서는 클라이언트 개체 파일에서 default로 연결된 기하학적 도형, 재료와 텍스처를 사용하는 방법을 알 수 있습니다.

{
    "format_version": "1.8.0",
    "render_controllers": {
        "controller.render.robot": {
            "geometry": "Geometry.default",
            "materials": [ { "*": "Material.default" }],
            "textures": [ "Texture.default" ]
        }
    }
}

단일 기본 기하학적 도형, 재료 및 텍스처를 사용하고 싶다면, 이전에 했던 것처럼 기본 렌더링 컨트롤러를 가리키게 하면 됩니다. 하지만 지금은 무작위 텍스처를 추가하는 방법을 배워야 하므로 렌더링 컨트롤러의 작동 방식을 자세히 살펴보겠습니다.

렌더링 컨트롤러 설명

기본 태그는 render_controllers임을 알 수 있습니다. 따라서 파일 하나에 여러 렌더링 컨트롤러를 지정할 수 있습니다.

우리의 렌더링 컨트롤러는 controller.render.<entity_name> 스키마를 이용해 이름이 지정됩니다. 다목적 렌더링 컨트롤러에는 개체 이름 대신 다른 키워드를 사용해도 됩니다.

렌더링 컨트롤러 태그에서는 다양한 리소스가 지정되지만, 각 태그는 서로 다른 JSON 형식을 사용합니다.

기하학

하나의 렌더링 컨트롤러는 한 번에 하나의 기하학적 도형만 표시할 수 있습니다. 그래서 렌더링 컨트롤러는 문자열 컨트롤러 하나에 바로 연결됩니다. 이 문자열은 몰랑 표현식일 수 있으며 항상 기하학적 도형을 반환해야 합니다. 이 경우에는 Geometry.default라고 하며, 따라서 렌더링 컨트롤러를 사용하는 개체에 의해 default로 연결된 기하학적 도형을 반환합니다.

다양한 렌더링 컨트롤러를 사용하여 단일 개체에 여러 기하학적 도형을 렌더링할 수 있습니다. 하지만 이 작업은 까다로우며, 예상하지 못한 행동을 유발할 수 있습니다. 따라서 숙련된 크리에이터만 사용하는 것이 좋습니다.

재료

기하학적 도형과는 달리, 재료는 개체의 배열로 작성됩니다. 각 뼈를 별도의 재료에 할당해야 하기 때문입니다. 배열의 각 개체는 키 값 쌍 하나를 가질 수 있습니다. 키는 뼈 모음을 선택합니다. 별표는 와일드카드로 사용합니다. 따라서 모든 뼈에는 뼈 이름에 상관없이 기본 재료가 할당됩니다. 재료는 순서대로 할당됩니다. 즉 목록 아래쪽에 있는 재료가 이전 재료를 덮어쓸 수도 있습니다.

        "materials": [
            { "*": "Material.default" },
            { "*_arm": "Material.transparent" }
        ],

이 예시에서는 먼저 기본 재료를 모든 뼈에 적용합니다. 그런 다음 _arm으로 끝나는 모든 뼈에서 투명한 재료로 재료를 덮어씁니다. 이렇게 하면 모든 팔 뼈가 투명성을 지원하게 됩니다.

텍스처

텍스처는 배열에서 지정됩니다. 대부분의 경우에는 텍스처 하나만 연결됩니다. 개체는 별도의 텍스처를 지원하지 않기 때문입니다. 하지만 예외가 하나 있습니다. 재료는 여러 층을 이루는 다양한 텍스처를 지원할 수 있습니다(예: entity_multitexture). 예를 들어 이 텍스처는 라마가 실내장식을 덮는 용도로 사용합니다.

배열

같은 유형의 여러 리소스를 다룰 때는 배열을 사용하면 도움이 됩니다. 배열은 렌더링 컨트롤러에 정의된 리소스 링크 모음으로, 몰랑을 사용하여 배열에서 리소스 하나를 선택할 수 있습니다.

다음과 같은 로봇용 배열을 정의할 수 있습니다.

        "controller.render.robot": {
            "arrays": {
                "textures": {
                    "Array.variant":[
                        "Texture.default",
                        "Texture.variant_b",
                        "Texture.variant_c"
                    ]
                }
            },

배열 섹션에서는 textures, materials, geometries라는 3가지 범주 각각에 대한 배열을 정의할 수 있습니다. 범주 내에서 Array.<array name>을 이름으로 사용하여 배열을 정의할 수 있습니다. 배열의 각 줄은 클라이언트 개체 파일에 정의된 텍스처 하나를 연결합니다.

배열은 몰랑을 이용해 액세스할 수 있습니다. 배열은 0을 기준으로 하며, 따라서 이 배열의 첫 번째 텍스처는 Array.variant[0]를 통해 액세스할 수 있습니다.

이 예시에서는 변형 쿼리를 사용하여 배열에서 텍스처를 선택합니다. 몹의 변형은 행동 파일의 minecraft:variant 구성 요소를 통해 변경할 수 있습니다.

"textures": [ "Array.variant[ query.variant ]" ]

이제 클라이언트 개체 파일에서 추가 텍스처를 연결해야 합니다. 일반적인 파란색 로봇 텍스처가 이미 default로 연결되었으니, 로봇 텍스처 복사본 2개를 만들고 색상을 편집한 다음 variant_bvariant_c로서 연결해야 합니다.

            "textures": {
                "default": "textures/entity/robot",
                "variant_b": "textures/entity/robot_b",
                "variant_c": "textures/entity/robot_c"
            },

텍스처가 연결되었습니다. 마지막 단계는 행동 파일에 있는 변형을 무작위화하는 것입니다. 이를 위해 구성 요소 그룹을 사용하겠습니다. 구성 요소 그룹을 사용하면 개체에서 언제든 구성 요소 모음을 추가하거나 제거할 수 있습니다. 그룹에 추가할 구성 요소를 무작위로 선택하는 이벤트도 사용할 것입니다.

        "description": {
            ...
        },
        "components": {
            ...
        },
        "component_groups": {
            "compass:color_0": {
                "minecraft:variant": {"value": 0}
            },
            "compass:color_1": {
                "minecraft:variant": {"value": 1}
            },
            "compass:color_2": {
                "minecraft:variant": {"value": 2}
            }
        },
        "events": {
            "minecraft:entity_spawned": {
                "randomize": [
                    {
                        "add": {
                            "component_groups": ["compass:color_0"]
                        }
                    }, {
                        "add": {
                            "component_groups": ["compass:color_1"]
                        }
                    }, {
                        "add": {
                            "component_groups": ["compass:color_2"]
                        }
                    }
                ]
            }
        }

이제 개체를 처음으로 생성하면, 개체는 구성 요소 그룹과 그에 따른 변형을 무작위로 선택합니다. 이것은 개체의 외형을 무작위화할 때 자주 사용하는 기법입니다.

생성

생성 규칙은 개체가 월드에 무작위로 생성되는 방식을 정의합니다. 우리 로봇의 생성 규칙 파일을 만들어보겠습니다. 먼저 행동 팩에서 spawn_rules라는 폴더를 만듭니다. 폴더에서 robot.json이라는 새 텍스트 파일을 만듭니다. 파일의 콘텐츠는 다음과 같은 형식이어야 합니다.

{
    "format_version": "1.8.0",
    "minecraft:spawn_rules": {
        "description": {
            "identifier": "compass:robot",
            "population_control": "animal"
        },
        "conditions": []
    }
}

minecraft:spawn_rules에는 인구 제어조건 두 가지 사항을 고려해야 합니다.

description 파일의 기본 속성을 정의합니다. identifier 개체의 식별자와 일치해야 합니다. population_control 게임이 생성할 몹 수를 확인하는 방법을 정의하며 조금 더 복잡합니다.

인구 제어

다양한 개체 풀이 존재합니다. 여기에 정의된 풀이 가득 찬 것으로 간주되면 게임은 이 풀의 몹 생성을 중단합니다. 3가지 옵션이 제공됩니다.

  • "animal": 소나 돼지 같은 수동적인 몹
  • "water_animal": 열대어나 돌고래 같은 수중 몹
  • "monster": 스켈레톤이나 좀비 같은 적대적인 몹

로봇에는 동물 풀을 사용합니다.

조건

conditions 몹이 월드에서 생성될 수 있게 하는 조건의 배열입니다. 각 조건은 별도로 결합되어 몹을 월드에 생성합니다. 각 조건은 몹을 생성해야 하는 시점과 그렇지 않은 시점을 정의하는 구성 요소 그룹으로 구성됩니다.

기본 생성 규칙에는 규칙 하나만 있으면 됩니다. 로봇에는 이 구성을 사용할 것입니다.

{
    "format_version": "1.8.0",
    "minecraft:spawn_rules": {
        "description": {
            "identifier": "compass:robot",
            "population_control": "animal"
        },
        "conditions": [
            {
                "minecraft:spawns_on_surface": {},
                "minecraft:brightness_filter": {
                    "min": 12,
                    "max": 15,
                    "adjust_for_weather": false
                },
                "minecraft:weight": {
                    "default": 40
                },
                "minecraft:biome_filter": {
                    "test": "has_biome_tag",
                    "value": "animal"
                }
            }
        ]
    }
}
구성 요소 이름 설명
minecraft:spawns_on_surface 표면에 생성되는 몹
minecraft:brightness_filter 특정 밝기에서만 개체를 생성합니다. min, max, adjust_for_weather라는 3가지 옵션을 수락합니다. 조도 범위는 0~15입니다. adjust_for_weathertrue로 설정하면, 비와 천둥번개가 고려되기 때문에 조도가 감소합니다.
minecraft:weight 생성 중인 개체의 가중치입니다. 숫자가 클수록 몹이 더 자주 생성됩니다.
minecraft:biome_filter 몹이 생성될 수 있는 바이옴을 필터링합니다. 바이옴 필터는 행동에서의 필터와 비슷한 방식으로 작동하며, 따라서 all_ofany_of 같은 연산자를 사용할 수 있습니다. 바이옴에는 바이옴 유형, 변형, 차원 및 몬스터나 동물 같은 기능을 표시하는 다양한 태그가 있습니다.

로봇은 이제 표면에서 동물이 생성될 수 있고 조도가 충분한 모든 지점에서 생성됩니다. 가중치가 40이므로 상당히 자주 생성될 것입니다.

행동 애니메이션

행동 애니메이션은 일반 애니메이션과 비슷한 방식으로 작동하지만 행동 팩에서 실행됩니다. 일반 애니메이션은 모델의 움직임과 소리 및 입자에 움직임을 부여하지만, 행동 애니메이션은 일반 명령어를 실행하고 개체 이벤트를 트리거하거나 몰랑 식을 실행할 수 있습니다. 행동 애니메이션은 흔히 개체 이벤트라고 부르지만, 이 이름은 혼란을 유발할 때가 잦습니다.

로봇은 물을 싫어하니, 물속에 있거나 비를 맞으면 로봇이 손상되는 메커니즘을 추가하겠습니다. 먼저 몰랑 쿼리를 사용하여 개체가 물속에 있을 때를 테스트하는 애니메이션 컨트롤러를 만들어야 합니다. 행동 팩에 animation_controllers라는 새 폴더를 만들고 폴더 안에 robot.animation_controllers.json 파일을 만듭니다.

{
    "format_version": "1.10.0",
    "animation_controllers": {
        "controller.animation.robot.in_water": {
            "states": {
                "default": {
                    "transitions": [
                        {"in_water": "query.is_in_water_or_rain"}
                    ]
                },
                "in_water": {
                    "transitions": [
                       {"default": "query.is_in_water_or_rain == 0"}
                    ]
                }
            }
        }
    }
}

애니메이션 컨트롤러는 일반 클라이언트 측 애니메이션 컨트롤러와 대단히 비슷하게 보입니다. 로봇이 물속에 있는지 여부에 따라 토글되는 두 가지 상태가 존재합니다.

지금부터는 로봇에 독 효과를 부여하는 애니메이션을 추가하겠습니다. 행동 팩에 animations 폴더를 만들고 robot.animation.json이라는 파일을 만듭니다.

{
    "format_version": "1.8.0",
    "animations": {
        "animation.robot.poison": {
            "loop": true,
            "animation_length": 1,
            "timeline": {
                "0.0": [
                    "/effect @s poison 2 0 true"
                ]
            }
        }
    }
}

여기서는 뼈 태그를 사용하여 뼈에 움직임을 부여하는 대신 타임라인 태그를 사용합니다. 리소스 팩에서 타임라인은 몰랑 코드를 실행하는 용도로만 사용할 수 있습니다. 행동 애니메이션에는 타임라인을 사용하여 몰랑 코드와 명령어를 실행하거나 개체 이벤트를 트리거할 수 있습니다. 모든 요소는 문자열로 제공된다는 점에 유의하세요. 게임은 콘텐츠에 있는 문자열 유형을 확인합니다. 슬래시로 시작하는 문자열은 하나의 명령어로 실행됩니다. @s namespace:event 스키마에 부합하는 문자열은 개체 이벤트로 실행됩니다. 몰랑처럼 보이는 문자열은 몰랑으로 실행됩니다.

따라서 행동 애니메이션에서는 명령어가 슬래시로 시작되어야 합니다. 또한 독은 2초 동안 적용해야 합니다. 1초로는 실제로 피해를 줄 수 없기 때문입니다. 명령어 끝에 있는 true는 상태 효과를 배경화합니다. 따라서 입자가 발생하지 않습니다.

리소스 팩에서 애니메이션을 사용할 때처럼, 개체의 설명 태그에 있는 모든 애니메이션과 애니메이션 컨트롤러를 연결해야 합니다. 다음과 같은 모습이 됩니다.

        "description": {
            "identifier": "compass:robot",
            "is_spawnable": true,
            "is_summonable": true,
            "animations": {
                "poison": "animation.robot.poison",
                "in_water": "controller.animation.robot.in_water"
            },
            "scripts": {
                "animate": [
                    "in_water"
                ]
            }
        },

애니메이션 섹션에는 개체가 사용하고 약식 이름을 제공하는 모든 애니메이션 및 애니메이션 컨트롤러가 나열됩니다. 스크립트/애니메이트 섹션에는 항상 실행해야 하는 애니메이션이 나열됩니다. 우리는 컨트롤러가 항상 실행 중인 상태를 감지하되 독 효과는 감지하지 않기를 원합니다.

지금부터는 애니메이션 컨트롤러로 돌아가 독 효과를 추가해야 합니다. 또한 로봇이 쉽게 죽지 않도록 간단한 재생 메커니즘과 효과음을 추가하겠습니다.

            "states": {
                "default": {
                    "transitions": [
                        {"in_water": "query.is_in_water_or_rain"}
                    ]
                },
                "in_water": {
                    "animations": [
                        "poison"
                    ],
                    "on_exit": [
                        "/effect @s regeneration 2 4 true",
                        "/playsound random.fizz @a[r=16]"
                    ],
                    "transitions": [
                        {"default": "query.is_in_water_or_rain == 0"}
                    ]
                }
            }

animations 배열에는 이 상태로 실행 중이어야 하는 애니메이션이 모두 나열됩니다. 이 경우에는 poison 밖에 없습니다.

on_exit 태그에는 로봇이 물 밖으로 나올 때 실행할 두 가지 명령어를 추가합니다. 첫 번째 명령어는 로봇에 2초 동안 재생 효과 레벨 4를 적용합니다. 두 번째 명령어는 물이 끓는 효과음을 재생합니다.

기본 상태인 on_entry 배열에서 명령어를 실행할 수도 있었지만, 이렇게 하면 로봇이 생성되거나 월드를 다시 로드할 때 효과가 재생됩니다. 게임은 처음에는 항상 default 상태로 전환되기 때문입니다.

컨트롤러와 애니메이션의 관계를 요약하자면, 애니메이션 컨트롤러는 애니메이션이 재생되는 시점을 제어하는 데 사용하지만 애니메이션은 컨트롤러의 결정에 따른 애니메이션으로의 전환에 따라 발생하는 작업입니다. 애니메이션과 애니메이션 컨트롤러는 개체 행동 파일에 제공됩니다.

다음 튜토리얼

이 가이드에서는 완전한 사용자 정의 개체를 게임에 추가했습니다. 모델 파일을 직접 만드는 대신 기존 모델 파일을 사용했다면 이제 Blockbench에 대해 배워 보세요. 또는 서버의 개체 행동에 대해 자세히 알아볼 수 있습니다.