Unityメモ3:IEnumerator、Macでシーン操作、当たり判定、GameObjectとTransform、オブジェクトの取得、LerpとSlerp、タッチした場所

オリジナルゲーム作成中のUnityのメモ、その3
頭の中のゲーム構想が少しずつ形になっていく。


IEnumeratorの使いどころ

重い処理をするときにIEnumeratorを使う。

IEnumeratorは非同期。
WaitForSecondsやLoop等をするときにIEnumeratorを使う場合が多い。

Macbookでのシーン操作

Macbookでシーンビューの操作はわずらわしい。

・回転 optionを押しながら指1本でタッチパッドを押し込んだまま動かす
・平行移動 optionとcommandを押しながら指1本でタッチパッドを押し込んだまま動かす
・ズーム タッチパッドを指2本でスライドする
MacBookのタッチパッドでシーンビューのカメラ操作

当たり判定とIs Trigger

Is Triggerにチェックを入れる場合、当たったとき素通りする。
void OnTriggerEnter(Collider other)
void OnTriggerStay(Collider other)
void OnTriggerExit(Collider other)

Is Triggerにチェックを入れない場合、当たったときはじける。
void OnCollisionEnter(Collision other)
void OnCollisionStay(Collision other)
void OnCollisionExit(Collision other)

Enterは接触した瞬間に1回だけ呼ばれる
Stayは接触している間、毎フレーム呼ばれる
Exitは接触から離れた瞬間に1回だけ呼ばれる

GameObjectとTransform

オブジェクトにスクリプトを追加して、そのスクリプトからオブジェクトのgameObjectとtransformをアクセスすることができる。

gameObject
・transformへアクセス
・スクリプトのpublicへアクセス
・オブジェクトの他のコンポーネントへアクセス

transform
・transformへアクセス

gameObjectの子供の1人がtransform
gameObject.transform

transformの親がgameObject
transform.gameObject

gameObject.transform.position
transform.position等など

オブジェクトの親オブジェクトを呼び出す方法
gameObject.transform.parent.gameObject

オブジェクトの取得

・オブジェクト名からオブジェクトを取得
GameObject.Find("オブジェクトの名前");
1つ取得、探すスピードは普通、数が増えると遅くなる

・タグ名からオブジェクトを取得
GameObject.FindWithTag("タグの名前");
GameObject.FindGameObjectWithTag("タグの名前");
GameObject.FindGameObjectsWithTag("タグの名前");
1つ/複数取得、探すの速い

・タイプ名からオブジェクトを取得
FindObjectOfType<タイプ名>() 
FindObjectsOfType<タイプ名>()
1つ/複数取得、探すの遅い

LerpとSlerp、位置と角度とスケール

LerpとSlerpは変化を緩やかにするのに使う。
Lerpは3次用で位置とスケールに使って、Slerpは4次用で角度に使う。
transform.position = Vector3.Lerp(from.position, to.position, Time.deltaTime * speed);
transform.localScale = Vector3.Lerp(from.localScale, to.localScale, Time.deltaTime * speed);
transform.rotation = Quaternion.Slerp(from.rotation, to.rotation, Time.deltaTime * speed)
上記はUpdate()やFixedUpdate()の中で記述する例。

適当なメソッド内でLerpやSlerpを使う場合は下記のようにする。
private IEnumerator hoge(Quaternion from, Quaternion to){
	float elapsedTime = 0.0f;
	float time = 1.0f;

	while (elapsedTime < time) {
		transform.rotation = Quaternion.Slerp(from.rotation, to.rotation, (elapsedTime / time ));

		elapsedTime += Time.deltaTime;
		yield return new WaitForEndOfFrame ();
	}
}
StartCoroutine(hoge())みたいな感じで呼び出してあげる。

Raycastでタッチしたところに移動/設置

3DだとRaycastがよく登場する。

画面をタッチしたりマウスをクリックした場所を見つける方法。
void Update(){
	if (Input.GetMouseButtonDown (0)) {
		Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
		RaycastHit hit = new RaycastHit ();
		if (Physics.Raycast (ray, out hit)) {
			Vector3 touchedPosition = new Vector3(hit.point.x, 2.83f,hit.point.z);

			//何かする
		}

	}
}

3Dオブジェクトを移動したり設置したりするのに使う。

コメントを残す

メールアドレスが公開されることはありません。