행동 팩 안내

Minecraft: Bedrock Edition용 첫 번째 추가 콘텐츠를 제작하기 전에 사용자 정의 콘텐츠를 포함시킬 팩을 제작해야 합니다. 크리에이터가 만들 수 있는 두 가지 팩 유형은 리소스 팩과 행동 팩입니다. 행동 팩은 개체 행동을 유도하고, 전리품을 얻고, 규칙과 아이템, 제작법 및 거래 테이블을 생성하는 파일이 포함된 폴더 구조입니다. 이 튜토리얼은 행동 팩을 만드는 방법과 게임 내 소 개체에 행동을 추가하여 공격적으로 만드는 방법을 다룹니다.

스티브를 쫓아가는 소의 이미지

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

  • Minecraft: Bedrock Edition에서 개체의 행동을 변경할 수 있다는 것.
  • 행동 팩을 리소스 팩에 연결하는 방법.

요구 사항

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

행동 팩 제작하기

행동 팩에는 여러분과 같은 크리에이터가 Minecraft 내 개체의 게임 플레이 행동을 추가하거나 제거하거나 변경하는 데 사용하는 파일이 포함되어 있습니다. 개체의 동작 파일은 닭이 씨앗을 들고 있는 플레이어를 따라가는 것과 같이 각 개체가 특정 동작을 수행하도록 하는 파일입니다.

Minecraft가 행동 파일을 찾고 사용하려면 폴더와 파일을 특정 구조로 설정해야 합니다. 이 튜토리얼은 이 폴더와 파일 구조를 만드는 과정을 안내합니다.

행동 팩 폴더와 파일 구조 이미지

폴더 만들기

이 섹션에서는 My_BEHAVIOR_Pack이라는 폴더를 만들어 보겠습니다. 꼭 이렇게 이름 붙일 필요는 없습니다. 이 폴더의 이름은 원하는 대로 지정할 수 있지만, 다른 폴더의 이름은 이 튜토리얼에서 말하는 것과 정확히 같은 이름을 지정해야 Minecraft가 찾을 위치를 알 수 있습니다.

  1. com.mojang 폴더를 엽니다.
  2. development_behavior_packs 폴더를 엽니다.
  3. development_behavior_packs 폴더 안에 새 폴더를 만들고 이름을 My_BEHAVIOR_Pack으로 지정합니다.
  4. My_BEHAVIOR_Pack 폴더를 엽니다. com.mojang development_behavior_packs 폴더에 있는 My_BEHAVIOR_Pack 폴더 이미지

매니페스트 파일 만들기

행동 팩을 Minecraft에 불러오려면 매니페스트 파일을 생성해야 합니다. 행동 팩 매니페스트 파일은 리소스 팩용으로 생성된 매니페스트 파일과 유사하지만 두 개의 추가 섹션이 있습니다.

  • 모듈: 월드에 적용하는 방법을 Minecraft가 알 수 있도록 팩을 정의합니다. 행동 팩은 데이터 유형을 사용합니다.
  • 종속성 - 행동 팩과 리소스 팩 사의 연결을 만들어 Minecraft에 사용자 정의 텍스처와 비주얼을 추가합니다.
  1. My_BEHAVIOR_Pack 폴더에 새 문서를 만들고 이름을 manifest.json으로 지정합니다.
    1. 파일 확장자를 .txt에서 .json으로 변경해야 합니다. 만약 탐색기 창에서 파일 확장자를 확인할 수 없다면 보기 탭에서 파일 확장자가 표시되게 할 수 있습니다. My_BEHAVIOR_Pack 폴더에 있는 manifest.json 파일 이미지
  2. manifest.json 파일을 더블 클릭하여 텍스트 편집기에서 엽니다.
  3. 다음 코드를 복사하여 파일에 붙여넣습니다.
{
  "format_version": 2,
  "header": {
    "description": "My attack cow behavior pack Add-On!",
    "name": "My Behavior Pack",
    "uuid":"",
    "version": [1, 0, 0],
    "min_engine_version": [1, 16, 0]
  },
  "modules":
    [
      {
        "description": "My First Add-On!",
          "type": "data",
          "uuid": "",
          "version": [1, 0, 0]
      }
    ],
  "dependencies": [
    {
     "uuid":"UUID from the header section of manifest.json in My_RESOURCE_Pack",
      "version":[1,0,0]
    }
 ]
}

UUID 입력

리소스 팩 매니페스트 파일과 유사하게 매니페스트 파일의 헤더 및 모듈 섹션에 대해 서로 다른 두 개의 UUID를 생성해야 합니다. https://www.uuidgenerator.net/ 같은 온라인 생성기에서 UUID를 얻을 수 있습니다.

사용자 정의 UUID가 생성된 UUIDGenerator.net 홈 화면 이미지

  1. UUID를 복사하여 헤더 섹션에 붙여넣습니다. 따옴표("") 사이의 "uuid" 필드에 붙여넣기해야 UUID가 제대로 읽힐 수 있습니다.
  2. 모듈 섹션에서 사용할 새 UUID를 생성하려면 웹 페이지를 새로 고침합니다.
  3. 새 UUID를 복사하여 따옴표 사이의 "uuid" 필드에 있는 모듈 섹션에 붙여넣습니다.

종속성 만들기

행동 팩의 manifest.json 파일에는 리소스 팩과 동작 팩 사이의 연결을 만드는 데 사용되는 '종속성'이라는 세 번째 섹션이 있습니다. 이 연결은 리소스 팩 manifest.json 파일의 헤더 섹션에 있는 UUID가 행동 팩 manifest.json 파일의 종속성 섹션에 있는 UUID와 동일한 경우 생성됩니다. 행동 팩을 사용하기 위해 리소스 팩이 필요하지 않으며 리소스 팩을 사용하기 위해 행동 팩이 필요하지 않습니다. 둘 다 가지고 있는 경우 이 솔루션을 사용하여 둘을 함께 연결할 수 있으므로 행동 팩을 월드에 불러올 때 연결된 리소스 팩을 자동으로 불러오고 활성화합니다.

행동 팩 종속성 섹션에 복제된 리소스 팩 manifest.json 헤더 UUID의 이미지

  1. development_resource_packs 폴더의 My_RESOURCE_Pack 폴더에 있는 manifest.json 파일을 엽니다.
  2. 리소스 팩 manifest.json 파일의 header 섹션에서 UUID를 복사합니다.
  3. development_behavior_packs 폴더의 *My_BEHAVIOR_Pack 폴더에 있는 manifest.json 파일로 이동합니다.
  4. 종속성 섹션의 "uuid" 필드에 UUID를 붙여넣습니다. 따옴표 사이의 모든 항목이 정확히 일치하는지 확인하세요.
  5. 행동 팩 manifest.json 파일을 저장합니다.

행동 팩 종속성 섹션에 복제된 리소스 팩 manifest.json 헤더 UUID의 이미지

entities 폴더 생성 및 소 추가

모든 개체의 행동은 Minecraft를 작동시키는 코드 안에 있는 JSON 파일에 정의되어 있습니다. Minecraft가 일반적인 "바닐라" 파일 대신 사용할 새 소 행동 파일을 만들어 보겠습니다.

  1. My_BEHAVIOR_Pack 폴더에서 폴더를 만들고 이름을 entities로 지정합니다.
  2. entities 폴더에 텍스트 파일을 만들고 이름을 cow.json으로 지정합니다.
  3. 다음 코드를 복사하여 cow.json 파일에 붙여넣습니다. 파일을 저장하고 나면 준비가 완료된 것입니다!

참고

편집된 전체 cow.json 파일입니다. 소가 많은 행동을 하기 때문에 파일의 크기가 큽니다!

{
    "format_version": "1.16.0",
    "minecraft:entity": {
        "description": {
            "identifier": "minecraft:cow",
            "is_spawnable": true,
            "is_summonable": true,
            "is_experimental": false
        },
        "component_groups": {
            "minecraft:cow_baby": {
                "minecraft:is_baby": {},
                "minecraft:scale": {
                    "value": 0.5
                },
                "minecraft:ageable": {
                    "duration": 1200,
                    "feed_items": "wheat",
                    "grow_up": {
                        "event": "minecraft:ageable_grow_up",
                        "target": "self"
                    }
                },
                "minecraft:behavior.follow_parent": {
                    "priority": 6,
                    "speed_multiplier": 1.1
                }
            },
            "minecraft:cow_adult": {
                "minecraft:experience_reward": {
                    "on_bred": "Math.Random(1,7)",
                    "on_death": "query.last_hit_by_player ? Math.Random(1,3) : 0"
                },
                "minecraft:loot": {
                    "table": "loot_tables/entities/cow.json"
                },
                "minecraft:behavior.breed": {
                    "priority": 3,
                    "speed_multiplier": 1.0
                },
                "minecraft:breedable": {
                    "require_tame": false,
                    "breed_items": "wheat",
                    "breeds_with": {
                        "mate_type": "minecraft:cow",
                        "baby_type": "minecraft:cow",
                        "breed_event": {
                            "event": "minecraft:entity_born",
                            "target": "baby"
                        }
                    }
                },
                "minecraft:interact": {
                    "interactions": [
                        {
                            "on_interact": {
                                "filters": {
                                    "all_of": [
                                        {
                                            "test": "is_family",
                                            "subject": "other",
                                            "value": "player"
                                        },
                                        {
                                            "test": "has_equipment",
                                            "domain": "hand",
                                            "subject": "other",
                                            "value": "bucket:0"
                                        }
                                    ]
                                }
                            },
                            "use_item": true,
                            "transform_to_item": "bucket:1",
                            "play_sounds": "milk",
                            "interact_text": "action.interact.milk"
                        }
                    ]
                }
            }
        },
        "components": {
            "minecraft:is_hidden_when_invisible": {},
            "minecraft:type_family": {
                "family": [
                    "cow",
                    "mob"
                ]
            },
            "minecraft:breathable": {
                "total_supply": 15,
                "suffocate_time": 0
            },
            "minecraft:navigation.walk": {
                "can_path_over_water": true,
                "avoid_water": true,
                "avoid_damage_blocks": true
            },
            "minecraft:movement.basic": {},
            "minecraft:jump.static": {},
            "minecraft:can_climb": {},
            "minecraft:collision_box": {
                "width": 0.9,
                "height": 1.3
            },
            "minecraft:nameable": {},
            "minecraft:health": {
                "value": 10,
                "max": 10
            },
            "minecraft:hurt_on_condition": {
                "damage_conditions": [
                    {
                        "filters": {
                            "test": "in_lava",
                            "subject": "self",
                            "operator": "==",
                            "value": true
                        },
                        "cause": "lava",
                        "damage_per_tick": 4
                    }
                ]
            },
            "minecraft:movement": {
                "value": 0.25
            },
            "minecraft:despawn": {
                "despawn_from_distance": {}
            },
            "minecraft:behavior.float": {
                "priority": 0
            },
            "minecraft:behavior.panic": {
                "priority": 1,
                "speed_multiplier": 1.25
            },
            "minecraft:behavior.mount_pathing": {
                "priority": 2,
                "speed_multiplier": 1.5,
                "target_dist": 0.0,
                "track_target": true
            },
            "minecraft:behavior.breed": {
                "priority": 3,
                "speed_multiplier": 1.0
            },
            "minecraft:behavior.tempt": {
                "priority": 4,
                "speed_multiplier": 1.25,
                "items": [
                    "wheat"
                ]
            },
            "minecraft:behavior.follow_parent": {
                "priority": 5,
                "speed_multiplier": 1.1
            },
            "minecraft:behavior.random_stroll": {
                "priority": 6,
                "speed_multiplier": 0.8
            },
            "minecraft:behavior.look_at_player": {
                "priority": 7,
                "look_distance": 6.0,
                "probability": 0.02
            },
            "minecraft:behavior.random_look_around": {
                "priority": 9
            },
            "minecraft:leashable": {
                "soft_distance": 4.0,
                "hard_distance": 6.0,
                "max_distance": 10.0
            },
            "minecraft:balloonable": {},
            "minecraft:rideable": {
                "seat_count": 1,
                "family_types": [
                    "zombie"
                ],
                "seats": {
                    "position": [
                        0.0,
                        1.105,
                        0.0
                    ]
                }
            },
            "minecraft:physics": {},
            "minecraft:pushable": {
                "is_pushable": true,
                "is_pushable_by_piston": true
            },
            "minecraft:conditional_bandwidth_optimization": {},
            "minecraft:behavior.nearest_attackable_target": {
                "priority": 2,
                "must_see": true,
                "reselect_targets": true,
                "within_radius": 25.0,
                "entity_types": [
                    {
                        "filters": {
                            "test": "is_family",
                            "subject": "other",
                            "value": "player"
                        },
                        "max_dist": 32
                    }
                ]
            },
            "minecraft:behavior.melee_attack": {
                "priority": 3
            },
            "minecraft:attack": {
                "damage": 3
            }
        },
        "events": {
            "minecraft:entity_spawned": {
                "randomize": [
                    {
                        "weight": 95,
                        "trigger": "minecraft:spawn_adult"
                    },
                    {
                        "weight": 5,
                        "add": {
                            "component_groups": [
                                "minecraft:cow_baby"
                            ]
                        }
                    }
                ]
            },
            "minecraft:entity_born": {
                "add": {
                    "component_groups": [
                        "minecraft:cow_baby"
                    ]
                }
            },
            "minecraft:entity_transformed": {
                "remove": {},
                "add": {
                    "component_groups": [
                        "minecraft:cow_adult"
                    ]
                }
            },
            "minecraft:ageable_grow_up": {
                "remove": {
                    "component_groups": [
                        "minecraft:cow_baby"
                    ]
                },
                "add": {
                    "component_groups": [
                        "minecraft:cow_adult"
                    ]
                }
            },
            "minecraft:spawn_adult": {
                "add": {
                    "component_groups": [
                        "minecraft:cow_adult"
                    ]
                }
            }
        }
    }
}

팩 테스트

이제 매니페스트 파일과 소 개체가 모두 행동 팩에 들어 있으므로 Minecraft를 실행하여 새 추가 콘텐츠를 테스트할 차례입니다. 리소스 팩 튜토리얼에서 설명한 것처럼 Pack Stacking 은 행동 팩에서도 작동합니다. 즉, 콘텐츠를 불러올 때 바닐라 콘텐츠를 먼저 불러오고 그 다음에 추가 콘텐츠를 불러옵니다. 모든 소는 cow.json 행동 파일에 의해 제어되므로 월드에 생성되는 모든 소는 새로운 행동을 하게 됩니다.

  1. Minecraft를 실행하고 플레이를 선택하세요.
  2. 새 월드 만들기를 선택하세요.
  3. 설정에서 아래로 스크롤하여 추가 콘텐츠로 이동하세요.
  4. 행동 팩을 클릭하여 사용 가능한 모든 팩을 확인하세요.
  5. MY PACKS 드롭다운을 클릭하여 여세요.
  6. My BEHAVIOR Pack을 선택하고 인증하기를 클릭하여 행동 팩을 월드에 추가하세요.
  7. 만들기를 클릭하여 나만의 월드를 만드세요.
  8. 소를 찾아 보세요.

문제 해결

행동 팩 문제? 문제 해결은 일반적인 모든 개발 프로세스의 일부입니다. 아래와 같은 위치에서 행동 팩 문제 해결을 시작할 수 있습니다.

Minecraft에 행동 팩이 나타나지 않음

리소스 팩이 추가 콘텐츠 섹션에 나타나지 않으면 manifest.json 파일에 문제가 있는 것입니다. 거기에서 시작해 보겠습니다!

  • manifest.json 헤더 및 모듈 섹션에 서로 다른 두 개의 UUID가 있습니까? 자세한 정보는 UUID 섹션을 참조하세요.
  • 파일 확장자 및 경로를 설정하셨습니까? manifest.json manifest.json이 아닐 수도 있습니다. 탐색기 창에 파일 확장자가 표시되지 않는 경우 보기 탭에서 파일 확장명을 활성화할 수 있습니다.
  • JSON 중괄호와 대괄호를 다시 확인하세요. JSON 린팅 도구가 도움이 될 수 있습니다.
  • 사용 중인 행동 팩에 문제가 있는 경우 추가 콘텐츠 섹션의 행동 팩 아래에 빨간색 느낌표가 표시됩니다.
    • 행동 팩에는 더 많은 정보가 포함됩니다. 누락된 종속성을 경고하거나 다른 문제에 대한 진단을 실행할 수 있습니다.

행동 팩이 표시되고 콘텐츠가 작동하지 않음

  • entities 폴더가 올바른 위치에 있고 철자가 올바른지 확인하세요. 그런 다음 cow의 모든 철자를 확인하세요.
  • dependencies 섹션의 UUID가 기존 리소스 팩과 일치하는지 (그리고 작동하는지) 확인하세요.
  • 먼저 불러오도록 행동 팩을 다른 팩 위로 이동하세요. 팩 스태킹으로 인해 변경 사항이 표시되지 않을 수 있습니다.

다음 튜토리얼

행동 팩이 작동하는 것을 살펴보았으므로 이제 행동 팩의 작동 방식과 기타 수행할 수 있는 작업에 대해 자세히 알아보겠습니다.

변경되지 않은 리소스 및 행동 파일의 예시를 확인하려면 Minecraft 바닐라 리소스 팩바닐라 행동 팩을 확인하세요.