3日目 - Unity①

関数

とりあえず以下の通りに書いて実行してみよう

void Start(){
	int i = 5;
	PrintInt(i);
}

void PrintInt(int x){ //Start()の{}の外に書くこと!
	Debug.Log(x);
}

出力例

image.png

複数のコードをまとめて一つのコードとして実行することができます。 これを関数(メソッド)といいます。

使い道

Debug.LogやRandom.Range()も、Unity側ですでに用意されている関数の一種です。

基本的な書き方

関数側

戻り値の型 関数名(){} //戻り値の説明は下で

戻り値の型 関数名(型 変数名){} //()内にほしい情報(引数)を宣言することができる
戻り値の型 関数名(型 変数名, 型 変数名){} //引数は,で区切ることで複数宣言可能

呼び出す側

関数名();

関数名(引数); //引数が要求されている場合には引数と同じ型の変数を用意する必要がある
関数名(引数,引数);

戻り値(return)

コードを実行すればいいだけの場合は「戻り値がない」というふうにいい、戻り値の方はvoidを使用します。

void Start(){
 OnlyExecute(5);
}

void OnlyExecute(int n){ //引数回だけ出力を繰り返す関数
	for(int i = 0; i < n; i++){ //引数回だけループ
		Debug.Log("n回出力するだけ");
	}
}

一方、実行した結果を呼び出した際に取得したいという場合があります。その際戻り値にその結果の型を使用することで、値を返すことができます。戻り値として返したい値は関数内でreturnを使用します。

void Start(){
	int x, y;
	x = RandomInt();
	y = RandomInt();
	
	Debug.Log(x + y);
}

int RandomInt(){ //0~10のランダムな整数を返す関数
	int random;
	random = Random.Range(0, 10);
	
	return random;
}

returnを実行すると、そのあとのコードはすべて無視されることに注意

void Start(){
  int[] numbers = new int[]{1, 2, 4, 8, 16, 32, 64};
  
	Debug.Log(CheakNum(8, numbers));
}

string CheakNum(int n, int[] array){ //与えられた配列から与えられた値を探す関数

	for(int i = 0; i < 7; i++){
		if(array[i] == n){
			return  n + "を発見!";
		}
	}
	
	return n + "は見つかりませんでした";
}

出力例

image.png

return n + "を発見!";後のreturn n + "は見つかりませんでした"; は実行されずにスキップされている

スコープ

変数は宣言を書く場所によってアクセスできる範囲が異なります。

例えば、以下のようにfor文内で宣言した変数はその外からアクセスすることができません。

void Start(){
	for(int i = 0; i < 10; i++){
	
	}
	
	Debug.Log(i); //エラーがでる
}

一方、以下のようにiをfor文の外で宣言しておくとアクセスできます。

void Start(){
	int i;
	
	for(i = 0; i < 10; i++){
	
	}
	
	Debug.Log(i); //10
}

同様に、他の関数内で宣言した変数はアクセスすることはできません。

void Start(){
	int x = 10;
	
	Debug.Log(x); //10
	Print();
}

void Print(){
	Debug.Log(x); //エラーがでる
}

同じスクリプト内で共通して使用したい変数は、すべての関数の外に書くようにしましょう

int x = 10;  //Start()の{}の外に書くこと!

void Start(){
	Debug.Log(x); //10
	Print();
}

void Print(){
	Debug.Log(x); //10
}

このアクセスできる範囲のことをスコープといいます。

スコープの外であれば同じ変数名で変数を宣言することができます。

練習⑤

コンポーネントの外し方と一時無効化

間違えてゲームオブジェクトにつけてしまったりいらなくなったコンポーネントは、Inspector上の右側の点々から、「Remove Compornent」を選択することで取り外せます。

image.png

また、一時的にそのコンポーネントを無効化しておくには、Inspector上の左側のチェックを外します。再度有効にする際はチェックを入れます。

image.png

他のコンポーネントの参照

異なるスクリプトの変数の参照や関数の実行を行うことができます。

とりあえず試してみよう。

最初に、今使用しているスクリプト(Programming1)に以下の通りに書いてください。

public int num = 50;

void Start(){

}

public void Print(){
 Debug.Log("Hello World");
}

次にもう一つスクリプト(Programming2)を制作して、以下の通りに書いてください。

image.png

public Programming1 script1;

void Start(){
	Debug.Log(script1.num);
	
	script1.Print();
}

書けたらProgramming1がついているゲームオブジェクト(Programming)に、Programming2もドラッグアンドドロップして追加する。

gif3.gif

最後に、Inspector上の「Programming 1 (Script)」と書いているところを持ち、Programming 2 (Script) の「Script 1」と書いてあるところの右側の四角(None(Programming 1)と書かれているところ)にドラッグアンドドロップする。

gif2.gif

実行してみる

出力例

image.png

これはProgramming2のスクリプトがProgramming1のスクリプトを参照することで、変数を取得したり関数を実行したりしています。

publicとprivate

変数や関数の前にpublicをつけることで、他のスクリプトから参照することができるようになります。

public int x = 8;

public void Random(int n){
	Debug.Log(n);
}

一方、他のスクリプトから参照できないようにしたいときはprivateをつけます。また、何もつけない場合はprivateが省略されているものとみなされます。

private int y = 5
int z = 10; //privateが省略されている

Inspectorでの変数の変更([SerializeField])

また、Publicをつけることでスクリプトを編集せずに、UnityのInspector上から変数を編集することができます。

image.png