【初心者Unity】C#におけるアクセス修飾子
アクセス修飾子とは
アクセス修飾子は「public」 や「private」といった物で、クラスやメソッド、変数の前につけることによってそれらクラス等にアクセスできる範囲を制限することができます。アクセス修飾子はメンバ(※)(クラス・メソッド・変数)につけることができます。つけないことも可能ですが、つけなければデフォルトで「private」となります。メンバ以外には「public」か「internal」のみつけることが可能です。メンバ同様、つけないことも可能ですが、つけなければデフォルトで「internal」となります。また、名前空間(※)にはアクセス修飾子はつけることができず、常にpublicと同じ扱いとなります。
Unityで変数をpublicにすると自動的にシリアライズ化される場合があります。シリアライズ化とはソフトウェア内部で扱っているデータをそのまま保存したり送受信することができるように変換することです。具体的には、Unityにおいて変数がシリアライズ化されるとその変数はインスペクターに表示されるようになります。つまり、スクリプトを変更しなくてもインスペクターの値を編集することで値を変更することができるということです。基本データ型やUnityが定義している構造体(※)はシリアライズ化することができますが、自身で定義した構造体はシリアライズ化することはできません。
※名前空間
名前空間とは、フォルダの様なものです。例えば、主人公と敵キャラクターの攻撃をそれぞれクラスとして定義しようとした際に名前空間を利用しないと、「PlayerAttackSlash」「PlayerAttackHit」「PlayerAttackKick」「EnemyAttackSlash」「EnemyAttackHit」「EnemyAttackKick」というように各クラスの名前が長くなってしまします。名前空間の活用により、それぞれのクラスをカテゴリー毎に分けることによって、「Player」という名前空間の「Attack」という名前空間の中にクラス「Slash」「Hit」「Kick」を記述し、「Enemy」という名前空間の「Attack」という名前空間の中にクラス「Slash」「Hit」「Kick」を記述することで、各クラスの名前を短くすることができます。また、「usingステートメント」を記述することで名前空間に作成したクラスの機能がを使うことができます。名前空間内にはクラスと構造体を記述することができます。
※構造体
構造体はクラスと同様に、設計図としての役割を持ちます。つまり、構造体もインスタンス化し、Unity内のゲームオブジェクトを実体化することができます。クラスとの違いは、クラスは参照型で、構造体は値型であるということです。
※メンバ
クラスや構造体の中に書けるものです。変数やメソッド、入れ子にされたクラスや構造体がそれにあたります。メンバとしての変数を、メンバ変数やフィールド、メソッドをメンバメソッド、クラスや構造体を内部クラスや内部構造体と呼びます。
アクセス修飾子一覧
・public
自分のクラスのみならず、他のクラスからも参照可能となっており、無制限に参照することができます。
・protected
自分のクラスと、自分のクラスと継承関係にあるクラスも参照可能です。
・private
自分のクラスでのみ参照可能です。
・internal
同一アセンブリであれば参照可能です。同一アセンブリとは同一プロジェクトであるということを表し、Unityでいえば、一つのゲームに関わっているクラスは全て同一アセンブリであるといえます。
・protected internal
同一アセンブリと、自分のクラスと包含関係にあるクラスも参照可能です。
・private protected
自分のクラスと包含関係にあるクラス、そのクラスと継承関係にあるクラスも参照可能です。