仮面:ダァス!
秋山:アキヤマでーす。今回もよろしくお願いします~
仮面:さて、
秋山:あー、
仮面:お前の評判じゃない!
秋山:あー、
仮面:ふー...そうか……ボチボチか……
はい、
今回は趣向を変えて、
無料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をコピペすれば増殖できるぞ
秋山:わ!
仮面:一応、
完成したゲーム
以下のサイトで完成した交通安全ゲームが遊べます。
また、
まとめ:ゲームを作り始めるには
仮面:さあ今回どうだった?
秋山:あー、
仮面:そうだ。プログラムしている時間はあんまりなかっただろう。
秋山:そうですね、
仮面:私が声を大にして言いたいのは (クワ!)
秋山:か、
仮面:イチから全て作るのは大変だ。だから最初は完成品、
秋山:それでいいんですか?
仮面:確かにパクリだ!
秋山:えええ!
仮面:パクリだが、
秋山:言いたい放題ですね。
仮面:――つまりだな。ゲームを作りたいのだけど、
秋山:まさに私ですね。
仮面:それにはまず、
秋山:はい、
仮面:じゃあ、
秋山:なんか最終回みたいな終わり方ですね。
仮面:お、
秋山:いや、
仮面:ぐぬぬ
秋山:では、
