Unity仮面が教える! ラクしてゲームを作るためのAssetStore超活用術

Track.2 クマの交通安全ゲームを作ろう!「Car Tutorial」「Mecanim Example Scenes」「iTween」

画像

仮面:ダァス!Unity仮面だ!

秋山:アキヤマでーす。今回もよろしくお願いします~

仮面:さて、アキヤマよ。ぶっちゃけどうなんだ?その……評判は……

秋山:あー、この髪型にしてからたまに声かけられるようになりましたね

仮面:お前の評判じゃない!この連載の方だ!

秋山:あー、まあ、ぼちぼちじゃないですか?

仮面:ふー...そうか……ボチボチか……(遠い目)

はい、第二回始まりました「ラクしてゲームを作るためのAssetStore超活用術」です。Unityエバンジェリストの伊藤です。前回は前半でUnityの説明し、後半Playmakerの紹介をしました。Unityの基本的な使い方を知りたい場合はまずはそちらを見てみてくださいね。

今回は趣向を変えて、Assetを活用しつつ実際にゲームを作っていこうかと思います。

無料Assetでゲームを作ろう!

秋山:でですね!これじゃいけないということで、てこ入れしましょう。

仮面:てこ入れ早ッ!

秋山:内容をお金がかからない方法でできませんか?

仮面:無料Assetか……

秋山:そうです!無料なら懐が痛まないで済みますし、とりあえず使ってみようか、って思うんじゃないでしょうか?

仮面:貴様自分がお金を払いたくないからではないか?

秋山:そ、そんなわけないじゃないですかー

仮面:まあいい、わかった今回はいろんな無料Assetを使ってみよう

秋山:お願いしまーす!

Asset Storeには無料のAssetも置いてあります。そしてもちろん商用利用が可能です。その中から今回は「Car Tutorial」⁠Mecanim Example Scenes」⁠iTween」を紹介します。 まずは「Car Tutorial」ですね。

Assets/CarTutorial/CompleteSceneシーンをダブルクリックすると、完成レースゲームのシーンが開くことができます。

画像

レースゲームサンプル「Car Tutorial」

仮面:まず、最初に紹介する「Car Tutorial」だが、これはレースゲームのチュートリアルだ。

秋山:グランツーリスモとか、そういうたぐいのゲームですね。

仮面:そこは頭文字Dと言って欲しかったな……。チュートリアルなので、これ一つで完成したゲームになっている。

秋山:へー、ゲーム自体もAsset Store内にあるんですね。

仮面:そうだ。だからこれをダウンロードして、中身がどうなっているかを調べてみれば、勉強になるということだ。

秋山:まあとりあえず、ゲームしてみましょう、ゲーム。

(プレイ中)

仮面:まあ……こんな感じだ。

秋山:あんまり面白くないですね。

仮面:うぉい!ハッキリ言うな!

秋山:レースゲームっていうから競走するものと思っていましたよ。

アニメーションシステムの例「Mecanim Example Scenes」

次に「Mecanim Example Scenes」です。これはUnityのアニメーション機能「Mecanim」を紹介するサンプル集です。

画像

「Mecanim」はその機能だけでもかなり大きい仕組みなので、ここでは「Unityで簡単にアニメーションを作ることを実現する機能」として紹介します。

秋山:これはUnityさんが作ったのですか?

仮面:そうだ。先ほどの「Car Tutorial」もそうだが、Unity Technologies社が提供しているAssetは基本無料だ。

秋山:基本無料というとなんかアレですね。

仮面:アレではない!たまに有料のAssetもあるということだ。

秋山:やっぱりアレじゃないですか。

仮面:アレじゃない!というかアレってなんだー!

フォルダ分けでスッキリ

まずはこの二つのAssetを使って、ゲームを簡単に作ってみましょう。

二つのAssetをAsset Storeから読み込むと、それぞれのフォルダが入り交じってしまいます。そこでまず「Car Tutorial」をDownloadし、Importしたのち、⁠CarTutorial」というフォルダを作りましょう。そして全てのフォルダをその「CarTutorial」以下に入れてしまいましょう。同様に「Mecanim Example Scenes」「MecanimSample」というフォルダを作ってその中に全て入れます。これでそれぞれの置き場所がわかりやすくなりました。

そして、これから作るゲームのフォルダ「MyGame」も作っておきましょう。これはあなた専用のフォルダですので、自由に使うことができます。

どんなゲームを作る?

秋山:で、どんなゲーム作りましょうか。

仮面:相変わらず何も考えてないな……。⁠Mecanim Example Scenes」にはクマが動き回るサンプルがあるからそれを使うとしようか。

秋山:なるほど!クマちゃんが運転するわけですね?

仮面:いやそれだとプレイ中、クマ見えんだろ……。

秋山:じゃあ、クマが動き回って、それを避けるっていうのはどうでしょう?当たったらゴメンナサイということで。

仮面:それ倫理的にどうなんだ?まあ交通安全シミュレーションゲームということでいくか。

秋山:はい!あくまでも、当てない!ということで。

Assets/MecanimSample/Nav Mesh Exampleシーンを開いてみましょう。

このシーンの中のTeddyBearを使います。TeddyBearAssets/MyGameドラッグアンドドロップ(以下D&D)して、Prefab化してください。名前もRunningBearにしましょう。

再びAssets/CarTutorial/CompleteSceneシーンを開いて、シーンもAssets/MyGame/TrafficSafetyとして保存しておきましょう。

クマを動き回らせるには

クマをAIで自由に動いてもらうために、Navigationという機能を使います。⁠探索パスを作るNavMeshという機能はUnityPro専用でしたが、Unity4.2よりProの限定がなくなりました!)メニューからWindow→Navigationを選択し、Navigationウィンドウを開きます。そして、動き回らせたいMesh Rendererが含むオブジェクトはNavigation Staticをオンに、関係ないオブジェクトはオフにしましょう。このゲームでは、Road_Assembly/Road以下のオブジェクト以外は全てオフでいいでしょう。あとTerrainもオフでいいでしょう。

そしてBakeボタンを押して、ナビゲーション情報を生成します。こうすることで、AIが探索する道筋の計算するための必要な情報が、事前に作られるわけです。

画像

次にクマの動きを改造していきましょう。先ほどPrefabを作ったRunningBearは既にAgent.csというスクリプトがついています。これを改造しましょう。まず名前をFollowAgent.csに変更、行頭のクラス名も同様にFollowAgentに変更しましょう。

次にいらない箇所は全てコメントしましょう。particle関連は全て必要ないのでコメントし、SetDestination関数は全て削除していいでしょう。そして以下の関数を加えます。

  void OnTriggerStay(Collider other) 
  {
    if ( this.enabled == false ) return;
    Vector3 dir = this.transform.position - other.transform.position;
    Vector3 pos = this.transform.position + dir * 0.5f;
    agent.destination = pos;
  }

やっていることは、Colliderトリガー判定がきたら(つまりプレイヤーの車が近づいたら⁠⁠、対象物(つまりプレイヤーの車)と反対側の方に目標点にする、ということです。

そして次にクマにSphere Colliderコンポーネントを追加しましょう。RunningBearを選択し、メニューからComponent→Physics→Sphere Colliderを選択してください。そしてIs Triggerフラグをオンに、Radiusは10にしましょう。

画像

最後にクマ同士は反応しないようにしましょう。RunningBearを選択し、Inspectorの上の方の項目LayerAdd Layerを選択すると、レイヤーウィンドウが表示されます。このUser Layer 8あたりにBearを作りましょう。そして、RunningBearBearレイヤーを割り当てましょう。⁠Do you want to set layer to Bear for all child objects as well?」と聞かれますが、⁠Yes, change children」を選択し、全ての子供にも適応させましょう。

画像
画像

そしてEdit→Project Settings→Physicsを選択し、BearとBearの組み合わせのみをオフにしておきましょう。

画像

それと、RunningBearのInspectorでApplyを押すことで、大元のPrefabに反映することを忘れないでください。

画像

仮面:クマPrefabをたくさん配置すると……

秋山:わー、クマちゃん逃げますねー

仮面:そうだ……おい、当てるなよ……

秋山:あ、当たっても何も起きませんね。

仮面:そうだな。まだそこの処理は作ってないからな。

秋山:当たったときは、ちょっと派手にドーンとした方が良いですね。

仮面:おまっ...なんかゲームの方向性変わってきてないか?

秋山:いやいや。あくまでも交通安全ゲームです!

車に当たったときの処理

当たったときのクマを表現するにはRagdollを使いましょう。これは人体モデルを重みがある人形のように見せる手法です。Unityでもそれを適応させる方法があります。GameObject→Create Other→Ragdoll...を選択し、Ragdollウィザードを表示させます。ここでどの部位をどのボーンオブジェクトに割り当てるかを設定します。画像はBearでの設定例です。

画像

それぞれの部位のColliderを多少調整し、画像のようなColliderになります。

画像

以上の操作でそれぞれの部位にColliderとRigidbodyが付加されます。そしてこのゲームでは当たった瞬間にRagdollをオンにする、ということを行うので、スタートの瞬間はオフにしておきましょう。Hierarchyビューで検索欄に「t:Rigidbody」と入力してRigidbodを持っているオブジェクトだけを抽出して、それらを選択します。複数選択した状態でRigidbodyIs Kinematicのチェックをオンにします。こうすることでアニメーションに干渉することを防ぐというわけです。

画像
画像

あと車との衝突判定としてRunningBearCapsule Colliderを付加しましょう。RunningBearを選択し、メニューからComponent→Physics→Capsule Colliderを選択してください。Center Y、Radius、Heightをそれぞれ、0.6、0.3、1.2ぐらいにセットしましょう。

これで準備は整いましたので、あとはスクリプトでぶつかった際の処理をします。

ChangeRagdoll.cs
using UnityEngine;
using System.Collections;

public class ChangeRagdoll : MonoBehaviour {

  // ぶつかった際の力の度合い
  public float forceDegree = 1.0f;

  // 当たった際の判定がここに来ます
  void OnCollisionEnter(Collision collision) 
  {
    // ぐったりクマにするために各種コンポーネントのオフ
    GetComponent<Animator>().enabled = false;
    GetComponent<NavMeshAgent>().enabled = false;
    GetComponent<FollowAgent>().enabled = false;
    GetComponent<CapsuleCollider>().enabled = false;
    GetComponent<SphereCollider>().enabled = false;
    
    // 衝突の力を計算。ちょっと上方に飛ばす処理
    Vector3 vec = collision.impactForceSum;
    float mag = vec.magnitude;
    vec.Normalize();
    vec.y += 0.5f;
    vec.Normalize();
    vec *= mag;
    
    // Kinematicをオンにして、力を加える
    Rigidbody [] ragdollRB = this.gameObject.GetComponentsInChildren<Rigidbody>();
    foreach( Rigidbody rb in ragdollRB ) {
      rb.isKinematic = false;
      rb.AddForce( vec * forceDegree, ForceMode.Impulse );
    }

    // この判定も以後は使わないので、オフに
    this.enabled = false;
  }
}
画像

仮面:おい

秋山:はい?

仮面:これは、どうなんだ?

秋山:ヒドいことになってますね

仮面:お前が派手にとか言うからだろ!

秋山:まあヒドいことにならないように、気をつけましょうということで

仮面:いいのか?それで...

秋山:それより、もっとクマちゃん増やしましょうよ。

仮面:それなら簡単だ。RunningBearをコピペすれば増殖できるぞ

秋山:わ!簡単ですね!どんどん増やしましょう

仮面:一応、交通安全ゲームなんだが...

完成したゲーム

以下のサイトで完成した交通安全ゲームが遊べます。

また、今回使ったプログラムは以下のサイトで閲覧ができますので、細かいところはこちらをご覧ください。

まとめ:ゲームを作り始めるには

仮面:さあ今回どうだった?

秋山:あー、意外とゲームになるんだなーって思いましたね。

仮面:そうだ。プログラムしている時間はあんまりなかっただろう。

秋山:そうですね、私はプログラムするのはできないので、いじっているうちに何かできそうな気になりますね。

仮面:私が声を大にして言いたいのは ⁠クワ!)最初は改造で学べということだ!

秋山:か、顔怖いですよ

仮面:イチから全て作るのは大変だ。だから最初は完成品、この場合でいったらレースゲームだな、これを改造していって自分のゲームしていったらいい。

秋山:それでいいんですか?それって・・・・・・

仮面:確かにパクリだ!

秋山:えええ!

仮面:パクリだが、初心者のパクリなんぞ稚拙すぎて、誰も気に留めない。だから初心者は存分にパクレい!初心者の特権だ!

秋山:言いたい放題ですね。

仮面:――つまりだな。ゲームを作りたいのだけど、何から始めたらいいかわからない人が多いと思う。

秋山:まさに私ですね。

仮面:それにはまず、完成品をいじってオリジナルにしていこうということだ。そちらの方がとりあえず取っ付きやすいだろう。

秋山:はい、わかりました。

仮面:じゃあ、これで今回はおしまいだ。

秋山:なんか最終回みたいな終わり方ですね。

仮面:お、終わるのか!?

秋山:いや、まあ読者さん次第じゃないですか?

仮面:ぐぬぬ

秋山:では、さよーならー

おすすめ記事

記事・ニュース一覧