
仮面:ダァス!
秋山:アキヤマでーす。今回もよろしくお願いします~
仮面:さて、
秋山:あー、
仮面:お前の評判じゃない!
秋山:あー、
仮面:ふー...そうか……ボチボチか……
はい、
今回は趣向を変えて、
無料Assetでゲームを作ろう!
秋山:でですね!
仮面:てこ入れ早ッ!
秋山:内容をお金がかからない方法でできませんか?
仮面:無料Assetか……
秋山:そうです!
仮面:貴様自分がお金を払いたくないからではないか?
秋山:そ、
仮面:まあいい、
秋山:お願いしまーす!
Asset Storeには無料のAssetも置いてあります。そしてもちろん商用利用が可能です。その中から今回は
Assets/
シーンをダブルクリックすると、

レースゲームサンプル「Car Tutorial」
仮面:まず、
秋山:グランツーリスモとか、
仮面:そこは頭文字Dと言って欲しかったな……。チュートリアルなので、
秋山:へー、
仮面:そうだ。だからこれをダウンロードして、
秋山:まあとりあえず、
(プレイ中)
仮面:まあ……こんな感じだ。
秋山:あんまり面白くないですね。
仮面:うぉい!
秋山:レースゲームっていうから競走するものと思っていましたよ。
アニメーションシステムの例「Mecanim Example Scenes」
次に

「Mecanim」
秋山:これはUnityさんが作ったのですか?
仮面:そうだ。先ほどの
秋山:基本無料というとなんかアレですね。
仮面:アレではない!
秋山:やっぱりアレじゃないですか。
仮面:アレじゃない!
フォルダ分けでスッキリ
まずはこの二つのAssetを使って、
二つのAssetをAsset Storeから読み込むと、
そして、
どんなゲームを作る?
秋山:で、
仮面:相変わらず何も考えてないな……。
秋山:なるほど!
仮面:いやそれだとプレイ中、
秋山:じゃあ、
仮面:それ倫理的にどうなんだ?
秋山:はい!
Assets/
シーンを開いてみましょう。
このシーンの中のTeddyBear
を使います。TeddyBear
をAssets/
ドラッグアンドドロップRunningBear
にしましょう。
再びAssets/
シーンを開いて、Assets/
として保存しておきましょう。
クマを動き回らせるには
クマをAIで自由に動いてもらうために、Navigation
という機能を使います。Window→Navigation
を選択し、Navigation
ウィンドウを開きます。そして、Mesh Renderer
が含むオブジェクトはNavigation Static
をオンに、Road_
以下のオブジェクト以外は全てオフでいいでしょう。あとTerrain
もオフでいいでしょう。
そしてBake
ボタンを押して、

次にクマの動きを改造していきましょう。先ほどPrefabを作ったRunningBear
は既にAgent.
というスクリプトがついています。これを改造しましょう。まず名前をFollowAgent.
に変更、
次にいらない箇所は全てコメントしましょう。particle関連は全て必要ないのでコメントし、
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;
}
やっていることは、
そして次にクマにSphere Collider
コンポーネントを追加しましょう。RunningBear
を選択し、Component→Physics→Sphere Collider
を選択してください。そしてIs Trigger
フラグをオンに、Radius
は10にしましょう。

最後にクマ同士は反応しないようにしましょう。RunningBear
を選択し、Layer
のAdd Layer
を選択すると、User Layer 8
あたりにBear
を作りましょう。そして、RunningBear
にBear
レイヤーを割り当てましょう。


そしてEdit→Project Settings→Physics
を選択し、

それと、RunningBear
のInspectorでApply
を押すことで、

仮面:クマPrefabをたくさん配置すると……
秋山:わー、
仮面:そうだ……おい、
秋山:あ、
仮面:そうだな。まだそこの処理は作ってないからな。
秋山:当たったときは、
仮面:おまっ...なんかゲームの方向性変わってきてないか?
秋山:いやいや。あくまでも交通安全ゲームです!
車に当たったときの処理
当たったときのクマを表現するにはRagdoll
を使いましょう。これは人体モデルを重みがある人形のように見せる手法です。Unityでもそれを適応させる方法があります。GameObject→Create Other→Ragdoll...
を選択し、

それぞれの部位のColliderを多少調整し、

以上の操作でそれぞれの部位にColliderとRigidbodyが付加されます。そしてこのゲームでは当たった瞬間にRagdollをオンにする、Rigidbody
のIs Kinematic
のチェックをオンにします。こうすることでアニメーションに干渉することを防ぐというわけです。


あと車との衝突判定としてRunningBear
にCapsule Collider
を付加しましょう。RunningBear
を選択し、Component→Physics→Capsule Collider
を選択してください。Center Y、
これで準備は整いましたので、
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をコピペすれば増殖できるぞ
秋山:わ!
仮面:一応、
完成したゲーム
以下のサイトで完成した交通安全ゲームが遊べます。
また、
まとめ:ゲームを作り始めるには
仮面:さあ今回どうだった?
秋山:あー、
仮面:そうだ。プログラムしている時間はあんまりなかっただろう。
秋山:そうですね、
仮面:私が声を大にして言いたいのは (クワ!)
秋山:か、
仮面:イチから全て作るのは大変だ。だから最初は完成品、
秋山:それでいいんですか?
仮面:確かにパクリだ!
秋山:えええ!
仮面:パクリだが、
秋山:言いたい放題ですね。
仮面:――つまりだな。ゲームを作りたいのだけど、
秋山:まさに私ですね。
仮面:それにはまず、
秋山:はい、
仮面:じゃあ、
秋山:なんか最終回みたいな終わり方ですね。
仮面:お、
秋山:いや、
仮面:ぐぬぬ
秋山:では、