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

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

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

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

Unity3D

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

Unity

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

Q&A

2回答

729閲覧

指定したオブジェクトの上の中でランダムで場所を取得したい

_Beginner

総合スコア103

C#

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

Unity3D

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

Unity

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

0グッド

1クリップ

投稿2018/12/22 08:34

編集2022/01/12 10:55

イメージ1

画像の(0, 0, 0)は位置を表しています。

あるオブジェクトの上の範囲の値をランダムで取得したいです。

これがやりたい理由は、ステージの上にランダムで敵を出現させるためです。

例えば、地面となるオブジェクトの大きさが(6, 1, 6)だとすれば、

結果として得たい三次元の値は(-3, 1, -3)から(3, 1, 3)の間です。

どのようにすればこのような値を取得できますか


また、

イメージ2

ピンク色が有効な範囲です。

c#

1UnityEngine.Random.Range();

このような場合で、ランダムな値が中央の穴の位置だったとき、一番近い有効な場所に移動させるにはどうすればいいでしょうか。

わかりにくくてすみません

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

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

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

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

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

guest

回答2

0

XとZは「-地面オブジェクトの大きさの半分〜地面オブジェクトの大きさの半分」を取るので、
これをそのまま使うと以下のように求められます。

C#

1// 地面オブジェクトのサイズ 2Vector3 groundSize = transform.lossyScale; 3 4// xとzをランダムに求める 5float x = Random.Range ( groundSize.x * -1.0f, groundSize.x ) / 2.0f; 6float z = Random.Range ( groundSize.z * -1.0f, groundSize.z ) / 2.0f; 7 8// 目的地の座標にする 9Vector3 target = new Vector3 ( x, groundSize.y, z );

【追記分】
上記の方法で「穴の範囲」も求められます(穴の中央座標と幅が分かればいい)。
後は穴の端の座標の中央より、求めたXが大きいか小さいかを計算すればいいです。
(例えば穴の端のX値が-2と2なら、中間値は(Mathf.Abs(-2)+Mathf.Abs(2))/2.0f + -2
目的地座標のXがこれより小さければ-2、大きければ2にすればよい。Z値も同じ要領でいける)

但し穴が複数あるならnegitamaさんの回答のようにRay飛ばした方が早いかもしれません。

投稿2018/12/22 09:17

編集2018/12/23 04:50
sakura_hana

総合スコア11425

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

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

0

以下の手順ではいかがでしょうか。
(1) X座標とY座標をランダムで定める
(2) Y座標は、(1)のXZ座標の十分な高さから地面に垂直にRayを飛ばしてぶつかった位置とする

■ 参考記事
座標取得の考え方はこちらの記事の2つめ「任意の高さの異なる位置へワープする」と同じです。

【追記】
ステージ上に穴があって移動不可にしたい場合、下記(a)または(b)の方法でいけるのではないでしょうか。
(a) 上記(2)で取得したY座標が一定以上低い場合は再度(1)からやり直す
(b) 着地可能な地面のオブジェクトにレイヤーを設定しておき、上記(2)でRaycastする際にレイヤーマスクを指定する。Rayがヒットしなければ(1)からやり直す

投稿2018/12/22 08:52

編集2018/12/22 13:48
negitama

総合スコア943

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問