Unityで何か処理するときに、回数を数えて処理を変えたいときにどうするか、の基礎です。
#先ずは元の確認
処理の元のScriptファイルです。
using UnityEngine;
using System.Collections;
public class Launcher : MonoBehaviour {
//発射する玉のPrefab
public GameObject ballPrefab;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
if (Input.GetMouseButtonDown(1)) {
Instantiate(this.ballPrefab);
}
}
}
このScriptは、以下の設定で動いています。
オブジェクト名 | 属性 | 内容 |
---|---|---|
Launcher | クラス | |
ballprefab | public Gameobject | 発生させるprefab |
Start | メソッド | 初めに一回の処理:何もしない |
Update | メソッド | 画面の更新でする処理:マウスの左クリックがされていたらballprefabを生成 |
#押された回数を数える
数えるには、その為のオブジェクトを用意することが必要です。どう考えれば良いでしょうか。
##どういうオブジェクトにするかを考える
###型は何が良いか
数値として持つので、それに相当する型で考えます。該当するのは以下の何れかになります。
-
int
型:整数を格納する -
float
型:小数を格納する
「数える」ということは整数で済ませられるので、ここではint
型で定義しておきましょう。
###名前をどうするか
命名では、以下のことに配慮する必要があります。
- 何を示すかが分かりやすいこと。これを改造し続けていくとすれば、単純なアルファベット一文字では何か判らなくなります。
- 誰が考えても、同じ発想になること。他人との共同もあり得るので、他人が見ても同様になることが予想され得るものがのぞましくなります。Unityの記法では、変数名は最初の文字がsmallで書くことが多いです。また、海外のソースコードもあったり、日本人でも書き方が変わるので__ローマ字で書くのは避けるべき__です。
こうしたことを考えて、今回は以下の形にします。
###どこに配置するか
今回の変数は、「押されたら数える」ので、外部から変更される可能性がありませんし、それを許すとバグの元になります。__オブジェクトのスコープは出来る限り隠す__と考えて下さい。今回は、このクラス内でのみ使うので、private
にして、class
内部にしました。
###コードにする
以下の形になりました。
public class Launcher : MonoBehaviour {
//押された回数を格納する変数
private int counter = 0;
##数える処理を入れる
数える部分は、「押されたら」なので、該当するブロックに追加します。
// Update is called once per frame
void Update () {
if (Input.GetMouseButtonDown(1)) {
counter++; //****追加
Instantiate(this.ballPrefab);
}
}
##数えた数で動作を変える
数えた処理で、何かを変えたい場合は、数を評価して処理を分岐します。例えば、押された回数が20になったら玉が出ない、としたい場合は以下になります。
// Update is called once per frame
void Update () {
if (Input.GetMouseButtonDown(1)) {
counter++;
if (counter <= 20) {//****追加
Instantiate(this.ballPrefab);
}
}
}
ただし、これだと「玉が出るのは20が限界」ということが、後から見た時にわかりにくくなります。こうした値をそのままソースコードに書くことを「ハードコーディング」と呼び、後から改造しにくいコードになります。そうした場合は、変数を別にとりましょう。
ここまでをまとめると、以下のコードになりました。
using UnityEngine;
using System.Collections;
public class Launcher : MonoBehaviour {
//押された回数を格納する変数
private int counter = 0;
const int counterMax = 20; //最大値
//発射する玉のPrefab
public GameObject ballPrefab;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
if (Input.GetMouseButtonDown(1)) {
counter++;
if (counter <= counterMax) {//****変更
Instantiate(this.ballPrefab);
}
}
}
}
数え方は様々なので、「残りの数」で数えるなど、工夫してみてください。