プログラミングの話は初心者にとって基本的に抽象的で難しく、最初から理解することは難しい。したがってくだけた言葉の説明の方がいいのではという仮説のもと、Unityのプログラミングに関する基礎について紹介する。
演習も準備しました。
Unityプログラミング基礎演習 (変数編)
型
男子トイレには男子しか入れない。女子トイレには女子しかはいれない。これを破ったら犯罪。プログラミングの変数も一緒。型をそろえないと犯罪(エラー)なのだ。
まず変数を宣言せよ
まず変数って何よ。そこから。
数学で方程式を解く時にxと置いたように、何か記憶してくれる便利なメモリーを「変数」という。とにかく便利なのだ。最初はとにかく慣れるしかない。理解より慣れ。
変数には型がある。そして使用するには宣言をする必要がある。さぁ変数を宣言しよう。
int x = 0;
よし、整数型の変数xを宣言できたぞ。初期値は0だ。
君はこれからこのxを好きに使うことができる。ただし整数しか入らないから気をつけて。どのように使うかは、たくさんプログラミングコードを写して慣れて慣れて覚えよう。
型の表
型名 | 読み方 | 意味 | 例 | 備考 |
---|---|---|---|---|
int |
イント | 整数 | 3 |
|
float |
フロート | 小数 | 3.5f |
fをつけないとダメ |
string |
ストリング | 文字列 | "tanaka" |
ダブルクォーテーションで囲う |
bool |
ブール | 真偽値 | true |
trueかfalse |
Vector3 |
ベクタースリー | 3次元ベクトル | new Vector3(1,1,1) |
|
GameObject |
ゲームオブジェクト | そのまま | ||
Transform |
トランスフォーム | transform |
試しに使ってみる
int x = 4; // int型でxという名前の変数を宣言、初期値は4
x = 3.0f; //型が違うのでエラー
はいはい型が違うからエラーだよ。どうしても代入したい場合は型変換を行おう。
int x = 4;
x = (int)3.0f; //float(小数型) から int(整数型)に型変換
(int)を前につけるとint型に変換するようになるぞ。あとstring
型にしたい場合は「何か.ToString()」をつける。特殊なので覚えよう
string moji; // string 型 初期値はいれなくてもいいんだよ
int x = 4; // 整数型
moji = x.ToString(); // 整数型から文字列型に変換
moji = x; //こいつは犯罪
演算子
やけに仲がいい男女、二人の関係は気になるよね。プログラミングでは二つの変数の関係は演算子によって決まる。
演算子 | 例 | 結果 | 意味 |
---|---|---|---|
= |
x = 2 |
x = 2 |
xに2を"代入"する。(等号じゃない) |
+ |
2+3 |
5 |
足し算 |
- |
3-2 |
1 |
引き算 |
* |
3*4 |
12 | 乗算 |
/ |
4/2 |
2 |
割り算 |
/ |
5/2 |
2 |
整数の割り算は商も整数 |
/ |
5.0f/2.0f |
2.5f |
小数の割り算は商も小数 |
% |
5%2 |
1 |
余り |
+= |
5 += 2 |
7 |
右辺を左辺に足す |
++ |
4++ |
5 |
1ふやす |
== |
1 == 2 |
false |
同じかどうか |
== |
"タナカ" == "タナカ" |
true |
おなじかどうか |
!= |
1 != 2 |
true |
違うならばtrue |
&& |
true && false |
flase |
論理積(どっちもtrueだったらtrue) |
&& |
true && true |
true |
論理積(どっちもtrueだったらtrue) |
|| |
false||true |
true |
論理和(どっちかがtrueだったらtrue) |
あとこれは本当によくあるミスなんだけど
if(x = 4){
// xは4です。
}
これは間違いです。代入しています。正しくは
if(x == 4){
// xは4です。
}
if文の条件文のイコールは(==)二つです。同じかどうか聞きたいわけですから。
メソッド
毎日毎日同じことを命令するのは面倒くさい。
まとまって命令してくれるロボット君がいればな...
はいメソッドの出番です。
命令をまとめて書いてしまおう。
public void Meirei(){
//告白する
//花束を渡す
//ふられる
}
これはこういう構成になっているんだ
アクセス演算子 返り値 メソッド名(引数){
//まとまって命令を書く
}
アクセス修飾子
アクセス修飾子 | アクセスの制限 | 備考 |
---|---|---|
public |
アクセス制限なし | Scriptの外から使用できる(例:ボタン) |
(省略) |
private と同じ |
|
private |
そのクラス内のみ使用可能 |
メソッドはとりあえずpublicをつけていれば大丈夫だと思う。
publicは省略することも可能。その場合はスクリプトの外から使用することはできない。
多分最初は難しいと思うから、とりあえず教科書写しながらなれていこう。
返り値
返り値には型の名前が入る。(intとかfloatとか)
void は「空っぽ」の意味。つまり返り値無し。Unityではあんまり気にせずvoidにしておけばいいと思う。
逆に返り値があるメソッドの例は
int x,y;
public int Plus(){
return x + y;
}
この時このように使用する
int x = 2;
int y = 3;
void Start(){
int answer = Plus(); //Plusメソッドを呼び出す
// answerの中身は5
}
// Plusメソッドの宣言
public int Plus(){
return x + y;
}
メソッド名
好きな名前つけようぜ。ポケモンの主人公の名前をつけるみたいにさ。でも何の意味をもつメソッドなのかはわかるようにしてね。
引数
これも型を指定して使う。これも教科書を移してなんとなく決まった形のを覚えていけばOK
void Start(){
Plus(2,4); //6を出力
Plus(1,2); //3を出力
}
// 引数ありのメソッドを宣言
public void Plus(int x,int y){
int answer = x + y;
Debug.Log(answer);
}
メソッドはいつ呼ばれる?
メソッドを作ったがいいが、使わないと意味ないぞ。
Meirei();
Meirei();
Meirei();
Meirei();
Meirei();
//5回も告白してふられてしまったようだ
これで自分が作ったメソッドが呼ばれる。めでたしめでたし。
Unityで定められている名前のメソッド(オーバーライドメソッド)
実はUnityには特有のメソッドがあって、この人達は呼ばれるタイミングがきまっているのよね、役者さんみたいに。こいつらの名前を覚えないわけにはいかん!
// 俺さ...何かに触れ合った時に呼ばれるんだよね...
void OnTriggerEnter(Collider col){
//触れた時に処理したいことを書く
}
ここでいうオブジェクトとは、このスクリプトを張っているオブジェクトのことである。
本当の詳しいタイミングはここを見るべし
イベント関数の実行順
(下の表はわかりやすいように雑に書いてある)
メソッド名 | 実行される時 |
---|---|
Start() |
ゲームが始まった時 |
Update() |
フレームが変わる毎 |
Awake() |
Startメソッドより前 |
FixedUpdate() |
固定のインターバルで呼ばれます。defaultでは0.02秒(50fps) |
OnTriggerEnter(Collider col) |
オブジェクトがis Triggerな他のオブジェクトに触れた瞬間 |
OnTriggerStay(Collider col) |
オブジェクトがis Triggerな他のオブジェクトに触れている間ずっと |
OnTriggerExit(Collider col) |
オブジェクトがis Triggerな他のオブジェクトから離れた瞬間 |
OnCollisionEnter(Collision col) |
オブジェクトがis Triggerでない他のオブジェクトと衝突したとき |
OnCollisionStay(Collision col) |
オブジェクトがis Triggerでない他のオブジェクトと衝突している間 |
OnCollisionExit(Collision col) |
オブジェクトがis Triggerでない他のオブジェクトから離れた瞬間 |
厳密には違うといわれるかもしれないけど、イメージはこんな感じだ。
Unityで覚えておくべきメソッド
これも覚えないとね、Unityでよく出るコード
意味を覚えるより、実際に教科書で使って体感すべし
メソッド名 | 実行される時 |
---|---|
Destroy(ゲームオブジェクト) |
ゲームオブジェクトを破壊する |
Instantiate(ゲームオブジェクト,場所,回転) |
オブジェクトを生成する |
Application.LoadLevel(シーン名) |
"シーン名"に移動する |
Invoke(メソッド名,何秒後) |
"メソッド名"を何秒後に呼び出す |
GameObject.Find("名前") |
シーン上の"名前"とおなじゲームオブジェクトを探す |
宛先のオブジェクト.SendMessage(命令の名前) |
オブジェクトに命令をする |
Input.GetKey(KeyCode) |
キーを押している間 true それ以外 false |
Input.GetKeyDown(KeyCode) |
キーを押した瞬間 true それ以外 false |
Input.GetKeyUp(KeyCode) |
キーを離した瞬間 true それ以外 false |
Input.MouseButton(0) |
左クリックを押している時 |
GetComponent<コンポート名>() |
コンポーネントを手に入れる |
そもそもC#ってどんな仕組みなのよ
あのさ...みんなC#のスクリプトの構造わかってる?
全てはclassの中に書いているという意識持ってる?
classは設計図
今から「タナカ」という人間の設計図をつくる。
class Tanaka{
}
このカッコの中に書いているんだよ。この外に書いたらもちろんエラーなんだよ。
もっとUnityっぽく書くと
public class Tanaka : MonoBehaviour{
}
さらに書くと
using UnityEngine;
using System.Collections;
public class Tanaka : MonoBehaviour{
}
Unityはこんな感じだね、それでclassの中に書けるものは2種類しかないんだ。もう実は習っている。変数とメソッドだよ。
まず変数を書いてみよう。
using UnityEngine;
using System.Collections;
public class Tanaka : MonoBehaviour{
string name = "tanaka"; //名前
int old = 22; //年齢
float tall = 165.9f; //身長
bool man = true; //男かどうか
string location = "house"; //場所
}
ほら変数を書いた。変数は能力値みたいなもの。
次はメソッド書くよ。
using UnityEngine;
using System.Collections;
public class Tanaka : MonoBehaviour{
string name = "tanaka"; //名前
int old = 22; //年齢
float tall = 165.9f; //身長
bool man = true; //男かどうか
string location = "house"; // 場所
void Start(){
name = "iwasaki"; //最初はiwasaki
}
void Update(){
// LifeisTech!にいる時はtanaka
if(location == "LifeisTech!"){
name = "tanaka";
}
}
}
Start(){}とUpdate(){}の中に書こう。
そして普通の関数も
using UnityEngine;
using System.Collections;
public class Tanaka : MonoBehaviour{
string name = "tanaka"; //名前
int old = 22; //年齢
float tall = 165.9f; //身長
bool man = true; //男かどうか
string location = "house"; // 場所
void Start(){
name = "iwasaki"; //最初はiwasaki
}
void Update(){
// LifeisTech!にいる時はtanaka
if(location == "LifeisTech!"){
name = "tanaka";
}
Walk(); // 歩く
}
//Walkメソッドの中身
void Walk(){
//前に進む
transform.position += new Vector3(0,0,1);
}
}
ほら、こんな感じの構造になっているんだ。{}の位置が重要。
すぐに理解できなくても、{}の位置を意識しながらコードを打つとミスが少なくなっていくよ。