UnityのC#で使う変数と宣言方法【共有の仕方も教えます】

Creating Game

こんにちは。あっきーです。
早稲田大学を退学して4年間アメリカ留学に行く予定のもので、ゲーム制作をしています。

unity初心者
unityでプログラムを書きたいんだけど、変数というのがいまいち分からないな。型だったり、他のスクリプトに共有する方法とか知りたい

ということで、今回はunityにおけるC#での変数やその宣言方法を教えます。

これさえ覚えておけばOKという感じで、初心者でも分かりやすく教えますので、最後まで読んでマスターしましょう。

プログラミングにおける「変数」とは

まず、そもそも「変数」って何ぞやというところから簡単に。

「変数」は、unityだけのものではなくて、プログラミング全般で使います。
数学と関連付けて見ると分かりやすいかなと思います。

数学で「x = 3」のような数式があったとするなら、このxを変数と言います。

そして、一度「x = 3」と定義してしまえば、「xに3を掛けたら何になる?」というのも「3x = 9」のように計算も可能になるわけです。

変数を使う理由は使い勝手をよくするため

プログラミングでも全く同じことができます。特にunityではゲーム制作をするわけですから計算も多いです。なので、よりこの変数が重要になってきます。

理由は2つ

  • 値を途中で変える可能性があるから
  • いろんな場所で使う可能性があるから

プログラムを書く際に値は何度も変える

例えば、「キャラクターのHpが10以下だったとき〇〇を行う」みたいなプログラムを書きたい場合。


//hpはキャラクターの現在のhpの値
if(hp <= 10)
{
//何らかの処理
}

と書くことができます。

だけど「やっぱり15以下にしたいな」という場合に、いちいちif()の10を15に変えないといけません。
今はプログラムが少ないので良いですが、どんどん増えていくと、いくつもの10を15に変えないといけません。

これは非常に面倒。

そこで、あらかじめ「あるhpになったら」という基準となる値をもつ変数を作っておいて、その変数を使ってみます。



//baseHpという基準の変数を作り、その値が10
private int baseHp = 10

//hpはキャラクターの現在のhpの値
if(hp <= baseHp)
{
//何らかの処理
}

先ほどのif()にあった10を代わりにbaseHpにするとどうでしょう。「やっぱり15以下にしたい」というときは、最初のbaseHpの値を15に変えるだけでOkですよね。

変数を使うことで、値の変更をしたい場合に簡単に変えることができるわけです。

変数を使うことで情報を入手できる

また、ある値をいろんなスクリプトで使いたいという場合も出てくるかと思います。

例えばスクリプトAにある「キャラクターのHp」を使って、スクリプトBで何らかの処理をしたいという場合もあるかと思います(例えば、「キャラのHpが満タンの時、敵は無敵になる」みたいな)。

この場合も、「キャラクターのHp」として変数"hp"を定義しておくと簡単に共有することができます。

変更とか共有とかがあるからそれに対応するために変数を使うということを理解しておきましょう。

プログラムでは変数に「型」がある

では、ここから実践編ということでやっていきます。
プログラミングで使う変数と数学で使う変数では1つ大きな違いがあります。
プログラミングには型というものが存在します。

数学では変数xに「x = 3」でも「x = 2.5」でも、整数でも小数でも何でも入れられます。
ですが、プログラミングでは「整数」や「小数」という感じで変数に型を決めていくんです。

まずはここを頭に入れておいて、具体的な型を紹介します。

C#における変数

プログラム上での書き方 メモリ数と取り得る値
整数 int 4バイト
long 8バイト
実数(小数) float 4バイト
double 8バイト
論理値 bool trueかfalse
文字 char 文字1つ
string 文字列(配列)
型推論 var 代入値で型が自動で決まる

メモリ数の方は今のところ気にしなくてもOKです。メモリが大きい方がより大きな数を扱えるという理解でOKです。

太文字にしたところは特によく使うものなので、最低限この4つはチェックしておきましょう。

Unity特有の変数の型

また、Unityならではの特殊な型も存在します。GameObjectやRigidbodyなどです。
unityのそれぞれのオブジェクトはGameObjectという型を持っています。

また、コンポーネントと呼ばれるものもあり、そのコンポーネントが変数の型となります。
(コンポーネントはTransformやRigidbodyといったものです。)

使い方はintやfloatと同じです。

C#で変数を宣言する方法

では、実際に変数を使っていきます。
変数は以下のように宣言します。


(privateのような公開設定に関しては後程)

実際にやってみましょう。


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Sample : MonoBehaviour
{
    private int intType = 0;
    private float floatType = 1.2f;
    private bool boolType = true;
    private string stringType = "Hello";
    private GameObject gameObject;
    private Rigidbody rigidbody;

    void Start()
    {
        var varType = 1;
        
        //gameobjectとrigidbodyの取得
        gameObject = GameObject.Find("Cube1");
        rigidbody = GetComponent();

        //コンソール画面に各値を出力
        Debug.Log(intType);
        Debug.Log(floatType);
        Debug.Log(boolType);
        Debug.Log(stringType);
        Debug.Log(gameObject);
        Debug.Log(rigidbody);
        Debug.Log(varType);
    }
}

(GameObjectとRigidbodyの取得に関しては別記事で)

最初に変数を宣言して、それをコンソール画面に表示していきます。

このように結果が出ていますね。

このようにして変数を宣言しながら、変数を扱っていろんな処理をしていきます。

型にあった値でないとエラーが起こる

よくあるミスで設定した型とは異なる値を入れてしまうことがあります。

例えば、こんな感じ


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Sample : MonoBehaviour
{
private int errorNum = 3.14f;
}

errorNumはint型なので整数だけを扱うことができます。なので3.14という小数を入れることはできません。
このようにすると、コンソール画面にエラーが出ます。

「int型なのにfloat型の値は入れられませんよ」というメッセージが出ています。

変数の型と値の型をしっかり揃えるように気をつけましょう。

変数宣言のポイント

もう一つ、変数の宣言では決まりごとがあります。
変数の名前の決め方です。

変数は好き勝手に文字を並べるのはよくありません。
以下のポイントに気を付けてください。

  • 意味が分かる名前にする
  • 最初は小文字で始める
  • 単語の区切れで大文字にする

当たり前ですが、意味の分かる名前をつけましょう。「キャラの体力」なら"hp"、「得点」なら"score"という感じです。
また、最初は小文字で始めます。

また、「キャラクターの最大HP」の変数を作りたいとき、名前としては「Max Hp」が分かりやすいと思います。
プログラムでは空白が使えないので、これを1つの文字列で書かないといけません。このとき「Max」と「Hp」と分かれるので変数名としては、"maxHp"と書きます。
(もちろん"maxhp"でも良いんですが、意味が分かりにくいですよね。)

-(ハイフン)や_(アンダーバー)は使いません。

変数の付け方も気を付けましょう。

変数の公開設定:privateとpublic

最後に、変数宣言のときに、頭にprivateという文字がありました。
これは変数の公開設定をしています。

これには2種類あります。

  • private:そのスクリプト内のみで使える
  • public:すべてのスクリプトで使える

実際にプログラムを書いて違いを見てみましょう。


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Sample1 : MonoBehaviour
{
    public int num1 = 10;
    private int num2 = 20; 
}

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Sample2 : MonoBehaviour
{
    private int num;
    public Sample1 sample1;

    // Start is called before the first frame update
    void Start()
    {
        num = sample1.num1;

        Debug.Log(num);
    }
}

Sample1, Sample2というスクリプトをそれぞれ作りました。

この状態でオブジェクトにアタッチしてみます。

すると、publicにした場合はインスペクター上で値を設定できることが分かりますね。
例えば、Sample1ではnum1の数値はここで設定できますが、num2の数値はここでは設定できません。

また、実行もしてみましょう。

10という値が出ましたね。

これは、Sample1のnum1の値をSample2で取得できていることが分かります。
このようにprivateとpublicに違いがあります。

外部から変更できないように設計する

こう見るとpublicを使った方が、インスペクター上で楽に値を変えられるし、取得もできるから良いかと思いますよね。
確かにそうなんですが、なんでもかんでもpublicを使うのはオススメしません。

publicは言い換えれば、外部から操作しやすいということです。
外部から操作しやすいとなると、ゲームデータを簡単に変えられることになりますし、予期せぬバグも起こり得ます。

まあ、個人製作のレベルであまりないとは思いますが、基本はprivateで完結させるのがベストです。

まとめ

ということで、今回はC#での変数の使い方について解説しました。
変数は大変よく使うので必ずマスターしておきましょう。

使っていけば分かってきますので、自分でプログラムを書きながら少しずつ慣れていきましょう。

それでは、また。

人気記事現役大学生が告白!大学生がブログを始めるのをオススメする理由

人気記事WordPress(ワードプレス)の始め方【初心者でも15分で開設】