사용자 정의 캐릭터

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

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

다음 섹션에서는 우리가 리깅 및 스키닝, PBR(표면 외관), 및 VFX를 사용하여 "Creature"라는 이름의 더 복잡한 캐릭터 중 하나를 만드는 방법에 대해 설명합니다. 우리는 그것이 빛나고, 빛을 방출하며, 입자 연기의 흔적을 남기고, 촉수의 설득력 있는 파도를 만들기 위해 충분한 관절로 리깅을 스킨하는 유동적인 움직임을 가졌으면 했습니다.

Creature Banner

리깅

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

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

다른 관절 대부분은 촉수와 턱쪽에 있습니다. 우리는 촉수에 많은 보조 움직임, 즉 층이 있는 움직임을 원했습니다. 이는 모든 것이 자율적으로 움직이는 것처럼 보이게 하는 설득력 있는 효과를 생성하기 위함입니다. 그러나 촉수의 중심 질량이 너무 가까워서 모든 촉수에 대한 관절을 만드는 것은 성능과 애니메이션의 노력을 낭비하는 것처럼 느껴졌습니다. 그래서 대신, 우리는 중심 질량을 하나의 큰 촉수로 취급하고, 그 팁이 중심 질량에서 빠져나오면서 더 작은 "꼬리"를 만들어주었습니다.

Creature Front, Maya

다음 지침은 캐릭터 메시가 Studio에 올바르게 가져올 수 있도록 하는 데 유용하다고 생각했습니다:

  • 개별 관절 및 뼈에는 고유한 이름이 있어야 합니다.
  • 메시의 이름이 관절 및 뼈와 동일하지 않아야 합니다.
  • 스키닝/바인딩 전에 메시에 변형이 없어야 합니다. 즉, 변형은 0이어야 하고 스케일은 1이어야 합니다.
  • 메시의 노멀은 바깥쪽을 향해야 합니다(모델이 뒤집혀 보이지 않아야 합니다).
  • 스켈레톤에는 스케일 계수가 없어야 합니다. 모든 관절은 [1, 1, 1]이어야 합니다.

스키닝

Creature의 스켈레톤을 완료하고, 다음 단계는 메시를 스킨하는 것이었습니다. 스키닝은 힘든 작업이 될 수 있으므로, 다양한 초기 스키닝 설정을 숙지하면 더 수월하게 진행할 수 있습니다. 이 캐릭터는 유기체이므로, 각 관절에 상당한 폴로프를 두고 겹침을 사용하여 스키닝을 진행했습니다. 이렇게 하면 굽힘이 매끄럽고 날카롭지 않게 느껴집니다. 다음 스크린샷은 각각 나쁜 스키닝과 매끄러운 스키닝을 보여줍니다:

나쁜 스키닝
매끄러운 스키닝

다음 지침은 스키닝에 가장 좋은 결과를 가져오는 데 도움이 되었습니다:

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

메시를 Studio에 가져오기

사용자 정의 캐릭터를 Studio에 가져오는 것은 과정 중 가장 흥미로운 부분 중 하나입니다. 여러분이 만들고 있는 경험에서 여러분의 창작물을 볼 수 있기 때문입니다!

메시를 Studio에 가져오려면:

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

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

    Creature Imported Into Studio

Creature를 빛나게 만들기

Creature 모델이 안정되고 더 이상 Studio에 즉각적으로 가져올 필요가 없다고 판단한 후, 우리는 SurfaceAppearance 객체, 조명 및 시각 효과를 배치하기 시작했습니다. 이는 모델의 품질이 충분히 좋았는지 확인하기 위함이었습니다.

Glowing Creature Example

우리는 Creature가 어둡고, 초점이 눈과 그 "잡는" 촉수에 있어야 한다는 것을 알고 있었습니다. 높은 대비의 초점은 주의를 끌기 때문에 몇 가지 강한 초점을 두는 것이 시청자가 집중해야 할 부분을 알리는 데 도움이 됩니다. Studio는 자발적으로 빛을 발산하는 네온 소재를 지원하므로, 우리는 초기에 눈을 분리하여 나머지 캐릭터와는 다른 소재로 만들었습니다. 촉수의 경우에도 유사하게 작업하여 팁에서만 빛나도록 했습니다.

Creature Eyes in Studio

네온 소재는 실제 빛을 방출하지 않기 때문에, 일부 테스트 후, 우리는 빛 방출의 위치 및 방향을 제어할 수 있는 별도의 부분을 추가했습니다. 이는 조명이 눈의 불빛을 강조하고 그 자체의 빛을 투사하도록 하였습니다.

Point Light in Studio

SpotLights가 다른 표면이나 플레이어 근처의 Creature에 시각적 효과를 추가하는 것을 확인하세요.

Creature Light Example

또한, 우리는 Creature의 촉수가 일부 입자를 방출하여 움직일 때 연기 흔적을 남기기를 원했습니다. 촉수가 매우 길기 때문에 ParticleEmitter를 전체 촉수에 추가하면 입자가 전체 촉수에서 방출되는 대신 팁에서 방출됩니다. 이를 해결하기 위해 우리는 촉수 끝에 가까운 작은 부분을 사용하여 입자의 방출 크기, 위치 및 방향을 제어할 수 있었습니다.

Particle Example

시각 효과가 캐릭터를 따르도록 만들기

스킨된 캐릭터의 메시 위치는 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")
    -- SETUP - 이는 모든 클라이언트에서 한 번 실행되어야 합니다.
    -- 태그가 있는 모든 모델을 수집합니다.
    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)
    -- UPDATE - 이는 모든 클라이언트의 RunService.PreSimulation에 연결되어야 합니다.
    -- 모든 모델을 확인한 후, 모델의 모든 부분을 관절 클리프레임에 맞춰 업데이트합니다.
    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 태그를 추가했습니다. 이는 Tags 속성 섹션을 사용하여 수행했습니다. 태그를 사용하면 VFXUpdateModule이 첫 번째 VFX 자식을 찾고 업데이트를 적용할 객체를 식별할 수 있습니다.

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

Creature에 텍스처 입히기

다음으로, PBR(물리 기반 렌더링) 텍스처 맵을 설정했습니다. 이 강력한 비트맵은 Creature에 다양하고 작은 울퉁불퉁한 표면 변화를 제공하여 가까이서 볼 때 더 사실적으로 보이게 합니다. 이 시각적 효과는 Creature의 외관을 잘 전달합니다.

Creature Texturing Comparison

우리가 표면 외관 텍스처 맵을 생성한 방법은 다음과 같습니다:

  1. 이 캐릭터의 텍스처 맵은 모두 하나의 "시트"에 있었습니다. 이는 Creature를 더 효율적으로 만들고, 처리해야 할 텍스처 맵 또는 SurfaceAppearance 객체의 수를 줄였습니다.

  2. "잡는 촉수"와 같이 빛이나 자발적인 조명이 필요한 영역에는 SurfaceAppearance에서 투명성을 추가하여 이러한 부분과 블렌딩했습니다.

    Illumination Example

    우리는 표면 외관 텍스처 맵을 생성할 때 다음 지침을 따르는 것이 유용하다고 생각했습니다:

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

Creature 애니메이션 만들기

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

앞에서 언급했듯이 우리는 유체적인 움직임과 충분한 팔다리를 위해 충분한 관절을 확보하여 Creature 애니메이션이 자연스럽고 "층화된" 느낌을 주고 싶었습니다. 층화는 보조 움직임이라고도 불리며, 이는 매일 생활에서 하는 행동에서 볼 수 있습니다. 팔을 던질 때, 모든 관절은 팔뚝에서 오는 초기 충격에 반응하며, 모든 관절이 동시에 움직이거나 쉬는 것은 아닙니다.

우리는 이 기술을 사용하여 Creature를 애니메이션하여 팔다리가 몸의 움직임에 반응하는 것처럼 보이게 하였습니다:

Creature Animation Example

외부 DCC 애플리케이션을 사용하여 애니메이션을 제작하는 경우, 다음 지침이 가장 잘 작동하는 것을 발견했습니다:

  • 프레임 속도를 최소 30 FPS로 설정합니다.
  • 애니메이션을 적용할 캐릭터와 동일한 캐릭터로 생성합니다.
  • 애니메이션 데이터를 별도의 .fbx 파일로 내보냅니다.

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

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

  1. 도구 모음의 Avatar 탭에서 Clip Editor를 클릭합니다.

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

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

    Animation Import Example 2
  4. 애니메이션이 만족스러우면, 애니메이션 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'은 미국 및 기타 국가 내 당사의 등록 및 미등록 상표입니다.