当前位置: 首页 > article >正文

ScriptableObject上的prefab内容暂用,ScriptableObject详解

ScriptableObject是Unity引擎中的一种特殊类型,它允许你创建可扩展的、自定义的数据容器,用于在项目中存储和管理数据。它们非常适合存储那些不直接关联场景对象的数据,例如配置数据、游戏设置、AI行为树、技能和物品属性等。

ScriptableObject具有以下特点:

不依赖场景:ScriptableObject的数据存储在项目文件夹中的资源文件中,而不是存储在场景中的GameObject上。这使得它们可以轻松地在多个场景中共享和访问数据。

不可撤销的更改:与场景中的GameObject和Component不同,对ScriptableObject所做的更改在编辑器中无法撤销。这意味着在编辑器中编辑ScriptableObject数据时要谨慎。

轻量级:ScriptableObject比继承自MonoBehaviour的类更轻量级,因为它们不需要挂载到GameObject上,也没有像Update、Start等Unity生命周期事件。这使得ScriptableObject更高效,更易于管理。

要创建一个ScriptableObject,需要遵循以下步骤:

创建一个继承自ScriptableObject的自定义类。例如:


using UnityEngine;

[CreateAssetMenu(fileName = "Data", menuName = "ScriptableObjects/ExampleData", order = 1)]
public class ExampleData : ScriptableObject
{
    public string exampleString;
    public int exampleInt;
    public GameObject examplePrefab;
}

使用CreateAssetMenu属性为该类提供创建菜单。这将允许你在Unity编辑器中的Assets菜单中轻松创建ScriptableObject实例。

在Unity编辑器中创建ScriptableObject实例。选择Assets > Create > ScriptableObjects > ExampleData。这将在项目的资源文件夹中创建一个新的ScriptableObject实例,你可以编辑它的属性值。

在其他脚本中引用和使用ScriptableObject实例。例如,在MonoBehaviour脚本中,你可以声明一个ExampleData类型的公共字段,并在Unity编辑器中将ScriptableObject实例拖放到相应的插槽中。

using UnityEngine;

public class ExampleUsage : MonoBehaviour
{
    public ExampleData exampleData;

    private void Start()
    {
        Debug.Log("Example String: " + exampleData.exampleString);
        Debug.Log("Example Int: " + exampleData.exampleInt);
    }
}

这样,你就可以在游戏运行时访问和使用ScriptableObject中的数据了。

当你在ScriptableObject上引用Prefab时,只有Prefab的元数据和引用信息会被加载到内存中,而不是整个Prefab的内容。只有当你在运行时实例化Prefab时(使用Instantiate函数),才会将Prefab的内容(如游戏对象、组件和资源)加载到内存中。

因此,尽管ScriptableObject上的Prefab引用占用一定的内存,但这通常是非常小的。只有在实际需要时,才会实例化Prefab并占用更多的内存。这种按需加载和实例化的方式有助于优化内存使用和性能。

所以,只要你没有实例化Prefab,它们就不会对内存产生太大影响。


http://www.kler.cn/a/18014.html

相关文章:

  • 【Python】爬虫通过验证码
  • java操作ES(一)RestHighLevelClient(2)集成与demo
  • 人工智能的前沿研究方向与未来发展趋势
  • 【MATLAB代码】二维平面上的TDOA,使用加权最小二乘法,不限制锚点数量,代码可复制粘贴
  • 【入门篇】A+B Problem——多语言版
  • 机器学习———特征工程
  • random — 伪随机数生成器(史上总结最全)
  • C++学习day--09 字符串比较、运算符
  • 【Java多线程编程】创建线程的基本方式
  • 【Linux】浅谈网络协议栈-网桥br0
  • 分布式锁Redisson对于(不可重入、不可重试、超时释放、主从一致性)四个问题的应对
  • Python人工智能—线性回归
  • C++面试题
  • java8新特性——StreamAPI
  • PyQt5零基础入门(二)——主窗口的显示与退出
  • LInux grep sed awk 命令详解
  • 开关电源基础01:电源变换器基础(3)
  • 数影周报:假冒ChatGPT的恶意软件激增,谷歌开启无密码登录
  • docker-mysql的几个问题
  • 学习HCIP的day.04
  • 【383. 赎金信】
  • 从零开始学习Linux运维,成为IT领域翘楚(十)
  • 【刷题】142. 环形链表 II
  • maven配置阿里云镜像仓库
  • 关于C语言的一些笔记
  • 算法:递归启蒙-汉诺塔