Help us understand the problem. What is going on with this article?

Unityプログラミング基礎 (変数からclassまで)

More than 1 year has passed since last update.

プログラミングの話は初心者にとって基本的に抽象的で難しく、最初から理解することは難しい。したがってくだけた言葉の説明の方がいいのではという仮説のもと、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型のメソッド
int x,y;
public int Plus(){
    return x + y;
}

この時このように使用する

返り値の型がint型のメソッドの使用例
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);
    }

}

ほら、こんな感じの構造になっているんだ。{}の位置が重要。
すぐに理解できなくても、{}の位置を意識しながらコードを打つとミスが少なくなっていくよ。

iwaken71
Unityの可能性を広げたい人 最近はARとバーチャルYouTuberが好き
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした