版本: Unity 6 (6000.0)
语言English
  • C#

PropertyDatabase

UnityEditor.Search 中的类

建议更改

成功!

感谢您帮助我们提高 Unity 文档的质量。虽然我们无法接受所有提交,但我们确实会阅读用户提出的每个建议更改,并在适用时进行更新。

关闭

提交失败

由于某些原因,您的建议更改无法提交。请<a>稍后再试</a>。感谢您抽出时间帮助我们提高 Unity 文档的质量。

关闭

取消

描述

PropertyDatabase 是一个系统,它可以以线程安全的方式将不同类型的属性存储到我们称为属性数据库的单个文件中。

PropertyDatabase 的理念是,大多数情况下,获取属性值可能代价高昂。因此,缓存这些值以便以后重用可以节省大量的周期。缓存存储在文件中,因此在域重新加载或退出 Unity 时不会丢失(并非所有类型都可以在文件中序列化,但它们仍然可以存储在 PropertyDatabase 中,请参阅 PropertyDatabase.IsPersistedType)。您可以在不同的文件上打开多个 PropertyDatabase,但不能在单个文件上打开多个 PropertyDatabase。这样做会导致无效的 PropertyDatabase(请参阅 valid)。您可以在 PropertyDatabase 的单个实例上执行并发操作,但出于性能原因,您应该使用视图(请参阅 PropertyDatabase.GetViewIPropertyDatabaseView)。

您可以使用 PropertyDatabase 执行三种主要操作:存储值、加载值和使值无效。存储值时,值将存储在数组中,并按其键排序(请参阅 PropertyDatabase.CreateRecordKeyPropertyDatabaseRecordKey。键是一个表示文档和属性的数字。您可以将来自 PropertyDatabase 中任何位置的任何值存储在其中,但最常见的用例是存储资产或游戏对象的属性。在这些情况下,资产或游戏对象将是文档,属性是您要存储的该文档上的任何属性。然后,您可以稍后加载这些值,无论是单个属性还是整个文档。

using System.Collections.Generic;
using NUnit.Framework;
using UnityEditor;
using UnityEditor.Search;
using UnityEngine;

static class Example_PropertyDatabase
{
    // Where the property database will be written.
    const string propertyDatabaseFilePath = "Temp/test_property_db";

    static PropertyDatabase propertyDatabase;

    static void InitializePropertyDatabase()
    {
        // Setup the property database. We configure it with automatic flushing so the file store
        // will be updated automatically after an update.
        propertyDatabase = new PropertyDatabase(propertyDatabaseFilePath, true);
    }

    static void ClearPropertyDatabase()
    {
        propertyDatabase.Clear();

        // Since we are done with the property database, we should dispose it
        // to clear all resources.
        propertyDatabase.Dispose();
    }

    static PropertyDatabaseRecordKey GetPropertyKey(int id)
    {
        return PropertyDatabase.CreateRecordKey((ulong)id / 100, PropertyDatabase.CreatePropertyHash((id % 100).ToString()));
    }

    static object LoadPropertyValue(int id)
    {
        var recordKey = GetPropertyKey(id);
        if (propertyDatabase.TryLoad(recordKey, out object value))
            return value;

        // Fetch the value with the time consuming operation and store it for future
        // accesses.
        value = id.ToString();
        propertyDatabase.Store(recordKey, value);
        return value;
    }

    [MenuItem("Examples/PropertyDatabase/Class")]
    public static void RunExample()
    {
        InitializePropertyDatabase();
        if (!propertyDatabase.valid)
        {
            Debug.LogFormat(LogType.Error, LogOption.NoStacktrace, null, $"PropertyDatabase \"{propertyDatabase.filePath}\" failed to open properly.");
            return;
        }

        var allValues = new Dictionary<int, object>();
        // Load the property values to do something with it.
        for (var i = 0; i < 1000; ++i)
        {
            var value = LoadPropertyValue(i);
            allValues.Add(i, value);
        }

        // Validate everything is in the database
        for (var i = 0; i < 1000; ++i)
        {
            var key = GetPropertyKey(i);
            if (!propertyDatabase.TryLoad(key, out object value))
                Assert.Fail("Record should be in the database.");
            Assert.AreEqual(i.ToString(), value);
        }

        ClearPropertyDatabase();
    }
}

如果属性或整个文档发生更改,您可以使用 PropertyDatabase.InvalidatePropertyDatabase.InvalidateMask 使存储的值无效。

属性

autoFlush指示 PropertyDatabase 是否会自动更新后备文件。
filePath此 PropertyDatabase 打开的文件。
valid指示 PropertyDatabase 是否有效的布尔值。

构造函数

PropertyDatabase构造 PropertyDatabase 的新实例。

公共方法

Clear清除 PropertyDatabase 的全部内容。
Dispose释放此 PropertyDatabase 使用的资源。
Flush触发后备文件的手动更新。
GetInfo返回一个格式化的字符串,显示 PropertyDatabase 的各种信息。
GetValueFromRecord将记录值反序列化为其正确的类型。
GetView在 PropertyDatabase 上打开一个视图。
Invalidate使单个属性记录无效,使其不再可检索。
InvalidateMask使从多个与文档键掩码匹配的文档中存储的所有属性无效。
Store存储文档属性。
TryLoad加载单个属性,已反序列化为对象。

静态方法

CreateDocumentKey从文档标识符创建文档键。
CreatePropertyHash从属性路径创建属性哈希。
CreateRecordKey从文档标识符和属性路径创建记录键。
IsPersistableType返回一个布尔值,指示类型是否可以持久化到后备文件中。