Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

『Unity C# 個人用メモ』 オブジェクトをクリックした座標へ移動させる(ナビゲーション不使用

More than 1 year has passed since last update.

クリックした位置の座標を取得し移動させる

RayRaycastHitを使用してオブジェクトをクリックした座標へ移動させる
Rayをちゃんと理解してないから推測込み('ω')難しいのよね

前提として

プレイ画面(スクリーン座標)は2Dなのでそれをゲーム上の3D空間(ワールド座標)へ変換する必要がある

素材

public class NewBehaviourScript : MonoBehaviour
{
    //レイを使用するための宣言
    private Ray ray;

    //レイがヒットした情報を格納するために使う
    private RaycastHit hit;

    //移動先の座標格納用
    private Vector3 pos;

    //移動用
    private float step;

本文

    void Update()
    {
        //クリックされた時
        if (Input.GetMouseButtonDown(0))
        {
            //レイのスタート位置
            ray = Camera.main.ScreenPointToRay(Input.mousePosition);

            //レイキャスト(スタート位置,方向 情報,距離)
            if (Physics.Raycast(ray, out hit, Mathf.Infinity))
            {
                //座標posへhitを変換
                pos = hit.point;
                pos.y = 1f;
            }
            //移動用
            step = 10f * Time.deltaTime;
        }
        //オブジェクトの移動
        transform.position = Vector3.MoveTowards(transform.position, pos, step);
    }
}

ray

そもそもray(レイ)ってなんぞやっていう疑問
特定の位置からセンサーを飛ばすって意味と推測してるけど実際どうなんだろう?

ray = Camera.main.ScreenPointToRay(Input.mousePosition);

rayを飛ばすスタート地点を宣言

Camera.main.ScreenPointToRay()
プレイ画面上のどこから飛ばすかを設定する
今回はマウスがクリックされた時のマウスの位置を取得しなければならないので
スタート地点はInput.mousePositionとなる

Raycast

if (Physics.Raycast(ray, out hit, Mathf.Infinity))
///Physics.Raycast(スタート地点, レイと飛ばす方向 レイが当たったオブジェクトの情報を格納, レイを飛ばす距離)

Physics.Raycast()はRaycastHitを使う際の決まり文句

rayはレイを飛ばすスタート地点のこと

outはどの方向にレイを飛ばすかということ
・補足:今回はoutなのでカメラの目線からout(奥側)となる(決まり文句でいいのかなと思う)

hitはレイキャストで飛ばしたレイが接触したオブジェクトの情報の格納先のこと
・補足:今回は変数hitに座標とか名前とか色々な情報が格納される

Mathf.Infinityは飛ばすレイの最大距離のこと{最大射程とか言った方が分かりやすい?}
・補足1:レイの飛ばす距離はfloat型であり、100f等とすれば範囲を制限できる
     (途方もなく遠い場所にあるオブジェクトに反応しないようにするため)
・補足2:逆に別に範囲を制限しないのであればMathf.Infinityと書けば距離は無限大になる

その後

pos = hit.point;
pos.y = 1f;

Vector3 poshit.point(hitの場所つまり座標)を変換して格納する
なおy軸は動いてほしくないのでオブジェクトの初期の設定値を入れる

step = 10f * Time.deltaTime;

これは移動速度の値10fにTime.deltaTimeを与えることでマシンスペックに関係なく処理速度を一定にする

Vector3.MoveTowards()

transform.position = Vector3.MoveTowards(transform.position, pos, step);
///transform.position = Vector3.MoveTowards(対象, 移動先, 速度);

Vector3.MoveTowards()で対象を移動先まで移動させることが出来る
今回は本体クリックされた座標へ設定された速度で移動させる。となる

MilkCocoa_oishi-yone
自分用のメモとして理解できるような物を書いていきたいなお続くかはしらぬ('ω')自分で作ったものhttps://youtu.be/V-IuSIZfjmM
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away