publicとSerializeFieldの違い
共通点:Unityエディタのインスペクターから、変数を設定できる
違い:publicなら別のスクリプトからアクセスできるが、SerializeFieldだとアクセスすることができない。
実際にpublicとSerializeFieldの共通点や違いを確認してみましょう。
実際に確認してみる
publicとSerializeFieldの共通点を確認
Hierarchyに空のゲームオブジェクトを作成し、名前をPlayerManagerオブジェクトに変更してください。
PlayerManagerスクリプトをPlayerManagerオブジェクトに追加します。
今回playerManagerスクリプトは、publicでhpを定義、SerializeFieldでatを定義しました。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerManager : MonoBehaviour { public int hp; [SerializeField] int at; private void Start() { Debug.Log(hp); Debug.Log(at); }
|
PlayerManagerオブジェクトのInspecterを確認すると、publicで定義したhpとSerializeFieldで定義したatをInspecterで設定できることが確認できます。
実行してDebug.Logでも確認してみましょう!
publicで定義したhpとSerializeFieldで定義したatがDebug.Logで表示されることが確認できました。
publicとSerializeFieldの違いを確認
Hierarchyに空のゲームオブジェクトを作成し、名前をGameManagerオブジェクトに変更してください。
まずはpublicで定義したhpをGameManagerで受け取ることができるのか確認します。
GameManagerスクリプトをGameManagerオブジェクトに追加します。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class GameManager : MonoBehaviour { [SerializeField] PlayerManager playerManager; void Start() { Debug.Log(playerManager.hp); } } |
GameManagerオブジェクトにPlayerManagerスクリプトを設定して確認します。
publicで定義したhpをGameManagerから読み込むことができました。
次に、SerializeFieldで定義したatを確認します。
playerManagerは、アクセスできない保護レベルになっています。っと表示されます。これは、atがSerializeFieldで定義されているため、GameManagerスクリプトからPlayerManagerスクリプトのatにアクセスできないために表示されています。
まとめ
publicとSerializeFieldは、インスペクターから変数を設定することができるという共通点を持っているが、publicでは別のスクリプトから値を読み取ることができるがSerializeFieldでは読み取ることができない。関数でも同じことが言えます。
コメント