ทำให้อินสแตนซ์สคริปต์เป็นอนุกรมใน ScriptableObject ใน Unity

ฉันรู้ว่าสิ่งนี้สามารถทำได้เพราะปลั๊กอินที่น่าทึ่ง Odin มีเครื่องมือทำให้เป็นอนุกรมที่ยอดเยี่ยม

ฉันหวังว่าฉันจะสามารถทำได้โดยใช้ Odin แต่แท็ก [Serialize] ก็ยังใช้งานไม่ได้

ฉันต้องการซีเรียลไลซ์อินสแตนซ์ใหม่ของสคริปต์ภายใน Scriptable Object

ด้วย Odin คุณสามารถทำให้พจนานุกรมเป็นอนุกรมได้ และหากคุณทำให้พจนานุกรมเป็นอนุกรมซึ่งมีอินสแตนซ์ของอินเทอร์เฟซ (สคริปต์) จะทำให้คุณสามารถสร้างอินสแตนซ์ใหม่ของสคริปต์นั้นภายในพจนานุกรมได้ดังนี้:

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

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

สคริปต์ที่ฉันต้องการบันทึกเป็นสคริปต์ทั่วไปที่มีเฉพาะฟังก์ชันและตัวสร้างว่างเปล่า

คุณรู้หรือไม่ว่าเหตุใดจึงต้องทำให้อินสแตนซ์ของอินเทอร์เฟซ (สคริปต์) ภายใน ScriptableObject เป็นอนุกรม

ตามหลักการแล้ว ฉันสามารถสร้างแอตทริบิวต์ด้วยวิธีใดวิธีหนึ่งและเพียงแค่บังคับให้มันทำให้เป็นอนุกรมดังนี้:

public class MyClass: MonoBehaviour
{
    [ForceSerialize]
    public IScript scriptToSerialize;

}

จากนั้นในตัวตรวจสอบ ฉันสามารถคลิกกล่องและสร้างอินสแตนซ์ใหม่ของสคริปต์นั้นเพื่อแนบกับออบเจ็กต์ได้


person Aggressor    schedule 28.12.2019    source แหล่งที่มา
comment
คุณกำหนดมันอย่างไรโดยไม่แสดง iscript ทั้งหมด มันเป็น system.serialiseable หรือไม่?   -  person BugFinder    schedule 29.12.2019
comment
นั่นเป็นส่วนหนึ่งของปัญหา คุณไม่สามารถประกาศอินเทอร์เฟซให้เป็นอนุกรมได้ แต่ด้วย Odin คุณยังสามารถเพิ่มอินสแตนซ์ได้ เพื่อให้ฉันรู้มีวิธี   -  person Aggressor    schedule 29.12.2019


คำตอบ (1)


คุณไม่จำเป็นต้องมีแท็ก [Serialize] MyClass เพียงแค่ต้องสืบทอดจาก Sirenix.OdinInspector.SerializedMonoBehaviour แทนที่จะเป็น MonoBehaviour จำเป็นต้องใช้คลาส "ซีเรียลไลซ์" เหล่านี้ (มีอยู่แล้วสำหรับ ScriptableObjects และไลค์) เพื่อให้ซีเรียลไลซ์แบบกำหนดเองของ Odin ทำงานได้ ซึ่งจะทำให้ฟิลด์ของคุณปรากฏในตัวตรวจสอบ

สคริปต์นี้ใช้ได้กับฉัน:

using Sirenix.OdinInspector;

public class MyScript : SerializedMonoBehaviour
{
    public IScript scriptToSerialize;
}

public interface IScript { }
person Vale    schedule 29.12.2019
comment
โอเค บิงโก! ปัญหาคือฉันสืบทอดมาจาก ScriptableObject เมื่อฉันเปลี่ยนมาใช้ SerializedMonoBehavior มันใช้งานได้ เหตุผลที่ฉันไม่ได้ลองสิ่งนี้ก็คือ ฉันเข้าใจผิดว่าการใช้แท็ก [ซีเรียลไลซ์] จะบังคับให้มันทำงานถ้ามันใช้งานได้ ขอบคุณมาก! - person Aggressor; 29.12.2019
comment
ดีใจที่ได้ช่วยเหลือ ในลักษณะเดียวกับ SerializedMonoBehaviour Sirenix.OdinInspector.SerializedScriptableObject ก็มีอยู่เช่นกัน หากคุณต้องการ - person Vale; 29.12.2019