パズルゲームの作り方講座の前回の記事では、unityを用いた衝突判定、重力処理を扱いました。
前回の記事↓
今回は第三回です。unityを使ったC#スクリプトの書き方・使い方を習得していきましょう。
C#のスクリプトの書き方/使い方
Unity上のC#を書く練習に、まずはボールを一定間隔で生成するスクリプトを作っていきましょう。
スクリプトの作成
初めに、ProjectのAssetsの中にScriptsフォルダを作成してください。
その後、Scriptsフォルダ下にC# Scriptを「BallGenerator」という名前で作成してください。
この時、書いた名前が自動でクラス名になります。
スクリプトの書き方
スクリプトを作成したら、スクリプトをダブルクリックしてください。
すると、既定のテキストエディタが起動します。本記事の環境ではVisual Studio Codeが起動しています。
起動すると、下のようにBallGeneratorファイルが開かれた状態になります。
この時、5行目を見てみると、クラス名がBallGeneratorになっていることが確認できます。
また、自動生成されたクラスには、start関数とupdate関数があります。
start関数は、ゲームオブジェクトが生成されたとき一度だけ実行される関数です。変数の値の初期化などに使用されます。
update関数はフレームごとに一度実行される関数です。入力取得やリアルタイムに演算させる際などに使用されます。
それでは、60フレームごとに1つのボールを生成するスクリプトを作成します。このスクリプトを作成するためには、下記のようなコードを書いていきます。
7行目からコードを書いています。順番に解説していきます。
まず、7~8行はプレハブのゲームオブジェクトを取得するために書いています。7行目の[SerializeField]は、Unity特有のコードであり、インスペクタから設定できる変数であることを意味します。これは属性(attribute)と呼ばれ、通常は次の行の変数に適用されます。つまり、8行目のGameObject型の変数ballObjはインスペクタから設定できる変数であることが分かります。
関連記事:UnityC#のLinq・属性・拡張メソッド・クラスの部分定義の使い方
次に、10行目ではフレームごとにカウントアップする変数cntを、11行目では定数MAXCNTを60と定義しています。これらは、22~23行にて使用します。
それでは、関数内のコードについて解説していきます。今回は初回起動時に必要な処理がないため、start関数には何も記入しません。update関数では、60フレームごとに1つのボールを生成する処理を書いていきます。
60フレームを検知する処理の2つの書き方
まずは60フレームごとを検知する処理を考えていきます。書き方は2種類あります。一つ目は次のようなコードです。
1 2 3 4 5 6 |
cnt++; if(cnt >= MAXCNT) { // ここにMAXCNTフレームごとに実行したい処理を書く cnt = 0; } |
これは、cntがMAXCNT(60)以上であるかどうかをif文にて分岐させる書き方です。このほかにも、よく書かれるコードがあります。それは次のようになります。
1 2 3 4 5 6 7 |
cnt++; cnt%=MAXCNT; if(cnt==0) { // ここにMAXCNTフレームごとに実行したい処理を書く cnt = 0; } |
このコードは、cnt%=MAXCNTの部分を追加してif文を少し変えたコードとなります。この書き方では、cnt%=MAXCNTは「cntにMAXCNTで割った余りをcntに代入する」処理となります。
例えば、cntが0~59の時はMAXCNTの値である60で割った余りはそのまま0~59です。しかし、cntが60になったとき、60で割った余りは0となります。
つまり、cntは0から昇順に59まで増えていき、60になると0となります。そのため、この書き方でも、60フレームごとを検知することができます。
コードの説明に戻ります。
26行目は、ボールと同じゲームオブジェクトを複製するコードとなります。このInstantiate関数に複製したいゲームオブジェクトを書くことでそのゲームオブジェクトを複製できます。ここでは、ballObjを書いているためボールを複製していることが分かります。
最後の27行は、この後作成するゲームオブジェクトBallGeneratorの子オブジェクトに設定するコードとなります。この処理は後で効いていくコードとなるため、ここでは説明を省略します。
スクリプト全体は次のようなコードになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
using System.Collections; using System.Collections.Generic; using UnityEngine; using System; public class BallGenerator : MonoBehaviour { [SerializeField] GameObject ballObj; int cnt = 0; const int MAXCNT = 60; // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { cnt++; cnt%=MAXCNT; if(cnt==0) { GameObject gameObject = Instantiate(ballObj); gameObject.transform.parent = this.transform; } } } |
作成したスクリプトの適用方法
それでは、Unityに戻りましょう。
ヒエラルキーに空のゲームオブジェクトを作成し、名前をBallGeneratorにしてください。
ゲームオブジェクトBallGeneratorのインスペクタに先ほど作成したスクリプトBallGeneratorを追加してください。
さらに、7行に書いた[SerializeField]によりインスペクタからballObjが設定できるようになっていることが確認できます(インスペクタ上では”Ball Obj”と表記が変わっていますが、これはUnityの仕様上、自動的に変わるものなので気にしないでください)。
プレハブに登録したBallをballObjにドラッグ&ドロップして設定しましょう。
それでは、この状態で実行してみましょう。下のようになります。
これで、今回のC#のスクリプトについての説明は以上です。
おさらいと次回予告
今回は、C#のスクリプトを作成しました。
次回からはさらに細かい処理をスクリプトに書いていきます。
次回の記事↓
もっとUnity C#スクリプトを本格的に学びたい方は「UnityC#プログラミング入門講座 初心者でも挫折しないUnityC#」も見てみてね。
パズルゲーム講座が動画になりました。
動画も合わせてチェック!
コメント