사용자 정의 캐릭터

*이 콘텐츠는 AI(베타)를 사용해 번역되었으며, 오류가 있을 수 있습니다. 이 페이지를 영어로 보려면 여기를 클릭하세요.

사용자 정의 메시를 가져와 NPC부터 애니메이션이 있는 세일 보트의 천까지 모든 것을 만들 수 있습니다. 우리는 가져오기 도구의 사용자 정의 설정을 사용하여 신비로운 블랙홀 생물과 친근하지만 인식하지 못하는 서비스 드로이드와 같은 더 이국적인 사용자 정의 캐릭터를 가져왔습니다.

다음 섹션에서는 우리가 "Creature"라고 이름 붙인 더 복잡한 캐릭터를 만들기 위해 리깅 및 스키닝, PBR (표면 외관), 및 VFX를 어떻게 사용했는지 설명합니다. 우리는 그것이 빛을 발하고, 일부 빛을 방출하며, 입자 연기의 흔적을 남기고, 충분한 관절로 스키닝된 리그를 통해 tentacles의 설득력 있는 파동을 생성하는 유동적인 움직임을 갖기를 원했습니다.

Creature Banner

리그

Creature를 리깅할 때, 우리는 캐릭터를 중립 자세로 모델링하는 것이 가장 좋다는 것을 알게 되었습니다. 왜냐하면 그 자세가 여러 방향으로 구부리는 데 가장 적합하기 때문입니다. 만약 우리가 Creature를 tentacles가 이미 말려 있는 상태로 모델링했다면, tentacles를 반대 방향으로 구부리도록 애니메이션을 만들 때 늘어나는 결과를 초래했을 것입니다. 다음 스크린샷은 Creature의 자연 상태를 보여줍니다:

중립 자세에서 우리는 필요한 움직임이 가장 많은 영역에 집중하여 경제적으로 관절을 추가했습니다. 관절이 적을수록 좋습니다. 왜냐하면 캐릭터를 스키닝할 때 관리해야 할 것이 줄어들고 애니메이션을 만들 때 제어해야 할 것도 줄어들기 때문입니다. 이전 스크린샷에서 Creature는 중앙에 많은 관절이 있는 것처럼 보이지만, 주요 몸체에는 하나의 관절만 있습니다.

다른 대부분의 관절은 tentacles와 mandibles 쪽에 있습니다. 우리는 tentacles에 많은 2차 움직임, 즉 레이어드된 움직임을 원했습니다. 이는 그들이 모두 스스로 움직이고 있다는 설득력 있는 효과를 만들기 위해서입니다. 그러나 tentacles의 중심 질량이 너무 가까워서 모든 관절을 만드는 것이 성능과 애니메이션 작업의 노력 측면에서 낭비처럼 느껴졌습니다. 그래서 대신 우리는 중심 질량을 하나의 큰 tentacle로 취급하고, 끝에서 중심 질량을 떠나는 작은 "꼬리"를 만들었습니다.

Creature Front, Maya

우리는 캐릭터 메시가 Studio에 올바르게 가져와지도록 하기 위해 다음 지침이 유용하다는 것을 알게 되었습니다:

  • 개별 관절과 뼈는 고유한 이름을 가져야 합니다.
  • 메시의 이름은 관절 및 뼈와 같아서는 안 됩니다.
  • 메시에는 스키닝/바인딩 전에 변형이 없어야 합니다. 즉, 변형은 0이고 스케일은 1이어야 합니다.
  • 메시 노멀은 바깥쪽을 향해야 합니다 (모델이 안쪽을 향하지 않아야 합니다).
  • 스켈레톤에는 스케일 팩터가 없어야 하며, 모든 관절은 [1, 1, 1]이어야 합니다.

스킨

Creature의 스켈레톤을 완성한 후, 다음 단계는 메시를 스키닝하는 것이었습니다. 스키닝은 힘든 작업이 될 수 있으므로, 문제를 쉽게 만들기 위해 DCC 애플리케이션의 다양한 초기 스키닝 설정에 익숙해지는 것이 가장 좋습니다. 이것은 유기적인 캐릭터이므로, 우리는 각 관절에 충분한 감쇠와 관절 간의 겹침을 두고 스키닝했습니다. 이렇게 하면 구부림이 부드럽고 날카롭지 않게 느껴집니다. 다음 스크린샷은 각각 나쁜 스키닝과 부드러운 스키닝을 보여줍니다:

나쁜 스키닝
부드러운 스키닝

우리는 다음 지침이 스키닝에 가장 좋은 결과를 가져온다는 것을 알게 되었습니다:

  • 스키닝 영향(즉, 이동할 때 모델의 일부에 영향을 미치는)은 정점당 최대 4개의 영향이어야 합니다.
  • 관절 및 메시 이름은 서로 간에 고유해야 합니다.
  • Studio에 가져오고자 하는 모든 관절은 모델의 스키닝에 영향을 미쳐야 하며, 그렇지 않으면 엔진이 이를 가져오지 않습니다. 가능한 한 원래 또는 "바인드" 자세에서 모델을 스키닝하세요.

메시를 Studio에 가져오기

사용자 정의 캐릭터를 Studio에 가져오는 것은 프로세스의 더 흥미로운 부분 중 하나입니다. 왜냐하면 당신이 만들고 있는 게임에서 당신의 창작물을 볼 수 있기 때문입니다!

메시를 Studio에 가져오려면:

  1. DCC 애플리케이션에서 캐릭터를 내보내고 다음 사항을 확인합니다:

    • 모든 노멀, 스케일 및 이름이 올바릅니다.
    • 캐릭터는 모든 관절 및 뼈 계층과 모든 메시를 가지고 있습니다.
    • 메시의 각 부분은 10,000 삼각형 이하입니다.
    • 메시의 총 크기는 어떤 축에서도 2000 단위를 초과하지 않습니다.
    • 모델 사양의 전체 목록은 메시 요구 사항를 참조하세요.
    Creature in DCC Tool
  2. 가져오기 도구에서 사용자 정의 .fbx 또는 .obj 파일을 가져옵니다.

    Creature Imported Into Studio

Creature를 빛나게 만들기

Creature의 모델이 안정적이고 더 이상 Studio에 즉시 가져올 필요가 없게 되자, 우리는 SurfaceAppearance 객체, 조명 및 시각 효과를 조합하기 시작했습니다. 우리는 모델의 품질이 충분히 좋도록 하기 위해 어떤 한 측면을 배치하고 편집하기 전에 이 작업을 수행했습니다.

Glowing Creature Example

우리는 Creature가 어두워야 하고, 초점이 눈과 "잡는" tentacles에 있어야 한다는 것을 알고 있었습니다. 높은 대비의 포인트는 주의를 끌기 때문에, 몇 가지 강한 포인트를 두어 시청자가 무엇에 집중해야 하는지 알 수 있도록 했습니다. Studio는 스스로 빛을 발하는 네온 재료를 지원하므로, 초기에 우리는 눈을 분리하여 나머지 캐릭터와는 다른 재료로 만들었습니다. 우리는 tentacles에 대해서도 비슷한 작업을 하여, 그들이 끝에서만 빛나도록 했습니다.

Creature Eyes in Studio

네온 재료는 실제 빛을 방출하지 않으므로, 몇 번의 테스트 후에 우리는 빛 방출의 배치 및 방향을 제어하기 위해 별도의 부분을 추가했습니다. 이는 조명이 눈의 빛을 강조하고 자체 빛의 원천을 투사하도록 보장했습니다.

Point Light in Studio

SpotLights가 다른 표면이나 플레이어 근처에서 Creature에 시각적 플레어를 추가하는 것을 주목하세요.

Creature Light Example

또한, 우리는 Creature의 tentacles가 일부 입자를 방출하여 이동할 때 연기 흔적을 남기기를 원했습니다. tentacles가 매우 길기 때문에, ParticleEmitter를 전체 tentacle에 추가하면 입자가 전체 tentacle에서 방출되기 때문에 끝에서 방출되지 않게 됩니다. 이를 해결하기 위해 우리는 tentacle 끝 근처에 작은 부분을 배치하여 입자의 방출 크기, 배치 및 방향을 제어할 수 있도록 했습니다.

Particle Example

VFX가 캐릭터를 따르도록 만들기

스키닝된 캐릭터의 메시 위치는 Creature가 애니메이션할 때 업데이트되지 않으므로, VFX, SFX 및 조명이 모두 Creature를 제대로 따르도록 하는 방법이 필요했습니다. 이를 달성하기 위해 우리는 VFX 컨트롤러 스크립트를 만들고 CollectionService를 사용하여 VFX가 포함된 부분이 Creature의 뼈가 어디에 있는지 알리고 이를 따르도록 했습니다.

  1. 우리는 StarterPlayerStarterPlayerScripts에 다음 LocalScript를 배치했습니다. 이는 본질적으로 VFX 업데이트 기능을 실행합니다.

    Local Script
    -- 이 스니펫을 PreSimulation 연결을 만드는 기존 로컬 스크립트에 추가하세요.
    local RunService = game:GetService("RunService")
    local vfx = require(workspace.VfxUpdateModule)
    RunService.PreSimulation:Connect(vfx.updateVfx)
    Module Script
    -- 이 모듈은 애니메이션이 재생될 때 애니메이션에 따라 부분을 업데이트하도록 연결합니다. 이는 관절 및 뼈의 현재 제한 사항에 대한 우회 방법이며 항상 필요하지는 않습니다.
    --
    -- 전제 조건:
    -- 포함되기 위해서는 모델이 "AnimatedVfxModel" 태그를 가져야 하며, 애니메이션과 동기화하려는 모든 부분의 폴더가 필요합니다. 각 부분은 연결할 뼈의 이름을 참조하는 "AttachedBoneName"이라는 속성을 가져야 합니다. 부분은 또한 원하는 뼈에 상대적으로 올바른 위치에 있어야 합니다.
    --
    -- 사용 방법:
    -- LocalScript는 이 모듈을 요구한 다음, VfxUpdateModule.updateVfx를 RunService.PreSimulation 이벤트에 연결해야 합니다.
    local VfxUpdateModule = {}
    local CollectionService = game:GetService("CollectionService")
    -- 설정 - 이는 모든 클라이언트에서 한 번 실행되어야 합니다.
    -- 태그가 있는 모든 모델을 수집합니다.
    local vfxModels = CollectionService:GetTagged("AnimatedVfxModel")
    local vfxTable = {} -- 모든 부분과 오프셋을 저장할 곳
    -- 각 모델에 대해 모든 vfx 부분과 오프셋을 보유할 테이블을 할당합니다.
    for _, model in vfxModels do
    vfxTable[model] = {}
    local vfxParts = model:FindFirstChild("VFX"):GetChildren() -- VFX 폴더 찾기
    -- 속성을 통해 뼈를 찾고 각 부분의 오프셋을 계산합니다.
    for _,part in vfxParts do
    local name = part:GetAttribute("AttachedBoneName")
    local bone = model:FindFirstChild(name, true)
    if bone then
    local offset = (bone.TransformedWorldCFrame:inverse() * part.CFrame)
    vfxTable[model][part] = {bone, offset}
    else
    warn("Vfx 부분이 찾을 수 없는 뼈를 참조합니다.")
    end
    end
    end
    print(vfxTable)
    -- 업데이트 - 이는 모든 클라이언트의 RunService.PreSimulation에 연결되어야 합니다.
    -- 모든 모델을 순회한 다음, 모델의 모든 부분을 뼈의 CFrame에 맞게 업데이트합니다.
    function VfxUpdateModule.updateVfx()
    for model, vfxParts in vfxTable do
    for part, bone in vfxParts do
    part.CFrame = bone[1].TransformedWorldCFrame * bone[2]
    end
    end
    end
    return VfxUpdateModule
  2. 우리는 AnimatedVfxModel로 적절하게 태그가 지정된 모든 객체가 재생 이벤트에서 업데이트되도록 하기 위해 VFXUpdateModule ModuleScript를 만들었습니다.

  3. 우리는 태그 속성 섹션을 사용하여 필요한 모델 그룹에 AnimatedVfxModel 태그를 추가했습니다. 태그를 사용하면 VFXUpdateModule이 첫 번째 VFX 자식으로 어떤 객체를 찾아야 하는지 알고 업데이트를 적용할 수 있습니다.

    VFX In Studio Example
  4. 마지막으로, 우리는 애니메이션할 부분에 AttachedBoneName 사용자 정의 속성을 추가하고 그것이 따라야 할 관절의 정확한 이름을 추가했습니다.

Creature에 텍스처 추가하기

다음으로, 우리는 PBR (물리 기반 렌더링) 텍스처 맵을 설정했습니다. 이 강력한 비트맵은 Creature에 다양한 광택과 표면 변화를 제공하여 많은 작은 돌기와 결함이 있는 것처럼 보이게 합니다. 이 시각적 효과는 Creature가 플레이어에 가까워질 때 그 외관을 판매하는 데 도움이 됩니다.

Creature Texturing Comparison

다음은 표면 외관 텍스처 맵을 만드는 방법입니다:

  1. 이 캐릭터의 텍스처 맵은 각 맵당 하나의 "시트"에 있었습니다. 이는 Creature를 더 효율적으로 만들고, 더 적은 텍스처 맵이나 SurfaceAppearance 객체를 처리해야 함을 의미했습니다.

  2. "잡는 tentacles"와 같이 빛나거나 스스로 빛을 발해야 하는 영역에는 SurfaceAppearance의 투명도를 사용하여 이러한 부분과 혼합했습니다.

    Illumination Example

    우리는 표면 외관 텍스처 맵을 만들 때 다음 지침을 따르는 것이 유용하다는 것을 알게 되었습니다:

    • 맵의 크기가 1024×1024를 초과하지 않도록 하세요.
    • 작업한 애플리케이션에 따라 녹색 채널을 뒤집어야 할 수도 있습니다.

Creature 애니메이션

애니메이션은 매우 주관적이며 개인적인 스타일이 있습니다. 옵션으로는 모션 캡처, DCC 애플리케이션에서 손으로 "키 프레임" 애니메이션을 만들거나 Studio의 강력한 애니메이션 편집기를 사용하는 것이 있습니다.

앞서 언급했듯이, 우리는 유동적인 움직임을 위해 충분한 관절과 충분한 팔다리가 있어야 하므로 Creature 애니메이션이 자연스럽고 "레이어드"하게 느껴지기를 원했습니다. 레이어링, 즉 2차 움직임은 일상 생활에서 볼 수 있는 것입니다. 팔을 던질 때, 모든 관절은 상완에서 오는 초기 충격에 반응하고, 몸의 모든 관절이 동시에 움직이거나 쉬지 않습니다.

우리는 이 기술을 사용하여 Creature가 몸의 움직임에 반응하는 것처럼 느껴지도록 애니메이션을 만들었습니다:

Creature Animation Example

외부 DCC 애플리케이션을 사용하여 애니메이션을 만드는 경우, 다음 지침이 가장 잘 작동한다는 것을 알게 되었습니다:

  • 프레임 속도를 최소 30 FPS로 설정하세요.
  • 애니메이션을 적용할 캐릭터와 동일한 캐릭터로 애니메이션을 만드세요.
  • 애니메이션 데이터를 별도의 .fbx 파일로 내보내세요.

우리가 Studio 외부에서 캐릭터를 애니메이션했기 때문에, 우리는 애니메이션 편집기를 사용하여 애니메이션 .fbx 파일을 가져와야 했습니다. 편집기를 사용하면 관절이나 모터가 있는 아바타를 선택하고 타임라인의 포인트를 통해 이를 구동할 수 있습니다.

애니메이션을 가져오려면:

  1. 툴바의 아바타 탭에서 클립 편집기를 클릭합니다.

  2. Roblox에서 애니메이션할 리깅된 캐릭터를 선택합니다. 캐릭터는 외부 DCC 애플리케이션에서 리깅하는 것과 동일해야 합니다.

  3. 편집기 창의 왼쪽 상단 섹션에 있는 버튼을 클릭하고 FBX 애니메이션에서 가져오기를 선택한 다음 내보낸 .fbx 애니메이션 파일을 찾습니다.

    Animation Import Example 2
  4. 애니메이션이 만족스러우면 이를 내보내어 애니메이션 ID를 발견할 수 있습니다. 이 ID는 Roblox 스크립트에서 애니메이션을 실행하는 데 사용할 수 있습니다. 예를 들어, 가져온 캐릭터의 모델 그룹에 Script를 추가하고 다음 코드를 사용하여 애니메이션을 실행할 수 있습니다:

    Animation Script Example
    local animationId = "YOUR_ANIMATION_ID"
    local char = script.Parent
    local animController = char:FindFirstChildWhichIsA("Humanoid") or char:FindFirstChildOfClass("AnimationController")
    local animation = Instance.new("Animation")
    animation.AnimationId = "rbxassetid://" .. tostring(animationId)
    local animTrack = animController:LoadAnimation(animation)
    animTrack:Play(0, 1, 1)

최종 결과

색상, 조명 밝기 및 창 앞에서 더 강한 후광 효과를 주기 위한 몇 가지 입자 효과에 대한 몇 가지 마무리 조정을 한 후, 우주 정거장에서의 최종 결과는 다음과 같습니다!

Final Creature Rendering
©2026 Roblox Corporation. Roblox 및 Roblox 로고, 'Powering Imagination'은 미국 및 기타 국가 내 당사의 등록 및 미등록 상표입니다.