◆Cobblemon Wiki

애드온 제작

구 Poser

서문

이 문서는 이제 오래된 poser JSON 형식을 다룹니다. 모드에는 아직 하위 호환 지원이 남아 있지만, 지금은 이 형식을 계속 사용할 이유가 없습니다. 현재 Poser 위키 문서를 사용하세요.

poser JSON은 포켓몬의 모든 애니메이션을 제어합니다. 포켓몬이 특정 애니메이션을 언제 수행할지에 대한 정보가 들어 있습니다. 원한다면 포켓몬이 하나의 애니메이션만 재생하게 만들 수도 있고, 거의 모든 행동마다 다른 애니메이션을 줄 수도 있습니다. 애니메이션 파일 자체를 수정하지 않고도 애니메이션의 일부 속성을 조정하는 데 사용할 수도 있습니다.

공식 모델이 구현된 방식 때문에 공식 poser 파일은 제공되지 않습니다. 커스텀 포켓몬용 poser 데이터는 여러 애드온 제작자 사이에서 자주 공유됩니다. poser 파일에 대한 도움말과 기법은 Cobblemon Discord 서버에서 찾아볼 수 있습니다.

Poser 파일 구성 설명

poser 파일은 model에 애니메이션을 배정하기 위해 animation JSON이 필요합니다. 모델에 어떤 애니메이션이 만들어져 있는지 항상 파악해 두는 것이 좋습니다. 애니메이션 JSON에 없는 애니메이션 타입을 지정하면 게임이 충돌합니다. poser에 적은 본이 모델에 존재하지 않아도 게임이 충돌합니다. 대상 포켓몬 모델에 어떤 애니메이션이 있는지 확인했다면, 기존 애니메이션을 알맞은 poses에 적용하면 됩니다.

blink 애니메이션처럼 대응되는 포즈가 없어 보이는 애니메이션도 있을 수 있습니다. 이런 애니메이션은 quirk 애니메이션 시스템으로 적용할 수 있습니다. 이 시스템은 게임 안에서 이미 재생 중인 애니메이션 위에 특정 애니메이션을 겹쳐 재생하게 해 줍니다. quirk 시스템을 잘 활용하면 포켓몬이 훨씬 생동감 있게 느껴집니다.

아래는 지정할 수 있는 여러 속성이 모두 포함된 poser 파일 예시의 설명입니다. 밑줄이 있는 텍스트에 마우스를 올리면 더 자세한 정보를 볼 수 있습니다. 사용 가능한 poser 함수의 모든 종류가 이 예시에 최소 한 번씩 들어 있습니다. 일부 항목이 왜 그런 방식으로 작성되었는지 이해하려면 파일 전체를 꼭 살펴보세요. 이 예시는 틀로 사용하기 위한 것이 아닙니다.

{
   "head": "head",
   "portraitScale": 1.65,
   "portraitTranslation": [0, -0.6, 0],
   "profileScale": 1,
   "profileTranslation": [0, 0.15, 0],
   "faint": "bedrock(charizard, faint, true)",
   "cry":  "bedrock(charizard, cry)",
   "poses": {
     "battle-idle": {
       "poseName": "battle-idle",
       "transformTicks": 10,
       "poseTypes": ["STAND"],
       "isBattle": true,
       "isTouchingWater": false,
       "transformedParts": [
         {
           "part": "wing_right",
           "position": [10, 0, 0],
           "rotation": [0, 0, 0],
           "isVisible": true
         },
         {
           "part": "wing_left",
           "position": [-10, 0, 0],
           "rotation": [0, 0, 0],
           "isVisible": false
         }
       ],
       "animations": ["bedrock(charizard, battle_idle)"],
       "quirks": [
         {
           "name": "blink",
           "loopTimes": 5,
           "minSecondsBetweenOccurrences": 8,
           "maxSecondsBetweenOccurrences": 20,
           "animations": ["bedrock(charizard, blink)"]
         },
         {
           "name": "wing_flap",
           "animations": ["bedrock(charizard, wing_flap)"]
         }
       ]
     },
     "standing": {
       "poseName": "standing",
       "transformTicks": 10,
       "poseTypes": ["STAND", "NONE", "PORTRAIT", "PROFILE" ],
       "isBattle": false,
       "transformedParts": [
         {
           "part": "wing_right",
           "position": [0, 0, 0],
           "isVisible": true
         },
         {
           "part": "wing_left",
           "position": [0, 0, 0],
           "isVisible": true
         }
       ],
       "animations": [
         "look",
         "bedrock(charizard, ground_idle)"
       ],
       "quirks": [
         {
           "name": "blink",
           "animations": ["bedrock(charizard, blink)"]
         }
       ]
     },
     "walking": {
       "poseName": "walking",
       "poseTypes": ["WALK"],
       "transformedParts": [
         {
           "part": "wing_right",
           "position": [0, 0, 0],
           "isVisible": true
         },
         {
           "part": "wing_left",
           "position": [0, 0, 0],
           "isVisible": true
         }
       ],
       "animations": [
         "look",
         "bedrock(charizard, ground_walk)",
         "bedrock(charizard, ground_idle)"
       ],
       "quirks": [
         {
           "name": "blink",
           "animations": ["bedrock(charizard, blink)"]
         }
       ]
     }
   }
  }

고급 Poser 함수와 사용 시점

poser는 포즈에 애니메이션 하나를 배정하는 것보다 훨씬 많은 일을 할 수 있습니다. poser에서 특정 요소를 조정하면 게임 안의 포켓몬을 더 생동감 있게 만들 수 있습니다. 포켓몬용 애니메이션을 여러 개 만드는 것을 좋아한다면, 이 섹션은 그 애니메이션을 게임 안에 구현하는 데 도움이 됩니다. 이러한 고급 기능을 사용하면 공식 포켓몬과 비슷한 수준의 품질을 가진 커스텀 포켓몬을 만들 수 있습니다.

더 쉽게 편집하려면 애드온의 압축 해제 사본을 게임의 리소스팩으로 둘 수 있습니다. poser 파일은 애드온 리소스의 일부이므로 게임 안에서 F3 + T를 눌러 새로고침할 수 있습니다. 이 동작은 모든 리소스팩을 다시 불러오며, 편집 중인 poser가 resourcepack 폴더 안에 있을 때만 poser 변경 사항을 확인할 수 있습니다. 애드온 요소를 게임에 구현하며 테스트할 때는 압축 해제 폴더를 사용하는 것을 강력히 권장합니다! 파일을 수정하고 저장한 다음 게임 안에서 리소스팩을 새로고침하면 변경 사항을 즉시 확인할 수 있습니다.

레이어드 애니메이션

레이어드 애니메이션은 animations 목록에 함께 적는 두 개 이상의 애니메이션입니다. 가장 흔한 예시는 서 있는 포즈에서 ground_idle 애니메이션 위에 look 애니메이션을 추가하는 것입니다. 애니메이션은 두 개보다 많이 나열할 수 있으며, 주된 한계는 움직일 본이 부족해지는 경우입니다.

목록에서 첫 번째 애니메이션은 모델의 본을 우선적으로 제어합니다. 포켓몬이 걸어 다니면서 플레이어를 바라볼 수 있는 이유가 이것입니다. look 애니메이션은 머리 본, 또는 머리로 지정된 본에 우선권을 갖습니다. 이 머리 본은 플레이어가 가까이 오면 항상 플레이어를 바라보려고 합니다.

애니메이션 레이어링의 또 다른 예시는 함께 재생되면서도 분리되어야 하는 두 종류의 애니메이션입니다. 좋은 예시는 리자몽의 걷기 애니메이션입니다. 걷기 애니메이션 자체는 걷는 동안 다리만 움직입니다. 걷기 포즈에서는 지상 대기 애니메이션과 지상 걷기 애니메이션을 조합합니다. 걷기 애니메이션은 몸의 아래쪽 절반만 제어하고, 지상 대기 애니메이션은 몸의 위쪽 절반만 제어합니다. 걷기 애니메이션만 나열한 상태에서 걷기 시작하면, 리자몽의 위쪽 절반은 걸을 때마다 T-포즈가 됩니다.
리자몽의 걷기 포즈용 걷기 애니메이션 목록:

     "animations": [
        "look",
        "bedrock(charizard, ground_walk)",
        "bedrock(charizard, ground_idle)"
       ]

애니메이션 덮어쓰기

이 함수는 주로 특정 상황에서만 애니메이션을 재생하고 싶을 때 사용합니다. 애니메이션 목록에서 애니메이션 타입 뒤에 , true를 적으면 됩니다. 가장 흔한 사용 예시는 기절 애니메이션에 넣어 포켓몬이 기절했을 때 항상 기절 애니메이션이 재생되도록 하는 것입니다. 애니메이션이 제대로 전환되지 않을 때도 이 방식으로 대부분 해결할 수 있습니다.

아래는 이 덮어쓰기 함수를 사용하는 기절 예시입니다. 게임 안에서는 리자몽이 기절할 때 이미 재생 중이던 다른 애니메이션 위에 항상 기절 애니메이션을 재생합니다. 기절 애니메이션은 모델 전체를 움직이므로 괜찮습니다. 울음소리 애니메이션에는 이 함수가 없습니다. 울음소리는 대기 애니메이션 위에 재생되기를 원하지만, 모든 것을 완전히 덮어쓰기를 원하지 않기 때문입니다. 만약 덮어쓴다면 울음소리 애니메이션은 머리 본만 움직이므로, 리자몽이 울음소리 애니메이션을 재생하려 할 때마다 T-포즈가 됩니다.

"faint": "bedrock(charizard, faint, true)",
  "cry":  "bedrock(charizard, cry)",

특이 동작

Quirk 애니메이션은 기본 애니메이션 목록 위에 추가로 재생할 수 있는 애니메이션입니다. 앞의 애니메이션 덮어쓰기 함수와 다른 점은 quirk에는 추가 속성을 적용할 수 있다는 것입니다. 특정 횟수만큼 반복하게 하거나 타이머를 넣을 수 있습니다. 가장 흔한 quirk 애니메이션 예시는 blink 애니메이션입니다. 기본적으로 quirk 애니메이션은 8~20초마다 한 번 재생됩니다.

poser 파일에서 quirk를 만드는 것은 게임 안에서 재생될 작은 개성 애니메이션을 애니메이터가 만드는 데 크게 달려 있습니다. 단순히 눈 깜빡임 애니메이션만 만들 수 있는 것은 아닙니다. 포켓몬이 포효하거나 재채기하거나 춤추게 만들고, 이를 서 있는 포즈나 다른 포즈의 quirk로 재생할 수 있습니다. 그런 다음 이 quirk 애니메이션에 타이머를 적용하면, 리자몽이 대기 중 30~60초마다 포효하는 식의 동작도 만들 수 있습니다. 창의력만이 한계인 매우 유연한 애니메이션 하위 시스템입니다.

quirk에 영향을 줄 수 있는 속성 목록은 다음과 같습니다:

"loopTimes": Int = 1 // The number of times the animation should play for the quirk
"minSecondsBetweenOccurrences": Float = 8 // The decimal-friendly number of seconds that is the 
minimum between the quirk playing once and it playing a second time
"maxSecondsBetweenOccurrences": Float = 30 // What do you think
"animations": List<Animation> = [] // The list of animations to play (together) when this quirk runs
"name": String // The name of the quirk

아래는 수정된 quirk 애니메이션 예시입니다. 이 설정은 결국 리자몽이 눈 깜빡임 애니메이션을 5번 연속 재생하게 합니다. 애니메이션이 재생된 뒤에는 8~20초 타이머가 시작되어 이 quirk를 다시 재생합니다. quirk 타이머는 quirk 애니메이션이 끝난 뒤 시작됩니다.

"quirks": [
        {
          "name": "blink",
          "loopTimes": 5,
          "minSecondsBetweenOccurrences": 8,
          "maxSecondsBetweenOccurrences": 20,
          "animations": ["bedrock(charizard, blink)"]
         }

변형된 파트

이 함수는 포켓몬이 특정 포즈에 있을 때 모델의 일부를 변형할 수 있게 해 줍니다. 각 포즈마다 본의 위치, 회전, 표시 여부를 바꿀 수 있습니다. 이를 통해 애니메이션 자체를 수정하지 않고도 게임 안 애니메이션을 조금 조정할 수 있습니다. 이 함수의 예시는 많지 않지만, 가장 흔한 사용법은 포켓몬이 배틀 대기 상태가 아닐 때 모델 파트를 숨기는 것입니다. 고릴타와 드럼이 이런 사례입니다.

위치와 회전 변형은 어깨 애니메이션을 조정할 때 특히 유용합니다. 애니메이션을 만들 때 플레이어 어깨 위의 모델 위치까지 미리 맞출 필요는 없습니다. 게임 안에서 위치가 맞지 않으면 이 함수를 사용해 모델 전체를 조정할 수 있습니다.

가시성 변형은 포켓몬이 현재 특정 포즈에 있을 때 모델의 특정 본을 숨길 수 있게 해 줍니다. 필요하다면 특정 본을 숨기는 데 사용할 수 있습니다. 이를 통해 고릴타가 배틀 대기 상태에서만 드럼을 사용하게 하거나, 블레이범의 불꽃이 배틀 중에만 켜지게 만들 수 있습니다. 기억해야 할 점은 특정 본이 배틀 중에만 보이게 하고 싶다면, 다른 모든 포즈에서는 그 본을 보이지 않도록 설정해야 한다는 것입니다. poser 파일 설명에서 transformedParts가 모든 포즈 아래에 작성된 이유가 이것입니다.

아래는 변형 파트 속성을 모두 사용한 예시입니다. 이 함수로 어떤 옵션을 사용할 수 있는지 보여 주기 위한 예시입니다. 이 예시를 게임에 적용하면 리자몽의 날개가 몸에서 분리되고, 왼쪽 날개만 보이지 않게 됩니다. 현실적으로 이런 설정을 실제로 쓰고 싶을 일은 거의 없을 것입니다.

"transformedParts": [
         {
           "part": "wing_right",
           "position": [10, 0, 0],
           "rotation": [0, 0, 0],
           "isVisible": true
         },
         {
           "part": "wing_left",
           "position": [-10, 0, 0],
           "rotationrotation": [0, 0, 0],
           "isVisible": false
         }
        ]

애니메이션 조건

이 함수는 애니메이션이 언제 재생될 수 있는지 더 세밀하게 제어하게 해 줍니다. 현재 사용할 수 있는 조건은 배틀 중인지와 물에 닿아 있는지입니다. 이를 사용해 배틀 중이거나 물에 있을 때만 쓰는 애니메이션을 만들 수 있습니다. 더 구체적인 애니메이션을 원한다면 배틀 조건과 물 조건을 조합할 수도 있습니다. 이렇게 하면 지상 대기, 지상 배틀 대기, 물속 대기, 물속 배틀 대기를 모두 가질 수 있습니다!

이 함수는 주로 각 포즈의 애니메이션을 정리하는 데 도움을 줍니다. 조건을 true로 설정하면 해당 조건이 충족될 때만 애니메이션이 재생됩니다. false로 설정하면 해당 조건이 충족될 때 애니메이션이 재생되지 않습니다. 이를 통해 poseType 하나에 애니메이션을 2개 이상 설정할 수 있습니다. 이 기본 원리 덕분에 배틀 중에만 재생되는 배틀 애니메이션을 만들 수 있습니다!

변형 파트는 이 함수와 아주 잘 어울립니다. 이 두 함수를 조합하면 고릴타가 배틀 중에만 드럼을 사용하게 만들 수 있습니다. 특정 조건을 만족할 때만 일부 모델 파트가 보이도록 할 수 있습니다. 다음에 커스텀 포켓몬 모델을 만들 때 이 함수들을 기억해 두세요. 이 시스템을 사용하면 더 생동감 있는 애니메이션을 만들 수 있습니다.

아래는 이런 애니메이션 조건을 사용하는 예시입니다. 이 예시에서 배틀 대기는 리자몽이 배틀 중일 때만 재생되며, 리자몽이 물에 있을 때는 절대 재생되지 않습니다.

    "poses": {
     "battle-idle": {
       "poseName": "battle-idle",
       "transformTicks": 10,
       "poseTypes": ["STAND"],
       "isBattle": true,
       "isTouchingWater": false,
       "animations": ["bedrock(charizard, battle_idle)"]
      },

Poser 파일 예시

매번 poser 파일을 처음부터 만들기보다 다른 커스텀 포켓몬 poser를 틀로 사용할 수 있습니다. 각 포켓몬이 가진 애니메이션을 확인하고, 일부 포켓몬은 head bone을 사용하지 않는다는 점도 기억하세요.

아래는 현재 구현된 모든 포즈와 그에 맞는 애니메이션을 포함한 커스텀 starly poser 파일 예시입니다.

  • 깜빡임 애니메이션은 수면 포즈에 적용되지 않습니다. 잠을 잘 때는 눈을 깜빡이지 않기 때문입니다.
{
 "head": "head",
 "portraitScale": 2.3,
 "portraitTranslation": [ -0.1, -0.9, 0 ],
 "profileScale": 1.1,
 "profileTranslation": [ -0.05, 0.15, 0 ],
 "faint": "bedrock(starly, faint, true)",
 "cry": "bedrock(starly, cry)",
 "poses": {
   "battle-idle": {
     "poseName": "battle-idle",
     "transformTicks": 10,
     "poseTypes": ["STAND"],
     "isBattle": true,
     "animations": ["bedrock(starly, battle_idle)"],
     "quirks": [
       {
         "name": "blink",
         "animations": ["bedrock(starly, blink)"]
       }
     ]
   },
   "standing": {
     "poseName": "standing",
     "transformTicks": 10,
     "poseTypes": [
       "STAND",
       "NONE",
       "PORTRAIT",
       "PROFILE"
     ],
     "isBattle": false,
     "animations": [
       "bedrock(starly, ground_idle)"
     ],
     "quirks": [
       {
         "name": "blink",
         "animations": [
           "bedrock(starly, blink)"
         ]
       }
     ]
   },
   "walking": {
     "poseName": "walking",
     "transformTicks": 10,
     "poseTypes": [
       "WALK"
     ],
     "animations": [
       "bedrock(starly, ground_walk)"
     ],
     "quirks": [
       {
         "name": "blink",
         "animations": [
           "bedrock(starly, blink)"
         ]
       }
     ]
   },
   "hovering": {
     "poseName": "hovering",
     "transformTicks": 10,
     "poseTypes": [
       "HOVER"
     ],
     "animations": [
       "bedrock(starly, air_idle)"
     ],
     "quirks": [
       {
         "name": "blink",
         "animations": [
           "bedrock(starly, blink)"
         ]
       }
     ]
   },
   "flying": {
     "poseName": "flying",
     "transformTicks": 10,
     "poseTypes": [
       "FLY"
     ],
     "animations": [
       "bedrock(starly, air_fly)"
     ],
     "quirks": [
       {
         "name": "blink",
         "animations": [
           "bedrock(starly, blink)"
         ]
       }
     ]
   },
   "sleeping": {
     "poseName": "sleeping",
     "transformTicks": 10,
     "poseTypes": [
       "SLEEP"
     ],
     "animations": [
       "bedrock(starly, sleep)"
     ]
   },
   "leftshoulder": {
     "poseName": "leftshoulder",
     "transformTicks": 10,
     "poseTypes": [
       "SHOULDER_LEFT"
     ],
     "animations": [
       "bedrock(starly, left_shoulder)",
       "look"
     ],
     "quirks": [
       {
         "name": "blink",
         "animations": [
           "bedrock(starly, blink)"
         ]
       }
     ]
   },
   "rightshoulder": {
     "poseName": "rightshoulder",
     "transformTicks": 10,
     "poseTypes": [
       "SHOULDER_RIGHT"
     ],
     "animations": [
       "bedrock(starly, right_shoulder)",
       "look"
     ],
     "quirks": [
       {
         "name": "blink",
         "animations": [
           "bedrock(starly, blink)"
         ]
       }
     ]
   },
   "swimming": {
     "poseName": "swimming",
     "transformTicks": 10,
     "poseTypes": [
       "SWIM"
     ],
     "animations": [
       "bedrock(starly, water_swim)"
     ],
     "quirks": [
       {
         "name": "blink",
         "animations": [
           "bedrock(starly, blink)"
         ]
       }
     ]
   },
   "floating": {
     "poseName": "floating",
     "transformTicks": 10,
     "poseTypes": [
       "FLOAT"
     ],
     "animations": [
       "bedrock(starly, water_idle)"
     ],
     "quirks": [
       {
         "name": "blink",
         "animations": [
           "bedrock(starly, blink)"
         ]
       }
     ]
   }
 }
}

Addon Creation

튜토리얼

커스텀 포켓몬 만들기 모델 만들기 커스텀 스폰 만들기 발광 텍스처 애니메이션 텍스처 Texture Replacement 애니메이션 교체 리전 폼여러 시각 Variants 애니메이션에 소리 추가하기

Asset Files

리졸버 구 Poser 신 Poser 소리

데이터 Files

종 종 특징 종 특징 할당 종 추가 스폰 Detail Presets 스폰 Pool 월드 화석 Datapackable Move Effects

Properties

행동 스폰 조건 발전 과제