Unity5学習の際の覚え書き。

Inputクラス

「ユーザーからの入力の管理」を行うために用意されているのが「Input」クラス。
インスタンスを作らない、静的プロパティ(フィールド)、静的メソッド。

キーボード入力と「GetKey」メソッド

3種類のメソッドが用意されている。

キーが押されているかチェックする

bool 変数 = Input.GetKey ( (KeyCode) );

(例)
=|PEAL|
if (Input.GetKey (KeyCode.Space)){
	スペースキーが押されている時の処理;
}

指定のキーが押されていればtrueを返す。
引数にはKeyCodeクラスのインスタンスを指定する。

キーが押されたことをチェックする

bool 変数 = Input.GetKeyDown ( (KeyCode) );

(例)
if (Input.GetKeyDown (KeyCode.Space)){
	スペースキーが押された時の処理;
}
指定のキーが押されたらtrueを返す。
引数にはKeyCodeクラスのインスタンスを指定する。
上との違いが難しいが、「キーを押したときに一度だけtrueが返される」もの。
これにより、「今、キーを押した」ということをチェックできる。

キーが離されたことをチェックする

bool 変数 = Input.GetKeyUp ( (KeyCode) );

(例)
if (Input.GetKeyUp (KeyCode.Space)){
	スペースキーが離された時の処理;
}
指定のキーが離されたらtrueを返す。
引数にはKeyCodeクラスのインスタンスを指定する。

GetKeyとGetKeyDown/GetKeyUpの違い

常にtrueを得られるか、一度だけか、の違い。
GetKeyは、キーを押していれば常にtrue。
GetKeyDownだと「押したかどうか」をチェックするものだから、一度しかtrueは得られない。

例えば「キーでキャラクターを操作する」場合、GetKeyならば押している間ずっと動き続けるが、GetKeyDownでは押した瞬間だけ動き、それ以後は止まったまま。

GetAxis

Input.GetAxis("Horizontal")
左右キーが押されているかを、左-1.0〜右1.0の値で取得する。

Input.GetAxis("Horizontal")
上下キーが押されているかを、下-1.0〜上1.0の値で取得する。

KeyCode

キーを示すのに使われるUnityクラス。
KeyCodeを参照。

Cubeを動かすスクリプト

public class myscript : MonoBehaviour {

	void Start () {
	}

	void Update () {
		if (Input.GetKey (KeyCode.UpArrow)) {
			transform.Translate (transform.forward * 0.1f);
		}
		if (Input.GetKey (KeyCode.DownArrow)) {
			transform.Translate (transform.forward * -0.1f);
		}
		if (Input.GetKey (KeyCode.RightArrow)) {
			transform.Translate (transform.right * 0.1f);
		}
		if (Input.GetKey (KeyCode.LeftArrow)) {
			transform.Translate (transform.right * -0.1f);
		}
	}
}

位置を示すVector3プロパティ

forward ... 前に1移動する
Right ... 右に1移動する
Up ... 上に1移動する

上記はインスタンスプロパティなので、インスタンスであるtransformを作って、そこから呼び出す必要がある。
ちなみに後ろ、左、下はないので、マイナスにする。

マウスボタンをチェックする

  • マウスボタンを押したかどうかのチェック
  • マウスポインタの位置の取得
  • マウスの位置がシーンの中でどの地点にあるのか調べる
  • マウスが特定のオブジェクトをタッチしているかどうかを調べる
などができる。

マウスボタンの状態チェック

bool 変数 = Input.GetMouseButton( 番号 );

(例)
if (Input.GetMouseButton (0)){
	左クリックされている時の処理;
}

0 ... 左ボタン
1 ... 右ボタン
2 ... 中央ボタン

マウスボタンが押されたときのチェック

bool 変数 = Input.GetMouseButtonDown( 番号 );

(例)
if (Input.GetMouseButtonDown (0)){
	左クリックされた時の処理;
}

マウスボタンがはなされたときのチェック

bool 変数 = Input.GetMouseButtonUp( 番号 );

(例)
if (Input.GetMouseButtonUp (0)){
	左クリックが離された時の処理;
}

マウスボタンを押しているときだけCubeが回転するスクリプト

public class myscript : MonoBehaviour {
	Vector3 vec;

	void Start () {
		vec = new Vector3 (0.1f, 0.1f, 0.1f);
	}

	void Update () {
		if (Input.GetMouseButton (0)) {
			transform.Rotate (vec);
		}
	}
}

マウスポインタの位置を示す「mousePosition」プロパティ

Inputクラスにある「mousePosition」プロパティを調べる。

Vector3 変数 = Input.mousePosition;

(例)
if (Input.GetMouseButtonDown (0)){
	Vector3 v = Input.mousePosition;
}

これでマウスポインタの位置を示すVector3インスタンスが得られる。

mousePositionの注意点

得られた値は、そのままシーンの位置としては扱えない。
なぜなら、シーンに配置されているオブジェクトは、シーンの絶対座標で、位置が設定されているため。
ゲーム画面の表示では、シーンに配置されたカメラを通してみた景色になっている。
ということは、例えば画面上にあるオブジェクトをクリックした場合、画面上のクリック位置と、シーンに配置されているオブジェクトが実際にある位置は同じ値ではない、ということ。
このため、マウスポインタの位置を実際のシーン上に反映させるには、得られた位置情報をシーンの絶対座標上の位置に変換する作業が必要となる。

ScreenToWorldPointによる座標変換

画面上の位置を、シーンの絶対座標に変換するには、カメラに用意されているメソッドを使用する。

Vector3 変数 = <Camera>.ScreenToWorldPoint ( float値 );

引数にz軸の値を指定する。
マウスは二次元なので、奥行きは引数で補う。

クリックした場所にCubeを移動させるスクリプト

public class myscript : MonoBehaviour {

	void Start () {
	}

	void Update () {
		if (Input.GetMouseButtonDown (0)) {
			Vector3 pos = Input.mousePosition;
			System.Random r = new System.Random ();
			float f = Random.value * 3;
			pos.z = f;
			Vector3 newpos = Camera.main.ScreenToWorldPoint (pos);
			transform.position = newpos;
		}
	}
}

特定のオブジェクトをクリックしたか調べる「Ray (光線)」

Rayは、「ある地点から、画面の奥へと無限に伸びる見えない直線」
クリックした位置を取得したら、画面上のその地点から無限大の奥(z方向)までレーザービームを発射し、ゲームオブジェクトを貫いているかどうか調べる。

画面の位置からRayを取得する

指定の位置から発射されるRayを作成する
Ray 変数 = <Camera>.ScreenPointToRay( <Vector3> );

引数には、位置を示すVector3インスタンスを指定する。
このVector3の位置は、画面上の位置を示す値(シーン上の絶対座標ではない)を用意すること。
Rayとオブジェクトの接触を調べる
bool 変数 = Physics.Raycast( (Ray) , out <RaycastHit> , 長さ );

Physics.Raycast
  • 第1引数 ... Rayが何かのゲームオブジェクトを貫通しているか調べるもの。接触していればtrue、何も触れていなければfalseが返される。
  • 第2引数 ... 「RaycastHit」という構造体の変数を指定する。outの意味は「この構造体の変数に値を書き出す」ということ。つまり、第2引数は、何かの値を指定するのではなく、「変数を指定すると、そこにRaycastHit構造体が書き出される」という不思議な働きをする。
  • 第3引数 ... どこまで調べるか。float値。100fとすれば、100の距離までの間に接触したものを調べる。
RaycastHit構造体とは
Rayに最初に接触しているゲームオブジェクトに関する情報をまとめたもの。

RaycastHitにある3つのプロパティ
  • "transform" ... 接触したゲームオブジェクトのtransform。これを操作すれば、接触したオブジェクトを動かせる。
  • "position" ... 接触した地点を示す。値はVector3インスタンスが入っている。
  • "collider.gameObject" ... 接触したゲームオブジェクトのインスタンス。

「上記のプロパティを操作すれば接触オブジェクトを動かせる」、ということを覚えておく。

クリックした場所に動いたり、オブジェクトをクリックするとオブジェクトサイズが変化するスクリプト

public class myscript : MonoBehaviour {
	Vector3 stdSize;
	Vector3 smlSize;
	RaycastHit hit;
	int counter = 0;
	bool flg = false;

	void Start () {
		stdSize = new Vector3 (1f, 1f, 1f);
		smlSize = new Vector3 (0.5f, 0.5f, 0.5f);
	}

	void Update () {
		if (flg) {
			if (counter <= 0) {
				hit.transform.localScale = stdSize;
				flg = false;
			} else {
				counter--;
			}
		}
		if (Input.GetMouseButtonDown (0)) {
			Vector3 pos = Input.mousePosition;
			pos.z = 3.0f;
			Ray ray = Camera.main.ScreenPointToRay (pos);
			if (!flg) {			//flgがfalseだった場合の処理
				if (Physics.Raycast (ray, out hit, 100)) {
					hit.transform.localScale = smlSize;
					counter = 100;
					flg = true;
				} else {
					Vector3 newpos = Camera.main.ScreenToWorldPoint (pos);
					transform.position = newpos;
				}
			}
		}
	}
}

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu

【メニュー編集】
Wiki記法ガイド

リンク

ゲームバー大阪心斎橋

ゲームバー大阪梅田

ゲームバー大阪心斎橋

ダーツ&ダイニングバー大阪梅田

メニュー

Unity


スマホ操作

Unity - GameObject

Unity - 3DCG

メンバーのみ編集できます