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

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

ただいまの
回答率

90.85%

  • C#

    5961questions

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

  • Unity

    3197questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • Unity3D

    1056questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 241

cafelatte

score 3

 前提・実現したいこと

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

 試したこと

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    2018/06/01 15:38

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 2

+3

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


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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/28 17:27 編集

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

    キャンセル

  • 2018/05/01 11:41

    質問するときのヒントはお読みになりましたか?

    確かに「自分なりに考えた結果」がこの方法なのは分かります。
    ですがそこから先の質問内容について、充分な考慮と調査が行われたかどうか"この質問文からは"読み取ることが出来ませんでした。

    例えば「unity オブジェクト 真上にあるか」をGoogle検索するとRayCastを使った方法が出て来ます。
    よしんばこれがヒットしなかったとしても、通常の衝突判定ではどうなのか?という発想や調査は可能な筈です。
    現在のコード無し(今回はおおよそ想像が付くものではありますが)、どのように調査・実験したかの記録無しという点から、丸投げと判断させて頂き、質問の方法も含めて「自分で考える」ことを勧めた次第です。

    ちなみにうろ覚えではありますが、めり込み方によってはRayCastでも衝突判定でも検知出来なかったように思います(完全に埋まっている場合など)。
    なので確実に安全な方法を「もっと良いやり方」として提示した次第です。
    確かに思考の時間は質問主さんよりも短いとは思いますが、全くの無考慮による回答ではないことを補足させて頂きます。

    キャンセル

  • 2018/05/31 22:38 編集

    >質問するときのヒントはお読みになりましたか?
    はい。

    私が実現したかったことはオブジェクトを検知することではなく、敵のランダム移動です。
    ですから、オブジェクトを検知する方法があることを知らない私は、AIを組み込んで動かすという方法にたどり着きました。しかし、この方法は私には理解できませんでした。
    そこで、私は質問本文の仕組みを作り、埋まらないためにはどうすればよいか、ここで質問した次第です。

     そもそも、この質問の内容で私が書いたコードが欲しいですか?
    内容は質問の通りですし、エラーを吐いているわけでもありません。

    私はインターネットを使って調べるという点で、このサイトを利用したにすぎません。恐らくあなたにとってのこのサイト価値と、私にとってのの価値というものは違うのだと思います。
    ですから、わからないことを質問して答えを募る事を目的としてこのサイトを利用して質問しただけで全て丸投げと判断されるのは不服です。

    キャンセル

  • 2018/06/01 13:08

    回答及び前回のコメントと内容は同一ですが改めて記載します。

    私はあなたが書いたコードが欲しいのではなく、
    「思考・調査・実験したか、**質問文に充分に書かれていない為**、丸投げと判断した」
    「改善の為には前提条件の開示が必要になる」というのが論旨です。
    (本当の主題は「そもそも完全にランダムに移動するのではなく、事前に用意した移動先の中から選んでワープすれば絶対に安全なのでは?」という点です)

    teratailの方向性として「よりよい質問や回答ができるように正していくこと」が推奨されている為、そのような指摘を行ったまでであり、それ以外の意図は無いです。
    https://teratail.com/tour
    また、私の判断が絶対に合っているとも限らないので、それが不服と思うならば運営に通報するなり無視するなりして頂ければと思います。

    キャンセル

checkベストアンサー

+1

 考え方

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

 参考動画

参考動画はこちら

 参考コード

コードはこんな感じ。

using UnityEngine;


public class Respawn : MonoBehaviour
{
    //インスペクターから設定するパラメーター
    public float xMin, xMax, zMin, zMax;  // 地面の範囲
    public float offsetY;                 // Y座標のオフセット

    public float rayOriginY = 10f;        // Rayの起点のY座標
    public float rayMaxDistance = 11f;    // Rayの最大距離


    private void Update ()
    {
        // 左クリックで新しい位置へ移動する
        if ( Input.GetMouseButtonDown ( 0 ) )
        {
            MoveToNewPosition ();
        }
    }


    // 新しい位置へ移動する
    private void MoveToNewPosition ()
    {
        // X, Z 座標はランダムに決める
        var newX = Random.Range(xMin, xMax);
        var newZ = Random.Range(zMin, zMax);

        // Y座標は新しい X,Z 座標の上から下へ Ray を飛ばして、衝突した位置とする(オフセットを加える)
        var newY = 0f;
        Ray ray = new Ray(new Vector3(newX, rayOriginY, newZ), Vector3.down);
        RaycastHit hit;
        if ( Physics.Raycast ( ray, out hit, rayMaxDistance ) )
        {
            newY = hit.point.y + offsetY;
        }

        //新しい位置へ移動する
        transform.position = new Vector3 ( newX, newY, newZ );
    }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/28 17:27

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

    キャンセル

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

  • ただいまの回答率 90.85%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C#

    5961questions

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

  • Unity

    3197questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • Unity3D

    1056questions

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