今回やること
- public変数を学ぶ/コンポーネント型変数を学ぶ
- if/for文を学ぶ
- オブジェクトのインスタンス化を学ぶ
1.public変数を学ぶ/コンポーネント型変数を学ぶ
それでは、public変数を作ってみましょう、プログラムの作成には前回使ったプログラムファイルを使う想定です。
関数の外側に、以下のように記述してみてください(Start以下は書き換えなくても大丈夫です)。
using UnityEngine;
public class TestScript : MonoBehaviour
{
public int value;
void Start()
{
}
[ContextMenu("Function")]
private void Function()
{
}
void Update()
{
}
}
この状態で保存すると、このファイルを適用しているオブジェクトのインスペクターから変数を編集することができるようになっています。
このような、「外部からの編集ができる変数」をpublic変数と言います(他にもpublic変数にはいろいろな意味合いがあったり他の種類の変数があったりするのですが、そこは割愛します)。
ちなみに、この変数はその変数のあるプログラムファイル内のどこからでも参照することができます。
using UnityEngine;
public class TestScript : MonoBehaviour
{
public int value;
void Start()
{
Debug.Log(value);
}
[ContextMenu("Function")]
private void Function()
{
int a = value * 2;
}
void Update()
{
}
}
次に、さっきと同じ書き方で以下のように記述してみてください。
using UnityEngine;
public class TestScript : MonoBehaviour
{
public Rigidbody2D rigid;
void Start()
{
}
[ContextMenu("Function")]
private void Function()
{
}
void Update()
{
}
}
ここで変数の型の部分に入れたRigidBody2Dというのは、Unityで使われるコンポーネントの一種です。
保存すると、先ほどと同じく変数を編集する欄が出てきます。
ここで、新しく空のオブジェクトを作成して、
新しく作成したオブジェクトのインスペクターの下の「Add Component」をクリックして開いてください。
ここに「RigidBody2D」と入力、もしくはこれを途中まで入力すると、候補欄に同名のものが出てくるので、これをクリックしてください。
これで、新しく作成したオブジェクトにRigidBody2Dコンポーネントを適用できました。
この状態で元のオブジェクトを選択して、変数の欄に新しく作成したオブジェクトをドラッグすると...
新しいオブジェクトに適用されたRigidBody2Dが入力されました。
このように、変数の型にコンポーネントの名前を使うと、そのコンポーネントを代入できる変数を作ることができます。
2.if/for文を学ぶ
if文という構文を解説します。以下のように記述してみてください。
using UnityEngine;
public class TestScript : MonoBehaviour
{
public int value = 0;
void Start()
{
}
[ContextMenu("Function")]
private void Function()
{
if(value > 5)
{
Debug.Log("valueは5以上です");
}
else
{
Debug.Log("valueはより下です");
}
}
void Update()
{
}
}
これを保存して実行すると、pubic変数valueの値に応じて出てくるログが変わります。
このように、if文は条件に応じて実行する内容が変わります。具体的には以下のように動作します。
if(/*条件A*/)
{
//条件Aが達成されるなら実行
}
if文にはifとelse、ifとelse ifとなるような組み合わせも存在します。それぞれ以下のように動作します。
ifとelse
if(/*条件A*/)
{
//条件Aが達成されるなら実行
}
else
{
//条件Aが達成されないなら実行
}
ifとelse if
if(/*条件A*/)
{
//条件Aが達成されるなら実行
}
else if (/*条件B*/)
{
//条件Aが達成されない、かつ条件Bが達成されるなら実行
}
ifとelse ififとelse ifとelse
if(/*条件A*/)
{
//条件Aが達成されるなら実行
}
else if (/*条件B*/)
{
//条件Aが達成されない、かつ条件Bが達成されるなら実行
}
else
{
//条件AもBも達成されないなら実行
}
条件は以下のように書くことができます。
| 書き方 | 意味 |
|---|---|
| A == B | AとBが等しいなら |
| A >= B | AがB以上なら |
| A <= B | AがB以下なら |
| A > B | AがBより大きいなら |
| A < B | AがBより小さいなら |
この条件は&&,||という記号を使うことで組み合わせることができます。
if (/*条件A*/ && /*条件B*/)
{
//条件AとBが達成されるなら実行
}
if (/*条件A*/ ||/*条件B*/)
{
//条件AもしくはBがどちらか最低一つでも達成されるなら実行
}
また、条件を()で包んで!を先頭に付けることで、条件を反転させることができます。
if (!(/*条件A*/))
{
//条件Aが達成されないなら実行
}
前回紹介したbool型の変数には、上記の条件を代入することができます。
public int value = 0;
private void Function()
{
bool a = value >= 5;
if (a)
{
//valueが5以上なら実行
}
}
次に、for文という構文を紹介します。以下のように記述してみてください。
using UnityEngine;
public class TestScript : MonoBehaviour
{
void Start()
{
}
[ContextMenu("Function")]
private void Function()
{
for(int i = 0;i < 10; i++)
{
Debug.Log(i);
}
}
void Update()
{
}
}
この状態で実行すると、0~9までの数字がログに出力されます。
for文は、以下のようにパーツ分けされます。
for( /*初めに実行すること*/ ; /*for文を続ける条件*/ ; /*毎回終わりに実行すること*/)
{
/*毎回実行すること*/
}
「for文を続ける条件」が達成されている間、「毎回実行すること」の部分がずっと繰り返して実行されます。
これを踏まえてさっきのfor文を分解すると、
int i = 0;
Debug.Log(i);
i++;
Debug.Log(i);
i++;
Debug.Log(i);
i++;
Debug.Log(i);
i++;
Debug.Log(i);
i++;
Debug.Log(i);
i++;
Debug.Log(i);
i++;
Debug.Log(i);
i++;
Debug.Log(i);
i++;
Debug.Log(i);
i++;
//iが10より下ではなくなったので終了
(i++は「iに1を足す」という意味です。)
となります。このプログラムとさっきのfor文は実行内容だけで見ると完全に同じです。
このように繰り返して似たような内容を実行するための構文をfor文といいます。
3.オブジェクトのインスタンス化を学ぶ
次に、オブジェクトのインスタンス化について説明します。さっき作ったオブジェクトでも、また新しく作ったオブジェクトでもいいので、ヒエラルキ上のオブジェクトをプロジェクト欄にドラッグしてください。
すると、オブジェクトの名前をしたファイルが作成されます。これをプレハブ/プレハブファイルといいます。
このプレハブを逆にヒエラルキやシーンビューにドラッグすると、同じオブジェクトを素早く複数作ることができます。
このように、プレハブはオブジェクトの金型のような特性を持っています。
このオブジェクトの複製はプログラムからでも実行することができます。以下のように記述してみてください。
using UnityEngine;
public class TestScript : MonoBehaviour
{
public GameObject obj;
void Start()
{
}
[ContextMenu("Function")]
private void Function()
{
Instantiate(obj);
}
void Update()
{
}
}
このプログラムのpublic変数の型はGameObjectです。ここにはプレハブや非プレハブのオブジェクトをドラッグして代入することができます。
ここにさっき作成したプレハブを入れて実行すると...
プレハブが複製されました。Instantiate(何らかのGameObject)は、()内で指定したGameObjectを複製することができます。
このとき、Instantiate()をgameObject型の変数に代入するようにして使うと複製された後のオブジェクトを取得することができます。
using UnityEngine;
public class TestScript : MonoBehaviour
{
public GameObject obj;
void Start()
{
}
[ContextMenu("Function")]
private void Function()
{
GameObject clone = Instantiate(obj);
Debug.Log(clone.name + "を複製しました");
}
void Update()
{
}
}
((GameObject変数).nameでそのオブジェクトの名前を取得できます。)
これで、この講座でこれから使う基礎的なプログラムの書き方はすべて解説し終えました。今回の講座はこれで終わります。 お疲れ様でした~
