オリジナルゲーム作成中のUnityのメモ、その2
ある程度勉強したあとに、オリジナルゲームを作りながら調べるというのがUnityの近道のような気がします。
オブジェクトを滑らす
Sphereの場合、力を加えることで転がる。
CubeやCylinderの場合、同じようにしても滑らない。せいぜい倒れるだけ。
Assetsで作れるPhysic Materialを設定することでCubeなど平面で接するオブジェクトが滑るようになる。
Mesh ColliderでConvexにチェックを入れているオブジェクトを滑らすときなぜか少しカーブしてしまう。RigidbodyのConstraintsのFreeze Rotationを全てチェックすることでカーブしなくなる。
UpdateとFixedUpdateの違い
Update
FrameごとにUpdateが呼ばれる。
FixedUpdate
固定の時間ごとに呼ばれる。
物理演算の処理はここで行うのが普通。Rigidbody等を使うときはFixedUpdateを使う。
キー入力がある場合、まずUpdateで拾ってFixedUpdateのときにRigidbody等を使う。
bool action = false; void Update(){ if(Input.GetKeyDown(KeyCode.Space)){ action = true; } } void FixedUpdate(){ if(action){ action = false; // Rigidbody等の操作 } }
キーボードやマウスの入力がUpdateとFixedUpdateで異なる場合がある。
例えばマウスをクリックすると、UpdateではInput.GetMouseButtonDown(0)がTrueになって、FixedUpdateではInput.GetMouseButton(0)がTrueになる。
デバッグメッセージの表示
Debug.Log("hogehoge");
これでUnityのConsoleに反映される。
Raycastでタップしたものを動かす
if(Input.GetMouseButtonDown(0)){ Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit = new RaycastHit(); if (Physics.Raycast(ray, out hit)){ GameObject obj = hit.collider.gameObject; if (transform.gameObject == obj){ Move (); } } }
参考: 【Unity初心者向け】タップされたオブジェクトを取得する方法
Moveは自分で作る。GetMouseButtonDownがタップしたときもiOSとAndroidアプリで通常に機能するか確認する。
マウス(タップ)を押す/押し続ける/放す
Input.GetMouseButtonDown(1) 左クリックを押した
Input.GetMouseButtonDown(2) 右クリックを押した
Input.GetMouseButtonDown(3) 真ん中クリックを押した
Input.GetMouseButton(1) 左クリックを押し続けている
Input.GetMouseButton(2) 右クリックを押し続けている
Input.GetMouseButton(3) 真ん中クリックを押し続けている
Input.GetMouseButtonUp(1) 左クリックを放した
Input.GetMouseButtonUp(2) 右クリックを放した
Input.GetMouseButtonUp(3) 真ん中クリックを放した
3Dオブジェクトの回転と拡大
3Dオブジェクトを回転させるときはLookRotationを使う。
gameObject.transform.rotation = Quaternion.LookRotation(playerToMouse);
rotation.x = 90 みたいな感じではまともに回転しない。
playerToMouseはRaycastを使って回転させるオブジェクトとマウスの相対的な位置関係のVector3が入っている。上記の例ではtransform.rotationを直接変更しているので回転というよりも、表示を変えている感じになる。
Rigidbodyを設定しているオブジェクトの場合
playerRigidbody.MoveRotation(newRotation);
この場合、物理的に回転してくれる。
3Dオブジェクトの拡大はlocalScaleを使う。
gameObject.transform.localScale = new Vector3(x, y, z);
Vector3ではなく、new Vector3を使うのがポイント。
Time.deltaTimeの意味
Unityでよく見かけるのがTime.deltaTime。
UpdateやFixedUpdateの中で物を動かしたりするときにTime.deltaTimeをよく使う。
rigidbody.AddForce(movement * speed * Time.deltaTime)
movementは移動方向、speedは移動の速さ。
Time.deltaTimeは何をしているかというと、1秒間に加わる力をmovement * speedだけにしている。上記の例でTime.deltaTimeがない場合はUpdateやFixedUpdateが1秒間に数十回も呼ばれるので、1秒間でmovement * speed * 数十回の力が加わってしまう。
時間を止めるWaitForSeconds
WaitForSecondsを使うと任意の時間処理をとめることができる。
public void Start(){ StartCoroutine(WaitAndStart ()); } IEnumerator WaitAndStart (){ Debug.Log ("最初の表示"); yield return new WaitForSeconds(3f); Debug.Log ("3秒後に表示"); // 何かする }
コメントを残す