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

SerializationUtility.GetManagedReferencesWithMissingTypes

建议修改

成功!

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

关闭

提交失败

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

关闭

取消

声明

public static ManagedReferenceMissingType[] GetManagedReferencesWithMissingTypes(Object obj);

描述

返回无法反序列化(由于缺少类型)的托管引用的列表。

此方法返回无法反序列化的 Managed References 对象列表,因为它们的类型丢失。此信息可用于帮助解决丢失的类型问题。

其他资源:HasManagedReferencesWithMissingTypesManagedReferenceMissingType

using System.Collections.Generic;
using System.Text;
using UnityEngine;
using UnityEditor;

public class GetManagedReferencesWithMissingTypesExample { enum ReportFormat { Detailed, ClassList }

[MenuItem("Example/Report MonoBehaviour Missing SerializeReference Types")] static public void ReportMissingTypes() { ReportMissingTypesOnActiveMonoBehaviours(ReportFormat.ClassList); }

[MenuItem("Example/Report MonoBehaviour Missing SerializeReference Types - Detailed")] static public void ReportMissingTypesDetailed() { ReportMissingTypesOnActiveMonoBehaviours(ReportFormat.Detailed); }

static private void ReportMissingTypesOnActiveMonoBehaviours(ReportFormat reportType) { var report = new StringBuilder();

// Visit all the active MonoBehaviours var myMonoComponents = Object.FindObjectsOfType<MonoBehaviour>(); foreach (var monoBehaviour in myMonoComponents) { ReportReferencesWithMissingTypesOnHost(monoBehaviour, ref report, reportType); }

if (report.Length == 0) report.Append("No missing types found");

Debug.Log(report.ToString()); }

static private void ReportReferencesWithMissingTypesOnHost(Object host, ref StringBuilder report, ReportFormat reportType) { // Report the references that have missing types on an individual MonoBehaviour, ScriptableObject or other host if (!SerializationUtility.HasManagedReferencesWithMissingTypes(host)) return;

var missingTypes = SerializationUtility.GetManagedReferencesWithMissingTypes(host);

report.Append(reportType == ReportFormat.Detailed ? "Missing references on " : "Missing classes on "); MonoBehaviourDescription(host, ref report);

if (reportType == ReportFormat.Detailed) { foreach (var missingType in missingTypes) { report.Append("\t").AppendFormat("{0} - {1}", missingType.referenceId, MissingClassFullName(missingType)); if (missingType.serializedData.Length > 0) report.Append("\t").AppendFormat("\n\t\t{0}", missingType.serializedData); report.AppendLine(); } } else { // Only report each unique class that is missing, rather than all objects using that class var missingClasses = new HashSet<string>(); foreach (var missingType in missingTypes) { missingClasses.Add(MissingClassFullName(missingType)); }

foreach (var missingClass in missingClasses) { report.Append("\t").Append(missingClass).AppendLine(); } } }

static private void MonoBehaviourDescription(Object host, ref StringBuilder stringBuilder) { // Identify the object that has missing types stringBuilder.AppendFormat("MonoBehaviour \"{0}\" (Type: {1}, Instance: {2})", host.name, host.GetType().FullName, host.GetInstanceID()).AppendLine(); }

static private string MissingClassFullName(ManagedReferenceMissingType missingType) { var description = new StringBuilder(); if (missingType.namespaceName.Length > 0) description.Append(missingType.namespaceName).Append("."); description.AppendFormat("{0}, {1}", missingType.className, missingType.assemblyName); return description.ToString(); } }