如何更改可编写脚本的对象中的值?

How do I change values in a scriptable object?

我正在尝试制作一个 class 选择系统,我有 2 个可编写脚本的对象,一个用于播放器,另一个用于 classes,我正在尝试找出如何更改选择A class时BaseClass中的值PlayerSettings中的值。

public class BaseClass : ScriptableObject
{
    public float health;
    public float walkSpeed;
    public float fallSpeed;
    public float jumpForce;

    public string displayName;
    
    public List<BaseAbility> abilities;
}
public class PlayerSettings : ScriptableObject
{
    public float health;

    public float walkSpeed;
    public float fallSpeed;
    public float jumpForce;

    public BaseClass playerClass;
}

这是我设置 class 的代码 我使用了一个在按下按钮时调用的事件,然后我只是将 PlaerSettings 中的值更改为newClass 参数

public class Player : MonoBehaviour
{
    public PlayerSettings playerSettings;

    public Controls keybinds;

    void Start()
    {
        ClassSelectButton.OnClassSelected += SetPlayerClass;
    }

    void SetPlayerClass(BaseClass newClass)
    {
        Debug.Log("Setting player class to: " + newClass.displayName); 
        playerClass = newClass;
        playerSettings.walkSpeed = playerClass.walkSpeed;
        //etc
    }
}

我不确定我拥有的东西是否合适,尽管我有一种感觉可能不是。另外,如您所见,第二个快速问题 PlayerSettingsBaseClass 基本相同,我想在这里使用继承还是将其分开?

在可编写脚本的目标代码的顶部,您应该添加以下行:

[UnityEngine.CreateAssetMenu(fileName = "Data", menuName = "ScriptableObjects/BaseClassScriptableObject", order = 1)]

然后,您应该会看到它已添加到您的右键单击菜单中。

创建对象后,它在检查器中应该如下所示:

您的代码示例:

[UnityEngine.CreateAssetMenu(fileName = "Data", menuName = "ScriptableObjects/BaseClassScriptableObject", order = 1)]
public class BaseClass : UnityEngine.ScriptableObject
{
    public float health;
    public float walkSpeed;
    public float fallSpeed;
    public float jumpForce;

    public string displayName;

}

所以您可以做的是将 playerClass 设置为 属性 并在 set 函数中设置值,但将字段设为转发 playerClass 值的属性可能更容易。我将在这里使用 null coalescing and null conditional operators,但希望这能给你一个想法。

还有一个很好的 IDE 应该抱怨这里的属性不是以大写字母开头,但我试图给你一个不会破坏你当前代码的例子:

public class PlayerSettings : ScriptableObject
{
    public float health => playerClass?. health ?? 100f;

    public float walkspeed => playerClass?.walkspeed ?? 1f;
    public float fallSpeed => playerClass?.fallSpeed ?? 1f;
    public float jumpForce => playerClass?.jumpForce ?? 1f;

    public BaseClass playerClass;
}

??后面的数字是您在 playerClass 为 null 时使用的默认值。不过,这些都是吸气剂,所以它们是 read-only。同样,如果将 playerClass 设置为 setter 函数的一部分,您可以让 playerClass 分配这些值,如果您将其设置为 属性,但我对您的项目了解不多,无法在此处提出建议。如果您将 playerClass public 留在此处,则可能更容易进入并直接获取这些值。我不知道你的 ScriptableObject 的意义是什么,如果它只是一个 public class 来容纳一个 public class.