とあるプログラマの備忘録

都内某所に住むプログラマが自分用に備忘録を残すという趣旨のブログです。はてなダイアリーから移動しました!

【Unity入門】FPSのゾンビゲー見たいなのを作ってみたい(願望) 第二回「キャラ動かしてみようぜ」

前回はマップ作りましたが、まだFPSにはほど遠いのでとりあえず自分である
キャラクター置きたいと思います。
できれば銃を撃つ所まで行きたいのですがスクリプトも絡むのでどうなる事やら。。

何度も言いますが、ここはUnity初心者が七転八倒しながらUnityを勉強するときの備忘録になります。

1.とりあえずキャラ置こうぜ
新しいプロジェクトを作ったときにCharacter Controllerのパッケージをインポートしておいたので、
Assets > Standard Assets > Character Controllersの中の
「First Person Controller.prefab」をマップ上に置いてみます。

そうするとこんな感じなるので、

Hierarchyの名前が「First Person Controller」になっているのでこれを「Player」に変えておきます。
この状態で一旦シュミレートしてみましょう。
どうでしょう?
WASDで移動して、スペースでジャンプできると思います。
マウスを動かせば視点変更。

いつもやっているFPSの操作ができると思います。
(こんな山と草原のマップなんてあり得ねーですがねwww)

カメラ的に走っている感とかはありませんが、First Person Controller.prefabをマップに置くだけでここまでシュミレートしてくれるなんて
これがUnityゲームエンジンの実力が…

2.あれ?銃なくね?
銃無くしてFPSとは言えないのでUnityのAssets Storeから銃の3Dモデルを拾ってきます。
本当はM4とかAKとか欲しかったんだけど、有料なので今回はこれ。
無料の銃のモデルを公開してくれてるのでこれを使わせてもらいます。

これをインポートします。

3.銃を持ってる様な位置にセットしよう
インポートしたら
Assets > CunstomizableGun_FreeED > Prefab
の使いたい銃をキャラクタープレハブのカメラの位置に会わせて設置しましょう。
InspectorのScaleが100だと大きすぎるので、50程度に調整しました

何度かシュミレートして銃の位置を微調整するとおもいます。

いい位置がにセットできたら、銃のプレハブをPlayerにドラッグ&ドロップします。
これでプレイヤーと銃は一緒くたの存在になるんだと思います。

この状態で趣味レートするとどうでしょう?プレイヤーの視点から消えずに一緒にはしっていませんかね?
なんか円柱見たいなものから銃が生えてる端から見るとかなり滑稽な姿ですがwとりあえずこれでいいとしましょうww

名前がAssault Rifle Low Freeとか長いので「Gun」に変更しておきます。

4.この銃、弾出ないじゃん
はい、まだただのハリボテなので弾でないです。
では弾の元素材作りたいと思います。

Hierarchy > create > Sphereを選択して球体を出します。名前を「bullet」に変更
銃弾としては大きすぎるので
InspectorのScaleを0.2程度にしてみます。(これでもでかいけど、小さすぎると見えないので一旦これで)

そしたら銃弾をプレハブ化します。
Project > create > Prefabを選択して名前を「BulletPrefab」にします、
そしたらさっき作ったHierarchy > bulletをBulletPrefabドラッグ&ドロップします。
白色だとわかりづらいのでProject > create > Materialをだして赤色にします。
(プレハブ化、マテリアルで色づけができない人はググるとすぐでてきますよb)
こんな感じになります。

最後に銃弾プレハブに物理マテリアルを追加します。
inspector > Add Conponent > Physics > Rigidbodyを選択

これで一応プレイヤーと銃を画面にセットできました。

関連記事リンク
【Unity入門】FPSのゾンビゲー見たいなのを作ってみたい(願望) 第一回「マップ作ろうぜ!」
【Unity入門】FPSのゾンビゲー見たいなのを作ってみたい(願望) 第二回「キャラ動かしてみようぜ」
【Unity入門】FPSのゾンビゲー見たいなのを作ってみたい(願望) 第三回「銃弾が撃てるスクリプトが書きたい」
【Unity入門】FPSのゾンビゲー見たいなのを作ってみたい(願望) 第四回「敵に動きを入れたい」

【Unity入門】FPSのゾンビゲー見たいなのを作ってみたい(願望) 第三回「銃弾が撃てるスクリプトが書きたい」

前回からの続きで今回は設置した銃から銃弾を撃つようにしたいということでやっとスクリプト書きます。
前回までのぜ!口調にそろそろ年齢的な限界を感じた為、今回から適当にキャラで行きます(´・ω・`)

1.とりあえず弾が出るようしたい
やっとこさ銃を撃つというスクリプト書けるようになりました。
Project > create > JavaScriptでアセットに空のJSファイルを出します。
これを以下の様に編集してGun Shot.jsとして保存します。

#pragma strict
var BulletPrefab: GameObject;

function Start () {

}

function Update () {
	if( Input.GetButton("Fire1")) {
		var muzzle = transform.Find('Lo_Muzzle');
		var bul : GameObject = Instantiate(BulletPrefab,muzzle.position,muzzle.rotation);
		var direction = (muzzle.position - transform.position).normalized;
		bul.rigidbody.velocity = direction * 50;
	}
}

えー私も完全に把握してませんが、何となく解説

#pragma strict
//ここで銃弾プレハブを入れる変数を作っておく
var BulletPrefab: GameObject;

function Start () {

}

function Update () {
    //もしもクリックボタンが押されたら。GetButtonだと押され続けている限りずっと弾がでます。
	if( Input.GetButton("Fire1")) {
                //銃の発射口のオブジェクトを変数に入れる
		var muzzle = transform.Find('Lo_Muzzle');
                //銃の発射口に弾丸オブジェクトをインスタンス化
		var bul : GameObject = Instantiate(BulletPrefab,muzzle.position,muzzle.rotation);
                //銃の発射口から銃のポジションを引いて飛ばす方向を作る
		var direction = (muzzle.position - transform.position).normalized;
		bul.rigidbody.velocity = direction * 50;
	}
}

このJsファイルをHierarchy > Playerにドラッグ&ドロップします。
そしたらPlayerのInspectorにGun Shot.jsが入ってると思うので、Bullet Purefab None(Game Object)となっている所の○をクリックして
さっき作った弾丸プレハブをセットします。

正直Unity Scriptをやった事ない私が思いつきで書いたスクリプトなので自信はありませんが、
シュミレートして動くか確かめましょうw

弾でたー!
なんか山にあたって噴火してるみたいになってますが、これも物理マテリアルが聞いてる賜物です。
発射口で弾丸プレハブがインスタンス化(プレハブのクローン)されてウマく飛んでいってる見たいです。
ですが、飛んでいった弾はひたすらゲーム内に残ってしまうので、これをなんとかしないとどんどん重くなりそうです(汗

2.銃弾は何かに当たったら消えるようにしたい
弾が何かに衝突したら消えるようにしたいのでもう一個スクリプトを用意します

#pragma strict

function OnCollisionEnter(collisionInfo: Collision){
	Destroy(gameObject);
}

これをbulletとか適当に名前をつけてbulletプレハブにドラッグ&ドロップします。
これでシュミレートしてみましょう、いままで弾はどこかにぶつかってそのままコロコロ転がってましたが、
山や、地面に当たるとcloneされた弾丸プレハブがどんどん消えていけば成功です。

3.敵が欲しい
一人で銃を撃ってるのも飽きちゃったので、
なんか敵というか目標物が欲しくなりました。
なのでまたAssets Storeから人の形をしたものをひろってきます。

URG!Free Edition
正直これをどう使えばいいのかさっぱりわからないですが、何となく人の形してるのがあるのでこれを使う事にします。

これをインポートしたら、Assets > UltimateRagdollFree > _prefabから適当なひとのプレハブを置きます
うーんなにこれどうやって使うのが正しいの?詳しい人いたらおしえてください(笑)
浪速ともあれ動かしてみないとわからないのでとりあえずおいてみました。


いいじゃん!なんか撃ってきそうじゃん!

そしてこのプレハブなんか最初からアニメーションとJSがアタッチされているので一旦全部消します。
そんで名前をmobと変更しておきましょう。


mobのInspectorがこんな感じになればおkです。

4.せっかく敵を置いたんだから倒したい
そりゃそうです、倒せない敵がいたらそれはただのNPCか無理ゲーということなのでこいつを倒したいそれもド派手に。
なのでとりあえずド派手な爆発エフェクトをまたAssets Storeから拾ってきます。
なんかこれが良いとどっかの記事に書いてあったのでこれやってみましょう。

とりあえずインポートしたらデモが入ってる見たいなので見てみる事にします。
Assets > Detonator Explotion Framework > TestSceneの下にシーンがあるので
これを押すと。

ド派手!!!!サブマシンガンのあんな赤い弾が出ただけでこのド派手なエフェクトがかかるならこれはもうやるしかないですねwww

これを敵に適応させる為に色々していきます。

4-1.さっきのbullet.jsを以下の様に修正

#pragma strict

function OnCollisionEnter(collisionInfo: Collision){
	if(collisionInfo.gameObject.tag  == 'mob'){
		collisionInfo.gameObject.SendMessage('ApplyDamage', SendMessageOptions.DontRequireReceiver);
	}
	Destroy(gameObject);
}

if文ははいりました。もしもタグのmobにぶつかったらmonオブジェクトのApplyDamageメソッド実行ということです。
後ろのSendMessageOptions.DontRequireReceiverはもしもこのメソッドがないオブジェクトだったらスルーしてねって事らしい。
ふむふむ。

4-2.着弾時のJavaScriptを作成
これは新しくjsを作ります。名前は適当にexplotion.jsとかにしておきましょう。

#pragma strict

var ExplotionPrefab: GameObject;

function ApplyDamage(){
	Instantiate(ExplotionPrefab, transform.position, transform.rotation);
	Destroy(gameObject);
}

ExplotionPrefabここにエフェクトプレハブを入れる様にします。
ApplyDamageが呼ばれたら、エフェクトをインスタンス化して、
その後、敵自身も消します。
これで爆発>敵がいなくなるとなるはず。

4-3.さっき置いた敵のオブジェクトにタグをつける
さっき敵を一体置いて、bullet.jsにmobだったらというif分をつけたんですけど、
まだ敵にはmobタグがついてないのでこのif文に引っかかりません、なので敵にmobタグをつけます。

mobタグをまだ作ってない場合はAdd Tagからタグを追加してあげましょう。

4-4.mobに着弾時のjsをアタッチ
Hierarchy > mob にさっき作ったexplotion.jsをドラッグ&ドロップします。

4-5.ExplotionPrefabにエフェクトをセット
mobのinspectorにjsが入りましたが、まだエフェクトを選んでないので適当に選びましょう。
(今回はDetonator-Baseを選択)

さぁ!シュミレートしてみましょう!


おー!これは気持ちがいい!

あんなショボい赤い弾で敵が塵となりました(笑)


UnityのAssets Storeには無料で適当に遊べそうなものが沢山あるので非常に助かります。
こういうの無いの?と思って探せば大体あります、有料の物を購入すればきっともっと幸せになれそうです。

関連記事リンク
【Unity入門】FPSのゾンビゲー見たいなのを作ってみたい(願望) 第一回「マップ作ろうぜ!」
【Unity入門】FPSのゾンビゲー見たいなのを作ってみたい(願望) 第二回「キャラ動かしてみようぜ」
【Unity入門】FPSのゾンビゲー見たいなのを作ってみたい(願望) 第三回「銃弾が撃てるスクリプトが書きたい」
【Unity入門】FPSのゾンビゲー見たいなのを作ってみたい(願望) 第四回「敵に動きを入れたい」