วิธีการทำให้ฟิลด์มองเห็น (สิ่งที่แนบได้) ในตัวตรวจสอบ แต่ไม่สามารถเข้าถึงได้ด้วยรหัส (ส่วนตัว - เหมือน)?


9

สมมติว่าผมมีชื่อตัวแปรbuttonชนิดซึ่งเป็นหลักสูตร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ไม่ได้มีจุดประสงค์เพื่อป้องกันไม่ให้บุคคลที่สามเข้าถึงข้อมูลในเขตข้อมูล แต่มีไว้เพื่อให้วิธีการพูดว่า "อย่ามองหลังม่านสิ่งที่ฉันทำจริงๆ" - นั่นคือส่วนใหญ่เป็นวิธีในการ ทำให้คุณไม่สามารถเข้าถึงได้
Clockwork-Muse

ใช่ฉันรู้ว่าการห่อหุ้มมีไว้เพื่ออะไร! : DI สร้างบางชนิดUI/ API MVC/ MVVMรูปแบบสำหรับการใช้งานขนาดใหญ่ (เกมไคลเอนต์จริง) และผมก็มีการแยกจากUI APIฉันต้องการกำหนดค่าผ่านทางผู้ตรวจสอบสาเหตุง่ายๆ - ไม่มีวิธีอื่น Find()เมธอดนั้นไม่ปลอดภัยและง่ายกว่าที่จะรวบรวมสิ่งต่าง ๆ ด้วยการลาก & วาง มันยากจริงๆที่จะสร้างคลาสสิก OOP framework ด้วยUnityและคุณต้องมองหาสิ่งที่เป็นแฮ็คแบบนี้
จาค็อบ

โปรดทราบว่าความเป็นส่วนตัวจะไม่ทำให้ตัวแปรปลอดภัยจากสคริปต์อื่น คุณนั่งรถแท็กซี่ไปถึงที่นั่นด้วยการไตร่ตรองหรือใช้กลอุบายชี้บางอย่าง
Bálint

คำตอบ:


19

คุณกำลังมองหาแอตทริบิวต์ SerializeField

จากเอกสาร:

บังคับให้ Unity ทำการซีเรียลฟิลด์ส่วนตัว

คุณแทบจะไม่ต้องการสิ่งนี้ เมื่อ Unity ทำการทำให้สคริปต์ของคุณเป็นแบบอนุกรมมันจะทำให้เป็นเขตข้อมูลสาธารณะเท่านั้น หากนอกเหนือจากนั้นคุณยังต้องการให้ Unity ทำการซีเรียลไลซ์หนึ่งในฟิลด์ส่วนตัวของคุณคุณสามารถเพิ่มแอททริบิว SerializeField ให้กับฟิลด์

รหัสของคุณจะเป็นดังนี้:

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

6
เพื่อความสะดวกในการอ่านฉันมักจะเขียนมันทั้งหมดในบรรทัดเดียว: [SerializeField] private Button button; ฉันพบว่ามันง่ายกว่าในการสแกนเมื่อมีหลาย ๆ แถวเรียงกันเป็นแถว นอกจากนี้สกรูเอกสารสำหรับ "คุณแทบจะไม่ต้องการสิ่งนี้"; ฉันทำสิ่งนี้ตลอดเวลา
jhocking

1

คุณสามารถแสดงตัวแปรส่วนตัวของคุณโดยการเพิ่มแอตทริบิวต์SerializeFieldก่อนตัวแปร บางสิ่งเช่นนี้

[SerializeField]
private Button button;

ตัวแปรข้างต้นจะปรากฏต่อผู้ตรวจสอบของคุณ แต่คลาสอื่น ๆ ของคุณจะไม่สามารถรับได้ ในทางกลับกันคุณสามารถซ่อนสาธารณะที่คุณยื่นไว้ในสารวัตรแอททริบิวต์HideInInspector บางสิ่งเช่นนี้

[HideInInspector]
public Button button;

ตัวแปรด้านบนของคุณจะสามารถเข้าถึงได้โดยสคริปต์อื่นของคุณ แต่จะไม่แสดงต่อผู้ตรวจสอบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.