배열을 지원하는 Multiple self 와 그렇지 않은 경우를 구분해야 할까?

엔진 버전 5.4를 기준으로 할 때

  • MultipleSelfsUK2Nodevirtual bool AllowMultipleSelfs(bool bInputAsArray) 에 의해 결정된다.
    • 실제로 사용되는 곳은 UK2Node_CallFunction::AllowMultipleSelfs 밖에 없다.
    • 파라메터 bInputAsArray 가 배열을 입력으로 했을 때 여부를 전달하고 있는데, 이 파라메터는 현재 함수 내부에서 사용되지 않는다.

UK2Node_CallFunction::AllowMultipleSelfs의 내용은 아래와 같다.

1
2
3
4
5
6
7
8
9
bool UK2Node_CallFunction::AllowMultipleSelfs(bool bInputAsArray) const
{
  if (UFunction* Function = GetTargetFunction())
  {
    return CanFunctionSupportMultipleTargets(Function);
  }

  return Super::AllowMultipleSelfs(bInputAsArray);
}

따라서, 현재 MultipleSelfs 를 지원하는 핀은 배열과 2개 이상의 싱글 핀을 모두 함께 지원한다. 어느 한 쪽만 지원하는 경우는 존재하지 않는다. 즉, 다음의 경우는 현재 존재하지 않는다.

  • “배열은 지원하지만 2개 이상의 싱글 핀은 지원하지 않는” MultipleSelf 핀
  • “2개 이상의 싱글 핀은 지원하지만 배열은 지원하지 않는” MultipleSelf 핀

이런 경우가 존재할 가능성이 있다면, 이에 대한 대응도 해야 할 것이라고 생각했다. 아마 아래와 같은 작업이 될 것이다.

  1. MultipleSelf 의 케이스를 다루는 Enum 에 MultipleSelfSupportArrayOnlyMultipleSelfSupportManySinglePinsOnly 를 추가한다.
  2. 이에 따라, 반대편에 존재 가능한 핀의 경우의 수를 다루는 case 문을 추가한다.
  3. 이걸 구분해서 UI에 표시해준다.

1과 2는 괜찮다. 하지만 3을 하는 것은 정말 고통스러운 일이다. 안 그래도 표시할 정보가 많아서 공간이 부족하다. 사용자가 느낄 혼란을 가능한한 줄이고 싶기도 하다.

하지만 현재 그런 코드는 존재하지 않는다.

참고로 저 CanFunctionSupportMultipleTargets는 스태틱 함수로, 내용은 아래와 같다.

1
2
3
4
5
6
7
8
bool UK2Node_CallFunction::CanFunctionSupportMultipleTargets(UFunction const* Function)
{
  bool const bIsImpure = !Function->HasAnyFunctionFlags(FUNC_BlueprintPure);
  bool const bIsLatent = Function->HasMetaData(FBlueprintMetadata::MD_Latent);
  bool const bHasReturnParam = (Function->GetReturnProperty() != nullptr);

  return !bHasReturnParam && bIsImpure && !bIsLatent;
}

예상할 수 있는 범위를 넘어서는 내용은 보이지 않는다. 이 내용까지 고려할 때, MultipleSelfSupportArrayOnlyMultipleSelfSupportManySinglePinsOnly 같은 케이스는 존재할 가능성이 거의 없다고 생각된다.

어딘가에 존재할지도 모르는 내가 알지 못하는 사용 사례가 있을 수 있다는 것이 걱정되지만, 이 부분은 그런 경우를 만나게 되면 다시 고민하기로 했다.

여전히 마음에 걸리지만.

태그