ตัวแปรเงื่อนไขในวัตถุสคริปต์


10

ในขณะที่ใช้ScriptableObjectsฉันจะทำให้ตัวแปรบางตัวมีเงื่อนไขได้อย่างไร

รหัสตัวอย่าง:

[System.Serializable]
public class Test : ScriptableObject
{
      public bool testbool;
      public string teststring;
      public int testint;
}

เป้าหมาย:เมื่อtestbool == trueนั้นteststringจะสามารถแก้ไขได้เมื่อtestbool == falseนั้นtestintจะสามารถแก้ไขได้ในขณะที่อีกอันจะเป็น " สีเทา "

คำตอบ:


7

เส้นทางที่เป็นมิตรกับบรรณาธิการคือ "ผู้ตรวจสอบที่กำหนดเอง" ใน Unity API หมายถึงการขยายคลาสEditor

นี่คือตัวอย่างการใช้งาน แต่ลิงค์เอกสารด้านบนจะนำคุณไปสู่รายละเอียดและตัวเลือกเพิ่มเติมมากมาย:

using UnityEngine;
using UnityEditor;

[CustomEditor(typeof(Test))]
public class TestEditor : Editor
{
    private Test targetObject;

    void OnEnable()
    {
        targetObject = (Test) this.target;
    }

    // Implement this function to make a custom inspector.
    public override void OnInspectorGUI()
    {
        // Using Begin/End ChangeCheck is a good practice to avoid changing assets on disk that weren't edited.
        EditorGUI.BeginChangeCheck();

        // Use the editor auto-layout system to make your life easy
        EditorGUILayout.BeginVertical();
        targetObject.testBool = EditorGUILayout.Toggle("Bool", targetObject.testBool);

        // GUI.enabled enables or disables all controls until it is called again
        GUI.enabled = targetObject.testBool;
        targetObject.testString = EditorGUILayout.TextField("String", targetObject.testString);

        // Re-enable further controls
        GUI.enabled = true;

        targetObject.testInt = EditorGUILayout.IntField("Int", targetObject.testInt);

        EditorGUILayout.EndVertical();

        // If anything has changed, mark the object dirty so it's saved to disk
        if(EditorGUI.EndChangeCheck())
            EditorUtility.SetDirty(target);
    }
}

โปรดทราบว่าสคริปต์นี้ใช้ API อย่างเดียวเท่านั้นดังนั้นจะต้องอยู่ในโฟลเดอร์ชื่อ Editor โค้ดด้านบนจะเปลี่ยนผู้ตรวจสอบของคุณเป็นดังต่อไปนี้:

ป้อนคำอธิบายรูปภาพที่นี่

การทำเช่นนี้จะทำให้คุณรู้สึกดีขึ้นจนกว่าคุณจะคุ้นเคยกับการแก้ไขสคริปต์มากขึ้น


4
[System.Serializable]
public class Test : ScriptableObject
{
    private bool testbool;
    public string teststring;
    public int testint;

    public string TestString 
    {
        get 
        {    
            return teststring; 
        }
        set 
        {
            if (testbool)
                teststring = value; 
        }
    }
}

มันดูแม่นยำ! ฉันจะทดสอบและรายงานกลับมา!
Valamorde

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