【Unity】publicとSerializeFieldの違いとは?

Unity Unity

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では読み取ることができない。関数でも同じことが言えます。

コメント

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