質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

11788閲覧

Unityでタグを2重につける、もしくは疑似的に再現する方法。

UDON3

総合スコア80

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2018/07/27 01:20

なぜ2重につけなければいけないのか

今、マインクラフトに物理演算機能を追加したようなゲームを作っていて、土台となる部分はほぼ完成しました。
しかし、ワールドの保存機能を付けるところでつまずいています。保存したいブロックの
ブロックID、位置情報、回転情報を記録したいのですが、保存対象のゲームオブジェクトににブロックIDを示すタグと、保存しなければいけないことを示すタグを、2つともつけたいのです。

どうしたいか

まず、保存しなければいけないゲームオブジェクトを探し出し、そのゲームオブジェクトが何のIDなのかを読み取りたいのです。
分かりにくい説明ですが、ブロックの配置、種類を保存し、他のシーンでブロックの置き方を再現するということがしたいです。

バージョン

Unity 2017.3.1f

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

####方法1:セーブ対象判定はタグ、ブロックIDはスクリプト使用
GameObject1つにつきtagは1つしか付けられないので、
「セーブ対象である」タグを付与、ブロックIDは別途スクリプトで管理する方法がスマートかと。
ただGameObject.FindGameObjectsWithTagは割と重い処理であることが予想される上に、その後更にブロックID用スクリプトを取得しなければいけないので、こちらも一度負荷を計測した方がいいかと。
(ブロックが増えると重くて使い物にならない可能性があります)

####方法2:セーブ対象判定はタグ、ブロックIDはGameObject名使用
手動設定するのはブロックIDだけでいい(位置と回転はtransformから取得)の場合、
ブロックID用スクリプトを作らず、そのままGameObject名にしてしまうという方法もあります。
この場合、GameObject名はstringになるので「『block_○』となっている名称の○部分をint型で欲しい」などの場合は文字列加工や型変換コストが発生するのがネック。
逆にGameObject名をstringのまま丸ごと受け渡せばOK、という場合はブロックID用スクリプト使用よりも早くなると思います。

####方法3:対象のオブジェクトを配列(リスト)に入れる
List型の変数を作り、対象のオブジェクトが生成されたタイミング等で格納する方法。
「探し出す」という工程が無くなるのでその分の処理負荷が消えますが、参照をキープし続けるのであまりにも対象オブジェクトの個数が多い場合はメモリに負荷が掛かるかもしれません。(参照だけなので大丈夫かもしれません、一度計測してみてください)
C# List<T> の使い方 - 要素の追加・検索・Sort・LINQ - Project Unknown

ちなみにリストとブロックID管理スクリプトを使う場合、GameObjectのリストではなく「ブロックIDを管理するスクリプトのリスト」にするとアクセスしやすいです。以下一例。
List<BlockData> saveList = new List<BlockData>(); //セーブするブロックのリスト
saveList.Add(targetGameObject.GetComponent<BlockData>()); //リストに格納
saveList[10].id; //10番目の要素のIDにアクセス

投稿2018/07/27 02:50

sakura_hana

総合スコア11427

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

UDON3

2018/07/27 03:09

GameObject名は同じIDのブロックを区別するのに使っているため、 コンパクトに収まりそうな方法3を試してみます。ブロックをプレイヤーが設置する際に、同時に記録してみます。 結果が出たら報告します。
UDON3

2018/07/27 05:54

方法3を使ってできました。 動作も軽かったので、この方法で行こうと思います、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問