Meyco's thoughts

ただのポエムです

ただのデザイナーがFPSゲームのScriptを設定した話。

先日、giginet君に「弾が打てないFPSだなんて詐欺です」と言われてしまったので、彼にUnity Scriptを教えてもらい、弾を追加しました。

前回:デザイナーがUnityでFPSゲームのステージが作れた話。

http://meyco.moo.jp/test/Unity/meycofps2/fps2/fps2.html

Space:ジャンプ 矢印キー:移動 弾を打つ:zキー

※遊ぶには、下記のUnity Playerが必要です。

http://unity3d.com/webplayer/

ほとんどプログラム出来なかった人でしたが、Javascriptの基礎も色々教わったのでメモ。

先に準備しておくもの。

FPSの骨組み

(プログラミング不要。詳しくはこちらの記事を参照のこと。)

学生のためのUnity勉強会「1時間でFPSを作る」チュートリアル(前編)

Dash

https://itunes.apple.com/jp/app/dash-docs-snippets/id458034879?mt=12

超高速でドキュメントの検索が出来るアプリ!なんと無料。UnityScript以外にも、CSS,php,iOSなど、様々なリファレンスがあります。本当にオススメ。ここでは、Unity 3Dをダウンロードしておきましょう。

 

Logicを組みてててから、何の機能を追加するのか考える。

今回は本当に骨組みしか作っていなかったので足すものは沢山あるのですが、とりあえず

  • Playerから弾が打てるようにする。
  • 障害物に弾が当たったら、障害物が消えるようにする。

の設定をします。

 

Unity Scriptの基礎知識

  1. function Start () {
  2. //ここに、ゲームを起動すると一度だけ動くScriptを書く
  3. }
  4. function Update () {
  5. //ここに移動や回転など、ゲーム中に使用するであろうコマンドやScript処理を書く
  6. }

ざっとこんなかんじです。上のfunction Startには、起動画面など、ゲーム中に一度だけ使う処理を、下のfunction Updateには、zキーを押したら弾を出す、オブジェクト(後ほど説明します)が上に動き続けるなど、何かのコマンドが入力された時にずっとupdate(更新/繰り返される)処理を書きます。

では実際に、処理を見ましょう。

テスト的に、ステージ上に箱を作って、その箱がずっとy軸上に上がり続ける処理を書いてみました。

箱の作り方は、

Hierarchy小窓のタブのすぐ下にあるCreate▼をクリック>Cubeをクリック。四角い箱がScene小窓に出てくるので、好きな場所に移動しておきます。

次に、Project小窓>Create▼JavaScriptを選択してファイルを生成、ファイル名をCubeにし、ファイルアイコンをダブルクリックして、MonoDevelopに飛びます。

そこに

  1. function Start () {
  2. }
  3. function Update () {
  4. //物体の位置が、毎秒y軸+1ずつ移動します
  5. this.transform.position.y+=1 * Time.deltaTime;
  6. }

というコードを書いてください。そのあと、Project小窓のcube.jsをHierarchyのcubeにドラッグして紐付け。そして再生ボタンを押して確認すると、キューブがどんどん上がっていってラピュタっぽいのが出来るかと思います。

これが、UnityScriptの基本です。

 

弾を打つためのScriptの解説

まず、弾を作ります。メニューGameObject>CreateOther>でSphereを配置。

Hierarchy小窓で名前をBulletにし、Project小窓にドラッグ、するとPrefab化されます。

Prefab化とは

UnityでPrefab化は超重要です。解りやすい言葉があったので、お借りします。

3Dでキャラクターを動かすためには数多くのデータが必要になる。3Dの座標データ、3Dキャラクターを動かすための骨データ、3Dキャラクターの表面に張りつけるテクスチャ画像、3Dキャラクターを制御するスクリプトなどなど。プレハブはそれらを一まとめにしたもの。

例えば、3Dクリボーを作ろうと思ったら、3Dクリボーの座標データ、3Dクリボーの骨・アニメーションデータ、3Dクリボースクリプトなどが必要になるので、それらを1箇所にまとめて3Dクリボープレハブとして扱うことができる。

http://octagonalroom.blogspot.jp/2011/08/unity2-prefab-unity-3d-3d3d3d-3d-3d3d3d.html

というわけで、このBullet PrefabにScriptを当てます。

Project小窓>Create▼>JavaScriptを選択してファイルを生成、ファイル名をgunにし、ファイルアイコンをダブルクリック。

  1. var explosion : Transform;
  2. //Bulletという名前をつけた弾が
  3. function OnCollisionEnter(collision : Collision) {
  4. //もしそれがgameObjectに当たった場合
  5. if(collision.gameObject.tag=="Bullet"){
  6. //オブジェクトを消します。
  7. Destroy (gameObject);
  8. }
  9. }

こんな感じです。ここで言うゲームオブジェクトは、CubeやSphereなどの事を言います。

とりあえずこれで弾が目標に当たるようになりました。

 

次に、Player自身から、弾が撃てるようにScriptを書きます。

  1. function Update () {
  2. //もしもzキーが押された場合
  3. if (Input.GetKeyDown (KeyCode.Z)){
  4. //bulletPrefabを繰り返し生成します。
  5. var bullet= Instantiate (bulletPrefab, transform.position, Quaternion.identity);
  6. //キャラクターの正面方向からbulletを出します。
  7. bullet.rigidbody.velocity=this.transform.forward*bulletSpeed;
  8. }
  9. }

ただ、このままだと弾の飛び方がおかしいので、弾に速度をつけようと思います。

function Update () {

の上に

  1. public var bulletPrefab : GameObject;
  2. public var bulletSpeed : int = 10;
  3. function Start () {
  4. }

これで、弾が出るようになりました。

#pragma strict

各jsの頭に、#pragma strictというコマンドを書いているのですが、

これを書くことによって、各GameObjectを見た時に、Inspectorから、直接パラメーターが弄れるようになります。

とても優秀なので是非使ってください。

Source codeの調整

知ってると便利。Scriptのインデント調節などを自動でやってくれます。(やり方忘れちゃったので後ほど調べて記入。)

次回は、マウスに追従して弾の方向を変える

Scriptを書こうと思います。