Unity カーソルの座標を元にRayを生成する

■Topic

ダンガンロンパみたいにカーソルを動かしてオブジェクトを検出したい。

(マウスで検出するのではなく)

 

■方法

「カーソルが動かせる」+「カーソルの座標を元にRayを生成する」

この2つを順番に実装する必要がある。

どちらもやろうとすると頭がいっぱいになるので注意。

 

▼完成イメージ

f:id:happyherpy:20200916015503p:plain

 

①カーソルを画面に表示する

何はともあれ、カーソルが画面に出ていないことには話が始まらない。

いろいろと悩んだが、何がいいかわからなかったので

結局UIとして表示することにした。

 

Hierarchyで右クリック > UI > Image

と選択していき、CanvasやらEventSystemと一緒にImageを生成される。

(わかりやすくCursorと命名

Imageに画像を設定することで、カーソルが表示されるようになる。

 

f:id:happyherpy:20200916021809p:plain

 

②カーソルを動かせるようにプログラムを作る

画像を置いただけではカーソルを操作できない。

コードでカーソルが動くようにしてやる必要がある。

 

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に乗っけてアタッチ。

f:id:happyherpy:20200916023904p:plain

③カーソルの位置から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を取得して放り込む。

シンプルすぎて不安だったが、なんとかなった。

▼参考にしたサイト

UnityのInputで入力を扱う - Qiita

 

f:id:happyherpy:20200916023401p:plain

 

というわけで実装完了。

悩んだ割に作るのはすぐである。