クリックした位置の座標を取得し移動させる
Ray
とRaycastHit
を使用してオブジェクトをクリックした座標へ移動させる
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 pos
へhit.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()
で対象を移動先まで移動させることが出来る
今回は本体
をクリックされた座標
へ設定された速度
で移動させる。となる