Làm cách nào để hiển thị trường (có thể đính kèm) trong trình kiểm tra nhưng không thể truy cập thông qua mã (giống như riêng tư)?


9

Giả sử tôi có một biến có tên là buttonloại Buttontất nhiên System.Serializable.

Tôi muốn biến đó có thể được gán thông qua thanh tra, vì vậy tôi thực hiện nó public:

public class SomeScript : MonoBehaviour{
    public Button button;
}

Điều này cho tôi rằng:

nhập mô tả hình ảnh ở đây

Bây giờ, tôi muốn giữ mã sạch và an toàn (có tổ chức) và có một lý do thực sự tại sao tôi cần phải bảo toàn việc đóng gói.

Tôi biết rằng có nhiều cách lấy các thành phần trong thời gian chạy như thế nào transform.Find("Some/Genius/TypeUnsafe/Path")hoặc GameObject.Find("3 seconds scene iteration").GetComponent(...).tôi muốn tránh điều đó.

Làm cách nào để trộn một biến private accessvới nó public accesstrong thanh tra?


Tại sao bạn muốn làm cho lĩnh vực này "an toàn" / ý của bạn là gì? Lưu ý rằng tôi đặt nó trong dấu ngoặc kép, bởi vì nếu mã chạy trên máy khách, máy khách có thể thực hiện bất kỳ thứ gì chúng muốn với nó. privatekhông thực sự có ý định ngăn một bên thứ ba tiếp cận với một lĩnh vực, điều đó có nghĩa là cung cấp một cách để nói "đừng nhìn vào bức màn về những gì tôi thực sự đang làm" - đó là, chủ yếu là một cách để giữ cho bạn không có quyền truy cập vào nó.
Đồng hồ-Muse

Vâng, tôi biết đóng gói để làm gì! : DI xây dựng một số loại UI/ API MVC/ MVVMmẫu cho một ứng dụng khổng lồ (thực sự là một ứng dụng khách trò chơi) và tôi phải tách ra UIkhỏi API. Tôi cần chỉ định giá trị thông qua nguyên nhân thanh tra - không còn cách nào khác. Find()các phương thức là loại không an toàn và việc kết hợp mọi thứ lại với nhau dễ dàng hơn bằng cách kéo và thả. Thật sự, rất khó để xây dựng một khung OOP cổ điển Unityvà bạn phải tìm kiếm những thứ hacky như thế này.
Jacob

Hãy nhớ rằng private không giữ biến an toàn khỏi các tập lệnh khác. Bạn có thể tiếp cận nó với sự phản chiếu hoặc một số mánh khóe con trỏ
Bálint

Câu trả lời:


19

Bạn đang tìm kiếm Thuộc tính serializeField

Từ các tài liệu:

Buộc Unity nối tiếp một lĩnh vực tư nhân.

Bạn sẽ gần như không bao giờ cần điều này. Khi Unity tuần tự hóa các tập lệnh của bạn, nó sẽ chỉ tuần tự hóa các trường công khai. Nếu ngoài ra, bạn cũng muốn Unity tuần tự hóa một trong các trường riêng tư của mình, bạn có thể thêm thuộc tính SerializeField vào trường.

Mã của bạn sẽ trông như thế này:

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

6
để dễ đọc, tôi thường viết tất cả trên một dòng: [SerializeField] private Button button; Tôi thấy việc quét dễ dàng hơn khi có một loạt các trường liên tiếp. Ngoài ra, vặn các tài liệu cho "bạn sẽ gần như không bao giờ cần điều này"; Tôi hoàn toàn làm điều này mọi lúc.
jhocking

1

Bạn có thể hiển thị biến riêng tư của mình bằng cách thêm thuộc tính SerializeField trước biến. Một cái gì đó như thế này

[SerializeField]
private Button button;

Biến trên sẽ được hiển thị cho thanh tra của bạn nhưng các lớp khác của bạn sẽ không thể có được nó. Ngược lại, bạn cũng có thể ẩn công khai của mình trong trình kiểm tra thông qua thuộc tính HideInInspector . Một cái gì đó như thế này

[HideInInspector]
public Button button;

Biến trên của bạn sẽ có thể được truy cập bởi tập lệnh khác của bạn nhưng nó sẽ không được hiển thị cho thanh tra.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.