Unity鏈変竴涓狥ind References in Scene鍔熻兘闈炲父濂界敤銆傚湪Project闈㈡澘涓彸閿竴涓枃浠讹紝閫夋嫨Find References in Scene灏卞彲浠ュ湪鍦烘櫙涓壘鍒版墍鏈夊瓨鍦ㄥ杩欎釜鏂囦欢鏈夊紩鐢ㄧ殑鐗╀綋銆備絾鏄緢澶氭椂鍊欙紝鎴戜滑鏇村姞闇瑕佺煡閬撶殑鏄紝杩欎釜鍦烘櫙閲岄潰鍒板簳寮曠敤浜嗗摢浜涙枃浠讹紝姣斿鍋氫紭鍖栫殑鏃跺欍
杩欓噷鏈変竴涓彃浠跺彨鍋ResourceChecker锛屽畠鍙互鍒椾妇鍑烘墍鏈夊紩鐢ㄥ埌鐨則exture/mesh/mat绛夈備絾鏄粬涔熸湁涓涓皬灏忕殑闂锛屽浜庤嚜瀹氫箟鑴氭湰鐨勫紩鐢ㄦ病鏈夋晥鏋溿
瑕佸疄鐜拌繖涓渶姹傦紝杩欓噷涓昏鍊熷姪SerializedObject/SerializedProperty銆傚弬鑰冨畼鏂规枃妗o細
https://docs.unity3d.com/ScriptReference/SerializedObject.html
https://docs.unity3d.com/ScriptReference/SerializedProperty.html
SerializedProperty鍦–ustomEditor浼氱粡甯哥敤鍒帮紝鍙互鐢ㄤ簬鍙嶅皠涓涓猆nity瀵硅薄鐨勫瓧娈碉紙鐢氳嚦鍙互鍙互鍙嶅皠private瀛楁锛岄潪甯告毚鍔涳級銆
鍦ㄣUnity鏂囦欢銆佹枃浠跺紩鐢ㄣ乵eta璇﹁В銆嬩竴鏂囦腑锛屾浘缁忔彁鍒拌繃unity璧勬簮搴忓垪鍖栫殑鏁版嵁瑕佷箞鏄瓨鍦╩eta涓紝瑕佷箞灏辨槸鏈韩閭d釜璧勬簮銆傛瘮濡傜敤Notepad++鎵撳紑prefab鏂囦欢鍚庯紝鍙兘浼氭槸杩欐牱鐨剏aml搴忓垪鍖栨暟鎹傝岃繖浜涙暟鎹兘鍙互閫氳繃SerializedProperty鑾峰彇寰楀埌銆
鍦ㄤ笂鍥剧殑渚嬪瓙涓彲浠ョ湅鍒帮紝Property鍚嶅瓧涓簃_PrefabInternal锛屽畠鐨刅alue涓紝fileID涓嶄负0銆傜敱姝ゅ彲浠ョ湅鍒拌繖涓墿浣撳紩鐢ㄤ簡涓涓璞°
涓嬮潰锛屾垜浠敤浠g爜鏉ュ鎵句竴涓狿refab涓紩鐢ㄥ埌鎸囧畾绫诲瀷鐨勬墍鏈夋枃浠讹紝姣斿Sprite銆
public static void FindRef<T>(SerializedObject obj) where T : Object {var prop = obj.GetIterator();while (prop.Next(true)) {if (prop.propertyType == SerializedPropertyType.ObjectReference) {var value = prop.objectReferenceValue;if (value is T) {var path = AssetDatabase.GetAssetPath(value); Debug.Log(prop.propertyPath + ":" + path); } } } }
杩欓噷鏈夊嚑涓狝PI
SerializedObject.GetIterator锛氳幏鍙栬繖涓猄erializedObject涓婄殑鍒濆SerializedProperty銆傜敤杩欎釜SerializedProperty鍙互閫愪釜鍒椾妇鍑轰笅涓涓猄erializedProperty
SerializedProperty.Next锛氳幏鍙栦笅涓涓猄erializedProperty锛屽鏋滃弬鏁颁负true锛屽氨浼氳繘鍏ュ瓙瀛楁Object鐨凱roperty.姣斿涓涓猰ono鑴氭湰涓婃湁A瀛楁锛孉瀛楁鏄竴涓猚lass锛屽畠鏈夎嚜宸辫嫢骞蹭釜鍙簭鍒楃殑瀛楁锛岄偅涔堝氨浼氶愪釜鍒椾妇杩欎簺瀛楁鐨凷erializedProperty銆
SerializedProperty.propertyType锛氬瓧娈电殑绫诲瀷锛屾瘮濡傛槸寮曠敤锛屾暟瀛楋紝瀛楃绛夌瓑锛岃SerializedPropertyType銆傛瘡涓绉峊ype瀵瑰簲鐨勫肩殑绫诲瀷涔熸槸涓嶄竴鏍
SerializedProperty.objectReferenceValue锛屽紩鐢ㄧ被鍨嬬殑瀛楁鐨勫笺傜敱浜庤繖閲屾垜浠富瑕佹煡鎵剧殑鏄鏂囦欢鐨勫紩鐢紝鎵浠ュ紩鐢ㄧ殑瀵硅薄鑲畾鍦╫bjectReferenceValue涓
SerializedProperty.propertyPath锛屽瓧娈靛湪杩欎釜SerializedObject涓殑璺緞銆傛濡備笂闈㈡墍瑷锛岃繖涓瓧娈靛彲鑳芥槸灞炰簬瀛愬瓧娈电殑锛屾墍浠ユ湁璺緞涔嬭
鎵浠ワ紝杩欐浠g爜灏辨槸锛岄愪釜閬嶅巻涓涓猄erializedObject涓殑鎵鏈夊瓧娈碉紝濡傛灉鏄璞″紩鐢ㄧ殑锛屽苟涓斿璞$殑鍊兼槸鎴戜滑鎯宠鐨勭被鍨嬶紝閭d箞鎵惧嚭鍦ㄥ伐绋嬩腑鐨勮矾寰勶紝鎵撳嵃鍑烘潵銆
鎴戜滑鎵╁厖涓涓嬶紝澧炲姞浠ヤ笅鍑芥暟
public static void FindRefWithGameObject<T>(GameObject obj) where T : Object {var coms = obj.GetComponentsInChildren<Component>();foreach (var com in coms) {var so = new SerializedObject(com); FindRef<T>(so); } }
寰堢畝鍗曪紝鎵惧埌涓涓狦ameObject鐗╀綋涓嬬殑鎵鏈夌粍浠讹紝杞负SerializedObject锛岀劧鍚庣敤涔嬪墠鐨勫嚱鏁帮紝鎶婃瘡涓涓粍浠朵笅锛屽紩鐢ㄥ埌鎸囧畾T绫诲瀷鐨勮祫婧愮殑瀛楁鍏ㄩ儴鎵撳嵃鍑烘潵銆
鏈鍚庯紝鎴戜滑鐪熸鏉ユ壘鍑烘墍鏈夊紩鐢ㄥ埌鐨凷prite
[MenuItem("Assets/Test/FindSprite")]public static void FindSprite() {var select = Selection.activeGameObject;if (select == null)return; FindRefWithGameObject<Sprite>(select); }
OK锛屽湪涓涓狿refab涓婂彸閿紝閫夋嫨Test->FindSprite锛屽彲浠ョ湅鍒版墦鍗板嚭鎵鏈夌殑寮曠敤淇℃伅浜
鍦ㄨ繖涓猟emo涓彲浠ョ湅鍒板寘鍚簡Image鎺т欢涓殑Sprite寮曠敤锛孊utton涓垏鎹㈢殑Sprite寮曠敤锛岃嚜瀹氫箟鑴氭湰Test涓Sprite鐨勫紩鐢
鑷虫瀹屾垚浜嗗ぇ閮ㄥ垎鐨勫紩鐢ㄤ俊鎭幏鍙栥傝繖閲岃繕鏈変竴涓棶棰橈紝娌℃湁闂存帴寮曠敤鐨勪俊鎭紝姣斿锛孴est鑴氭湰涓紩鐢ㄤ竴涓狝nimation鎴栬呭叾浠栨枃浠讹紝鑰岃繖浜涙枃浠跺張寮曠敤鍒癝prite銆傚湪杩欐牱鐨勬儏鍐典笅锛屽氨闇瑕佸啀瀵归偅涓枃浠跺仛閬嶅巻銆傜洿鍒版病鏈夐棿鎺ュ紩鐢紝鎵嶈兘鑾峰彇鐪熸鎵鏈夌殑寮曠敤銆