シーンに追加せずに新しいGameObjectを作成する方法は?


10

私は本質的に自分のプレハブシステムを作成しています。ゲームオブジェクトは、人間が読めるデータファイルによって定義されます。空のゲームオブジェクトを作成し、データファイルで定義されたコンポーネントを使用してロードし、準備してInstantiate()呼び出しを待機したいと思います。ただし、使用GameObject go = new GameObject()するたびに新しいゲームオブジェクトがシーンに追加されます。

Unityに組み込まれたプレハブを使用して、プレハブをGameObjectとしてロードできますが、シーンに追加されません。(下の例を参照)

この背後にある理論的根拠は、Unityプレハブをロードすることによって生成されたものと、カスタムプレハブシステムによって作成されたものと、GameObjectsを含む1つのリストが欲しいということです。これは実行時に行う必要があり、Unity Editorを使用することはできません(理想的にはエンドユーザーが独自のデータファイルを定義できるためです)。

Unityが自動的にインスタンス化しないで、新しいGameObjectを作成するにはどうすればよいですか?


たとえば、次のように電話をかけることができます。

Resources.LoadAll("PrefabsDirectory", typeof(GameObject))

また、呼び出しが行われたときにシーンに追加されていないGameObjectsのリストを取得します。基本的に、私はLoadAll自分のプレハブ用のメソッドを作成しています。同様に、呼び出しが行われたときにGameObjectsをインスタンス化したくありません。


1
できません。クラスのインスタンス化を遅らせる必要があると思います。
Roberto

Unityに触れて久しぶりですが、これが回避できない場合は、すぐにオブジェクトをシーンから削除して、目的の結果を得ることができますか?
Kevin Reid

@KevinReidこれを行う唯一の方法は、GameObjectを呼び出すことだと思いDestroyます。シーンから削除して解放し、使用できなくなります。
MichaelHouse

1
@PandaPajamaは良い考えを持っています。呼び出しgo.SetActive(false)は、オブジェクトプールのようなものを作成するための最良の方法です。それはまさにあなたが望むものではありませんが、おそらくカスタムのインスタンス化のために後で複製される非アクティブなオブジェクトの小さなグループを持つことができます。
AndrewEkeren 2014年

1
@ Byte56:工場のようなパターンを使用してコンポーネントをインスタンス化するときに、必要なコンポーネントを使用してGOをオンザフライで作成するだけでなく、カスタムプレハブを事前にインスタンス化したいのはなぜですか?ユーザーが「自分のデータファイル」を使用してプレハブを「シリアル化」できるようにしたいので、実行時にこれらのファイルを読み取り、必要なコンポーネントをインスタンス化する必要があります。何か不足していますか?
ハイゼンバグ

回答:


6

GameObjectのhideFlagsを変更できますか?

私はこれを実行してみました:

GameObject myGameObject = new GameObject ();
myGameObject.name = "Obvious Name";

myGameObject.hideFlags = HideFlags.HideInHierarchy;

...そしてそこにありますが、階層にはありません。技術的には、シーン内にありますが、フラグをHideFlags.Noneに戻すまでは表示されません。それはあなたが探している答えではありませんが、少なくともこれを開発者にリリースする限り、オブジェクトをグループ化するよりもきれいです。


1
これを無効にすることと組み合わせて(スクリプトが実行されないように)、機能する可能性があります。私はそれを試して、あなたに知らせます。それはまだ回避策ですが、現時点ではそれが残されていると思います。そして、私たちが知っているすべての人にとって、これは内部的に行われていることかもしれませんが、私は疑っています。
MichaelHouse

1
@ Byte56:私もそれが回避策だと思ったが、実際に最近私はUnityがアニメーションのプレビュー時にまったく同じことをすることを発見しました:シーンで非表示のゲームオブジェクトをインスタンス化し、専用カメラでプレビューフレームにレンダリングします。だから、それはそれほどきれいに聞こえないかもしれませんが、実際にはこのソリューションは内部でも使用されているようです。
ハイゼンバグ2014

1
遅くなって申し訳ありません。私はこれを実装することに慣れました、そしてそれは素晴らしい働きをします。ありがとう。
MichaelHouse

0

残念ながら、その正確なことはできません。ただし、ファクトリパターンを使用して、同じデザインパターンを実現できます(つまり、オブジェクトの構築を抽象化し、後で1つのコマンドで呼び出すだけです)。

オブジェクトが必要な場合は、などを呼び出します。Factory.CreateGameEntity()このメソッドは、舞台裏のすべてを処理します。


それはあなたが思っているよりも複雑で、それほどクリーンではありません。詳細については回答を投稿しますが、基本的にパーサーはかなり複雑でなければなりません。たとえば、プレハブにコンポーネントがあるかどうかをテストする場合、インスタンス化する前に、それはと同じくらい簡単GetComponent<>() != nullです。私のデータファイルでは、パーサーはデータ内の正しいコンポーネントを検索する必要があります。コンポーネント内などから値を取得する場合も同様です。このGameObjectクラスは、パーサーで複製する必要のある多くの機能を提供します。
MichaelHouse

これを実行できない理由の証拠または根拠さえ提供できれば、この回答は完全になります。
MichaelHouse

私はこれについての決定的なドキュメントを見つけることができれば、私は、これらのフォーラムのスレッドがされている今、すべて私が見つけることができるため、後で見るforum.unity3d.com/threads/... - answers.unity3d.com/questions/366273/...を - answers.unity3d .com / questions / 19736 /…
jhocking 2014年

0

go = new GameObject();シーンに追加せずに行う方法はありません。

私はRTSに取り組んでおり、プレーヤーベースを永続化する必要があります。基本的に、彼らが行ったすべてをシリアル化し、ストアから変更されたアセットを使用して実行時にロードし直します。

ほとんどの出力はXMLまたはJSONに出力されるため、ファイルをロードして必要に応じて操作するのは非常に簡単です。


マルク、ありがとう。シーンに追加せずに新しいゲームオブジェクトを作成できないことの証拠または根拠を提供できますか?私は自分のシリアル化コードを持っているので、問題はありません。提案をありがとうございます。
MichaelHouse

-1

正しい方法は、プレハブを作成することです。そのプレハブをObjectとして割り当て、インスタンス化するときはいつでも、このオブジェクトの参照を使用して、それをGameObjectとしてキャストします。

例:

private Object prefab;


public static GameObject Create(void)
{
   return (Instantiate(prefab , position , rotation) as GameObject);
}

1
これは既存のプレハブシステムを使用しています。私の質問が述べるように、私は本質的に自分のプレハブシステムを作成しています。要件の一部は「Unity Editorを含めることはできません」です。プレハブの作成にはUnityエディターを使用します。
MichaelHouse

できません。開発者がSDKを使用して独自のデータを作成できるようにするには、ライセンスが必要です。私が間違っていない限り、彼らは見せびらかすことなくコードを共有することはありません。しかし、Unityから自分のゲームエンジンにシーンをエクスポートできる人がいることは知っています
Ericool

ええ、私が選択した答えを使って自分のプレハブシステムを作成したので、それは明らかに可能です。私のプロフィールで見つけた私が作成したコースでそれを行う方法を学ぶことができます。
MichaelHouse

いいえ、私は卒業後のゲームプログラマです:)成功した場合は、ゲームを作るためにそれを必要としないでください
Ericool

それは本質的にエンドユーザーがプレハブを作ることを可能にするシステムです。これは、MODやその他のエンドユーザーが作成したコンテンツのゲームで非常に役立ちます。(そうです、ゲームを作るのにとても便利だと思います)。
MichaelHouse

-1

プレハブを変数にロードして後でインスタンス化できるようにするには、次のコードを使用します。

 GameObject ball = (GameObject)(Resources.Load ("myPrefab"));

Unity 5.5のプロジェクトでこれを行いました。インスタンス化は可能ですが、通常どおりインスタンス化されるまで、シーンや階層の一部では使用できません。


質問を間違って読んだようです。この回答には、デフォルトのプレハブシステムの使用が含まれます。この質問は、これにアクセスできないカスタムプレハブシステムの作成に関連して尋ねられます。下の例は、これをさらに強調するのに役立ちます。
Gnemlock 2017年

「Unityが自動的にインスタンス化しないで、新しいGameObjectを作成するにはどうすればよいですか?」尋ねられた質問であり、このコードはそれに答えました。コードを変更して、カスタムロードシステムで望ましい結果を得ることができます。
darthhawk 2017年

これは本質的に私が質問に含まれる例で説明するものです。また、プレハブでは正常に機能しますが、データファイルから新しいゲームオブジェクトを作成する場合には機能しません。
MichaelHouse
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.