スクラッチからUnityにシフトアップ
8回目は「変数」グループのご紹介です。
スクラッチの変数グループには変数とリストが含まれます。Unityでも変数とリストを利用することが出来ますが、さらにリストとよく似た「配列」も良く利用されます。
今回は変数、リスト、配列についてご紹介いたします。
変数
Unityでもスクラッチ同様、変数を使用することが出来ます。変数を使うには事前に変数を宣言する必要があります。
データ型
スクラッチとの違いは、宣言時に「データ型」というどのような情報をその変数に入れるのか、ということも併せて記述する必要があります。
主に使用される変数のデータ型
型 | サイズ(ビット) | 意味 | 初期値 |
bool | 8 | 真偽型 | false |
char | 16 | 1文字 | \0 (null文字) |
int | 16 | 整数 | 0 |
float | 32 | 浮動小数点 | 0 |
string | | 文字列 | ""(空文字) |
アクセス修飾子
Unityでは作成した変数を自分のクラスでのみ使用するのか?他のクラスでも使用できるのか?という「アクセス修飾子」を指定します。アクセス修飾子は省略可能で、省略した場合は「private」となり、そのクラスのみでしか使用できなくなります。アクセス修飾子には下のように5つのタイプがありますが、通常、public とprivate を意識すれば大丈夫でしょう。
アクセス修飾子 | 概要 |
public | 全てのクラスからアクセス可 |
protected internal | 同じアセンブリ内のクラスとそのサブクラスに対してアクセス可 |
protected | 同じクラス内とサブクラス内からのアクセスを可 |
internal | 同じアセンブリ内からのみアクセス可 |
private | 同じクラスからのみアクセス可 |
※通常はUnityプロジェクト内のすべてのスクリプトが同じアセンブリに含まれます
命名規則
変数には次のような命名規則があります。
1文字目はアルファベット、またはアンダースコア
2文字目以降は1文字目で使える文字、または数字
変数名に含まれるアルファベットの大文字/小文字は区別される
予約語ではない(型名やfor、while、null、bleakなど他に使用されるもの以外)
変数の使用例
bool isRun;
int num;
float posX;
string s
変数を〇にする
変数の値を変更することを「代入する」と言います。
左辺に変数を配置し、=(イコール)の記号で任意の値を代入します。
使用例
isRun = true; //isRun を true にする
num = 100; //num に100を代入する
posX = transoform.position.x; //PosX にx座標を代入する
s = "合計は" + num; //s に 合計は100 と代入する
変数を〇ずつ変える
変数を変える場合、現在の値に特定の値を加算していく、などの加算代入演算子や減算代入演算子が用いられるケースがよく見られます。 先に説明した「変数を〇にする」と区別せずに使われるケースがほとんどです。
使用例
num += 2; //num を 2 ずつ変える
posX -= transoform.position.x; //posX を x座標ずつ減らす
変数表示する/隠す
Unityではもともとスクラッチの様に、ステージ上に変数を表示するという機能がありません。変数を表示したい場合は、UIを使用すると良いでしょう。
事前に下のように変数を表示するためのUI、Textを配置します。
変数の宣言と初期値の取得
GameObject variableText;
void Start()
{
variableText = GameObject.Find("Canvas/Text");
}
変数を隠す
variableText.SetActive(false);
変数を表示する
variableText.SetActive(true);
リスト
Unityのリストはスクラッチと同様、動的で自由に要素を追加したり削除することが出来ます。
リストを使用するには、変数と同様、事前にデータ型、アクセス修飾子と共にリストを宣言します。変数と違い「List<型名 リスト名>」 で宣言、「new List<型名>()」で初期化してから使用します。
使用例
List<int> mylist = new List<int>();
List<float> score = new List<float>();
List<string> str = new List<string>();
宣言時にリストに要素を追加するときは、{ } で要素全体を囲み個々の要素の間を「,(カンマ)」で区切ります。
使用例
List<int> mylist = new List<int>{ 10, 20, 30 };
List<float> score = new List<float>{ 1.1f, 2.5f, 4.3f, 6.9f };
List<string> menu = new List<string>{ "ライス", "パン", "パスタ"};
「なにか」をリストに追加する
リストに要素を追加するときは Add() メソッド を使用します。Add()メソッドでは末尾に要素が追加されます。
使用例
mylist.Add(40); //mylist に40を追加
score.Add(5.7f); //score に5.7fを追加
menu.Add("うどん"); //menu に"うどん"を追加
リストの○番目を削除する
リストの n 番目の要素を削除するには、RemoveAt(n) メソッドを使用します。なお要素は0番目から開始するので、最初のデータを削除するには RemoveAt(0) となります。
使用例
mylist.RemoveAt(2); //mylist から 3番目の要素を削除
score.RemoveAt(1); //score から 2番目の要素を削除
menu.RemoveAt(0); //menu の最初の要素を削除
また、RemoveRange()メソッドを使うと、指定した場所から指定した数だけ要素を削除することが出来ます。RemoveRange(index , count) と指定した時、index番目からcount個の要素が削除されます。
使用例
mylist.RemoveRange(2,2); //mylist の3番目から4番目までの要素を削除
score.RemoveRange(1,1); //score の2番目の要素、1つのみを削除
menu.RemoveRange(0, 3); //menu の最初から3つの要素を削除
リストのすべてを削除する
リストの すべてを削除するには Clear() メソッドを使用します。
使用例
mylist.Clear(); //mylist の全てを削除
score.Clear(); //score の全てを削除
menu.Clear(); //menu の全てを削除
リストの○番目に何かを挿入する
番号を指定してリストに要素を挿入するには、Insert()メソッドを使用します。
Insert( index , item) と指定したとき、 index 番目に item という要素が挿入されます。
使用例
mylist.Insert(1,15); //mylist の2番目に 15 を挿入
score.Insert(0,0.5f); //score の1番目に 0.5f を挿入
menu.Insert(3,"そば"); //mylist の4番目に "そば" を挿入
リストの○番目を何かで置き換える
リストの要素を置き換えるには、そのリストにアクセスし、新たな値で置き換えます。
使用例
mylist[1] = 18; //mylist の2番を 18 で置換
score[3] = 2.9f; //score の4番を 2.9f で置換
menu[0] = "ごはん"; //menu の1番を "ごはん" で置換
リストの○番目
リストの n 番目を指定するには リスト名[0] の様に[ ]で囲ってindex番号を指定します。index番号は 0 番目から始まるので注意しましょう。
使用例
mylist[1] //mylist の2番
score[3] //score の4番
menu[0] //menu の1番
リストの中の「なにか」の場所
リストの中の特定の要素の場所を探すには、IndexOf()メソッドを使用します。検索する要素が対象リストの一番前にあれば、0 を返します。もし指定した要素が無い場合は、-1 を返します。
使用例
Debug.Log(mylist.IndexOf(30)); //mylist の中の30のある場所を表示
Debug.Log(score.IndexOf(0.0f)); //score の中の 0.0f がある場所を表示
Debug.Log(menu.IndexOf("パスタ")); //menu の中の"パスタ"のある場所を表示
※2番目のscore の中には 0.0f が無いので、-1 と表示されます
indexOfメソッドは、第二引数に検索開始位置、第三引数に検索する要素数を指定し、細かい検索を行うことが出来ます。
また、LastIndexOf()メソッド を使用して、指定した要素の位置を後方から検索することもできます。このメソッドも第二引数に検索開始位置、第三引数に検索する要素数を指定し、細かい検索を行うことが出来ます。
使用例
Debug.Log(mylist.LastIndexOf(30)); //mylist の要素を後方から検索
Debug.Log(score.IndexOf(1.1f,3,2)); //score の要素を後方4番目から2つ検索
Debug.Log(menu.IndexOf("パスタ", 0, 4)); //nemu の要素を後方0番目から4つ検索
リストの長さ
スクラッチの「リストの長さ」はリストの要素数を表します。UnityではCountプロパティを使って要素数を取得することが出来ます。
使用例
Debug.Log(mylist.Count); //mylist の要素数を表示
Debug.Log(score.Count); //score の要素数を表示
Debug.Log(menu.Count); //menu の要素数を表示
リストに「なにか」が含まれる
リストに特定の要素が含まれるかどうかを調べるには Conteins()メソッド を使用します。
もし含まれていたら true を、含まれていなければ false を返します。
使用例
if (menu.Contains("パスタ")) //もし menu に「パスタ」が含まれていたら
{
Debug.Log("はい、ございます"); //「はい、ございます」と表示
}
else //なければ
{
Debug.Log("少々お待ちください"); //「もう少々お待ちください」と表示
menu.Add("パスタ"); //menu に「パスタ」を追加
}
リストを表示する
変数と同様に、Unityではリストを表示する、非表示するという機能はありません。
スクラッチではリストを表示したときに、ステージ上にリスト内の要素が表示されますので、今回はその機能をご紹介します。
foreach()文を使うことで、リスト内の全ての要素を表示することが出来ます。
使用例
foreach (int i in mylist) //mylist の要素数の数だけ繰り返す
{
Debug.Log(i); //i番目の要素を表示
}
foreach (float j in score) //score の要素数の数だけ繰り返す
{
Debug.Log(j); //j番目の要素を表示
}
foreach (string k in menu) //menu の要素数の数だけ繰り返す
{
Debug.Log(k); //k番目の要素を表示
}
リストをステージ上に表示するにはUI のテキストを使用します。スクロールビューを活用すると、リストが多くなった時にリストが多くなった時にスクロールで送ることが出来ます。
今回は左の図の様にリストを表示してみたいと思います。
まずは下の図の様に、Canvasの配下に ScrollView を配置してください。ScrollViewの配下には各種パーツが配置されています。
ScrollView の配下の VewPort、さらにその配下の Content 、この配下にテキストを置くことで、ScrollView に文字が表示されます。
Content の設定 ・AnchorPreset をTop Left に指定し、Width:200、Height:300 程度に指定 ・GridLayoutGroupコンポーネントを追加(子要素を均等に並べるコンポーネント) → CellSizeを x:200、y:25 程度に指定(要素の幅と高さ)
ListText の配置 Content の配下に UI の Text を新たに配置、「ListText」などの名前を指定 「ListText」をAssetフォルダにドラッグ&ドロップでプレハブ化 Content配下のオブジェクトは削除しておきましょう。
変数の宣言
GameObject content; //SclrollView の Content オブジェクト
public GameObject textPrefab; //上で作ったListTextのプレハブ
作成中のスクリプトファイルは UI の ScrollView にアタッチします。
上で宣言した変数:textPrefab には先に作成済みの ListText のプレハブをAssign
リストの作成(未作成の場合は作っておきます)
List<string> menu = new List<string> { "ライス", "パン", "パスタ", "そば", "うどん" };
変数の初期値取得とリストの表示
void Start()
{
//変数content を探して代入
content = transform.Find("Viewport/Content").gameObject;
content.GetComponent<RectTransform>().sizeDelta =
new Vector2(180f, menu.Count * 25); //content の大きさを指定
foreach (string i in menu) //リストの要素数だけ繰り返す
{
//textPrefab のインスタンスを生成し、menuText の名前で変数化
GameObject menuText = Instantiate(textPrefab);
//nemuText を content の子要素に(LayoutGridGroupの効果で整列)
menuText.transform.SetParent(content.transform,false);
//menuText の文字にリストのi番目を代入
menuText.GetComponent<Text>().text = i;
}
}
作成したリストを表示する
content.SetActive(true); //リストを表示する
リストを隠す
上で作成したリストを隠す方法です。
作成したリストを隠す
content.SetActive(false); //リストを隠す
配列
スクラッチにはないのですが、リストと似ている機能として、Unityには「配列」というものがあります。
配列はリストと違って次のような特徴があります。
1つの配列に複数のデータを格納できるが、静的で内部の要素数は一度決めたら固定
1つの要素にさらに要素を加える(多次元構造)が可能
配列の宣言
配列は使用する前に型、要素数、配列名を指定します。使用する要素を直接代入することで、要素数の宣言を省略することも可能です。
配列の宣言
string[] name = new string[3]; //配列の宣言、初期値 ""が登録
float[] temp = { 1.4f, 1.9f, 2.8f, 3.2f }; //要素数4の配列に値を代入
int[,] data = new int[,]{ {11,2 }, {12,3}, {13,4} }; //3×2 の配列
配列へのアクセス
配列にアクセスするには[]内にindex数を指定してアクセスします。
配列へのアクセス
name[0] = "taro"; //name の1番目に "taro" を代入
Debug.Log(temp[2]); //temp の3番目 2.8 と表示
data[2, 1] = 7; //[2,1]の要素4という値を7に置換
配列の要素数
配列の要素数は Length プロパティで取得します
配列の要素数
Debug.Log(name.Length); //nameの要素数、3と表示される
Debug.Log(temp.Length); //tempの要素数、4と表示される
Debug.Log(data.Length); //多次元配列の場合、全ての要素数 6 と表示
ファイブボックスでは、スクラッチはもう卒業、という方向けにUnityの個別指導のオンラインレッスンを行っています。
ご興味のある方は当サイト、オンラインレッスンから、無料体験授業へお問い合わせ下さい。
Comments