オリジナルゲーム作成中の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オブジェクトを移動したり設置したりするのに使う。
コメントを残す