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

SerializedProperty.contentHash

建议更改

成功!

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

关闭

提交失败

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

关闭

取消

public uint contentHash;

描述

提供属性的哈希值。(只读)

您可以使用它来跟踪属性路径下的值是否发生了任何更改(其他资源:SerializedProperty.propertyPath)。

请注意
-如果属性内容的大小小于或等于 32 位,则将返回内容而不是哈希值。
-如果属性路径指向数组或复杂类型,则哈希将对应于整个内容。
-如果属性是带有 [SerializeReference] 属性的字段,或者包含此类字段的复合类型,则内容哈希不包括引用的对象的内容,而是仅对引用 ID 进行哈希(其他资源:SerializedProperty.managedReferenceId)。

using UnityEngine;
using UnityEditor;

public class MyObject : ScriptableObject { public string myString = "answer to life the universe and everything"; public string[] myStringArray = { "answer", "to", "life", "the", "universe", "and", "everything" }; public int[] myIntArray = { 42, 442, 422, 4242 };

[MenuItem("Example/Output contentHash from SerializedProperty")] static void OutputContentHashFromSerializedProperty() { var scriptableObject = ScriptableObject.CreateInstance<MyObject>();

using (var serializedObject = new SerializedObject(scriptableObject)) { SerializedProperty serializedPropertyMyString = serializedObject.FindProperty("myString"); SerializedProperty serializedPropertyMyStringArray = serializedObject.FindProperty("myStringArray"); SerializedProperty serializedPropertyMyIntArray = serializedObject.FindProperty("myIntArray");

uint myStringHash = serializedPropertyMyString.contentHash; uint myStringArrayHash = serializedPropertyMyStringArray.contentHash; uint MyIntArrayHash = serializedPropertyMyIntArray.contentHash;

serializedPropertyMyString.stringValue = "new string"; serializedPropertyMyIntArray.DeleteArrayElementAtIndex(1);

serializedObject.ApplyModifiedPropertiesWithoutUndo();

Debug.Log(string.Format("myString: before={0}, after={1}, changed={2}", myStringHash, serializedPropertyMyString.contentHash, myStringHash == serializedPropertyMyString.contentHash ? "no" : "yes")); Debug.Log(string.Format("myStringArrayHash: before={0}, after={1}, changed={2}", myStringArrayHash, serializedPropertyMyStringArray.contentHash, myStringArrayHash == serializedPropertyMyStringArray.contentHash ? "no" : "yes")); Debug.Log(string.Format("MyIntArrayHash: before={0}, after={1}, changed={2}", MyIntArrayHash, serializedPropertyMyIntArray.contentHash, MyIntArrayHash == serializedPropertyMyIntArray.contentHash ? "no" : "yes")); } } }