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);
}
}
上記のデバッグログの最後の3行を生成し、このコードは、次のされている方法は、そう:これは、入力Aとして取ったGameObject
二つの成分と:Button
とPopupOpener
。コンポーネントが同じPopupOpener
GameObjectに存在することを要求しButton
ます:
[RequireComponent(typeof(Button))]
public class PopupOpener : MonoBehaviour
{
...
}
whileループの最初の反復(「ITERATION ON Button Invite(clone)」というテキストで示される)は、最初の反復を削除しようButton
としましたが、PopupOpener
コンポーネントに依存しているため、削除できませんでした。これによりエラーが発生しました。次に、他のPopupOpener
コンポーネントに依存していないため、コンポーネントを削除しようとしました。次の反復(2番目のテキスト "ITERATION ON Button Invite(clone)"でButton
示さPopupOpener
れる)では、最初の反復(エラー後)で削除されたため、現在実行可能な残りのコンポーネントを削除しようとしました。
したがって、私の質問はGameObject
、Destroy()
またはを呼び出さずに、指定したコンポーネントを現在のコンポーネントから削除できるかどうかを事前に確認できるかどうかDestroyImmediate()
です。ありがとうございました。
Destroy
が、フレームの最後にあるコンポーネントを削除します(Immediate
lyではなく)。DestroyImmediate
とにかく悪いスタイルと見なされますDestroy
が、実際にこれらのエラーを排除できるように切り替えると思います