版本:Unity 6(6000.0)
语言中文(简体)
  • C#

ManagedReferenceUtility.GetManagedReference

建议更改

恭喜!

感谢您帮助我们提升 Unity 文档的质量。虽然我们无法接受所有提交内容,但我们会阅读来自用户的所有建议更改,并在适用的地方进行更新。

关闭

提交失败

由于某种原因,无法提交您建议的更改。请在几分钟后<a>重试</a>。感谢您抽出时间帮助我们提升 Unity 文档的质量。

关闭

取消

声明

public static object GetManagedReference(Object obj, long id);

参数

hostObj 支持 SerializeReference 的宿主对象。例如 MonoBehaviourScriptableObject
refId 托管引用 ID。

返回

对象返回指定宿主上并通过提供的 ID 识别的 C# 对象。如果没有找到引用对象,则返回 null。

说明

根据其托管引用 ID 检索一个对象。

当在数组或图中的确切位置未知时,可以使用此方法有效地检索特定的引用对象。

其他资源:GetManagedReferenceIdForObjectSerializeReference

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

public class GetManagedReferenceExample : ScriptableObject { [Serializable] public class Item { public char m_data; }

[SerializeReference] public List<Item> m_items = new List<Item>();

private void InsertNewItem(long id, char data) { var newItem = new Item() {m_data = data}; if (ManagedReferenceUtility.SetManagedReferenceIdForObject(this, newItem, id)) m_items.Add(newItem); }

[MenuItem("Example/ManagedReferenceUtility GetManagedReference Example")] static void TestMethod() { var scriptableObject = ScriptableObject.CreateInstance<GetManagedReferenceExample>();

scriptableObject.InsertNewItem(1000, 'a'); scriptableObject.InsertNewItem(1001, 'b'); scriptableObject.InsertNewItem(1002, 'c'); scriptableObject.InsertNewItem(1003, 'd');

// Because 1002 is registered in an earlier call this will log an error and not change the state scriptableObject.InsertNewItem(1002, 'e');

// The array may get reordered over time. One way to find an specific item again would // be to look it up based on a known managed reference id var item = ManagedReferenceUtility.GetManagedReference(scriptableObject, 1002) as Item; Debug.LogFormat("Data on object 1002 is {0}", item.m_data);

var willBeNull = ManagedReferenceUtility.GetManagedReference(scriptableObject, 9999) as Item; } }