Unity 6.3
0 онлайн 69 гостей 3 в системе
Вход

SerializationUtility.GetManagedReferencesWithMissingTypes

Declaration

public static ManagedReferenceMissingType[] GetManagedReferencesWithMissingTypes(Object obj);

Описание

Возвращает список управляемых ссылок, которые не удалось десериализовать из-за отсутствия типа.

Этот метод возвращает список объектов управляемых ссылок, которые не могли быть десериализированы из-за отсутствия их типа. Эту информацию можно использовать для разрешения случаев отсутствия типа.

Дополнительные ресурсы: HasManagedReferencesWithMissingTypes, ManagedReferenceMissingType.

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(); } }