【Unity】スクリプトのpublic・privateって何?使い分けは?

最近初心者の頃に疑問に思ったことが常識になり始めてブログの本来の目的を見失いかけている気がします。

ですので今回は記事のボリュームはありませんが、私が最初に結構疑問に思ったスクリプトの最初にあるprivateとかpublicについて最低限Unityで使う上で必要な情報を説明したいと思います。

 

はじめたばかりのときにスクリプトの最初の変数定義は全部publicで私は行っていました。これは非常に危うさを含んだことということに時が進むにつれて知ることになって行きました。

でははじめにpublic以外に何が使えるのかということを説明します。

だいたいUnityでは以下の3つを覚えておけばよいです。

    // パブリック変数.
    public int _publicInt;

    // プライベート変数.
    private int _privateInt;

    // シリアライズフィールドのプライベート変数.
    [SerializeField]
    private int _serializedfieldPrivateInt;

 

では1つずつ説明したいと思います。

  • Public

UnityでInspectorで欄が出てきて設定できる。

他のスクリプトからアクセス可能となる、参照できる。

  • Private

UnityでInspectorで欄が出てきて設定できない。

他のスクリプトからアクセス不可となる、参照できない。

  • [SerializedField] Private(変数のみ)

UnityでInspectorで欄が出てきて設定できる。

他のスクリプトからアクセス不可となる、参照できない。

 

では

UnityでのInspectorの欄で設定とはなんでしょうか?

それはこういうことです

f:id:graphicalpoxy:20190624195129p:plain

ここに欄が出来て数値やオブジェクトを設定できるようになるということです。

そう、あると便利な奴です。 [SerializedField]を知らなかった頃の私は、インスペクタに表示して設定したいがためにPublicを乱用していました。

ただPublicは便利なのですが他のスクリプトからもアクセス可能なので非常に危うさを含みます!

 

他のスクリプトからもアクセス可能となる、参照できるってなに?

これの何が怖いって他のスクリプトから書き換えることが出来ちゃうということです。

 

Unityに慣れてくるとスクリプトの数が多くなります。それは機能ごとにスクリプトを別々に作り始めることが理由に挙げられます。たとえばRPGならば、現在のプレイヤーのステータスだけを管理するスクリプト、レベルアップ処理だけを管理するスクリプト、所持金だけを管理するスクリプトなどと分けていきます。これはわかりやすさや、修正のしやすさが増すなど様々なメリットがあるためです。

しかしこうなってくると無考慮のPublicは危うさが増してきます。

 

 

例えばRPGとかのレベルっていろんな要素で使われますよね。ステータス管理したり、進行可能場所の制限をしたり、購入可能アイテムを制限したり・・・

なのでレベルというのは様々なスクリプトで参照したくなるわけです。ただこれをPublicにしておくと、どこかで書き換えられてしまう危険性が出てくるわけです。

レベルが予期せぬところで書き換わるってとんでもないバグですよね・・・

ということでPulicは使い分けをしっかりしないといけないということです。

複数人で開発なんてしている場合とかだともっと危険度は増しますからね。

 

どう使い分けるのか?

いろいろ書いてきましたが変数においての使い分けは簡単です。

 

public

  • 他で参照しないなら絶対に使わない。
  • 理由がない場合極力避ける

private

  • とりあえずこれ

[SerializedField] Private

  • Inspectorで直接オブジェクトや数値などを入れ込みたい

 

 

 

(おまけ)他のスクリプトで参照しないとだめな重要な変数があるんですけど・・・

たとえば先ほどの例にあったレベルに応じて進行可能場所の制限したいからレベルは重要な変数だけどpublicしないとだめなんだよ!とかなる可能性ってありますよね。

こんなときはpublicにしてもいいか?私の答えはpublicはつかっちゃダメです!レベルは重要すぎます!どうにかして回避する方法を考えましょう。関数が増えたとしても!

 

じゃあどうすれば良いのか、そういうときはレベル管理しているスクリプトのレベルはprivateにしたままで、進行可能か判断するスクリプトから、レベルのスクリプトに対して現在のレベルが進行可能なレベルに達しているかどうか聞く関数をレベル管理側に作ってOKかNGかbool型で進行スクリプトに返してあげることで回避することができますよね!

 

こんな感じで重要な変数は絶対にpublic使うのを避けることを心がけましょう!