修飾子とは?

型指定は覚えてるかい?

int num とか string name とかだったよね?それがどうしたの

変数には型指定の他にも修飾子をつけて、変数の特性を明確にすることで可読性や安全性を向上させる役割があるんだ

型指定で変数の中身を表して、修飾子で特性(公開範囲)を表すと……なるほど。個人での開発ならともかく、複数人での作業だと大事そうだね
public, protected, private

とりあえずはpulicとprivateだけ覚えておこうか。後々、継承に使うprotectedもやろう。継承というのは名前の通り、引き継いだ機能を使えるようにすることだ。身近な例で言えば[MonoBehaviour]から引き継いだ[test]がそうだね
using UnityEngine;
public class test : MonoBehaviour
{
//internal修飾子 同じアセンブリ内のコードからのみ、その型やメンバーにアクセス
int num1 = 1;
//public修飾子 すべてのクラスからアクセス可能
public int num2 = 2;
//privateはクラス内部のみからアクセス可能
private int num3 = 3;
//シリアライズ可することで、privateでありながらインスペクターから操作可
[SerializeField] private int num4 = 4;
void Start()
{
print(num1);
print(num2);
print(num3);
print(num4);
}
}

classとは、その一つ一つのscriptファイルのことだね。ここでは[test]がclassってことになるね。んで、publicはどこからでもアクセスできるから便利なんだけど、よく理解せずに使っていくと他のclassからアクセスしてしまってバグの元になるよ。privateは、このtest内でのみアクセスが可能になるから安全性が高いんだ

ifとかforを学んだ時には修飾子を使ってなかったけど、自動でinternal修飾子ってのになってたんだ?アセンブリ内ってのは何なの?

Unityでいえば、そのゲームプロジェクトにあるクラスは全て「同一アセンブリ」のものと言えるね

ん?internal修飾子で同じゲームプロジェクト内からアクセス可能なら、publicと同じじゃないの?

とても良い着眼点だね。手っ取り早く早見表を用意したよ
アクセス修飾子 早見表
用途 | 修飾子 | 理由・備考 |
---|---|---|
クラスの外から使わせる | public |
他スクリプト・Unityインスペクターから使えるようにする |
Unityインスペクターに表示 | private + [SerializeField] |
カプセル化を保ちつつ、値を編集可能にする |
スクリプト内部だけで使う変数 | private |
実装の詳細は隠す(カプセル化) |
同アセンブリ内だけで使う | internal |
ライブラリやツールの内部処理に最適 |
継承先からアクセスさせたい | protected |
基底クラスとして設計するときに使用 |
継承先かつ同アセンブリ限定 | protected internal |
特殊な設計向け。多用は避ける |
インスタンス化不可・ユーティリティ | static + internal/private |
ヘルパー関数などに使う |

頭痛がしてきた

難しく考える必要はないさ。最初のうちは[public]、[private]、[private + [SerializeField]]だけ覚えておけば十分だから。最初のコードがあるだろ?あれを実行してごらん?

……これが何なの?

num2は[public]。num4は[private + [SerializeField]]で作っただろ?scriptファイルをくっつけたオブジェクトのインスペクターを確認してごらん。簡単にアクセスが可能になっているのが確認できる

本当だ!インスペクターから操作ができるようになってる。速度の変更とか重力の変更とか、いちいちscriptから数字を変更したら大変だもんね!これは便利だ!

修飾子については、個人で作るのか否かで大事さはかなり違ってくるよ。最後にポイントをまとめておくから、軽く確認しておこう
ベストプラクティスのポイント
原則は「最小限のアクセス」にする
-
private
→internal
→protected
→public
の順でアクセス範囲が広がる。 -
必要になるまで
public
にしない。
インスペクター表示は [SerializeField] を使う
Unityでは、フィールドをpublic
にしなくても [SerializeField]
を付ければエディタ上で編集可能。
[SerializeField]
private float moveSpeed = 5f; // 外部からはアクセスさせないが、インスペクターでは見える
安全・効率的なアクセス修飾子のつけかた
修飾子 | 推奨される使用ケース |
---|---|
private |
実装の隠蔽、内部フィールド |
private + [SerializeField] |
エディタで編集可能にしたいが外部に公開したくない |
public |
Unityのコンポーネントや、完全に公開すべきAPI |
internal |
プロジェクト内部限定のロジック・補助クラス |
protected |
継承構造を想定した設計 |

今回はちょっと内容が多かったかもしれないけど、使っていけば自然と身につくから焦る必要はない。今は覚えるのではなくて、そういう仕様があるんだと知るだけで十分だからね。



いつも言ってるAIがあるから!ってやつ?

そうそう。まだ基本の間はAIは使わないからもう少しだけ辛抱してね
次のページ
準備中
※コメントポリシーはこちらから。