UDN
Search public documentation:

DevelopmentKitGemsIteratorKismetNodesKR
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년 4월 버전으로 최종 테스팅, PC 와 iOS 호환

개요


가끔은 레벨 디자인 단계에 있을 동안에는 레벨에 없을 수도 있는 액터 종류나 근처 (플레이어나 몬스터) 폰을 찾는 기능이 필요합니다. 아니면 가끔 특정 액터 유형에 특수 효과를 붙여, 어떠한 것의 일정한 범위 안에서만 이펙트가 나게 하고 싶을 수도 있습니다. 이 젬에서는 이러한 함수성을 노출시키는 키즈멧 노드를 새로 만들어 보겠습니다.

All Actors


모든 액터 노드는 클래스 및/또는 인터페이스로 필터링하여 원하는 액터를 구하기 위해 AllActors 나 DynamicActors 중 하나의 이터레이터를 사용합니다. 이 키즈멧 노드의 작동 방식은, 먼저 WorldInfo 에서 쓸 수 있는 스태틱 함수를 사용하여 WorldInfo 로의 참조를 구합니다. WorldInfo 참조가 필요한 이유는 AllActors 와 DynamicActors 의 작동을 위해서는 Actor 참조가 필요하기 때문입니다. WorldInfo 는 항상 사용가능하고 참조를 구하기도 쉽기 때문에 선택되었습니다. WorldInfo 로의 참조가 가능하면, 어태치된 ObjectList 키즈멧 변수 노드를 찾아 형 변환합니다. 레벨 디자이너가 *AlwaysClearObjectList*를 체크했다면, ObjectList 배열을 먼저 비운 다음 찾은 액터를 추가합니다. 그렇지 않으면 AllActors 이터레이터를 사용하여 액터 참조를 구합니다. 이렇게 하는 일차적인 이유는 두 이터레이터의 퍼포먼스가 다를 수 있기 때문입니다.

  • ALERT! AllActors 는 느리니, 아껴 쓰십시오.
  • ALERT! DynamicActors 는 AllActors 보단 빠르니, 사용 전 가능하면 다른 이터레이터를 고려해 보십시오.

변수

  • ActorClass - 클래스별로 액터를 필터링합니다. 액터는 이 클래스나 서브클래스여야 합니다.
  • InterfaceClass - 인터페이스 구현으로 액터를 필터링합니다. 액터는 이 인터페이스나 서브클래싱된 인터페이스를 구현해야 합니다.
  • AlwaysClearObjectList - ObjectList 를 새 액터로 채우기 전, ObjectList 를 비웁니다.
  • DynamicActorsOnly - 논-스태틱 액터 목록 안에서만 액터를 찾습니다.

언리얼스크립트

SeqAct_AllActors.uc
  class SeqAct_AllActors extends SequenceAction;
  
  var() class<Actor> ActorClass;
  var() class<Interface> InterfaceClass;
  var() bool AlwaysClearObjectList;
  var() bool DynamicActorsOnly;
  
  event Activated()
  {
    local Actor Actor;
    local WorldInfo WorldInfo;
    local array<SequenceObject> ObjectList;
    local SeqVar_ObjectList SeqVar_ObjectList;
  
    if (ActorClass != None)
    {
      WorldInfo = class'WorldInfo'.static.GetWorldInfo();
      if (WorldInfo != None)
      {
        // 오브젝트 리스트 시퀸 변수 구하기
        GetLinkedObjects(ObjectList, class'SeqVar_ObjectList', false);
  
        if (ObjectList.Length > 0)
        {
          SeqVar_ObjectList = SeqVar_ObjectList(ObjectList[0]);
  
          if (SeqVar_ObjectList != None)
          {
            if (AlwaysClearObjectList)
            {
              SeqVar_ObjectList.ObjList.Length = 0;
            }
  
            if (DynamicActorsOnly)
            {
              ForEach WorldInfo.DynamicActors(ActorClass, Actor, InterfaceClass)
              {
                SeqVar_ObjectList.ObjList.AddItem(Actor);
              }
            }
            else
            {
              ForEach WorldInfo.AllActors(ActorClass, Actor, InterfaceClass)
              {
                SeqVar_ObjectList.ObjList.AddItem(Actor);
              }
            }
          }
        }
      }
    }
  
    ActivateOutputLink(0);
  }
  
  defaultproperties
  {
    ObjName="All Actors"
    ObjCategory="Iterators"
    InputLinks(0)=(LinkDesc="In")
    OutputLinks(0)=(LinkDesc="Out")
    VariableLinks.Empty
    VariableLinks(0)=(ExpectedType=class'SeqVar_ObjectList',LinkDesc="Out Objects",bWriteable=true)
  }
  

All Actors 키즈멧 노드 사용하기

이 예제에서 All Actors 노드는 플레이어가 바닥의 트리거를 건드릴 때 활성화됩니다. 그러면 All Actors 노드는 레벨에 있는 모든 Note 액터를 찾습니다. 마지막으로 ObjectList 에서 랜덤 Note 를 고른 다음 그 Note 위치에 폭발을 발동시킵니다.

KI_AllActorsTest.jpg

Based Actors


Based actors 는 현재 다른 액터의 위에 올라서 있는 액터를 찾을 때 좋습니다. 예를 들어 압력 발판 위에 액턱라 몇 개나 올라가 있나 알고 싶을 때 입니다. 폰이 셋 있다면 충분히 무거워 졌으니 다른 키즈멧 이벤트 종류를 발동시켜라 식으로 결정할 수 있는 것입니다. 이러한 예제의 경우에는 Touch 트리거 등등을 사용하여 이루어 낼 수도 있습니다만, 이러한 이터레이터 Kismet 노드가 유용하게 다가올 수도 있을 것입니다.

이터레이터 키즈멧 노드는 특정 액터 위에서 실행되어야 하므로 WorldInfo 로의 참조를 찾을 필요가 없습니다. 그렇기에 BaseActor 변수를 키즈멧에 노출시켜 레벨 디자이너가 사용할 액터를 지정할 수 있도록 합니다. 거기서 ObjectList 를 찾아 형 변환합니다. 레벨 디자이너가 AlwaysClearObjectList 옵션을 체크하면 오브젝트 리스트에 새 액터를 채우기 전 먼저 비웁니다. 마지막으로 BasedActors 이터레이터가 호출되어 현재 BaseActor 위에 있는 액터를 전부 찾아냅니다. BasedActor 이터레이터는 빠릅니다.

변수

  • ActorClass - 클래스 별로 액터를 필터링합니다. 액터는 이 클래스이거나 서브클래스여야 합니다.
  • AlwaysClearObjectList - ObjectList 를 새 액터로 채우기 전, ObjectList 를 비웁니다.

언리얼스크립트

SeqAct_BasedActors.uc
  class SeqAct_BasedActors extends SequenceAction;
  
  var() class<Actor> ActorClass;
  var() bool AlwaysClearObjectList;
  var Actor BaseActor;
  
  event Activated()
  {
    local Actor Actor;
    local array<SequenceObject> ObjectList;
    local SeqVar_ObjectList SeqVar_ObjectList;
  
    if (ActorClass != None && BaseActor != None)
    {
      // 오브젝트 리스트 시퀸 변수 구하기
      GetLinkedObjects(ObjectList, class'SeqVar_ObjectList', false);
  
      if (ObjectList.Length > 0)
      {
        SeqVar_ObjectList = SeqVar_ObjectList(ObjectList[0]);
  
        if (SeqVar_ObjectList != None)
        {
          if (AlwaysClearObjectList)
          {
            SeqVar_ObjectList.ObjList.Length = 0;
          }
  
          ForEach BaseActor.BasedActors(ActorClass, Actor)
          {
            SeqVar_ObjectList.ObjList.AddItem(Actor);
          }
        }
      }
    }
  
    ActivateOutputLink(0);
  }
  
  defaultproperties
  {
    ObjName="Based Actors"
    ObjCategory="Iterators"
    InputLinks(0)=(LinkDesc="In")
    OutputLinks(0)=(LinkDesc="Out")
    VariableLinks.Empty
    VariableLinks(0)=(ExpectedType=class'SeqVar_ObjectList',LinkDesc="Out Objects",bWriteable=true)
    VariableLinks(1)=(ExpectedType=class'SeqVar_Object',LinkDesc="Base Actor",PropertyName=BaseActor)
  }
  

Based Actors 키즈멧 노드 사용하기

이 예제에서는 레벨이 로드될 때 루프가 구성됩니다. 루프 주기마다 Based Actors 노드는 현재 레벨의 InterpActor 위에 있는 UTPawn 액터를 전부 찾습니다. 그런 다음 ObjectList 에서 처음 적합한 오브젝트를 찾은 다음 화면상에 출력합니다. ObjectList 는 그 후 비웁니다.

KI_BasedActorsTest.jpg

Child Actors


Child Actors 키즈멧 노드는 현재 OwningActor 에 의해 소유된 모든 액터 참조를 반환합니다. Based Actors 이터레이터 키즈멧 노드와 매우 흡사하게, 노출된 키즈멧 노드 변수를 사용하여 OwningActor 를 설정하는 것은 레벨 디자이너 몫입니다. 이 코드는 Based Actors 이터레이터 키즈멧 노드워 매우 유사하나, ChildActors 이터레이터가 대신 사용된다는 점만 다릅니다.

  • ALERT! ChildActors 는 느리며, 가급적 쓰지 않는 것이 좋습니다.

변수

  • ActorClass - 클래스별로 액터를 필터링합니다. 액터는 이 클래스거나 서브클래스여야 합니다.
  • AlwaysClearObjectList - ObjectList 를 새 액터로 채우기 전, ObjectList 를 비웁니다.

언리얼스크립트

SeqAct_ChildActors.uc
  class SeqAct_ChildActors extends SequenceAction;
  
  var() class<Actor> ActorClass;
  var() bool AlwaysClearObjectList;
  var Actor OwningActor;
  
  event Activated()
  {
    local Actor Actor;
    local array<SequenceObject> ObjectList;
    local SeqVar_ObjectList SeqVar_ObjectList;
  
    if (ActorClass != None && OwningActor != None)
    {
      // 오브젝트 변수 시퀸 변수 구하기
      GetLinkedObjects(ObjectList, class'SeqVar_ObjectList', false);
  
      if (ObjectList.Length > 0)
      {
        SeqVar_ObjectList = SeqVar_ObjectList(ObjectList[0]);
  
        if (SeqVar_ObjectList != None)
        {
          if (AlwaysClearObjectList)
          {
            SeqVar_ObjectList.ObjList.Length = 0;
          }
  
          ForEach OwningActor.ChildActors(ActorClass, Actor)
          {
            SeqVar_ObjectList.ObjList.AddItem(Actor);
          }
        }
      }
    }
  
    ActivateOutputLink(0);
  }
  
  defaultproperties
  {
    ObjName="Child Actors"
    ObjCategory="Iterators"
    InputLinks(0)=(LinkDesc="In")
    OutputLinks(0)=(LinkDesc="Out")
    VariableLinks.Empty
    VariableLinks(0)=(ExpectedType=class'SeqVar_ObjectList',LinkDesc="Out Objects",bWriteable=true)
    VariableLinks(1)=(ExpectedType=class'SeqVar_Object',LinkDesc="Owning Actor",PropertyName=OwningActor)
  }
  

Child Actors 키즈멧 노드 사용하기

이 예제에서는 레벨 로드시 루프가 구성됩니다. 각 루프 주기마다 Child Actors 노드는 Player 에 의해 소유된 모든 UTPawn 액터를 찾습니다. ObjectList 에서 랜덤 오브젝트를 선택한 다음 화면상에 출력합니다.

KI_ChildActorsTest.jpg

Radial Actor


이 이터레이터 키즈멧 노드는 반경 안의 액터를 찾습니다. 표시여부(visibility), 콜리전(collision), 겹침(overlapping) 여부에 따라 액터를 걸러낼 수 있는 옵션도 있습니다. 표시여부 필터는 액터가 히든 상태인지 아닌지를 검사합니다. 콜리전 필터는 액터가 다른 액터와 충돌할 수 있는(bCollideActors 가 참인)지 검사합니다. 겹침 필터는 액터의 콜리전 (bCollideActors 가 참인) 컴포넌트가 Radius 로 정의된 반경을 가진 구체와 겹치는지 확인합니다.

먼저 WorldInfo 안의 스태틱 함수를 사용하여 WorldInfo 로의 참조를 구합니다. 적합한 WorldInfo 를 찾았으면 ObjectList 를 사용할 수 있는 상태로 만들기 위해 찾아 형 변환합니다. 이터레이터의 위치는 다음 로직에 따라 결정됩니다.

  • ActorLocation 가 월드의 액터를 가리키는 데 사용된 경우, 반경 스캔의 원점으로 Actor 의 위치를 사용합니다.
  • 아니면 반경 스캔의 원점으로 Location 을 사용합니다.

AlwaysClearObjectList 가 체크된 경우, ObjectList 에 새로운 것을 추가하기 전에 먼저 비웁니다. 거기서 대부분의 이터레이터는 레벨 디자이너가 설정한 여러가지 프로퍼티와 함께 사용됩니다. 이 키즈멧 노드가 퍼포먼스에 끼치는 영향은 사용되는 이터레이터의 종류에 따라 달라집니다.

변수

  • ActorClass - 클래스별로 액터를 필터링합니다. 액터는 이 클래스나 서브클래스여야 합니다.
  • AlwaysClearObjectList - ObjectList 에 새 액터를 채우기 전, 먼저 비웁니다.
  • IteratorType - 사용할 이터레이터 종류입니다.
    • Visible - 느리니 가급적 사용을 피하십시오.
    • Visible and Collidable - 반경이 적당히 작을 때는 콜리전 옥트리를 사용하므로 빠릅니다.
      • Ignore Hidden - 숨은 액터는 무시합니다.
      • Trace Extent - 원점과 액터의 위치 사이에 월드 지오메트리가 없는지 검사하기 위해 트레이스에 사용할 익스텐트 입니다.
      • Trace Actors - 원점과 액터의 위치 사이에 월드 지오메트리가 없는지 검사하기 위해 트레이스를 해 보려면 체크하십시오.
      • Interface Class - 인터페이스 구현 별로 액터를 필터링하려면 none 이외의 것으로 설정하십시오.
    • Collidable - 반경이 적당히 작을 때는 콜리전 옥트리를 사용하므로 빠릅니다.
      • Use Overlap Check - 액터위 위치가 반경 안에 있는지만 검사할 게 아니라, 액터가 반경 안에 확실히 있는지 확인하려면 체크하십시오.
      • Interface Class - 인터페이스 구현 별로 액터를 필터링하려면 none 이외의 것으로 설정하십시오.
    • Overlapping - 느리니 가급적 사용을 피하십시오.
      • Ignore Hidden - 숨은 액터를 무시합니다.

언리얼스크립트

SeqAct_RadialActors.uc
  class SeqAct_RadialActors extends SequenceAction;
  
  enum EIteratorType
  {
    EIT_Visible<DisplayName="Visible">,
    EIT_VisibleColliding<DisplayName="Visible and Collidable">,
    EIT_Colliding<DisplayName="Collidable">,
    EIT_Overlapping<DisplayName="Overlapping">
  };
  
  var() class<Actor> ActorClass;
  var() bool AlwaysClearObjectList;
  var() EIteratorType IteratorType;
  
  var() float Radius;
  // 어태치된 액터를 사용하면 Location 덮어씀
  var() Vector Location;
  var Actor ActorLocation;
  
  var(VisibleCollidingActors) bool VCAIgnoreHidden<DisplayName="Ignore Hidden">;
  var(VisibleCollidingActors) Vector VCAExtent<DisplayName="Trace Extent">;
  var(VisibleCollidingActors) bool VCATraceActors<DisplayName="Trace Actors">;
  var(VisibleCollidingActors) class<Interface> VCAInterfaceClass<DisplayName="Interface Class">;
  
  var(CollidingActors) bool CAUseOverlapCheck<DisplayName="Use Overlap Check">;
  var(CollidingActors) class<Interface> CAInterfaceClass<DisplayName="Interface Class">;
  
  var(OverlappingActors) bool OAIgnoreHidden<DisplayName="Ignore Hidden">;
  
  event Activated()
  {
    local WorldInfo WorldInfo;
    local Actor Actor;
    local array<SequenceObject> ObjectList;
    local SeqVar_ObjectList SeqVar_ObjectList;
    local Vector IteratorLocation;
  
    if (ActorClass != None)
    {
      WorldInfo = class'WorldInfo'.static.GetWorldInfo();
  
      if (WorldInfo != None)
      {
        // 오브젝트 리스트 시퀸 변수 구하기
        GetLinkedObjects(ObjectList, class'SeqVar_ObjectList', false);
  
        if (ObjectList.Length > 0)
        {
          SeqVar_ObjectList = SeqVar_ObjectList(ObjectList[0]);
  
          if (SeqVar_ObjectList != None)
          {
            IteratorLocation = (ActorLocation != None) ? ActorLocation.Location : Location;
  
            if (AlwaysClearObjectList)
            {
              SeqVar_ObjectList.ObjList.Length = 0;
            }
  
            switch (IteratorType)
            {
            case EIT_Visible:
              ForEach WorldInfo.VisibleActors(ActorClass, Actor, Radius, IteratorLocation)
              {
                SeqVar_ObjectList.ObjList.AddItem(Actor);
              }
              break;
  
            case EIT_VisibleColliding:
              ForEach WorldInfo.VisibleCollidingActors(ActorClass, Actor, Radius, IteratorLocation, VCAIgnoreHidden, VCAExtent, VCATraceActors, VCAInterfaceClass)
              {
                SeqVar_ObjectList.ObjList.AddItem(Actor);
              }
              break;
  
            case EIT_Colliding:
              ForEach WorldInfo.CollidingActors(ActorClass, Actor, Radius, IteratorLocation, CAUseOverlapCheck, CAInterfaceClass)
              {
                SeqVar_ObjectList.ObjList.AddItem(Actor);
              }
              break;
  
            case EIT_Overlapping:
              ForEach WorldInfo.OverlappingActors(ActorClass, Actor, Radius, IteratorLocation, OAIgnoreHidden)
              {
                SeqVar_ObjectList.ObjList.AddItem(Actor);
              }
              break;
  
            default:
              break;
            }
          }
        }
      }
    }
  
    ActivateOutputLink(0);
  }
  
  defaultproperties
  {
    ObjName="Radial Actors"
    ObjCategory="Iterators"
    InputLinks(0)=(LinkDesc="In")
    OutputLinks(0)=(LinkDesc="Out")
    VariableLinks.Empty
    VariableLinks(0)=(ExpectedType=class'SeqVar_ObjectList',LinkDesc="Out Objects",bWriteable=true)
    VariableLinks(1)=(ExpectedType=class'SeqVar_Float',LinkDesc="Radius",PropertyName=Radius)
    VariableLinks(2)=(ExpectedType=class'SeqVar_Object',LinkDesc="Actor Location",bHidden=true,PropertyName=ActorLocation)
    VariableLinks(3)=(ExpectedType=class'SeqVar_Vector',LinkDesc="Location",PropertyName=Location)
  }
  

Radial Actors 키즈멧 노드 사용하기

이 예제에서는 플레이어가 스폰되면 플레이어의 폰을 먼저 찾은 다음 저장합니다. 그리고서 Radial Actors 는 플레이어의 폰 위치에서 192.f 로 정의된 반경 안에 있는 PathNode 를 검색합니다. ObjectList 에서 랜덤 오브젝트를 선택한 다음 그 오브젝트의 위치에서 폭발이 발동됩니다.

KI_RadiusActorsTest.jpg

Touching Actors


이 이터레이터 키즈멧 노드는 현재 BaseActor 에 맞닿아 있는 액터를 모두 반환합니다. 그 코드는 BasedActors 이터레이터 키즈멧 노드워 매우 유사하나, TouchingActors 이터레이터가 대신 사용된다는 점이 다릅니다. 이 이터레이터는 빠릅니다.

변수

  • ActorClass - 클래스별로 액터를 필터링합니다. 액터는 이 클래스나 서브클래스여야 합니다.
  • AlwaysClearObjectList - ObjectList 에 새 액터를 채우기 전 먼저 비웁니다.

언리얼스크립트

SeqAct_TouchingActors.uc
  class SeqAct_TouchingActors extends SequenceAction;
  
  var() class<Actor> ActorClass;
  var() bool AlwaysClearObjectList;
  var Actor BaseActor;
  
  event Activated()
  {
    local Actor Actor;
    local array<SequenceObject> ObjectList;
    local SeqVar_ObjectList SeqVar_ObjectList;
  
    if (ActorClass != None && BaseActor != None)
    {
      // 오브젝트 리스트 시퀸스 변수 구하기
      GetLinkedObjects(ObjectList, class'SeqVar_ObjectList', false);
  
      if (ObjectList.Length > 0)
      {
        SeqVar_ObjectList = SeqVar_ObjectList(ObjectList[0]);
  
        if (SeqVar_ObjectList != None)
        {
          if (AlwaysClearObjectList)
          {
            SeqVar_ObjectList.ObjList.Length = 0;
          }
  
          ForEach BaseActor.TouchingActors(ActorClass, Actor)
          {
            SeqVar_ObjectList.ObjList.AddItem(Actor);
          }
        }
      }
    }
  
    ActivateOutputLink(0);
  }
  
  defaultproperties
  {
    ObjName="Touching Actors"
    ObjCategory="Iterators"
    InputLinks(0)=(LinkDesc="In")
    OutputLinks(0)=(LinkDesc="Out")
    VariableLinks.Empty
    VariableLinks(0)=(ExpectedType=class'SeqVar_ObjectList',LinkDesc="Out Objects",bWriteable=true)
    VariableLinks(1)=(ExpectedType=class'SeqVar_Object',LinkDesc="Base Actor",PropertyName=BaseActor)
  }
  

Touching Actors 키즈멧 노드 사용하기

이 예제에서는 레벨이 로드되면 루프가 구성됩니다. 각 루프 주기마다 Touching Actors 노드는 현재 Trigger_0 에 맞닿아 있는 UTProj_LinkPlasma 액터를 모두 찾아봅니다. ObjectList 에서 랜덤 오브젝트를 선택한 다음 화면상에 출력합니다. 그 직후 ObjectList 를 비웁니다.

KI_TouchingActorsTest.jpg

Trace Actors


이 이터레이터 키즈멧 노드는 TraceStart 에서 TraceEnd 사이로 트레이스를 수행합니다. (논-제로 익스텐트 트레이스라서) 필요한 경우 TraceExtent 는 트레이스의 폭과 높이를 정의합니다. 이 이터레이터 키즈멧 노드는 레이저 빔처럼 일직선상의 액터를 찾고자 할 때 좋습니다.

먼저 WorldInfo 안에서 스태틱 함수를 사용하여 WorldInfo 로의 참조를 찾습니다. 거기서 ObjectList 를 찾아 형 변환합니다. AlwaysClearObjectList 가 체크된 경우 ObjectList ㅇ를 비웁니다. 마지막으로 TraceStart, TraceEnd, TraceExtent 입력을 사용하여 TraceActors 이터레이터를 실행합니다. 이터레이터가 그러모은 HitLocationHitNormal 정보는 버립니다. 그리고서 트레이스 지점 내 모든 액터를 ObjectList 로 추가합니다. 다른 트레이스와 마찬가지로 꽤 빠른 편입니다.

변수

  • ActorClass - 클래스별로 액터를 필터링합니다. 액터는 이 클래스나 서브클래스여야 합니다.
  • AlwaysClearObjectList - ObjectList 에 새 액터를 채우기 전 먼저 비웁니다.
  • TraceStart - 트레이스 시작 지점입니다.
  • TraceEnd - 트레이스 종료 지점입니다.
  • TraceExtent - 트레이스의 굵기입니다. 제로-익스텐트 트레이스를 사용하려면 0 으로 해도 됩니다.

언리얼스크립트

SeqAct_TraceActors.uc
  class SeqAct_TraceActors extends SequenceAction;
  
  var() class<Actor> ActorClass;
  var() bool AlwaysClearObjectList;
  var() Vector TraceStart;
  var() Vector TraceEnd;
  var() Vector TraceExtent;
  
  event Activated()
  {
    local WorldInfo WorldInfo;
    local Actor Actor;
    local array<SequenceObject> ObjectList;
    local SeqVar_ObjectList SeqVar_ObjectList;
    local Vector HitLocation, HitNormal;
  
    if (ActorClass != None)
    {
      WorldInfo = class'WorldInfo'.static.GetWorldInfo();
  
      if (WorldInfo != None)
      {
        // 오브젝트 리스트 시퀸스 변수 구하기
        GetLinkedObjects(ObjectList, class'SeqVar_ObjectList', false);
  
        if (ObjectList.Length > 0)
        {
          SeqVar_ObjectList = SeqVar_ObjectList(ObjectList[0]);
  
          if (SeqVar_ObjectList != None)
          {
            if (AlwaysClearObjectList)
            {
              SeqVar_ObjectList.ObjList.Length = 0;
            }
  
            ForEach WorldInfo.TraceActors(ActorClass, Actor, HitLocation, HitNormal, TraceEnd, TraceStart, TraceExtent)
            {
              SeqVar_ObjectList.ObjList.AddItem(Actor);
            }
          }
        }
      }
    }
  
    ActivateOutputLink(0);
  }
  
  defaultproperties
  {
    ObjName="Trace Actors"
    ObjCategory="Iterators"
    InputLinks(0)=(LinkDesc="In")
    OutputLinks(0)=(LinkDesc="Out")
    VariableLinks.Empty
    VariableLinks(0)=(ExpectedType=class'SeqVar_ObjectList',LinkDesc="Out Objects",bWriteable=true)
    VariableLinks(1)=(ExpectedType=class'SeqVar_Vector',LinkDesc="Trace Start",PropertyName=TraceStart)
    VariableLinks(2)=(ExpectedType=class'SeqVar_Vector',LinkDesc="Trace End",PropertyName=TraceEnd)
    VariableLinks(3)=(ExpectedType=class'SeqVar_Vector',LinkDesc="Trace Extent",PropertyName=TraceExtent)
  }
  

Trace Actors 키즈멧 노드 사용하기

이 예제에서 Note_0 과 Note_1 의 위치를 먼저 찾습니다. 그리고서 두 변수가 설정되면 루핑 셋업을 생성합니다. 각각의 루프 주기마다 Trace Actors 는 Note_0 과 Note_1 사이로 트레이스를 하여, 그 안의 UTPawn 이 있는지 찾아봅니다. 그리고서 ObjectList 에서 랜덤 오브젝트를 선택합니다. 화면상에 로그를 출력한 다음 알람 소리를 재생합니다. ObjectList 는 그 직후 비웁니다.

KI_TraceActorsTest.jpg

내려받기