Movatterモバイル変換


[0]ホーム

URL:


UnityC# クラスとインスタンスの作り方・コンストラクタの使い方

クラスについての画像Unity C#入門講座
クラスは変数やメソッドなど関連性があるものをまとめたものになる。


Unity入門の森オリジナル本格ゲーム制作講座はこちら
11種類の本格ゲームの全ソースコード公開・画像&動画による解説付き

今回の記事ではクラスについて解説していきます。

クラスについては複数回に分けて解説します。今回はクラスとインスタンスの基本的な使い方について解説します。

ちなみに構造体(struct)も大体クラスと同じものになり、ここで解説する用法は構造体でも使えます。

前回の記事:

Unity C#での列挙型と定数の使い方
今回の記事では列挙型と定数について解説していきます。列挙型を使うとスクリプト上で定数をテキストとして表現でき、より読みやすく設定しやすいコードを書くことができます。前回の記事:列挙型(enum)とは列挙型は値型になり、System.Enum...
feynman.co.jp
2021.09.11

【Line登録者限定のプレゼントもあるよ!】

クラスとは

クラスは変数やメソッドなど関連性のある機能をまとめたものになります。

C#はクラスを組み合わせてプログラムを作成していくオブジェクト指向型プログラミング言語になります。

クラスの中で宣言されたものをメンバと呼びます。変数ならメンバ変数、メソッドならメンバメソッドと呼ばれたりします。クラスの中で宣言された変数はフィールド(Field)と呼ばれます。

次のものはクラスの定義の書き方になります。メンバ宣言にはpublicなどアクセス修飾子をつけることができますがこれについての詳細はこれ以降の記事で解説します。

class <クラス名> { <メンバ宣言>... }

classについて
C#
1
2
3
4
5
6
7
//Sampleという名前を持つクラスを定義する。
classSample{
  publicintValue=0;
  publicvoidMethod(){
    // ...
  }
}

クラスとインスタンスの違い

クラスとインスタンスの違いの画像

インスタンスはクラス定義からnew演算子を使って作成される値になる。

クラスを定義しただけではあまり意味はありません。クラスを利用する際にはインスタンスを作成する必要があります。

それぞれの役割を例えると、クラスは設計図になり、インスタンスは設計図をもとに作成された生成物になります。

インスタンスを作成するときはnew演算子を使用します。書き方は以下のように先にnewを書いてからクラス名を続けます。クラス名の後にはコンストラクタ(※)への引数を書きます。

(※コンストラクタについてはこの後に解説します。)

new <クラス名>(<引数>...)

一度作成したインスタンスにはクラス定義にあるメンバが存在しています。それらメンバを使用したい、アクセスしたいときは.演算子を使用してください

<インスタンス> . <メンバ>

クラスは参照型になります。インスタンスがオブジェクトの属するメンバであるのに対し、クラスのメンバ変数はクラスに属しています。

インスタンスメンバはインスタンスそれぞれが独立した実体(値)を持ちますが、クラスメンバ変数はクラスで一つしか存在できません。全てのインスタンスでそのメンバ変数が共有されます。

クラスのインスタンスを作成する
C#
1
2
3
4
5
6
7
8
9
classA{
  publicintValue=0;
}
 
//インスタンスを作成するときはnew演算子を使用する。
Ainstance=newA();
 
//メンバにアクセスするときは'.'演算子を使用する。
instance.Value+=10;

コンストラクタについて

コンストラクタについての画像

コンストラクタはnew演算子と一緒に呼び出されるメソッドになる。複数個定義できる。

インスタンスを作成する時には必ずコンストラクタが呼び出されます。コンストラクタはインスタンスの初期化を行う特殊なメソッドになります。

書き方はメソッドと似ており、戻り値を省略したものになります

<コンストラクタ名>(<引数>...) { <処理> ... }

また、コンストラクタはクラスの中に複数定義できます。その際は引数が異なるようにコンストラクタを定義してください。

さらにコンストラクタを実行する前に他のコンストラクタを一つだけ実行することもできます。そのためコンストラクタで行う処理を共通化することが可能になります。

他のコンストラクタを呼び出したいときは以下のように引数と鉤括弧の間に: this(<引数>)と書いてください。

コンストラクタの書き方
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
classA{
  publicintValue=0;
 
  //引数なしのコンストラクタ
  // 一つのintをとるコンストラクタを呼び出している。
  publicA():this(10){
  }
 
  //引数付きのコンストラクタ
  // 引数についてはメソッドと同じになります。
  publicA(inta){
    Value=a;
  }
}
 
varinst=newA();// <- OK
varinst2=newA(10);// <- OK

上記コードのpublic A() : this(10) は同じクラス内で別のコンストラクタを実行し、引数として10を与えよという意味になります。

このコードの場合、引数なしでクラスAを呼び出した場合、引数10を与えた初期化コードとして処理されるわけですね。

コンストラクタの注意点

もし、コンストラクタを定義しなかった場合はC#側で自動的に引数なしのコンストラクタが定義されます。

またそれに合わせて注意点として、コンストラクタを一つ以上定義した場合には引数なしのコンストラクタは自動生成されませんそのためインスタンスを作成するときは必ず定義したコンストラクタのいずれかの引数と一致するように値を渡す必要があります。

コンストラクタの注意点
C#
1
2
3
4
5
6
7
8
9
10
11
classA{
  //コンストラクタを定義しなければ、C#によって引数なしのコンストラクタが自動的に定義される。
}
vara=newA();// <- OK
 
classB{
  //一つでもコンストラクタを定義すると、引数なしのコンストラクタは自動生成されない。
  publicB(inta){...}
}
varb=newB();// <- NG
varb2=newB(10);// <- OK

静的なコンストラクタ

コンストラクタにはstaticキーワードをつけた静的コンストラクタというものが存在します。

静的コンストラクタはこれを定義したクラスが初めて使われるタイミングで自動的に実行されます。主な用途として静的メンバ(※)の初期化などに使われます。

使う場合は

  • static修飾子を付けること
  • 他の修飾子は付けられない
  • 引数も指定できない(のちの記事で出てくるオーバーロードもできない)

という特徴を持ちます。

(※静的メンバはプログラムのどこからでもアクセスできるメンバのことです。詳しくは他の記事で解説します。)

静的コンストラクタについて
C#
1
2
3
4
5
classA{
  staticA(){
    // 処理
  }
}

privateなコンストラクタ

privateなコンストラクタとはコンストラクタにprivateというアクセス修飾子(※)をつけたものになります。

このコンストラクタは同じクラスの中からしか呼び出すことができないと指定したコンストラクタになります。そのため、他のクラスの中からインスタンスを作成しようとしてもコンパイルエラーになります。

一見意味のない機能に見えますが以下の用途があります。

  • 静的メンバのみを持つクラスのインスタンスを生成させないようにする

(※アクセス修飾子についてはこれ以降の記事で解説します。)

privateなコンストラクタ
C#
1
2
3
4
5
6
7
classA{
  privateA(){
    // 処理
  }
}
 
vara=newA();// <- NG

【実践】Unityでクラスを実際に定義してみよう!

それでは実際にUnityでクラスを定義してみましょう!

これまで何回も書いてきましたがコンポーネントもクラスになるので既にクラス定義については経験済みです。

ただコンポーネントではコンストラクタは必要ではないので、今回のサンプルではコンストラクタ付きクラスをコンポーネントの中に定義して使ってみましょう!

ちなみにクラスの中に定義されたクラスを子クラスなどと呼んだりします。

Unityでクラスを使ってみよう!
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
usingUnityEngine;
 
publicclassSample:MonoBehaviour{
  publicclassData{
    publicfloatSpeed=0f;
 
    publicData(floatspeed){
      Speed=speed;
    }
 
    publicVector3GetMove(){
      varmove=Vector3.zero;
      move.x=Speed*Time.deltaTime;
      returnmove;
    }
  }
 
  publicfloatSpeed=0;
  publicDatadata;
  
  voidStart(){
    data=newData(Speed);
  }
 
  voidUpdate(){
    transform.position+=data.GetMove();
  }
}
サンプルコード1の画像

再生前にSpeedに設定した値でGameObjectが左右に移動する。Start()の中でdataメンバにSpeedの値を渡しているので、再生後にSpeedの値を変更しても速さは変わらない。

上のサンプルコードではSampleコンポーネントの中でDataというクラスを定義しています。Start()メソッドの中でDataクラスのインスタンスを作成し、Update()メソッドの中で作成したインスタンスからGetMove()メソッドを呼び出しGameObjectを移動させています。

Start()メソッド内でDataクラスのコンストラクタの引数にInspectorから設定した値を渡しています。そのため、再生後にSpeedの値を変更してもGameObjectの移動速度は変わりません。

上のサンプルコードではコンストラクタを使用したかったため、少々回りくどい手順を踏んでいますが、実はクラスのメンバもInspector上から設定することができます。

クラスのメンバをInspectorから設定できるようにする方法

上のサンプルコードで定義したクラスのメンバをInspector上から設定するときは以下のように書いてください。

  • クラス定義の際にSystem.SerializableAttributeを指定すること。
Unityでクラスを使ってみよう!
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
usingUnityEngine;
 
publicclassSample:MonoBehaviour{
  [System.Serializable]
  publicclassData{
    publicfloatSpeed=0f;
 
    publicData(floatspeed){
      Speed=speed;
    }
 
    publicVector3GetMove(){
      varmove=Vector3.zero;
      move.x=Speed*Time.deltaTime;
      returnmove;
    }
  }
 
  publicDatadata;
  
  voidUpdate(){
    transform.position+=data.GetMove();
  }
}

System.SerializableAttributeを指定するとそのクラスがコンポーネントのメンバにある場合Unityエディタが自動的にInspectorから設定してくれます。

System.SerializableAttributeを指定しておけば、そのクラスに関してはクラス型のメンバが入れ子で定義されていてもその全てInspector上から設定することができます(※)。

(※クラス定義によっては無限に入れ子を作ることができますが、入れ子の上限は存在しています。)

また、コンストラクタ自体もUnity側から呼び出されるため、わざわざStart()メソッドの中でインスタンス生成する必要はなくなりますので、削除しています。

また、Inspectorから直接Dataクラスのメンバを変更しているのでこちらは再生後にSpeedの値を変更するとGameObjectの移動速度に反映されます。

サンプルコード2Inspectorの画像

クラス定義にSystem.SerializableAttributeを指定するとInspectorから設定できるようになる。こちらのサンプルでは直接Dataクラスのメンバを変更しているので再生後でもGameObjectの移動速度に反映される。

まとめ

今回の記事をまとめると以下になります。

  • クラスは関連する変数、メソッドなどをまとめたもの。
  • コンポーネントもクラスである。
  • インスタンスはクラス定義から作成されたもの。
  • new演算子を使ってインスタンスを作成する。
  • インスタンス作成の時にはコンストラクタという特殊なメソッドが自動的に呼び出される。
  • コンストラクタは他のコンストラクタの処理を一つだけ先に実行することができる。
  • 何もコンストラクタを定義しなかった場合は引数なしのコンストラクタがC#によって作成される。
  • コンストラクタを一つ以上定義した場合はインスタンス生成時に必ず定義したコンストラクタと一致した引数を渡さないといけない。
  • 静的コンストラクタはアプリ実行中一度だけ自動的に呼び出されるコンストラクタ。
  • privateなコンストラクタはそのクラスのインスタンスを生成させないためのコンストラクタ。
  • System.SerializableAttributeをクラスに指定するとInspector上からそのクラスのメンバの値を設定することができる。

それでは次の記事に行ってみましょう!

次回の記事:

UnityC#のフィールド・プロパティ・アクセス修飾子の使い方 スコープの概念を理解する
今回の記事ではクラスのメンバであるフィールドとプロパティをまず解説し、次にアクセス修飾子とスコープについての理解を深めていきます。ややこしいところですが、頑張っていきましょう!前回の記事:クラスにフィールドとプロパティを持たせてみようそれで...
feynman.co.jp
2021.09.11

初心者向けUnityC#入門講座に戻る>>



Unity入門の森オリジナル本格ゲーム制作講座はこちら
11種類の本格ゲームの全ソースコード公開・画像&動画による解説付き

関連記事

Unity C#入門講座

UnityC# デリゲートとイベントとUnityActionの使い方

今回の記事ではデリゲートとイベントについて解説していきます。前回は辞書の使い方について解説しましたね。デリゲートとイベントを使うことでメソッドを値として使用することができます。メソッドを値にして利点があるのかと思われますが、アプリでできるこ...
2023.04.22
Unity C#入門講座
Unity C#入門講座

Unity C#言語とは

本連載では、Unity上においてのC#について解説していきます。初めての方でもわかりやすく解説していきますので、お気軽に読んだり、実際にUnity上で動かしてみてください。Unityにおけるプログラミング言語の役割プログラミング言語を使用す...
2023.02.02
Unity C#入門講座
Unity C#入門講座

UnityC# クラスの継承・抽象メソッドとオーバライド is, as, null, this, baseの使い方も解説

今回の記事ではクラスの継承についてみていきます。Unityではコンポーネント自体がUnityEngine.MoneBehaviourを継承したものなので実は既に使用している機能になります。さらにUnityEngine.MonoBehavio...
2023.03.28
Unity C#入門講座
Unity C#入門講座

Unity C#の繰り返し処理の使い方 for文・while文・foreach文

今回の記事では繰り返し処理についてみていきます。アプリ開発ではたくさんのデータに対して同じ処理を行いたい時があるのですが、その時に繰り返し処理を利用することになります。前回の条件分岐の制御文と併せてプログラミングの超重要ポイントの一つです。...
2021.09.11
Unity C#入門講座
Unity C#入門講座

Unity C#の演算子の使い方をマスターしよう

今回の記事では演算子について解説していきます。演算子は簡単に言うと、足し算、掛け算、引き算、割り算などを意味する記号ですね。プログラミングする上ではこうした四則演算以外でも演算子を利用することがあります。以前の記事の中でも既にいくつか使用さ...
2023.03.06
Unity C#入門講座
Unity C#入門講座

Unity C# 変数と型の使い方 宣言や代入・型変換について

前回はコンパイルエラーとその対処法について解説しました。前回の記事:今回の記事ではC#の文法についてみていきましょう!プログラミングにおいて最重要な変数と型についてしっかり解説しています。型については、初心者さんはいきなり全部を理解しようと...
2023.02.04
Unity C#入門講座

コメント

コメントをどうぞコメントをキャンセル

メールアドレスが公開されることはありません。

CAPTCHA


↓知りたいことを検索してね

Unity入門の森 インディーゲームリリース!

魔女と召喚獣

 

Seeker of Darkness

 

呪術迷宮をリリース

unity入門の森 ゲームの作り方のyoutubeチャンネル

unity入門の森 ゲームの作り方
「unity入門の森 ゲームの作り方」のyoutubeチャンネル。unityを用いたゲームプログラミング、unityスクール、ゲームクリエイターになりたい方向けの情報を中心に発信。インディーゲームクリエイター・プロゲーマー・ゲーム実況者を目...
www.youtube.com

ブログランキング参加中(クリックして応援してくれると嬉しいな)

にほんブログ村 教育ブログ プログラミング教育へ
にほんブログ村

カテゴリー

最近の投稿

タイトルとURLをコピーしました

[8]ページ先頭

©2009-2025 Movatter.jp