Unity カーソルの座標を元にRayを生成する
■Topic
ダンガンロンパみたいにカーソルを動かしてオブジェクトを検出したい。
(マウスで検出するのではなく)
■方法
「カーソルが動かせる」+「カーソルの座標を元にRayを生成する」
この2つを順番に実装する必要がある。
どちらもやろうとすると頭がいっぱいになるので注意。
▼完成イメージ
①カーソルを画面に表示する
何はともあれ、カーソルが画面に出ていないことには話が始まらない。
いろいろと悩んだが、何がいいかわからなかったので
結局UIとして表示することにした。
Hierarchyで右クリック > UI > Image
と選択していき、CanvasやらEventSystemと一緒にImageを生成される。
(わかりやすくCursorと命名)
Imageに画像を設定することで、カーソルが表示されるようになる。
②カーソルを動かせるようにプログラムを作る
画像を置いただけではカーソルを操作できない。
コードでカーソルが動くようにしてやる必要がある。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class CursorController : MonoBehaviour
{
public float cursorSpeed = 0.1f;// Start is called before the first frame update
void Start()
{
}// Update is called once per frame
void Update()
{
// 左に移動
if (Input.GetKey(KeyCode.LeftArrow))
{
this.transform.Translate(-cursorSpeed, 0.0f, 0.0f);
}
// 右に移動
if (Input.GetKey(KeyCode.RightArrow))
{
this.transform.Translate(cursorSpeed, 0.0f, 0.0f);
}
// 上に移動
if (Input.GetKey(KeyCode.UpArrow))
{
this.transform.Translate(0.0f, cursorSpeed,0.0f);
}
// 下に移動
if (Input.GetKey(KeyCode.DownArrow))
{
this.transform.Translate(0.0f, -cursorSpeed,0.0f);
}
}
}
▼参考にしたページ
【Unity】キー入力入門!超簡単なInputクラスの使い方! | 侍エンジニア塾ブログ(Samurai Blog) - プログラミング入門者向けサイト
※本コードではX,Yの2次元で動くため、
X,Yにそれぞれ入力に応じた方向へSpeedで移動する。
終わったらCursorのInspectorに乗っけてアタッチ。
③カーソルの位置からRayを生成する
前回作ったRaycastにおいて、このカーソルの座標を読ませるようにしないといけない。
そのため、以下のようにコードを書き換える。
※変わったのは赤文字の行
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class RayCastTest : MonoBehaviour
{
public Camera camera_object; //カメラを取得//rayキャストが当たったものを取得する入れ物
public RaycastHit hit;//カーソルオブジェクト
public GameObject objCursor;void Update()
{
if (Input.GetKeyUp(KeyCode.Return))//Enterを押したら
{
//マウスのポジションでrayを生成
Ray ray = Camera.main.ScreenPointToRay(objCursor.transform.position);
Debug.Log(Input.mousePosition); //スクリーンに対するマウスのポジションif (Physics.Raycast(ray, out hit))
//マウスのポジションからRayを投げて何かに当たったらhitに入れる
{
string objectName = hit.collider.gameObject.name; //オブジェクト名を取得して変数に入れるDebug.Log(objectName); //オブジェクト名をコンソールに表示
switch (objectName)
{
case "Chr_01":
Debug.Log("なによ"); //オブジェクト名をコンソールに表示
break;
case "Chr_02":
Debug.Log("やあ"); //オブジェクト名をコンソールに表示
break;
default:
Debug.Log("何もないようだ"); //オブジェクト名をコンソールに表示
break;
}
}
}
}
}
単純なGetKeyだと押している間検出し続けてしまうので、
GetKeyUpで離した瞬間のみに修正。
入力はカーソルオブジェクトをpublicで紐づけして、
そこのVector3座標であるtransform.positionを取得して放り込む。
シンプルすぎて不安だったが、なんとかなった。
▼参考にしたサイト
というわけで実装完了。
悩んだ割に作るのはすぐである。