スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

【Unity 入門講座FPS編】第二回 武器で弾を撃てるようにする


Unity 入門講座FPS編 第二回

こんにちは、今回はUnityでいよいよプレイヤーに銃を持たせ、弾を発射出来るようにします。

いよいよUnityにおけるゲーム作成で、大体は避けて通れない道、スクリプトの解説になります。
遅れてすみません。今回からSceneビューの操作が必要になります。
「よくわからないよ!」という方は、併せてこれを読むことをおすすめします。
番外 Sceneビューの操作方法まとめ


下準備

まず、以後の簡略化の為に、”First Person Controller”の名前を、”Player”に変更して下さい。
名前の変更方法は、Hierarchyビューで、オブジェクトを選択した後に、もう一度名前の上をクリックすることで、編集出来ます。
(windowsと同じですね。)
または、Inspectorビュー上部に名前入力欄があるので、そこで編集も出来ます。

次に、”Tag”を編集します。これは、スクリプト上で、オブジェクトを指定するのに必要不可欠なもので、オブジェクト名でも指定できますが、そちらより一括で選択出来たりします。(確認はしてませんが、多分処理も軽いです。)
まず、”Player”のInspectorビュー上部にTagのポップアップメニューがあるので、”Player”に変更して下さい。
082001.png
次に、武器を入手します。AssetStoreを利用します。(独自に入手したものがあるならそれで構いません。)
082002.png
今回は、コチラのAssetを利用させて頂きます。(無料です)

今回は簡易的なFPSゲームですので、武器持ち替えなどは考えず、Playerの子オブジェクトとして、武器をプレイヤーに持たせます。 子オブジェクトとは、あるオブジェクト(親)に関連付けられたオブジェクトで、何もしなければ親に追従していきます。 もっと具体的に言えば親オブジェクトを原点(基準)とした、local座標を持ちます、その他Transformも親準拠になるのが特徴です。
Local座標って何?という人は、今回は気にする必要はありません。ただ追従するという特徴だけを覚えているだけでOKです。
子オブジェクトにする方法は、Hierarchyビューで、子供にしたいオブジェクトを親オブジェクトにD&Dするだけです。
では、実際にやってみましょう。

実際にやった様子がコチラ。無事に、”M4A1 Sopmod”は”Main Camerar”の子オブジェクトになりました。
082003s.png
次に武器の位置を調整します。Sceneビューで、目で確かめながら微調整するのが良いと思います。
実際にやったのがコチラ。いい感じにFPSっぽいと思います。
082004.png
次は、弾丸と弾丸を発生するポイントを作成します。
まずは、弾丸です。今回はただの玉を使いますが、弾丸オブジェクトがあるなら、それを使ってもいいと思います。

まずは、Hierarchyビュー上部から、<Create>→<Sphere>で、弾丸を作成します。
名前は、”Bullet”に変更して下さい。
次に、大きさを0.1にします。(”Transform”→”Scale”→x y z)
また、Inspectorビューからコンポーネントに物理演算を付加します。
<Add Component>→<Physics>→<Rigidbody>をして、Rigidbodyオブジェクトを足して下さい。
これは、Unityで最もよく使われるコンポーネントの一つで、これを持ったオブジェクトは物理演算を付加され、重力に従って落ちるようになります。また、これを持ったオブジェクト同士は、押しのけることが出来ます。

また、視認性を上げるため弾丸にマテリアルを適用します。Projectビュー上部から、<Create>→<Material>で新規作成。名前は”Bullet”にします。
マテリアルのInspectorビュー”MainColor”をクリックすることで色の編集画面が出ます。そこで好きな色を指定して下さい。後は、弾丸にそのMaterialをD&Dして完成です。

次に、この弾丸を複数作成出来るように、”Bullet”をPrefab化します。
Prefabとは、オブジェクトを複製するための金型みたいな物で、PrefabをHierarchyビューにD&Dすると、Prefabのクローンが作成されます。Prefabは、位置情報や、コンポーネントといったオブジェクトに付加されている情報も保持しているので、全く同じ物が複製できる点で、Unityでは必須の仕組みです。
作り方は簡単で、HierarchyビューのオブジェクトをProjectビューにD&Dするだけでも出来ますし、Projectビュー上部<Create>→<Prefab>で空のPrefabを作成でき、Projectビューのオブジェクトからでも作成できます。
082005.png
無事にBulletのPrefabが作成されました。Hierarchyビューの”Bullet”は削除しても構いません。(Deleatボタンまたは、右クリック)

次に、発射時に弾丸が発生するポイントを作成します。<GameObject>→<CreateEmpty>から、何もないオブジェクトを作成します。名前は”Spawn”にします。それを、武器オブジェクトの子オブジェクトにします。また、位置は銃の先端にします。
082006.png

長かったですが、これで下準備は完了です。お疲れ様でした。


弾丸を撃つ
いよいよ、スクリプトを書いていきます。
Projectビュー上部<Create>から<Javascript>または<C#script>を選んで下さい。
どちらにするかは、自由ですが応用の効くC#がいいと言われます。
(C#は明確なClass宣言や、一部関数がJavascriptと違う。特にUnityのJavascriptはほぼUnity専用のため、Javascriptを知っている人は混乱するかもしれません。しかしJavascriptの方が、表記は簡単です。)
私は、Javascript派ですが、C#の勉強も兼ねて書いてみたいと思います。
(なので、C#の解説はあまり出来ません。スミマセン...)

まず、弾丸オブジェクトを”Spawn”から発生させるスクリプトからです。先ほど作成したスクリプトの名前を”Shot”にしてください。
次にダブルクリックすれば、外部エディター”MonoDepeloper”が起動します。
/*
変数とは、入れ物のようなもの。プログラミングでは変数は予め宣言して使用する。
GameObject型は、中にオブジェクトを入れる(代入)ができ、この変数を使うことで、位置や大きさ
オブジェクトに付与されているComponentにアクセスすることが出来る。
Transform型は、中にオブジェクトを入れるが実際に代入されるのはそのオブジェクトのTransformにしかアクセス出来ない。
float型は、中に浮動小数点型という少数のような値を入れることができる。
他にも整数のみを入れるint型やコンポーネント(スクリプト)を代入するには、そのコンポーネントの名前を型として宣言する。
javascriptでは"修飾子 var 型 : 名前"で変数を宣言する。
*/
public var bullet : GameObject;	//GameObject型変数bulletを宣言
public var spawn : Transform;	//Transform型変数spawnを宣言
public var speed : float = 1000;//float型変数speedを宣言。同時に1000を代入

//毎フレーム実行される
function Update () {
	if(Input.GetButton("Fire1")){
	//マウスが左クリックされた時
		Shot();	//Shot関数を実行
	}
}

//Shot関数
function Shot (){
	var obj : GameObject = GameObject.Instantiate(bullet);	//GameObject型変数objを宣言
	obj.transform.position = spawn.position;				//objに代入されたオブジェクトの位置をspawnオブジェクトに合わせる
	obj.rigidbody.AddForce(transform.forward * speed);		//objオブジェクトに付与されたrigidbodyを利用して前方向に1000の力を加える
}

以上のスクリプトをJavascriptの方は、以上をコピペして下さい。
(ただ//や/* */のところにある日本語はコメントです。なくてもポログラミングには関係ありませんのでご注意ください)
スクリプト内でなるべく説明していますが、プログラミングに関しては、これ以上の説明はしません。ご注意ください。
次にC#です。
using UnityEngine;
using System.Collections;

public class Shot : MonoBehaviour {
	public GameObject bullet;
	public Transform spawn;
	public float speed = 1000;

	// Update is called once per frame(毎フレーム呼ばれる)
	void Update () {
		if(Input.GetButton("Fire1")){
			Shoot();
		}
	}

	void Shoot () {
		GameObject obj = GameObject.Instantiate(bullet)as GameObject;
		obj.transform.position = spawn.position;
		Vector3 force;
		force = this.gameObject.transform.forward * speed;
		obj.rigidbody.AddForce (force);
	}
}

以上がC#のスクリプトです。

スクリプトをコピーしたら、<File>→<Save>でスクリプトを保存して下さい。
これをUnityで、スクリプトファイルをHierarchyビューの”Player”にD&Dして下さい。
”Player”のInspectorビューにShotというコンポーネントが追加されます。
修飾子がpublicで宣言された変数はInspectorビューに表示され、テストプレイ中でも編集することが出来ます。
Shotコンポーネントの”Bullet”に弾丸となるオブジェクト(ここでは、”Bullet”オブジェクト)、”Spawn”に”Spawn”オブジェクトをそれぞれD&Dして下さい。
082007.png

お疲れ様です。
本日は、ここまでです。

Sceneの保存は忘れないようにして下さい。
081804.png

試しに、テストプレイをしてみてください。
082008.png
左クリックをすると、弾丸を発射すると思います。
次回は、敵を実装したいとおもいます。
わからないことがあったらお気軽にコメントまでどうぞ!

目次

番外 Sceneビューの操作方法まとめ

前回 FPS編 第一回 ステージをつくろう!+プレイヤーの配置
次回 FPS編 第三回 敵を実装する
スポンサーサイト
プロフィール

ヨシキ

Author:ヨシキ
UnityやBlenderを使ったゲーム製作や
CG製作に取り組んでみます。

プログラムは、
Javaを基礎程度です。
Unityは主にC#を使って書いています。
UnityScrioptも使えますが…

androidアプリを制作を目指す!

雑談等つぶやいてます
Twitter

カテゴリ
最新記事
最新コメント
月別アーカイブ
検索フォーム
RSSリンクの表示
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
ブログランキング

FC2Blog Ranking

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。