Bagaimana cara membuat bidang terlihat (dilampirkan) di inspektur tetapi tidak dapat diakses melalui kode (seperti pribadi)?

9

Katakanlah saya memiliki variabel bernama buttontipe Buttonyang tentu saja System.Serializable.

Saya ingin variabel itu dapat ditetapkan melalui inspektur, jadi saya membuatnya public:

public class SomeScript : MonoBehaviour{
    public Button button;
}

Yang memberi saya itu:

masukkan deskripsi gambar di sini

Sekarang, saya ingin menjaga kode bersih & aman (terorganisir) dan ada alasan nyata mengapa saya harus menjaga enkapsulasi.

Saya tahu bahwa ada beberapa cara untuk mengambil komponen pada runtime seperti transform.Find("Some/Genius/TypeUnsafe/Path")atau GameObject.Find("3 seconds scene iteration").GetComponent(...).saya ingin menghindarinya.

Bagaimana cara mencampur variabel private accessdengan variabel tersebut public accessdi inspektur?

Yakub
sumber
Mengapa Anda ingin menjadikan bidang ini "aman" / apa yang Anda maksud dengan itu? Perhatikan bahwa saya memasukkannya ke dalam tanda kutip, karena jika kode dijalankan pada mesin klien, klien dapat melakukan hampir semua yang mereka inginkan dengannya. privatetidak benar-benar dimaksudkan untuk mencegah pihak ketiga dari mendapatkan akses ke lapangan, itu dimaksudkan untuk memberikan cara untuk mengatakan "jangan melihat ke balik tirai pada apa yang sebenarnya saya lakukan" - yaitu, itu sebagian besar cara untuk membuat Anda tidak mendapatkan akses ke sana.
Clockwork-Muse
Ya, saya tahu untuk apa enkapsulasi! : DI membangun semacam UI/ API MVC/ MVVMpola untuk aplikasi besar (klien game sebenarnya) dan saya harus memisahkanUI dari API. Saya perlu menetapkan nilai melalui penyebab inspektur hanya - tidak ada cara lain. Find()metode mengetik tidak aman, dan lebih mudah untuk menyatukan semuanya dengan menyeret & menjatuhkan. Sangat sulit untuk membangun kerangka kerja OOP klasik Unitydan Anda harus mencari hal-hal seperti ini.
Yakub
Ingatlah bahwa privasi tidak membuat variabel aman dari skrip lain. Anda dapat mengambilnya dengan refleksi atau tipuan pointer
Bálint

Jawaban:

19

Anda sedang mencari Atribut SerializeField

Dari dokumen:

Force Unity untuk membuat serial bidang pribadi.

Anda hampir tidak pernah membutuhkan ini. Ketika Unity membuat serialisasi skrip Anda, itu hanya akan membuat serialisasi bidang publik. Jika selain itu Anda juga ingin Unity membuat serial salah satu bidang pribadi Anda, Anda dapat menambahkan atribut SerializeField ke bidang tersebut.

Kode Anda kemudian akan terlihat seperti ini:

public class SomeScript : MonoBehaviour{
    [SerializeField]
    private Button button;
}
Cameron Edwards
sumber
6
untuk keterbacaan, saya biasanya menulis semuanya dalam satu baris: [SerializeField] private Button button; Saya merasa lebih mudah untuk memindai ketika ada banyak bidang dalam satu baris. Juga, letakkan dokumen untuk "Anda hampir tidak pernah membutuhkan ini"; Saya benar-benar melakukan ini sepanjang waktu.
jhocking
1

Anda dapat menunjukkan variabel pribadi Anda Dengan menambahkan SerializeField atribut sebelum variabel. Sesuatu seperti ini

[SerializeField]
private Button button;

Variabel di atas akan ditampilkan kepada inspektur Anda, tetapi kelas Anda yang lain tidak akan bisa mendapatkannya. Sebaliknya, Anda juga dapat menyembunyikan arsip publik Anda di inspektur melalui HideInInspector atribut . Sesuatu seperti ini

[HideInInspector]
public Button button;

Variabel Anda di atas akan dapat diakses oleh skrip Anda yang lain tetapi tidak akan ditampilkan kepada inspektur.

Muhammad Faizan Khan
sumber