Unityメモ2:滑らす、UpdateとFixedUpdate、デバッグ、Raycast、マウス(タップ)アクション、回転と拡大、Time.deltaTime、WaitForSeconds

オリジナルゲーム作成中の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等の操作
   }
}
参考: FixedUpdateについて考える

キーボードやマウスの入力が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秒後に表示");
	// 何かする
}

コメントを残す

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