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

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

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

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

解決済

1回答

9219閲覧

Unityで複数のPrefabを重ならないようにinstantiateしたい

ut-

総合スコア7

C#

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

0グッド

0クリップ

投稿2018/08/24 15:27

編集2018/08/26 01:43

前提・実現したいこと

Unityでランゲームを制作しています。
複数の障害物Prefabをランダムに3件選択し、重ならないよう、z軸方向に並べて配置したいです。

障害物Prefab1つめ:(0, 0, 0)
2つめ:(0, 0, 3)
3つめ:(0, 0, 6)
のようなイメージです。

各prefabは

親オブジェクト
└3DモデルA
└3DモデルB

のような親子構造になっています。

現在組んでいる障害物Prefabは全てz軸が同じサイズですが、
参考までに、z軸のサイズがバラバラの場合もご教示いただければ幸いです。

発生している問題・エラーメッセージ

複数の障害物Prefabをランダムに3件選択して生成するところまでは上手く動作していますが、
全てのオブジェクトが(0, 0, 0)の位置に生成されてしまいます。

該当のソースコード

C#

1 int count = 0; 2 int max = 3; 3 4 [SerializeField] GameObject[] objList; 5 6 void SetStageObjects() 7 { 8 if (count == max) return; 9 int number = Random.Range(0, objList.Length); 10 Vector3 position = new Vector3(0, 0, 0); 11 Quaternion q = new Quaternion(); 12 q = Quaternion.identity; 13 GameObject obj = Instantiate(objList[number],position,q); 14 count++; 15 } 16

試したこと

position.z += obj.transform.localScale.z;
をcount++;の前に挿入してみましたが、想定通りに動いてくれませんでした。
エラーメッセージは表示されていません。

補足情報

当方初心者のため、質問がわかりにくかったり、情報が不足していればご指摘ください。
どうぞよろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Instantiateの第二引数がVector3 position = new Vector3(0, 0, 0);で固定されているので当然同じ位置に出ますね。

zを3ずつずらす(毎回固定)なら以下。
Vector3 position = new Vector3(0, 0, count*3.0f);

大きさを取得したい場合、親は子のサイズを把握していないし、3Dモデルを使っているなら更に計算が面倒臭いです。
(TransformのScale値は「大きさの"割合"」みたいなもの。「3Dモデル(fbxファイルとか)のインスペクターで設定している大きさ×TransformのScale値」なので、後者が同じでも前者が違えば見た目の大きさが変わる。もし子オブジェクト2つが離れていたりしたら更にややこしい)
なので「サイズを記載しておくクラス」を作って付与しておく方が楽かと。

C#

1//サイズを指定するクラス(プレハブの親に付ける。値はインスペクタから設定しておく) 2public class PrefabSize : MonoBehaviour { 3 public Vector3 size; 4} 5 6//生成するクラス 7//クラス変数に以下を用意 8private Vector3 stagePosition; 9 10void SetStageObjects() { 11 //中略 12 13 //本当はpositionは何でもいい 14 GameObject obj = Instantiate(objList[number],position,q); 15 16 //指定サイズを前回までの位置に加算する 17 stagePosition += obj.GetComponent<PrefabSize>().size; 18 obj.transform.position = stagePosition; 19}

※ちなみに子オブジェクトのローカル位置によってズレて見える可能性あります。(例えば「原点=中心」なら半分ずれる)
ローカル座標(0,0,0)に子オブジェクトの端が来るように配置するか、PrefabSizeのsize値を調整してください。

投稿2018/08/26 05:35

sakura_hana

総合スコア11427

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

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

ut-

2018/08/26 05:51

うまく想定した挙動にできました。 scaleに関してもわかりやすく解説していただき、大変ためになりました。他の箇所でも使えそうなテクニックなので記憶しておきます。 ご回答本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問