UDN
Search public documentation:

DevelopmentKitGemsCreatingASimpleBlobShadowKR
English Translation
日本語訳
中国翻译

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UE3 홈 > UDK 젬 > 단순 얼룩 그림자 만들기
UE3 홈 > 파티클과 이펙트 > 데칼 > 단순 얼룩 그림자 만들기

단순 얼룩 그림자 만들기


문서 변경내역: James Tan 작성. 홍성진 번역.
UDK 2011년 3월 버전으로 최종 테스팅, PC 호환

개요


가끔은 액터에 정교한 실시간 동적 그림자가 필요하지 않을 때는, 단순한 얼룩 그림자로 속일 수 있겠습니다. 성능은 유지하면서도 화면상에 그림자가 필요한 액터가 많이 있을 때에도 유용한 기술입니다.

이런 효과를 내려면, 액터에 동적 데칼 액터를 부착합니다. 긴 그림자를 드리우고 싶거나 할 때 데칼 액터의 회전을 사용할 수는 있으나, 데칼 컴포넌트는 FOV 세팅이 없어 이상적이지는 않을 수 있습니다. 그림자의 색과 농도는 데칼 머티리얼 인스턴스로 제어합니다. 마지막으로 투영된 그림자의 크기는 데칼 액터 내의 데칼 컴포넌트로 제어합니다.

데칼 머티리얼 레이아웃


이는 그림자를 만드는 데 사용된 데칼 머티리얼 레이아웃입니다. 변조(modulate) 블렌드 모드를 사용하고 있습니다. 투명(transparent) 블렌드 모드를 사용할 수는 있지만, 화면상에 렌더링하기에는 변조 블렌드 모드가 훨씬 쌉니다. (~14 인스트럭션 대 ~110 인스트럭션)

SimpleBlobShadowMaterialLayout.png

  • Constant Clamp 상수 제한 - 모든 기존 계산으로부터의 출력값이 0.f 에서 1.f 범위 사이에 있도록 하기 위해 사용됩니다. 변조는 이 범위 밖의 값으로도 여전히 작동하나, 이 경우엔 바람직하지 않습니다.
  • Add 추가 - 보간된 그림자 색에 불투명 텍스처 마스크를 추가하기 위해 사용됩니다. 그림자의 '반전된' 마스크를 추가하면 그림자의 일부가 아닌 영역에 1.f 가 추가됩니다. 고로 이 값이 제한되면 1.f 가 될 것이며, 데칼이 렌더링될 때 보이지 않게 될 것입니다.
  • 'Opacity Texture' 불투명 텍스처 - 그림자 마스크를 정의합니다. 꼭 원모양 그림자를 사용할 필요는 없기에 다른 정적인 그림자 모양을 만들 수 있습니다.
  • Linear Interpolation 선형 보간 - 이는 (1,1,1,1) 과 'ShadowColor' 사이를 선형으로 보간합니다. 'ShadowColor' 의 알파 출력을 사용하여 그림자의 농도를 조절할 수 있습니다.
  • Constant [1] 상수 - 선형 보간 함수의 파라미터 중 하나입니다. 그림자의 최대 옅은 정도(lightness)를 정의하며, 여기서는 1 입니다.
  • 'Shadow Color' 그림자 색 - 그림자의 색을 정의합니다. 꼭 검정색을 사용할 필요는 없습니다.

관련 토픽

데칼 머티리얼 테스트하기


단순 얼룩 그림자 데칼 머티리얼 테스트 절차는 다음과 같습니다:

  1. 콘텐츠 브라우저에서 데칼 머티리얼을 선택합니다.
  2. 월드 뷰포트 내 데칼을 놓고자 하는 곳에 우클릭하면 맥락 메뉴가 나타납니다.
  3. "Add Movable Decal: *" 또는 "Add Decal: *" 중 하나를 클릭합니다.

SimpleBlobShadowAddingATestDecal.jpg

관련 토픽

데칼 머티리얼 인스턴스 제작 및 변경하기


데칼 머티리얼 인스턴스를 통해 개발자가 머티리얼 내 기존 파라미터를 재정의하여 다른 버전을 빠르게 만들어낼 수 있습니다. 여기서는 개발자가 색, 밝기, 그림자 마스크를 변경할 수 있도록 하려 하며, 그 절차는 다음과 같습니다.

콘텐츠 브라우저 내 데칼 머티리얼에 우클릭, New Material Instance (Constant) 에 왼클릭합니다.

SimpleBlobShadowCreateNewMaterialInstanceMenu.jpg

대화상자가 나타납니다. 머티리얼 인스턴스를 저장하려는 곳과 그걸 무엇으로 부르려는지를 입력하십시오.

SimpleBlobShadowCreateNewMaterialInstance.jpg

여기서 속성의 왼편 체크박스 중 변경하고자 하는 것을 클릭합니다. 이 체크 박스는 덮어쓸 속성을 정의합니다. 적합하다 생각되는 대로 값을 바꾸십시오.

SimpleBlobShadowAlterMaterialInstance.jpg

이 부분의 위 단계를 반복하여 새 데칼 머티리얼 인스턴스를 테스트합니다.

SimpleBlobShadowTestNewMaterialInstance.jpg

관련 토픽

액터에 단순한 얼룩 그림자 추가하기


세 가지 방법이 있습니다. 부착 시스템이나 키즈멧을 통해 맵에 있는 액터에 무버블 데칼을 부착해도 되고, 게임 도중에 데칼 액터를 스폰해도 됩니다.

부착

이 예제에서, 단순 얼룩 그림자는 언리얼 에디터가 제공하는 부착 툴을 사용하여 보간된 액터에 부착될 것입니다.

무버블 데칼 액터를 부착시킬 액터를 추가합니다. 저는 구체형 보간 액터를 추가했습니다.

SimpleBlobShadowAttachmentAddActors.jpg

부착 창을 엽니다. 전처럼 콘텐츠 브라우저에 부착되어 있지 않고, 디폴트로 이렇게 위치해 있습니다.

SimpleBlobShadowAttachmentOpenAttachment.jpg

뷰포트에서 부착하려는 액터를 선택하고, 부착 창에 내에 우클릭한 다음 "선택 액터 추가" 를 클릭합니다.

SimpleBlobShadowAttachmentAddAttachmentActors.jpg

InterpActor_0 (또는 데칼을 부착시키려는 액터) 오른편에 있는 작은 검정 박스 중 하나를 클릭한 다음, DecalActorMovable_1 (또는 무버블 데칼 액터)의 왼편에 있는 작은 검정 박스 중 하나에 끌어 놓습니다. 무버블 데칼 액터가 부착되었으며, 구체형 메시와 같이 움직일 것입니다.

SimpleBlobShadowAttachmentBindActors.jpg

관련 토픽

키즈멧


이 예제에서는 키즈멧을 사용하여 단순 얼룩 그림자를 플레이어에 부착시키겠습니다.

월드에 무버블 데칼 액터를 추가합니다. SimpleBlobKismetAddDecal.jpg

월드의 무버블 데칼 액터를 선택합니다. 툴바의 KismetIcon.jpg 버튼을 눌러 키즈멧 창을 엽니다. 키즈멧 공간 내에 우클릭하고 데칼 무버블 액터를 추가합니다.

SimpleBlobKismetAddDecalReferenceInKismet.jpg

맥락 메뉴를 통해 Plauyer Spawned 이벤트를 추가합니다. 이로써 키즈멧이 플레이어 스폰 시점을 검출할 수 있습니다. Object 변수 속으로 instigator (플레이어의 폰)을 출력할 수 있습니다.

SimpleBlobKismetAddPlayerSpawnedEvent.jpg

다음으로 맥랙 메뉴를 통해 Teleport 액션을 추가합니다. 무버블 데칼 액터는 플레이어가 처음 스폰될 때 플레이어 폰 아래에 있지 않을 것입니다. 그래서 무버블 데칼 액터를 플레이어 폰과 같은 위치로 텔레포트시킵니다.

SimpleBlobKismetAddTeleportAction.jpg

'Update Rotation' 을 false 로 설정합니다. 무버블 데칼 액터의 회전은 변경할 필요가 없습니다.

SimpleBlobKismetTweakTeleportAction.jpg

다음 맥랙 메뉴를 통해 Object 변수를 추가합니다. 이로써 키즈멧이 플레이어 폰의 참조를 저장할 수 있으며, 나중에 사용할 수 있습니다.

SimpleBlobKismetAddObjectVariable.jpg

모든 키즈멧 노드를 연결합니다. 그러려면 작은 박스나 트라이앵글에 왼클릭한 후 적절한 대상으로 끌면 됩니다. 플레이어가 스폰될 때, Player Spawned 키즈멧 노드가 instigator 를 활성화시켜 빈 오브젝트 변수 속으로 출력할 것입니다. 그런 다음 Teleport 키즈멧 노드를 실행시키고, 무버블 데칼 액터를 오브젝트 변수 내에 저장된 플레이어 폰과 같은 위치로 텔레포트시킵니다. 이로써 플레이어가 스폰될 때 무버블 데칼 액터가 올바른 곳에 있을 수 있습니다.

SimpleBlobKismetConnectTeleport.jpg

맥락 메뉴를 사용하여 Attach to Actor 액션을 추가합니다. 키즈멧 노드는 액터를 다른 액터에 부착합니다. 이 경우, 무버블 데칼 액터는 플레이어의 폰에 부착될 것입니다.

SimpleBlobKismetAddAttachAction.jpg

모든 요소를 연결합니다. 기존 지침에 덧붗여, 텔레포트 키즈멧 노드가 실행될 때, 이어서 Attach 키즈멧 노드를 실행합니다. 그리고 이 키즈멧 노드는 무버블 데칼 액터를 플레이어의 폰에 부착합니다.

SimpleBlobKismetConnectAttach.jpg

레벨을 시동시키면 빨강 데칼이 따라붙는 것을 볼 수 있을 것입니다.

SimpleBlobKismetInGame.jpg

관련 토픽

언리얼스크립트


이 방법은 런타임에 생성된 액터에 그림자를 붙이고자 할 때 사용되는 방법입니다.

언리얼 엔진 3는 디폴트로 스폰가능한 데칼 액터가 없습니다.위의 코드는 Engine 또는 자체 패키지에 추가 및 컴파일 가능합니다.

DecalActorSpawnable.uc
  class DecalActorSpawnable extends DecalActorMovable;
  
  defaultproperties
  {
    // bStatic 및 bNoDelete 는 액터가 런타임에 스폰되는 것을 방지.
    bStatic=false
    bNoDelete=false
  }
  

아래 코드는 스폰이 가능한 이동가능 데칼 액터를 폰에 붙이는 법에 대한 예제입니다.

SimpleBlobShadowPawn.uc
  class SimpleBlobShadowPawn extends UTPawn
     placeable;
  
  // 스폰된 단순 얼룩 그림자.
  var PrivateWrite DecalActorSpawnable SimpleBlobShadowDecal;
  // 우리가 스폰시킬 아키타입된 단순 얼룩 그림자 액터로의 참조.
  var(Shadow) const DecalActorSpawnable SimpleBlobShadowDecalArchetype;
  
  simulated function PostBeginPlay()
  {
    local MaterialInstanceConstant DecalMaterialInstanceConstant;
  
    Super.PostBeginPlay();
  
    // 전용 서버는 단순 얼룩 그림자 스폰 불필요
    if (WorldInfo.NetMode == NM_DedicatedServer)
    {
      return;
    }
  
    // 얼룩 그림자 아키타입 없음
    // 아키타입이 올바른 클래스형이 아님
    if (SimpleBlobShadowDecalArchetype == None)
    {
      return;
    }
  
    // 단순 얼룩 그림자 액터 스폰
    SimpleBlobShadowDecal = Spawn(SimpleBlobShadowDecalArchetype.Class, Self,, Location, Rot(49152, 0, 0), SimpleBlobShadowDecalArchetype);
  
    if (SimpleBlobShadowDecal != None)
    {
      if (SimpleBlobShadowDecal.Decal != None && SimpleBlobShadowDecal.Decal.GetDecalMaterial() != None)
      {
        // 파라미터를 동적으로 변경할 수 있도록 새 머티리얼 인스턴스 생성
        DecalMaterialInstanceConstant = new class'MaterialInstanceConstant';
  
        if (DecalMaterialInstanceConstant != None)
        {
          DecalMaterialInstanceConstant.SetParent(SimpleBlobShadowDecal.Decal.GetDecalMaterial());
          SimpleBlobShadowDecal.Decal.SetDecalMaterial(DecalMaterialInstanceConstant);
        }
      }
  
      // 단순 얼룩 그림자를 자신에게 부착
      Attach(SimpleBlobShadowDecal);
    }
  }
  
  defaultproperties
  {
  }
  

코드 배후의 로직은 이렇습니다:

  • PostBeginPlay 는 (UTPawn 을 서브클래스로 갖는) Actors 가 처음 스폰될 때 실행됩니다.
  • 이 액터가 전용 서버에 있을 때는 중단합니다. 전용 서버는 얼룩 그림자를 스폰할 필요가 없습니다.
  • 설정된 그림자 아키타입이 없으면 중단합니다.
  • 아키타입의 인스턴스를 아래로 향하게 해서 스폰합니다. 추적 가능하도록 인스턴스를 변수에 할당합니다.
  • 데칼 컴포넌트가 데칼 머티리얼을 가졌는지 검사합니다.
  • 그렇다면 새 머티리얼 인스턴스를 생성하여 그 부모를 현재 데칼 머티리얼에 할당합니다. 다른 것에는 영향을 끼치지 않고 속성을 변경할 수 있습니다.
  • 스폰된 아키타입을 자신에게 부착합니다. (SimpleBlobShadowPawn)

월드 안에 폰을 놓고 에디터에서 시작하면 확인할 수 있습니다. 더욱 고급적인 부분은 아키타입된 데칼 액터를 사용한다거나 런타임에 머티리얼 인스턴스를 만든다거나 하는 식으로 선보였습니다.

관련 토픽

다운로드


SimpleBlobShadow.zip 내려받기: 위의 예제에 사용된 콘텐츠입니다.