通过构造函数创建可编写脚本的对象实例

Swa*_*yya 1 c# unity-game-engine

我有一个字符可编程对象,其中有多种方法。就像 GetDate、GetAge (我没有在这里展示)。我在那里创建了一个构造函数,但我不知道如何通过构造函数创建该 ScriptableObject 的实例。这就是我想做的。

我尝试在检查器中键入值,但没有运行构造函数中的方法。

角色.cs

[CreateAssetMenu]
[Serializable]
public class Character : Scriptable Object
{
    // Attributes
    public string firstName;
    public string middleName;
    public string lastName;
    public string fullName;
    public bool isMale;

    // Constructor
    public Character(string _firstName, string _middleName, string _lastName, bool _isMale)
    {

        firstName = _firstName;
        middleName = _middleName;
        lastName = _lastName;

        // All The Functions 
        fullName = string.Format("{0} {1} {2}", firstName, middleName, 
        lastName);

        isMale = _isMale;

        // and all the other functions like date calculator.
    }
}
Run Code Online (Sandbox Code Playgroud)

我想通过这个构造创建这个可编写脚本的对象的实例。就像是

Character char("x", "y", "z", true);
Run Code Online (Sandbox Code Playgroud)

或者当我在 Unity Inspector 中输入必填字段时,它将运行该全名等所有方法string.format

der*_*ugo 6

不,不是那样的。目前还不清楚为什么您必须使用ScriptableObjects 而不是一个简单的类(我们来自这个问题),您可以在其中简单地配置这些字符,例如在检查器中或使用例如。

new Character("abc", "xyz", "kfk", true);
Run Code Online (Sandbox Code Playgroud)

但是,您可以使用某种工厂方法,例如

[CreateAssetMenu]
[Serializable]
public class Character : Scriptable Object
{
    // Attributes
    public string firstName;
    public string middleName;
    public string lastName;
    public string fullName;
    public bool isMale;

    // Constructor
    private void Init(string _firstName, string _middleName, string _lastName, bool _isMale)
    {
        firstName = _firstName;
        middleName = _middleName;
        lastName = _lastName;

        // All The Functions 
        fullName = string.Format("{0} {1} {2}", firstName, middleName, lastName);

        isMale = _isMale;

        // and all the other functions like date calculator.
    }

    public static Character CreateCharacter(string firstName, string middleName, string lastName, bool isMale)
    {
        var character = ScriptableObject.CreateInstance<Character>();

        character.Init(firstName, middleName, lastName, isMale);
        return character;
    }
}
Run Code Online (Sandbox Code Playgroud)

或者例如在

private void OnEnable()
{
    fullName = $"{firstName} {middleName} {lastName}";
}
Run Code Online (Sandbox Code Playgroud)

所以当游戏开始时它就在那里。


如果您确实想在检查器中输入这些名称拥有它,则不会通过实施来使用自定义检查器Editor

#if UNITY_EDITOR
    using UnityEditor;
#endif

    public class Character : Scriptable Object
    {
        ...
    }

#if UNITY_EDITOR

    [CustomEditor(typeof(Character))]
    public class CharacterEditor : Editor
    {
        private SerializedProperty firstName;
        private SerializedProperty middleName;
        private SerializedProperty lastName;
        private SerializedProperty fullName;

        // called once when the Object of this type gains focus and is shown in the Inspector
        private void OnEnable()
        {
            firstName = serializedObject.FindProperty("firstName");
            middleName= serializedObject.FindProperty("middleName");
            lastName= serializedObject.FindProperty("lastName");
            fullName= serializedObject.FindProperty("fullName");
        }

        // kind of like the Update method of the Inspector
        public override void OnInspectorGUI()
        {
            // draw the default inspector
            base.OnInspectorGUI();

            serializedObject.Update();

            fullName.stringValue = $"{firstName.stringValue} {middleName.stringValue} {lastName.stringValue}";

            serializedObject.ApplyModifiedProperties();
        }
    }

#endif
Run Code Online (Sandbox Code Playgroud)

除了使用之外,#if UNITY_EDITOR您当然可以将 放在CharacterEditor一个完全独立的脚本中,并将其放在名为 的文件夹中Editor。在这两种情况下,相应的代码都会在构建中被删除。


在此输入图像描述