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,它们就不会对内存产生太大影响。

猜你喜欢

转载自blog.csdn.net/hhh314159/article/details/130510151