如何更改可编写脚本的对象中的值?
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
}
}
我不确定我拥有的东西是否合适,尽管我有一种感觉可能不是。另外,如您所见,第二个快速问题 PlayerSettings
和 BaseClass
基本相同,我想在这里使用继承还是将其分开?
在可编写脚本的目标代码的顶部,您应该添加以下行:
[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.
我正在尝试制作一个 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
}
}
我不确定我拥有的东西是否合适,尽管我有一种感觉可能不是。另外,如您所见,第二个快速问题 PlayerSettings
和 BaseClass
基本相同,我想在这里使用继承还是将其分开?
在可编写脚本的目标代码的顶部,您应该添加以下行:
[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.