| 序章
よく、プログラミングのについて、調べていると、オブジェクト指向なるモノの存在を目にする。
どうやら、大まかにはスクリプトの働きによって、一つのオブジェクト(物?)として考えることのようだ。
もちろん、こんな簡単なことではないと思うけど、一気に文章だけ読んで理解できるほど良い頭を持ち合わせていないので、どうにか、学習を進めながら理解していこうと思う。
昔から、自分はおそらく文系の頭の作りなのか、数字だけを並べられも理解することができなかった。
数学はもちろんのこと、物理に至っては、運動の法則とか、教科書に書いてある単純な静止画を見せられても、『運動の法則なのに動いてくれなきゃ分からんだろ。』とか思っていたし、(単純に想像力の欠如か、)数学の関数なんか見ても、理解できなかった。
科学や、物理現象などに興味が無いわけではなかったし、むしろ、そういう分野は好きな方だと自負していた。
とにかく、興味はあるけど頭のスペックが追い付いていない。
プログラミングも、コードだけ読んで、何をしているのか理解できれば苦労しないのだが、自分にはそれがかなり困難であることも分かってきた。
そこで、出会ったのがUnityさん。
ゲームを作るのためのEditorとして、開発されたものなのだろうけど、最近では、ビジネスの分野でも使われるし、用途は多岐にわたる。
とにかく、自分にとって一番有難かったのはスクリプトの実行結果をすぐに、目に見える形で確認できるということ。
もちろん、他にもビジュアルとして、実行結果を確認できるツールはたくさんあるけど、Unity は、3Dのオブジェクトを簡単に生成できて、その挙動を記したスクリプトをそのままアタッチして、すぐに確認できる。
なので、スクリプトだけ眺めながら結果を想像するのではなくて、逆に、ビジュアル的な実行結果を見て、そこから、スクリプトを作成できる。
とにかく、自分にとっては、数字を形や動きで認識できる初めての衝撃だったのである。
| 関数
int Add(int a, int b) {
int c = a + b;
return c; // 返り値
}
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Function : MonoBehaviour { // Use this for initialization void Start () { Answer(); } // Update is called once per frame void Update () { } int Add(int a, int b) { int c = a + b; return c; } void Answer() { int answer; answer = Add(3, 4); Debug.Log(answer); } }
int Add(int a, int b) の int は、返り値の型を示し、Add は、その関数名を示す。
(int a, int b) は、引数の型と引数を示しており、関数を呼び出すときに、(この場合であれば、int型の値を記入する。)上記の Add(3, 4) のように値を入れる。
すると、関数 Add のなかで計算された返り値 c を、変数 answer に代入することができる。
引数には、型が同じであれば、変数を指定することもできる。
void Start () { int answer; int num1 = 1; int num2 = 2; answer = AddOn(num1, num2); Debug.Log(answer); } int AddOn(int a, int b) { int c = a + b; return c; }
| クラスの概念
特に、ゲームや、大型のプロジェクトを複数人で作成する際に、スクリプトの処理の種類によって、管理がしやすくなるメリットがある。
class クラス名 { メンバ変数の宣言; メンバ関数の実装; }
class の後ろにクラス名を記述し、変数と関数の実装をしていく。
クラス内で使用する変数と関数はそれぞれ、頭に”メンバ”を付けて呼ぶ。
作ったクラス(以下では、Item)は、変数の型のように使え、 Item myPlayer = new Item(); のように、変数の代入と同様、myPlayer という変数に、Item() の実体を代入している。
このとき、実体のことを インスタンス と呼んでいる。
以下で、気を付けたいのは、Itemクラスは、Playerクラスの外側に作成している点です。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Item { public int hp = 100; private int cure = 50; public int item = 10; public void Cure() { Debug.Log("薬草を使った。"); if (this.hp < 200) { this.item -= 1; Debug.Log("体力が " + this.cure + " 回復した。"); this.hp += this.cure; } else if (this.hp >= 200) { Debug.Log("今は使う必要はなさそうだ。"); } } public void Damege(int damege) { this.hp -= damege; Debug.Log(damege + "のダメージを受けた。"); } } public class Player : MonoBehaviour { // Use this for initialization void Start () { Item myPlayer = new Item(); Debug.Log("HP:" + myPlayer.hp); Debug.Log("薬草:" + myPlayer.item); myPlayer.Damege(30); Debug.Log("HP:" + myPlayer.hp); myPlayer.Cure(); Debug.Log("HP:" + myPlayer.hp); Debug.Log("薬草:" + myPlayer.item); } }
Itemクラスの変数に、以下のような記述がある。
public int hp = 100;
private int cure = 50;
public int item = 10;
public や private と、あるものはアクセス修飾子と呼ばれ、そのクラス(ここでは、Itemクラス)以外から、呼び出して使えるかどうかを定義している。
主には、複数人で一つのスクリプトを作成した時に、自分の作成したクラスの中で、変更してもらってもいい変数なのかどうなのかを明示するために分けている。
例えば、モンスターからの攻撃を受けたり、薬草で回復したりすると、体力は変動する。
これは当たり前のことだが、なかには、変動してしまっては都合の悪いモノもある。
ここで言えば、薬草の回復量などだ。
ゲームの設定によっては、わずかに変動させる場合もあるだろうが、基本的には外部からはあまり変更してもらいたくない値である。
アクセス修飾子 | アクセス可能クラス |
public | すべてのクラスからアクセス可能 |
protected | 同じクラスとそのサブクラスからアクセス可能 |
private | 同じクラスからのみアクセス可能 |
実行結果、
コメント