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

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

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

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

Unity3D

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

Unity

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

Q&A

解決済

2回答

1608閲覧

上にあるオブジェクトを認識したい

cafelatte

総合スコア11

C#

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

Unity3D

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

Unity

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

1グッド

1クリップ

投稿2018/04/23 13:23

前提・実現したいこと

敵キャラクターをランダムに動かしたい。

試したこと

キャラクターがSphereオブジェクト(ターゲット)を追いかけるようにして、キャラクターがターゲットに触れた瞬間ターゲットがランダムにワープするという仕組みで動かしてみました。
ですが、この方法ですと建物の中にターゲットが埋まってしまったり、Y座標が変化しないため坂にめり込むなどの問題があります。
そこで、ターゲットの真上にコライダーを含むオブジェクトがある場合にそのY座標を取得してそのY座標にターゲットを移動させれば良いと考えました。
もしそのような仕組みを実現する方法があれば教えて欲しいです。また、もっと良いやり方がありましたら是非初心者でもわかりやすく教えて頂きたいです。
よろしくお願い致します。

kotochi_Zmaba👍を押しています

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

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

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

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

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

guest

回答2

0

https://teratail.com/help/question-tips
まずはこちらをご確認ください。


ワープ先の安全性を確保するだけなら
「ワープ先の候補として"問題無い場所"を事前に複数用意しておき、その中からランダムに1つを選択してワープ」
が一番安定するのではないかと思います。
(「unity 配列 ランダム」等で選択するとやり方は出るかと)

ただこれも要件によって可不可があるでしょう。
「もっと良いやり方」を求めるにはそれなりの前提情報が必要になります。
初心者だからこそ回答や解説をすぐ求めるのではなく、自分で考える姿勢を身に付けた方が良いかと思います。

投稿2018/04/23 13:56

sakura_hana

総合スコア11427

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

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

cafelatte

2018/04/28 08:27 編集

よく質問はお読みになられましたか? >初心者だからこそ回答や解説をすぐ求めるのではなく、自分で考える姿勢を身に付けた方が良いかと思います。 これは、自分で考える姿勢を身につけられていないという皮肉でしょうか? 自分なりに考えた結果がこの仕組みなのですが、そう思われてしまうのは残念です。 こういった回答がつかないように、自分なりに考えたつもりです。それでも、こういった回答がついてしまったこと、ただただ悲しいと感じました。
sakura_hana

2018/05/01 02:41

質問するときのヒントはお読みになりましたか? 確かに「自分なりに考えた結果」がこの方法なのは分かります。 ですがそこから先の質問内容について、充分な考慮と調査が行われたかどうか"この質問文からは"読み取ることが出来ませんでした。 例えば「unity オブジェクト 真上にあるか」をGoogle検索するとRayCastを使った方法が出て来ます。 よしんばこれがヒットしなかったとしても、通常の衝突判定ではどうなのか?という発想や調査は可能な筈です。 現在のコード無し(今回はおおよそ想像が付くものではありますが)、どのように調査・実験したかの記録無しという点から、丸投げと判断させて頂き、質問の方法も含めて「自分で考える」ことを勧めた次第です。 ちなみにうろ覚えではありますが、めり込み方によってはRayCastでも衝突判定でも検知出来なかったように思います(完全に埋まっている場合など)。 なので確実に安全な方法を「もっと良いやり方」として提示した次第です。 確かに思考の時間は質問主さんよりも短いとは思いますが、全くの無考慮による回答ではないことを補足させて頂きます。
cafelatte

2018/05/31 13:38 編集

>質問するときのヒントはお読みになりましたか? はい。 私が実現したかったことはオブジェクトを検知することではなく、敵のランダム移動です。 ですから、オブジェクトを検知する方法があることを知らない私は、AIを組み込んで動かすという方法にたどり着きました。しかし、この方法は私には理解できませんでした。 そこで、私は質問本文の仕組みを作り、埋まらないためにはどうすればよいか、ここで質問した次第です。  そもそも、この質問の内容で私が書いたコードが欲しいですか? 内容は質問の通りですし、エラーを吐いているわけでもありません。 私はインターネットを使って調べるという点で、このサイトを利用したにすぎません。恐らくあなたにとってのこのサイト価値と、私にとってのの価値というものは違うのだと思います。 ですから、わからないことを質問して答えを募る事を目的としてこのサイトを利用して質問しただけで全て丸投げと判断されるのは不服です。
sakura_hana

2018/06/01 04:08

回答及び前回のコメントと内容は同一ですが改めて記載します。 私はあなたが書いたコードが欲しいのではなく、 「思考・調査・実験したか、**質問文に充分に書かれていない為**、丸投げと判断した」 「改善の為には前提条件の開示が必要になる」というのが論旨です。 (本当の主題は「そもそも完全にランダムに移動するのではなく、事前に用意した移動先の中から選んでワープすれば絶対に安全なのでは?」という点です) teratailの方向性として「よりよい質問や回答ができるように正していくこと」が推奨されている為、そのような指摘を行ったまでであり、それ以外の意図は無いです。 https://teratail.com/tour また、私の判断が絶対に合っているとも限らないので、それが不服と思うならば運営に通報するなり無視するなりして頂ければと思います。
guest

0

ベストアンサー

考え方

・ワープ先のX,Z座標を決める
・そのX,Z座標で、Y座標の十分上の位置から真下に向けてRayを飛ばす
・Rayがぶつかった位置が地面の高さだと分かるので、その値をもとに新しいY座標の位置を決める

参考動画

参考動画はこちら

参考コード

コードはこんな感じ。

C#

1using UnityEngine; 2 3 4public class Respawn : MonoBehaviour 5{ 6 //インスペクターから設定するパラメーター 7 public float xMin, xMax, zMin, zMax; // 地面の範囲 8 public float offsetY; // Y座標のオフセット 9 10 public float rayOriginY = 10f; // Rayの起点のY座標 11 public float rayMaxDistance = 11f; // Rayの最大距離 12 13 14 private void Update () 15 { 16 // 左クリックで新しい位置へ移動する 17 if ( Input.GetMouseButtonDown ( 0 ) ) 18 { 19 MoveToNewPosition (); 20 } 21 } 22 23 24 // 新しい位置へ移動する 25 private void MoveToNewPosition () 26 { 27 // X, Z 座標はランダムに決める 28 var newX = Random.Range(xMin, xMax); 29 var newZ = Random.Range(zMin, zMax); 30 31 // Y座標は新しい X,Z 座標の上から下へ Ray を飛ばして、衝突した位置とする(オフセットを加える) 32 var newY = 0f; 33 Ray ray = new Ray(new Vector3(newX, rayOriginY, newZ), Vector3.down); 34 RaycastHit hit; 35 if ( Physics.Raycast ( ray, out hit, rayMaxDistance ) ) 36 { 37 newY = hit.point.y + offsetY; 38 } 39 40 //新しい位置へ移動する 41 transform.position = new Vector3 ( newX, newY, newZ ); 42 } 43}

投稿2018/04/27 03:19

編集2018/04/27 13:04
negitama

総合スコア943

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

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

cafelatte

2018/04/28 08:27

参考動画まで作って下さり、ありがとうございます。 コードを吟味して理解を深めようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問