Unity에서 게임을 개발하면서 [RequireComponent(typeof(%ComponentType%))]
구성 요소가 모든 종속성을 충족시킬 수 있도록 최대한 활용하고 있습니다 .
이제 다양한 UI 객체를 강조하는 튜토리얼 시스템을 구현하고 있습니다. 강조 표시를 수행하려면 GameObject
장면에서 참조를 가져온 다음 Instantiate ()를 사용하여 복제 한 다음 표시에 필요하지 않은 모든 구성 요소를 재귀 적으로 제거합니다. 문제는 RequireComponent
이러한 구성 요소를 자유롭게 사용 하면 아직 삭제되지 않은 다른 구성 요소에 의존하기 때문에 많은 순서로 간단하게 제거 할 수 없다는 것입니다.
내 질문은 : 현재 첨부 된 Component
에서 제거 할 수 있는지 여부를 결정하는 방법이 있습니까?GameObject
내가 게시하는 코드는 기술적으로 작동하지만 Unity 오류가 발생합니다 (이미지에서 볼 수 있듯이 try-catch 블록에 잡히지 않음)
코드는 다음과 같습니다.
public void StripFunctionality(RectTransform rt)
{
if (rt == null)
{
return;
}
int componentCount = rt.gameObject.GetComponents<Component>().Length;
int safety = 10;
int allowedComponents = 0;
while (componentCount > allowedComponents && safety > 0)
{
Debug.Log("ITERATION ON "+rt.gameObject.name);
safety--;
allowedComponents = 0;
foreach (Component c in rt.gameObject.GetComponents<Component>())
{
//Disable clicking on graphics
if (c is Graphic)
{
((Graphic)c).raycastTarget = false;
}
//Remove components we don't want
if (
!(c is Image) &&
!(c is TextMeshProUGUI) &&
!(c is RectTransform) &&
!(c is CanvasRenderer)
)
{
try
{
DestroyImmediate(c);
}
catch
{
//NoOp
}
}
else
{
allowedComponents++;
}
}
componentCount = rt.gameObject.GetComponents<Component>().Length;
}
//Recursive call to children
foreach (RectTransform childRT in rt)
{
StripFunctionality(childRT);
}
}
다음과 같다 위의 방법 그래서이 코드는 디버그 로그의 마지막 세 줄을 생성 : 그것은 입력 A로했다 GameObject
두 개의 구성 요소 : Button
와 PopupOpener
. PopupOpener
것을 requies Button
성분과 같은 게임 오브젝트에 존재한다 :
[RequireComponent(typeof(Button))]
public class PopupOpener : MonoBehaviour
{
...
}
while 루프의 첫 번째 반복 ( "ITERATION ON Button Invite (clone)"텍스트로 표시)은 Button
첫 번째 삭제를 시도했지만 PopupOpener
구성 요소 에 따라 달라지지 않았습니다 . 이것은 오류를 던졌습니다. 그런 다음 PopupOpener
다른 것에 의존하지 않기 때문에 구성 요소 를 삭제하려고 시도했습니다 . 다음 반복 (두 번째 텍스트 "ITERATION ON Button Invite (clone)"으로 표시) 에서 첫 번째 반복 (오류 후)에서 삭제 된 Button
이후 남은 구성 요소 를 삭제하려고 시도했습니다 PopupOpener
.
내 질문에 지정된 구성 요소가 현재에서 제거 할 수있는 경우는 미리 확인할 수 있습니다 여부 그래서 GameObject
호출하지 않고, Destroy()
또는 DestroyImmediate()
. 감사합니다.
Destroy
프레임의 끝에서 구성 요소를 제거합니다 ( Immediate
ly 와 반대 ). DestroyImmediate
어쨌든 나쁜 스타일로 간주되지만 Destroy
실제로 전환 하면 이러한 오류가 제거 될 수 있다고 생각 합니다.