前回はbarが左右の矢印キーで左右に移動できるようにしました.今回は落ちてくるボールを製作します.
例によってProjectビューのAssetsに登録したballをSceneビューの四角い枠内にドロップします. それからProjectビューのAssetsを右クリックして[Create]→[C# Script]を選択します.できたNewBehaviourScriptと書かれたファイルを右クリックでballControllerにリネームしてダブルクリックしてvisual studioで開きます.そこに次のようにコードを書いてください:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class NewBehaviourScript : MonoBehaviour { // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { transform.Translate(0, -0.2f, 0); if (transform.position.y < -5) { Destroy(gameObject); } } }
このコードはbarのbarControllerよりシンプルです.というのもballはまっすぐ落下するだけなのでy軸方向の座標を毎回一定値減らすだけで良いからです.ただし,このままでは画面の外に行っても永久に計算し続けてしまってメモリが無駄に使用されますのでDestroy(gameObject)で画面外に出たらすぐgameObjectであるballを消滅させています.またStart()で開始位置を指定しておりませんので開始する位置は最初にballを設置した位置からになります.これを保存したらballにアタッチします.アタッチがうまくいくと次の画面になります: これで取りあえずボールが動くようになりました.Playボタンをクリックするとballが1個だけ真下に落ちるのが分かると思います.なお,ここで注意してほしいのが,Unityではゲーム実行中にもプロジェクトの編集が可能のため,実行中に即座に動作がどう変わるかを確認できるのですが,あいにく実行中に行った編集は保存されません.このため編集内容を保存するにはplayボタンをクリックするなどしてゲームの実行を止めてから行う必要があります.デフォルトではゲーム実行中は少し画面全体が暗く表示されるので一応区別がつくのですが,余りにもわずかな違いなので見落とすかもしれません.そういう時はUnityの配色のスタイルを変更するなどするとよいでしょう.
さて,ここまではballが一個だけ落ちてくるようにしましたが,本当にやりたいのはballが一定間隔で何度でもランダムな位置から落ちてくることです.つまりballをたくさん出したいわけですね.
こういう時に力を発揮するのがPrefab(プレハブ)という機能です.・・・プレハブ?家でも建てるのか?いいえ違います.プレハブ住宅は工場で建築部品をすべて作ってから現地で組み立てる工法ですが,UnityのPrefabもそれに似てPrefabからいくつでも同じ種類のgameObjectを作ることができるのです.これは大量に似たようなものを作る際大変重宝します.実際やってみましょう.
HierarchyからballControllerをアタッチしたオブジェクトをドラッグしてProjectのAssetsの中にドロップします.するとHierarchyビューのballが青くて四角いアイコンに変わりました.またAssetsの方はballのアイコンができているのでballPrefabとリネームします.これでballのPrefabができました: Hierarchyビューの方のballはもういらないので右クリックでdelateしておきましょう.
次にballを次々に生成するスクリプトのballGenを作ります.例によってProjectビューのAssetsで右クリックして[Create]→[C# Script]を選択してできたファイルをballGeneratorにリネームします.それからこのファイルをダブルクリックしてvisual studioを立ち上げそこに次のコードを書き込みます:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class ballGenerator : MonoBehaviour { public GameObject ballPrefab; // Start is called before the first frame update void Start() { InvokeRepeating("GenBall", 2, 1); } void GenBall() { Instantiate(ballPrefab, new Vector3(-5f + 10 * Random.value, 6, 0), Quaternion.identity); } }
InvokeRepeatingメソッドは第一引数のメソッドを第二引数の秒数だけ待って第三引数の間隔で実行するというものです. この場合,メソッドGenBall()を最初に2秒待ってそれからは1秒間隔で実行します.
一定間隔で実行されるGenBall()メソッドの中身は第一引数のgameObjectを第二引数の三次元ベクトルの座標に第三引数の回転で生成するものです.この場合だとballPrefabをy座標が6,つまり画面の上側の外側で,x座標が0を中心として左右に±5の位置でz座標が0の位置に回転ゼロで生成しています.Quaternion.identityのidentityは恒等の意味があり,回転させないときに書きます.またC#では通常System名前空間にRandomメソッドが定義されていますが,Unityでは独自のRandomメソッドを持っているためこちらを使います.両者の違いはSystemの方はNext()メソッドを使用するのに対し,UnityではRandom.valueで0から1までの単精度実数値乱数を生成します.このため-5f + 10 * Random.valueの部分は計算すると-5から+5の間のランダムな値になるわけです.
さてこのスクリプトを保存したら,このスクリプトをGameObjectに登録しなければなりません.といっても画面上にあるオブジェクトに登録するわけにもいかないので空っぽのGameObjectを作ります.
UnityのHierarchyビューの+マークをクリックしてCreate Emptyを選択するとHierarchyビューにGameObjectができますので,先ほど作ったballGeneratorスクリプトをドラッグアンドドロップでGameObjectにアタッチします.そののち,GameObjectのInspectorが右側に表示された状態でAssetsからballPrefabをBallGenerator(Script)の下にあるballPrefabの右側の領域にドロップしてアタッチします:
これでランダムに画面上方から落ちてくるボールができました.実行するとこんな感じになります: 例によって大変遅いですね^^;とはいえ決して処理が重くなって遅くなっているわけではないのでご安心を.最後にパラメータを調節してゲームらしくなるようにします.
次回はボールとバーの当たり判定をします.