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

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

【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のゾンビゲー見たいなのを作ってみたい(願望) 第四回「敵に動きを入れたい」