13
2018
06

Unity鎻掍欢寮鍙:SerializedObject/SerializedProperty 鏌ユ壘寮曠敤鐨勮祫婧

        Unity鏈変竴涓狥ind References in Scene鍔熻兘闈炲父濂界敤銆傚湪Project闈㈡澘涓彸閿竴涓枃浠讹紝閫夋嫨Find References in Scene灏卞彲浠ュ湪鍦烘櫙涓壘鍒版墍鏈夊瓨鍦ㄥ杩欎釜鏂囦欢鏈夊紩鐢ㄧ殑鐗╀綋銆備絾鏄緢澶氭椂鍊欙紝鎴戜滑鏇村姞闇瑕佺煡閬撶殑鏄紝杩欎釜鍦烘櫙閲岄潰鍒板簳寮曠敤浜嗗摢浜涙枃浠讹紝姣斿鍋氫紭鍖栫殑鏃跺欍

        杩欓噷鏈変竴涓彃浠跺彨鍋ResourceChecker锛屽畠鍙互鍒椾妇鍑烘墍鏈夊紩鐢ㄥ埌鐨則exture/mesh/mat绛夈備絾鏄粬涔熸湁涓涓皬灏忕殑闂锛屽浜庤嚜瀹氫箟鑴氭湰鐨勫紩鐢ㄦ病鏈夋晥鏋溿

        瑕佸疄鐜拌繖涓渶姹傦紝杩欓噷涓昏鍊熷姪SerializedObject/SerializedProperty銆傚弬鑰冨畼鏂规枃妗o細

        SerializedProperty鍦–ustomEditor浼氱粡甯哥敤鍒帮紝鍙互鐢ㄤ簬鍙嶅皠涓涓猆nity瀵硅薄鐨勫瓧娈碉紙鐢氳嚦鍙互鍙互鍙嶅皠private瀛楁锛岄潪甯告毚鍔涳級銆

        鍦ㄣUnity鏂囦欢銆佹枃浠跺紩鐢ㄣ乵eta璇﹁В銆嬩竴鏂囦腑锛屾浘缁忔彁鍒拌繃unity璧勬簮搴忓垪鍖栫殑鏁版嵁瑕佷箞鏄瓨鍦╩eta涓紝瑕佷箞灏辨槸鏈韩閭d釜璧勬簮銆傛瘮濡傜敤Notepad++鎵撳紑prefab鏂囦欢鍚庯紝鍙兘浼氭槸杩欐牱鐨剏aml搴忓垪鍖栨暟鎹傝岃繖浜涙暟鎹兘鍙互閫氳繃SerializedProperty鑾峰彇寰楀埌銆

image

        鍦ㄤ笂鍥剧殑渚嬪瓙涓彲浠ョ湅鍒帮紝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鐨勫紩鐢

image

       鑷虫瀹屾垚浜嗗ぇ閮ㄥ垎鐨勫紩鐢ㄤ俊鎭幏鍙栥傝繖閲岃繕鏈変竴涓棶棰橈紝娌℃湁闂存帴寮曠敤鐨勪俊鎭紝姣斿锛孴est鑴氭湰涓紩鐢ㄤ竴涓狝nimation鎴栬呭叾浠栨枃浠讹紝鑰岃繖浜涙枃浠跺張寮曠敤鍒癝prite銆傚湪杩欐牱鐨勬儏鍐典笅锛屽氨闇瑕佸啀瀵归偅涓枃浠跺仛閬嶅巻銆傜洿鍒版病鏈夐棿鎺ュ紩鐢紝鎵嶈兘鑾峰彇鐪熸鎵鏈夌殑寮曠敤銆

芦 涓婁竴绡 涓嬩竴绡 禄