작성
·
333
0
예전에 part1에서 배웠었던 컴포지션의 outer / SubObject 랑
Owner 랑 Attachment의 정의가 좀 헷갈려진 것 같습니다.....
Outer/SubObject의 관계는 UObject 사이에서 변수로 참조중인지 아닌지로 클래스 수명에 관련된 걸로 이해하고 있었지만,
Actor로 넘어와선 Actor 사이의 Owner가 좀 헷갈리기 시작했는데요. ...
Actor에서 부턴 Component 개념도 생겨서 attachment라는게 또 새로 나오는데, 여기서 attachment로 연결된 Actor 사이를 Owner라고 봐도 되나요?
답변 1
0
Owner라는 것은 액터에 설정된 다른 액터를 참조할 수 있는 변수인데, 이를 활용해 액터와 액터 사이의 소유 관계를 설정할 수 있습니다.
싱글 플레이에서 Owner의 개념은 딱 어떻게 해야한다라는 명확한 규칙은 없고 개발자가 설정하기 나름입니다.
다만 네트웍 멀티플레이어에서 액터 리플리케이션이 발생하기 위해서는 최상단 오너(Top Owner)가 폰(ViewTarget)이나 플레이어 컨트롤러(RealViewer)가 되어야 됩니다. 안그러면 리플리케이션 범주에서 벗어나 네트웍 동기화에서 제외됩니다.
강의에서 설명하는 엔진 소스 코드를 첨부합니다.
if (bAlwaysRelevant || RealViewer == Controller || IsOwnedBy(ViewTarget) || IsOwnedBy(RealViewer) || this == ViewTarget || ViewTarget == GetInstigator()
|| IsBasedOnActor(ViewTarget) || (ViewTarget && ViewTarget->IsBasedOnActor(this)))
{
return true;
}
위의 코드에서 IsOwnedBy 함수의 결과가 네트웍 배포를 결정한다고 볼 수 있는데, 이 함수는 다음과 같이 선언되어 있습니다.
/** See if this actor is owned by TestOwner. */
inline bool IsOwnedBy( const AActor* TestOwner ) const
{
for( const AActor* Arg=this; Arg; Arg=Arg->Owner )
{
if( Arg == TestOwner )
return true;
}
return false;
}