다음을 통해 공유


개체 행동 소개

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

  • 행동 파일을 사용하여 새 개체를 만들고 행동을 변경하는 방법을 알아봅니다.
  • 구성 요소를 사용하여 개체의 행동을 확장하는 방법을 알아봅니다.
  • 이벤트를 이용해 조건에 따라 발생하는 활성 구성 요소를 변경하는 방법을 알아봅니다.

요구 사항

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

소개

Minecraft: Bedrock Edition의 행동 파일로 개체가 행동하는 방식과 월드와 상호 작용하는 방식을 사용자 지정할 수 있습니다. 행동 팩의 일부이나 행동 팩에는 함수나 노획물 목록 같은 다른 종류의 파일도 포함되어 있습니다.

행동 파일은 바닐라 개체의 행동을 사용자 지정할 수 있는 방법으로 애드온과 함께 처음 도입되었습니다. 구성 요소는 이전 복잡한 코드 작동으로 이뤄진 개별 몹을 제작자들이 개체를 사용자 지정할 때 사용할 수 있는 작은 파일로 나뉘어지면서 만들어졌습니다. 예를 들어 고양이와 개에게 적용되던 길들이기 작동 방식은 tameable 구성 요소로 옮겨져 제작자들이 다른 개체도 길들일 수 있게 됐습니다.

최종 목적은 몇 년에 걸쳐 개체의 모든 단일 작동 방식을 사용자 지정할 수 있게 바꾸는 것입니다.

개체를 추가하는 방법이 도입됐을 때 행동 파일은 바닐라 개체의 구성 요소로 새로운 개체를 기초부터 생성하는 방법으로 사용됐습니다.

행동 파일을 사용하는 방법은 두 가지가 있습니다.

  • 바닐라 개체 변경 개체 추가하기가 도입된 이후 이 기능인 바닐라 게임에 작은 변화를 추가하는 방법이었으나 새 콘텐츠를 추가하는 것은 아니었습니다.
  • 사용자 지정 개체 제작 행동 파일은 사용자 지정 개체의 기본이 됩니다.

형식 개요

개체 행동 파일은 행동 팩의 entities 폴더에 저장됩니다. 게임은 해당 폴더의 모든 파일을 불러오기하므로 하위 폴더의 파일을 사용해 개체를 관리할 수 있습니다. 파일은 확장자로 .json을 사용합니다. 해당 확장자는 애드온의 많은 파일이 사용하며 혼동하지 않으려면 행동 파일의 확장자를 .behavior.json로 변경하여 따로 구분할 수 있습니다. 확장자를 확장하는 예시는 이 표를 참고하세요.

파일은 JSON 언어로 작성되며 기본 구조는 다음과 같습니다.

{
    "format_version": "1.13.0",
    "minecraft:entity": {
        "description": {
            "identifier":"compass:example",
            "is_spawnable":true,
            "is_summonable":true
        },
        "components": {},
        "component_groups": {},
        "events": {}
    }
}
        `description` 태그에서 게임이 개체를 등록하는 방식의 기본 특성을 정의합니다.
매개 변수 이름 유형 설명
identifier 문자열 개체의 식별자입니다. 이 개체가 애드온의 사용자 지정 개체라면 예시에서 볼 수 있듯이 사용자 지정 고유 네임스페이스를 사용해야 합니다.
runtime_identifier 문자열 게임 내부에서 사용되는 식별자입니다. 이를 이용해 아직 구성 요소를 사용할 수 없는 바닐라 개체에서 사용자 지정 작동 방식을 상속받을 수 있습니다. 개체마다 한 번에 하나의 런타임 식별자만 배정할 수 있지만 정말 필요한 경우에만 사용하세요. 바닐라 개체의 작동 방식이 구성 요소로 변경되면 런타임 식별자를 통해 해당 작동 방식을 사용할 경우 기능이 작동하지 않을 수 있습니다.
is_spawnable 불(참/거짓) 논리
true일 경우 개체의 알이 크리에이티브 모드 소지품에 생성됩니다.
is_summonable 불(참/거짓) 논리
true일 경우 개체를 /summon 명령어를 사용해 소환할 수 있습니다.
is_experimental 불(참/거짓) 논리
animations 객체 행동 애니메이션 목록 혹은 애니메이션 컨트롤러입니다. 이 기능으로 개체의 명령어를 실행하거나 이벤트를 만들 수 있습니다.
scripts 객체 클라이언트 개체 파일에서 작동하는 방식을 서술하여 행동 애니메이션을 재생하는데 쓰입니다.

구성 요소 및 구성 그룹

구성 요소는 여러분이 개체에 추가할 수 있는 특성이나 작동 방식입니다. 구성 요소를 추가하는 방법은 두 가지입니다. 구성 요소 태그에 직접 추가하거나 구성 그룹을 이용할 수 있습니다.

  • 기본 구성 요소 태그에 구성 요소를 추가하면 이벤트로 구성 그룹에서 제거되더라도 항상 활성화됩니다.
  •        **구성 그룹**은 하나 이상의 구성 요소의 집합체로 기본적으로 활성화되지 않지만 이벤트를 통해 활성화/비활성화됩니다. 예를 들어 유체 같은 다양한 종류의 개체를 만드는 데 쓸 수 있습니다.
    

예시를 보면 구성 그룹이 다양한 개체의 유체를 만들 때 사용됐습니다. 구성 요소는 주 구성 섹션에서 정의되며 항상 활성화됩니다. baby 구성 그룹의 구성 요소는 그룹이 추가됐을 경우이면 활성화됩니다.

{
    "format_version": "1.13.0",
    "minecraft:entity": {
        "description": {
            "identifier":"compass:example",
            "is_spawnable":true,
            "is_summonable":true
        },
        "components": {
            "minecraft:physics":{}
        },
        "component_groups": {
            "baby": {
               "minecraft:behavior.follow_parent": {},
               "minecraft:is_baby": {}
            }
        },
        "events": {}
    }
}

Minecraft 구성 요소는 minecraft: 네임스페이스를 사용합니다.

대부분의 구성 요소는 JSON 객체로 정의됩니다. 대부분의 구성 요소는 옵션을 가지고 있는데 객체 내부에서 정의할 수 있습니다. 하지만 일부 구성 요소는 이전 예시에서 본 것처럼 옵션이 없습니다.

구성 요소 배우는 방법

사용 가능한 전체 구성 요소 목록은 여기를 확인하세요.

구성 요소를 배우고 실재로 어떻게 사용되는지 보는 좋은 방법으로 기본 Minecraft 개체의 행동 파일을 살펴보는 것이 있습니다. 최신 기본 행동 팩은 언제든지 https://aka.ms/behaviorpacktemplate에서 찾을 수 있습니다.

참고

구성 요소가 작동하는 방식은 버전에 따라 달라지기도 합니다. 따라서 바닐라 개체의 구성 요소가 여러분의 개체에서 작동하지 않는다면 두 파일의 형식 버전이 동일한지 확인하세요. 구성 요소는 언제라도 수정될 수 있으므로 최신 버전을 사용하시길 추천합니다.

필수 구성 요소

구성 요소 이름 옵션 설명
minecraft:physics has_collision
has_gravity
99%의 사용자 지정 개체에 필요한 구성 요소입니다. 이 구성 요소는 개체가 땅에 붙어 있을 수 있게 하며 상호 작용에 반응하고 경우에 따라 여러분의 기대에 맞게 공격할 수도 있게 합니다.
minecraft:scale value 개체의 크기를 설정합니다.
minecraft:collision_box width height 개체의 충돌 상자를 설정합니다.
widthheight만 변경할 수 있습니다. 충돌 상자는 언제나 월드 축에 맞춰 기본적으로 사각형 형태입니다.
minecraft:type_family family 개체가 속한 유형 분류의 목록입니다. 유형 분류는 다른 개체로 확인할 수 있습니다. 예를 들어 어떤 몹이 공격적인지 테스트를 해봅니다.
minecraft:movement value 개체가 움직이는 속도를 정합니다. 0.25는 Minecraft 내 대부분의 동물의 일반 속도입니다.
minecraft:movement.basic 문서 보기 개체가 땅에서 돌아다닐 수 있게 합니다.
minecraft:navigation.walk 문서 보기 개체가 월드를 걸어서 이동할 수 있게 합니다. 호버링처럼 개체가 이동하는 다른 유형도 있습니다.
minecraft:is_baby
minecraft:is_ignited
minecraft:is_saddled
minecraft:is_sheared
minecraft:is_tamed
minecraft:is_illager_captain
:--- 이 구성 요소는 단독으로 작동하지 않습니다. 하지만 애니메이션, 애니메이션 컨트롤러, 렌더링 컨트롤러에 사용할 수 있으며 애니메이션이다 개체의 행동에서 다른 외형 요소를 조절할 때 사용합니다.
minecraft:variant
minecraft:mark_variant
minecraft:skin_id
value 이 구성 요소들은 위 구성 요소와 비슷하게 작동하는데 켜기/끄기 상태가 아닌 정수 값을 저장합니다.

우선순위

        `priority` 옵션은 모든 행동 구성 요소(AI 목표)에 쓰일 수 있습니다. `0` 는 가장 높은 우선순위를 지니며 모든 행동 구성 요소의 기본 우선순위입니다. 숫자가 클수록 우선순위가 낮습니다. 만약 개체가 낮은 우선순위의 행동을 하고 있을 때 높은 우선순위의 행동을 할 차례가 오면 즉시 높은 우선순위의 행동을 실행하게 됩니다.

아래 예시에서 hurt_by_target 구성 요소가 더 높은 우선순위를 가지고 있습니다. 만약 개체가 걷는 도중에 공격을 당한다면 즉시 공격한 대상을 표적으로 삼습니다.

"minecraft:behavior.random_stroll": {
    "priority": 4
},
"minecraft:behavior.hurt_by_target": {
    "priority": 1
}

구성 요소 제거하기

구성 그룹이 개체에서 제거되면 구성 요소의 효과도 모두 제거됩니다. 이때 대부분의 경우 문제가 생기지 않습니다. 하지만 일부 경우 구성 요소가 서로 덮어쓰기될 수 있으므로 주의해야 합니다. 따라서 구성 요소를 제거해도 해당 구성 요소의 이전 상태로 돌아가지는 않습니다. 또한 같은 구성 요소를 다른 구성 그룹에서 사용하거나 기본 구성 요소를 사용하지도 않습니다. 그 대신 구성 요소는 완전히 제거되며 기본 값으로 초기화됩니다.

예시: 기본 components 태그에 크기가 2로 지정된 개체가 있다고 가정하겠습니다. 크기를 1.5로 설정한 크기 구성 요소를 유체 구성 그룹에 추가합니다. 이제 크기는 1.5로 정확히 업데이트됩니다. 이제 구성 그룹 전체를 삭제합니다. 이때 크기가 2로 돌아가는 것이 아니라 1로 초기화됩니다. 이런 일이 일어나는 이유는 구성 그룹이 크기 구성 요소 전체를 삭제하기 때문입니다. 크기는 기본 값인 1로 초기화될 것입니다.

이러한 점을 주의해야 할 구성 요소들이 있습니다.

  • 개체의 값을 변경하는 구성 요소르는 minecraft:scale, minecraft:collision_box, minecraft:variant 등이 있습니다.
  • 구성 요소 목록은 minecraft:interact, minecraft:environment_sensor, minecraft:damage_sensor
  • 그리고 minecraft:rideable(다른 자리 숫자 혹은 위치) 같은 상태를 변경할 필요가 있는 구성 요소가 있습니다.

이런 현상을 피하려면 상태가 업데이트된 구성 요소가 포함된 새로운 구성 그룹을 추가하면 됩니다. 크기 예시와 같이 여러분이 서로 교체할 수 있는 서로 다른 두 구성 그룹으로 구성하면 쉽게 해결할 수 있습니다.

        "components": {
            "minecraft:scale":{
               "value": 2
            }
        },
        "component_groups": {
            "baby": {
               "minecraft:scale": {
                   "value": 1.5
               }
            },
            "adult": {
               "minecraft:scale": {
                   "value": 2
               }
            }
        },
        "events": {
            "set_baby":{
               "remove": {"component_groups": ["adult"]},
               "add": {"component_groups": ["baby"]}
            },
            "set_adult":{
               "remove": {"component_groups": ["baby"]},
               "add": {"component_groups": ["adult"]}
            }
        }

이벤트

이벤트는 개체의 구성 그룹을 추가하거나 제거할 때 쓰입니다. 예시처럼 이전 구성 그룹이 제거되고 새 구성 그룹이 추가되었습니다.

"events": {
    "compass:example_event": {
        "remove": {
            "component_groups": ["compass:group_a"]
        },
        "add": {
            "component_groups": ["compass:group_b","compass:group_c"]
        }
    }
}

이벤트는 minecraft:interact, minecraft:environment_sensor 같은 구성 요소나 행동 애니메이션, 소환 명령어로 발동됩니다. 다음 명령어는 위 이벤트가 실행될 때 개체를 생성합니다.

/summon compass:example_entity ~ ~ ~ compass:example_event

내장 이벤트

일부 이벤트는 Minecraft 내부에 탑재되어 개체가 특정 조건에서 생성되면 실행됩니다.

이벤트 이름 설명
minecraft:entity_born 이 이벤트는 개체가 번식으로 생성되었을 때 실행됩니다.
minecraft:entity_spawned 이 이벤트는 개체가 생성되었을 때마다 실행됩니다. 여러분이 직접 /summon할 경우 실행되지 않습니다.
minecraft:entity_transformed 이 이벤트는 한 개체가 해당 개체로 변환되면 실행됩니다.
minecraft:on_prime 이 이벤트는 개체가 준비가 완료돼 폭발할 준비가 되면 실행됩니다.

무작위 생성

만약 어떤 개체에 무작위 구성 그룹을 추가하고 싶다면 무작위 함수를 사용할 수 있습니다. 추가되거나 제거될 수 있는 구성 그룹의 객체 배열을 특정합니다. 게임이 객체를 무작위로 선택해서 실행할 것입니다.

추가로 옵션이 실행될 확률을 변경하려면 옵션에 가중치를 설정할 수 있습니다. 모든 가중치 합은 100%입니다. 다음 예시에서 개체는 20%(1에서 4) 확률로 유체로 생성되며 나머지 경우에는 구성 그룹이 추가되지 않습니다.

"events": {
    "minecraft:entity_spawned": {
        "randomize": [
            {
               "weight": 40
            },
            {
               "weight": 10,
               "add": {
                   "component_groups": ["baby"]
               }
            }
        ]
    }
}

시퀀스

때로 한 이벤트 내에서 다양한 이벤트를 순서대로 실행해야 할 경우가 있습니다. 예를 들어 개체의 색이나 무늬 패턴 같은 특성 두 가지를 무작위로 부여합니다. 이 경우 시퀀스를 사용할 수 있습니다. 시퀀스는 무작위와 구조가 비슷하지만 목록에 있는 아이템들이 순서대로 실행됩니다. 필터와 함께 사용하면 매우 유용한 기능으로 필터는 다음 섹션에서 설명하겠습니다.

시퀀스와 무작위는 독립적으로 적용할 수 있습니다.

예시를 보면 initial 그룹이 개체가 생성됐을 때 추가됩니다. 그 후 유체 구성 요소가 이전 섹션처럼 무작위화 됩니다.

        "events": {
            "minecraft:entity_spawned":{
               "sequence": [
                   {
                       "add": {
                           "component_groups": ["initial"]
                       }
                    },
                   {
                       "randomize": [
                           {
                               "weight": 40
                           },
                           {
                               "weight": 10,
                               "add": {
                                   "component_groups": ["baby"]
                               }
                           }
                       ]
                    }
               ]
            }
        }

필터

필터는 이벤트나 이벤트의 일부의 조건으로 현재 개체(상호 작용하는 개체 혹은 월드)의 특정 특성을 테스트합니다. 필터는 모든 이벤트에 사용할 수 있지만 일부 구성 요소에는 직접 사용해야 합니다.

이벤트는 최대 다섯 개의 매개 변수를 가집니다. 매개 변수 testvalue는 필수이며 나머지는 선택입니다.

테스트 유형 테스트할 속성
value 테스트할 값입니다. 문자열을 테스트할 경우 문자열이며 숫자 값이나 불 논리를 테스트할 때는 숫자 값입니다.
subject 테스트를 실행할 개체입니다. 기본 설정은 self지만 상호 작용하는 다른 개체를 대상으로 삼을 수도 있습니다.
operator 값을 비교하는 방식입니다. 기본 설정은 equals이지만 더 작거나 큰 값(숫자 값) 혹은 서로 다른 값을 테스트할 수 있습니다.
domain 일부 추가된 문맥을 테스트할 때 사용되는데 예를 들어 인벤토리 슬롯을 테스트하는 has_equipment 테스트가 있습니다.

참고

필터의 전체 목록과 이 매개 변수들이 상호 작용하는 방법은 개체 기술 문서에서 확인할 수 있습니다.

이벤트 내에서 필터를 사용하는 간단한 예시는 다음과 비슷합니다. 개체가 event_allowed 태그를 가졌다면 구성 그룹을 추가할 수 있습니다.

"events": {
    "compass:example_event": {
        "filters": {
            "test": "has_tag",
            "value":"event_allowed"
        },
        "add": {
            "component_groups": ["baby"]
        }
    }
}

여러 필터를 사용하고 싶다면 all_of, any_of, none_of 같은 목록을 사용해 그룹으로 만들 수 있으며 모든 필터가 내부에 존재하거나 필터가 하나만 내부에 존재하거나 필터가 내부에 존재하지 않아야 성공할 수 있습니다. 이 목록은 독립적으로 적용할 수 있습니다.

다음 예시처럼 필터에 두 번째 조건을 추가하겠습니다. 이벤트는 개체가 이전 예시의 태그를 가지고 있으며 동시에 가장 가까이 있는 플레이어와 떨어진 거리가 10블록 이내일 때 실행됩니다.

"events": {
    "compass:example_event": {
        "filters": {
            "all_of":[
               {"test": "has_tag", "value": "event_allowed"},
               {"test": "distance_to_nearest_player", "operator": "<", "value": 10}
            ]
        },
        "add": {
            "component_groups": ["baby"]
        }
    }
}

다음 튜토리얼

구성 요소가 어떻게 작동되는지 몰라 어려움을 겪었거나 더 자세히 알고 싶다면 바닐라 행동 파일을 확인하면 작동 예시를 확인할 수 있습니다. 바닐라 개체를 해체하거나 다른 개체에 적용하는 방법으로 시작하는 것이 좋습니다. 엔더맨의 minecraft:teleport 구성 요소를 얻어서 크리퍼에 적용해보세요. 플레이어가 좀비를 탈 수 있게 만들어보세요. 유체 크리퍼를 만들어보세요.

구성 요소 시스템을 이용해 여러분의 개체가 하는 행동 및 월드와 상호 작용하는 방식을 편집할 수 있습니다. 여러분의 개체의 모습과 행동을 설계하는 방법을 더 자세히 알고 싶다면 개체 모델링 및 애니메이션 튜토리얼을 참고하세요.