Unity(C#)初心者・入門者向けチュートリアル ひよこのたまご

AndroidやiOS向けアプリを簡単に作れるゲーム開発環境Unity(ユニティ)の使い方を、チュートリアル方式で一緒に学びましょう!

【Unity3】コインを落とす!Mathf.Sin, Time.time, MovePosition【コインプッシャー2】

Unity5.0.0f4 Personal(2015年4月)

f:id:hiyotama:20150505151000p:plain

 

前回の続きを書かさせて頂きます〜

 

今回は配置したプッシャーを動かして、コインを落とすところまで進めいたと思います〜

 

f:id:hiyotama:20150430131136p:plain

プッシャー(赤枠)を動かす

 

 

【目標】プッシャーを動かし、コインを画面下へ落とす!

 

まずはPusherに重力の影響を与えるため、RigidBodyコンポーネントを追加します〜

 

InspectorのAddComponentからPhysics>RigidBodyと進むとあります〜

 

f:id:hiyotama:20150430131412p:plain

RigidBodyコンポーネント追加完了

 

重力を追加しましたが今回は定位置でのゲームですので、重力に従って下へ落ちてもらっては困ります〜そこで、上画像のUseGravityのチェックを外して下さい〜こうすることで、Pusherを定位置に保つことができます〜

 

また、Is Kinematicのチェックを入れておいて下さい〜

 

IsKinematicにチェックが入っていないと、例えばプッシャーがコインに触れた時、プッシャーにも反動がきてしまい、位置情報がずれてしまうのです〜

 

IsKinematicにチェックが入っていれば、プッシャーはコインにぶつかっても、同じ位置で繰り返し動いてくれるようになります〜

 

重力を無効にするんじゃRigidBodyコンポーネントを追加した意味ないじゃないか!!!と思われるかもしれませんが、これからRigidBodyクラスのMovePositionメソッドを使うために必要なのです〜ひとまずソースを確認してみましょう!

 

 

MovePosition(Vector3)を使うと、指定した方向へオブジェクトを移動させることができます〜MovePositionの良いところは、他のオブジェクトの存在を判定しながら移動するためオブジェクトとオブジェクトが重なったりしない点です〜

 

ちなみに同じような処理にTransform.Translate(Vector3)という処理がありますが、こちらは指定した方向にワープするイメージであるため、オブジェクトとオブジェクトが重なってしまうことがあるので注意です〜

 

MovePositionを使う前に「GetComponent<RigidBody>().」という記述をしてRigidBodyクラスを使える状態にしております〜この記述はUnity4とUnity5とで違うのですが、詳しくは以前の記事に書かれておりますので、ご参照下さい〜 

 

 「GetComponent<Rigidbody>.」の記述はしたけれど、オブジェクトにRigidbodyコンポーネントが取り付けられていない場合エラーとなってしまいます〜そのため、UseGravityのチェックを外したRigidbodyコンポーネントをPusherに取り付けたというわけです〜

 

f:id:hiyotama:20150430084641p:plain

Rigidbodyが付いてないとこんなエラーが出てきます

 

それではソースの解説に戻ります〜FixedUpdateの中でMathf.Sin(Time.time)* 0.5fという記述がありますが、Mathf.Sinは-1から1の間で往復的に値を変化させる関数です〜これに0.5をかけているので、-0.5から0.5の間で往復的に値を変化させております〜

 

Time.timeはゲーム起動からの経過時間を表しております〜1秒単位の処理を行う時に使います〜

 

まとめると、AwakeでPusherの初期position(X:0, Y:0.4, Z:0.7)を取得して、ゲーム内で1秒→2秒→3秒→4秒→5秒、、、と時間が進むと、PusherのZ軸が0 → 0.5 → 0 → -0.5 →0 、、、という変化をなめらかに繰り返し、コインドーザーのプッシャーの動きを実現しているというわけです〜

 

【課題3】コインを量産化し、プッシャーの動きを確認

それでは前回作成しておいたCoinのPrefabでコインを更に量産化したいと思います〜

 

f:id:hiyotama:20150430132937p:plain

量産化し位置をまばらに

 

しまった!CoinにRigidbodyを付け忘れたまま量産化してしまいました〜!ご安心下さい、Prefabからオブジェクトを複製した場合、コピー元のPrefabの設定を変えればコピー先のオブジェクトの設定は全て連動して変わります〜

 

f:id:hiyotama:20150430132949p:plain

コピー元にRigidbodyをつけるだけでコピーした全てのコインに反映

 

また、僕の場合なのですが、コインに付いていたColliderがSphereColliderであったのでこれを削除し

 

f:id:hiyotama:20150430133257p:plain

右クリックからRemoveComponentで削除

 

代わりにMeshColliderを取り付けて下さい〜更に、Unity5からMeshColliderを使う場合はConvixにチェックを入れなければならないようなので、そのようにします〜

 

f:id:hiyotama:20150430133547p:plain

Convixにチェック

 

f:id:hiyotama:20150430133630p:plain

コインが

 

f:id:hiyotama:20150430133702p:plain

落ちて

 

f:id:hiyotama:20150430133750p:plain

プッシャーに押されます

 

これでプッシャーに押されてコインが落ちるようになりました〜

ひとまず今回はここまでです、ありがとうございました〜

 

【Unity開発3】下準備【コインプッシャー1/6】

【Unity開発3】プッシャーを動かしてコインを落としたい!【コインプッシャー2/6】

【Unity開発3】画面をクリックしてコインを出現させたい!【コインプッシャー:3/6】

【Unity開発3】前方にコインが落ちた時スコアアップしたい!【コインプッシャー4/6】

【Unity開発3】タイトル画面とゲームオーバー画面を作成する(前編)【コインプッシャー:5/6】

【Unity開発3】タイトル画面とゲームオーバー画面を作成する(後編)【コインプッシャー:6/6(Fin)】