インスペクターでフィールドを表示(アタッチ可能)するがコード(プライベートライク)でアクセスできないようにする方法は?


9

もちろんbutton、type という名前の変数があるとします。ButtonSystem.Serializable

その変数をインスペクターを通じて割り当て可能にしたいので、次のようにしますpublic

public class SomeScript : MonoBehaviour{
    public Button button;
}

それは私にそれを与えます:

ここに画像の説明を入力してください

今、私はコードをクリーンで安全な(整理された)状態に保ちたいのですが、カプセル化を維持する必要がある本当の理由があります。

私は実行時にコンポーネントを取得する方法が複数あることを知っています。transform.Find("Some/Genius/TypeUnsafe/Path")または、GameObject.Find("3 seconds scene iteration").GetComponent(...).それを避けたいです。

インスペクターで変数private accessをどのように混合しますpublic accessか?


なぜこのフィールドを「安全」にしたいのですか?それはどういう意味ですか?クライアントマシンでコードが実行される場合、クライアントはそれを使用してほとんど何でもできるため、引用符で囲んでいることに注意してください。 privateサードパーティがフィールドにアクセスするのを防ぐことを意図したものではありません。「私が実際に行っていることに目を向けないでください」と言う方法を提供することを目的としています。つまり、それは主にアクセスできないようにします
時計じかけのミューズ

ええ、私はカプセル化が何のためにあるのか知っています!:DIは、いくつかの種類の構築UI/ API MVC/ MVVM巨大なアプリケーションのためのパターン(実際にゲームクライアントを)と私は分離しなければならなかったUIからAPI。私は単にインスペクターの原因によって値を割り当てる必要がありました-他に方法はありません。Find()メソッドは安全ではないタイプであり、ドラッグアンドドロップで物事をまとめる方が簡単です。クラシックなOOPフレームワークを構築するのは本当に本当に難しいUnityので、このようなハックなものを探す必要があります。
ジェイコブ

プライベートでは、変数が他のスクリプトから保護されないことに注意してください。あなたはakwaysは反射や、いくつかのポインタの策略でそれを達するCAB
バリント

回答:


19

あなたはSerializeField属性を探しています

ドキュメントから:

Unityにプライベートフィールドのシリアル化を強制します。

これはほとんど必要ありません。Unityがスクリプトをシリアル化すると、パブリックフィールドのみがシリアル化されます。それに加えて、Unityにプライベートフィールドの1つをシリアル化させたい場合は、フィールドにSerializeField属性を追加できます。

コードは次のようになります。

public class SomeScript : MonoBehaviour{
    [SerializeField]
    private Button button;
}

6
読みやすくするために、通常はすべて1行で記述します[SerializeField] private Button button; 。一連のフィールドが多数ある場合は、スキャンする方が簡単です。また、「これはほとんど必要ない」というドキュメントをねじ込みます。私はいつもこれをいつもやっています。
2017

1

変数の前にSerializeField属性を追加することで、プライベート変数を表示できます。このようなもの

[SerializeField]
private Button button;

上記の変数はインスペクターに表示されますが、他のクラスはそれを取得できません。逆にHideInInspector属性を使用して、インスペクターに提出されたパブリックを非表示することもできます。このようなもの

[HideInInspector]
public Button button;

上記の変数は他のスクリプトからアクセスできますが、インスペクターには表示されません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.