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。
不,不是那样的。目前还不清楚为什么您必须使用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。在这两种情况下,相应的代码都会在构建中被删除。