Unity-ScriptableObject

什么是ScriptableObject

  • ScriptableObject 是 Unity 提供的一个数据配置存储基类,它是一个可以用来保存大量数据的数据容器,我们可以将它保存为自定义的数据资源文件
  • ScriptableObject 是一个类似 MonoBehaviour 的基类,继承自 UnityEngine.Object 。要想使用它,需要我们写个脚本去继承 ScriptableObject 。需要注意的是,继承自 SctiptableObject 的脚本无法挂载到游戏物体上,毕竟它不是继承自 MonoBehaviour。
  • ScriptableObject 类的实例会被保存成资源文件(.asset文件),和预制体,材质球,音频文件等类似,都是一种资源文件,存放在 Assets 文件夹下,创建出来的实例也是唯一存在的。 Unity官方文档

ScriptableObject的使用

主要用例:

  • 在编辑模式下保存和存储数据
  • 将数据保存为项目中的资源,方便在运行时使用

使用Scriptable需要在创建一个脚本并继承自ScriptableObject类,通过使用CreateAssetMenu属性来创建由自定义ScriptableObject类生成的资源。

ScriptableObject资源的创建:

//方法1:在编辑器菜单中创建
[CreateAssetMenu(fileName = "NewScriptableObject", menuName = "CreateScriptableObject", order = 0)]
//创建一个Asset资源菜单菜单名称为:"CreateScriptableObject",文件名称:"NewScriptableObject"
public class NewSO : ScriptableObject
{
    public GameObject GameObject;
    public Vector3[] spawnPoints;
    public int spawnCount;
    public string name;
}
//方法2:在菜单栏中通过静态方法创建 需要继承UnityEditor
public class ScriptableObjectTool 
{
    [MenuItem("ScritableObject/CreateData")]
    public static void CreateMyData()
    {
        //创建数据资源文件
        //泛型是继承自ScriptableObject的类
        BulletData asset = ScriptableObject.CreateInstance<NewSO>();
        //前一步创建的资源只是存在内存中,现在要把它保存到本地
        //通过编辑器API,创建一个数据资源文件,第二个参数为资源文件在Assets目录下的路径
        AssetDatabase.CreateAsset(asset, "Assets/Resources/ScriptableObject/NewSO.asset");
        //保存创建的资源
        AssetDatabase.SaveAssets();
        //刷新界面
        AssetDatabase.Refresh();
    }
}

ScriptableObject实例的使用:

public class CreateGameobject : MonoBehaviour
{
    public NewSO newSO;
    private NewSO newSO01;
    void Start()
    {
        newSO01 = ScriptableObject.Instantiate(newSO);
        newSO01.name = "新的预制体";
		//实例化一个新的NewSO对象通过已用的NewSO对象,并对name字段重新赋值,其余值与newSO对象相同
      	//ScriptableObject.CreateInstance<NewSO>();==>创建一个全新的NewSO对象
        SpawnEntities();
    }

    private void SpawnEntities()
    {
        for (int i = 0; i < newSO01.spawnCount; i++)
        {
            GameObject gameObject = Instantiate(newSO01.GameObject, newSO01.spawnPoints[i], Quaternion.identity);
            gameObject.name = newSO01.name + i;
            DontDestroyOnLoad(gameObject);

        }
    }
}

ScriptableObject脚本API

参考链接

参考链接

全部评论

相关推荐

2025-12-28 20:47
已编辑
北京工商大学 Java
程序员牛肉:我靠你这个实习经历其实最需要担心的点是你做的太多了,可能会被面试官怀疑是你伪造的。 交易状态机是你做的,支付多渠道是你做的,对账是你做的,结算还是你做的,重复支付也是你做的,整个服务的异常处理也是你做的。 其实你这个反而问题很大的,你想想站在面试官的角度,他是真的会相信你的能力很强,还是相信这份实习你伪造了大部分?我相信你真的做了这么多,但是删一些,废话删一删。你这个做的太多了反而真实性不可信。 后面再补一个项目,在github上找一个高star的项目学一学然后写到自己简历上。我觉得你能力肯定没问题。28届能做到这个份上很厉害,但是在求职市场中,你不是在跟28届的同学比,把你这个简历放到27届其实也就一般水平。 所以后续要想一想看看能不能给自己简历上搞点亮点,比如开源贡献呢?比如博客呢?
实习要如何选择和准备?
点赞 评论 收藏
分享
狸猫换offer:埋点都出来了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务