ContentLoadState
A snapshot of what is loaded from one content directory: the content files in memory, the loaded scenes, and the dependencies between them.
阅读时间3 分钟最后更新于 2 天前
Definition
- Type: Class
- Namespace: Unity.Loading
- Assembly: UnityEngine.ContentLoadModule
public sealed class ContentLoadState
Remarks
ContentDirectoryDiagnostics.GetContentDirectoryLoadInfo fills the state in ContentDirectoryLoadInfo.LoadState. The lists stay empty in release Players.
The lists refer to each other by index. Each file and scene names a range of ContentLoadState.Dependencies, and each entry of that range is the index in ContentLoadState.Files of a file it depends on. An index is only valid in the state it comes from. To follow a file from one state to another, compare LoadedContentFileInfo.Identity.
The lists do not change after the call, so a state can be kept after the content directory is unregistered or after Play mode ends. LoadedSceneInfo.Scene refers to a live scene, which can be unloaded after the call.
To find the source assets of a file, look up ContentFileIdentity.ToString in the build's file, as ContentDirectoryDiagnostics describes. This also works for a state filled in a Player: send each ContentFileIdentity.ToString with the ContentDirectoryLoadInfo.BuildManifestHash. In the Editor, ContentLoadEditorUtility.TryGetSourceAssetGUID gives the source asset directly.
ContentLayout.jsonAdditional Resources: ContentDirectoryDiagnostics.GetContentDirectoryLoadInfo
Examples
using System.Collections.Generic;using Unity.Loading;using UnityEditor;using UnityEngine;namespace BuildDocExamples{ // Example: find what a level loaded and did not release. Count the holds that game code keeps on // each content file before the level loads, and again after it unloads. A file that game code // holds more often afterwards is held by a Loadable that the level loaded and did not release. // The same asset built into two content directories has the same identity in both, so the counts // are kept per directory. public class ContentDirectoryDiagnostics_GetContentDirectoryLoadInfoExample { readonly ContentDirectoryLoadInfo m_Info = new ContentDirectoryLoadInfo(); readonly Dictionary<(ContentDirectoryHandle, ContentFileIdentity), int> m_HoldsBeforeLevel = new Dictionary<(ContentDirectoryHandle, ContentFileIdentity), int>(); public void OnBeforeLevelLoads() { m_HoldsBeforeLevel.Clear(); foreach (ContentDirectoryHandle directory in ContentLoadManager.GetContentDirectories()) { ContentDirectoryDiagnostics.GetContentDirectoryLoadInfo(directory, m_Info); for (int i = 0; i < m_Info.LoadState.Files.Count; i++) m_HoldsBeforeLevel[(directory, m_Info.LoadState.Files[i].Identity)] = GameCodeHolds(i); } } public void OnAfterLevelUnloads() { foreach (ContentDirectoryHandle directory in ContentLoadManager.GetContentDirectories()) { ContentDirectoryDiagnostics.GetContentDirectoryLoadInfo(directory, m_Info); ContentLoadState state = m_Info.LoadState; for (int i = 0; i < state.Files.Count; i++) { LoadedContentFileInfo file = state.Files[i]; m_HoldsBeforeLevel.TryGetValue((directory, file.Identity), out int holdsBefore); int notReleased = GameCodeHolds(i) - holdsBefore; if (notReleased > 0) Debug.LogWarning($"{notReleased} Loadable(s) not released after the level unloaded, in {NameOf(file.Identity)}"); } } } // Unity holds the files of root assets for the content directory. The other holds come from game code. int GameCodeHolds(int fileIndex) { return m_Info.LoadState.Files[fileIndex].ReferenceCount - m_Info.RootAssetReferences[fileIndex]; } // In the Editor, name the asset that the file was built from. Elsewhere, the identity is the // file's StableId in the ContentLayout.json file of the build that ContentDirectoryLoadInfo.BuildManifestHash names. static string NameOf(ContentFileIdentity file) { return ContentLoadEditorUtility.TryGetSourceAssetGUID(file, out GUID guid) ? AssetDatabase.GUIDToAssetPath(guid) : file.ToString(); } }}
Properties
Property | Description |
|---|---|
| Dependencies | Indices into ContentLoadState.Files, in one range for each file and each scene. |
| Files | The content files of the content directory that are in memory, including those loaded only as dependencies. |
| Scenes | The scenes loaded from the content directory. |