仮面 :ダァス!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
を使います。TeddyBear
をAssets/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の上の方の項目Layer
のAdd Layer
を選択すると、レイヤーウィンドウが表示されます。このUser Layer 8
あたりにBear
を作りましょう。そして、RunningBear
にBear
レイヤーを割り当てましょう。「 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を持っているオブジェクトだけを抽出して、それらを選択します。複数選択した状態でRigidbody
のIs Kinematic
のチェックをオンにします。こうすることでアニメーションに干渉することを防ぐというわけです。
あと車との衝突判定としてRunningBear
にCapsule 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 ;
Rigidbody [] ragdollRB = this . gameObject . GetComponentsInChildren < Rigidbody >();
foreach ( Rigidbody rb in ragdollRB ) {
rb . isKinematic = false ;
rb . AddForce ( vec * forceDegree , ForceMode . Impulse );
}
this . enabled = false ;
}
}
仮面 :おい
秋山 :はい?
仮面 :これは、どうなんだ?
秋山 :ヒドいことになってますね
仮面 :お前が派手にとか言うからだろ!
秋山 :まあヒドいことにならないように、気をつけましょうということで
仮面 :いいのか?それで...
秋山 :それより、もっとクマちゃん増やしましょうよ。
仮面 :それなら簡単だ。RunningBearをコピペすれば増殖できるぞ
秋山 :わ!簡単ですね!どんどん増やしましょう
仮面 :一応、交通安全ゲームなんだが...
完成したゲーム
以下のサイトで完成した交通安全ゲームが遊べます。
また、今回使ったプログラムは以下のサイトで閲覧ができますので、細かいところはこちらをご覧ください。
One More Thing:iTweenを使う
はい、それでは今回も最後にもう少しワンステップ上のお話もしましょう。最後にご紹介するのが「iTween」というAssetStoreアイテムです。これも無料なのですが、超役立ちAssetなので是非皆さんダウンロードして使ってみましょう。
どういうAssetかというと、動きをスムーズに動かすための便利スクリプトです。
例えば、オブジェクトをA地点(0,0,0)からB地点(10,20,30)まで行かせる際、距離を測って、その方向のベクトルを求め、速度を定めて、毎フレーム加算していき、到達したら止めます。こういった処理はそのまま書くと、少なくとも数行のスクリプトになり、冗長になってしまいます。さらに加速度運動や、最初遅く→中盤早く→最後遅くといったような複雑な動きであれば、とても面倒な処理になってしまいます。
前述の目的地への移動をiTweenであれば、以下のように1行で書けます。
void Start () {
iTween . MoveTo ( gameObject , new Vector3 ( 10 , 20 , 30 ), 10.0f );
}
では「最初遅く→中盤早く→最後遅く」の場合はどうなるでしょうか?
void Start () {
iTween . MoveTo ( gameObject , iTween . Hash ( "position" , new Vector3 ( 10 , 20 , 30 ), "easeType" , "easeInOutExpo" , "time" , 10.0f ));
}
第二引数がiTween.Hashになりましたね。これはiTweenで細かい動きを指定したい場合、使われるパラメータ群です。この中の引数の奇数番目がパラメータ名、偶数番目がその値、となっています。つまり上の例では、最初のパラメータ名が「position」で、値が「new Vector(10,20,30)」ということです。同様に"easeType"と"easeInOutExpo"、"time"と"10.0f"がペアになっています。ちょっとわかりにくいかもしれませんが、一行で書けてしまうのはありがたいことです。
以上のような機能のiTweenですが、何かオブジェクトをスムーズに動かしたいときに使ってみるといいのではないでしょうか?
まとめ:ゲームを作り始めるには
仮面 :さあ今回どうだった?
秋山 :あー、意外とゲームになるんだなーって思いましたね。
仮面 :そうだ。プログラムしている時間はあんまりなかっただろう。
秋山 :そうですね、私はプログラムするのはできないので、いじっているうちに何かできそうな気になりますね。
仮面 :私が声を大にして言いたいのは ( クワ!)最初は改造で学べ ということだ!
秋山 :か、顔怖いですよ
仮面 :イチから全て作るのは大変だ。だから最初は完成品、この場合でいったらレースゲームだな、これを改造していって自分のゲームしていったらいい。
秋山 :それでいいんですか?それって・・・・・・
仮面 :確かにパクリだ!
秋山 :えええ!
仮面 :パクリだが、初心者のパクリなんぞ稚拙すぎて、誰も気に留めない。だから初心者は存分にパクレい!初心者の特権だ!
秋山 :言いたい放題ですね。
仮面 :――つまりだな。ゲームを作りたいのだけど、何から始めたらいいかわからない人が多いと思う。
秋山 :まさに私ですね。
仮面 :それにはまず、完成品をいじってオリジナルにしていこうということだ。そちらの方がとりあえず取っ付きやすいだろう。
秋山 :はい、わかりました。
仮面 :じゃあ、これで今回はおしまいだ。
秋山 :なんか最終回みたいな終わり方ですね。
仮面 :お、終わるのか!?
秋山 :いや、まあ読者さん次第じゃないですか?
仮面 :ぐぬぬ
秋山 :では、さよーならー