로컬라이즈 추가
com.unity.localization 추가
This commit is contained in:
8
Gameton-06/Assets/AddressableAssetsData.meta
Normal file
8
Gameton-06/Assets/AddressableAssetsData.meta
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: e65bfabc212232942be7fbabe43bc3ab
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
BIN
Gameton-06/Assets/AddressableAssetsData/AddressableAssetSettings.asset
LFS
Normal file
BIN
Gameton-06/Assets/AddressableAssetsData/AddressableAssetSettings.asset
LFS
Normal file
Binary file not shown.
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 4e1e47aa584fbbc4a85c83713c580086
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
8
Gameton-06/Assets/AddressableAssetsData/Android.meta
Normal file
8
Gameton-06/Assets/AddressableAssetsData/Android.meta
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 7ed5bff9db69a4c4599876e42b4a8b30
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 348264cbd15537a4aafec29706ceef66
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
BIN
Gameton-06/Assets/AddressableAssetsData/AssetGroupTemplates/Packed Assets.asset
LFS
Normal file
BIN
Gameton-06/Assets/AddressableAssetsData/AssetGroupTemplates/Packed Assets.asset
LFS
Normal file
Binary file not shown.
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 274c924c396bc8a48a9615b16f350fd0
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
8
Gameton-06/Assets/AddressableAssetsData/AssetGroups.meta
Normal file
8
Gameton-06/Assets/AddressableAssetsData/AssetGroups.meta
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 789d766003ae2214e81891699346b4f5
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
BIN
Gameton-06/Assets/AddressableAssetsData/AssetGroups/Built In Data.asset
LFS
Normal file
BIN
Gameton-06/Assets/AddressableAssetsData/AssetGroups/Built In Data.asset
LFS
Normal file
Binary file not shown.
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 309ec65306fb5134697827674cd7227e
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
BIN
Gameton-06/Assets/AddressableAssetsData/AssetGroups/Default Local Group.asset
LFS
Normal file
BIN
Gameton-06/Assets/AddressableAssetsData/AssetGroups/Default Local Group.asset
LFS
Normal file
Binary file not shown.
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 9a30e9266a6f14942aff2c6a23e2eed8
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Binary file not shown.
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: cb162b8eb567b174c8ff3d42822f890d
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
BIN
Gameton-06/Assets/AddressableAssetsData/AssetGroups/Localization-Locales.asset
LFS
Normal file
BIN
Gameton-06/Assets/AddressableAssetsData/AssetGroups/Localization-Locales.asset
LFS
Normal file
Binary file not shown.
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 19ba5a4d983976e428bb96ff78f728ec
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Binary file not shown.
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 9ea2004a9650eb1439268edac62dfe77
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Binary file not shown.
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: aa167019ab1d1114083b8a4e09b3e213
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: a57ea3ad9feae2446a10f0a008c2bce9
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Binary file not shown.
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 0a7b8b655083f4c4f8a3ea2f627556e8
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Binary file not shown.
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 07f0cd69b6b36844993dd8a508cb509d
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Binary file not shown.
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 6f158d50604d8b54eaabcf68d0efa9a3
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Binary file not shown.
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 1741e2c306099064ea3fb76c812be3fd
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Binary file not shown.
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 35746cd3760db124b9aa8e0f7ed6990c
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Binary file not shown.
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 29b6e7ad0134a244c911f43643fe36c1
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Binary file not shown.
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: f541b0a94ee113b4daa64be20da034ce
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Binary file not shown.
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 1174e3a5b510c52429d1c3f02f5cb51a
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Binary file not shown.
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 904c1efa710dfb24e926d2b162012d23
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Binary file not shown.
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: a79f9dcba9c60a640a99145620e3b4e5
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Binary file not shown.
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 0764e95737052c94aa5a20b51222f446
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: d7a7271f4eb70724eaaa2394aaef1fe2
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
BIN
Gameton-06/Assets/AddressableAssetsData/DataBuilders/BuildScriptFastMode.asset
LFS
Normal file
BIN
Gameton-06/Assets/AddressableAssetsData/DataBuilders/BuildScriptFastMode.asset
LFS
Normal file
Binary file not shown.
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 1fa2e4007bd20124ab6678465c85822d
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
BIN
Gameton-06/Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedMode.asset
LFS
Normal file
BIN
Gameton-06/Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedMode.asset
LFS
Normal file
Binary file not shown.
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 83a7bf2e6e43a9444b3b4459c04dae30
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Binary file not shown.
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 5b6808d7139b955438b327010eab6442
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Binary file not shown.
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 187d676902980eb47bbd301e1c5760fc
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
BIN
Gameton-06/Assets/AddressableAssetsData/DefaultObject.asset
LFS
Normal file
BIN
Gameton-06/Assets/AddressableAssetsData/DefaultObject.asset
LFS
Normal file
Binary file not shown.
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: f2cdd77340a451b459d557bdf1e569a6
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
BIN
Gameton-06/Assets/AddressableAssetsData/ProfileDataSourceSettings.asset
LFS
Normal file
BIN
Gameton-06/Assets/AddressableAssetsData/ProfileDataSourceSettings.asset
LFS
Normal file
Binary file not shown.
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: d27df7db6f069864eb7ca429230b530f
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
26
Gameton-06/Assets/AddressableAssetsData/link.xml
Normal file
26
Gameton-06/Assets/AddressableAssetsData/link.xml
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
<linker>
|
||||||
|
<assembly fullname="Unity.Addressables, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" preserve="all">
|
||||||
|
<type fullname="UnityEngine.AddressableAssets.Addressables" preserve="all" />
|
||||||
|
</assembly>
|
||||||
|
<assembly fullname="Unity.Localization, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null">
|
||||||
|
<type fullname="UnityEngine.Localization.Locale" preserve="all" />
|
||||||
|
<type fullname="UnityEngine.Localization.Tables.SharedTableData" preserve="all" />
|
||||||
|
<type fullname="UnityEngine.Localization.Tables.StringTable" preserve="all" />
|
||||||
|
<type fullname="UnityEngine.Localization.Metadata.MetadataCollection" preserve="nothing" serialized="true" />
|
||||||
|
<type fullname="UnityEngine.Localization.Tables.DistributedUIDGenerator" preserve="nothing" serialized="true" />
|
||||||
|
<type fullname="UnityEngine.Localization.Tables.SharedTableData/SharedTableEntry" preserve="nothing" serialized="true" />
|
||||||
|
<type fullname="UnityEngine.Localization.LocaleIdentifier" preserve="nothing" serialized="true" />
|
||||||
|
<type fullname="UnityEngine.Localization.Metadata.FallbackLocale" preserve="nothing" serialized="true" />
|
||||||
|
<type fullname="UnityEngine.Localization.Tables.TableEntryData" preserve="nothing" serialized="true" />
|
||||||
|
</assembly>
|
||||||
|
<assembly fullname="Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" preserve="all">
|
||||||
|
<type fullname="UnityEngine.ResourceManagement.ResourceProviders.AssetBundleProvider" preserve="all" />
|
||||||
|
<type fullname="UnityEngine.ResourceManagement.ResourceProviders.BundledAssetProvider" preserve="all" />
|
||||||
|
<type fullname="UnityEngine.ResourceManagement.ResourceProviders.InstanceProvider" preserve="all" />
|
||||||
|
<type fullname="UnityEngine.ResourceManagement.ResourceProviders.LegacyResourcesProvider" preserve="all" />
|
||||||
|
<type fullname="UnityEngine.ResourceManagement.ResourceProviders.SceneProvider" preserve="all" />
|
||||||
|
</assembly>
|
||||||
|
<assembly fullname="UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null">
|
||||||
|
<type fullname="UnityEngine.Object" preserve="all" />
|
||||||
|
</assembly>
|
||||||
|
</linker>
|
||||||
7
Gameton-06/Assets/AddressableAssetsData/link.xml.meta
Normal file
7
Gameton-06/Assets/AddressableAssetsData/link.xml.meta
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 2ae74e8a783d81048bfeb68a1933c3e9
|
||||||
|
TextScriptImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
8
Gameton-06/Assets/Gameton/Localization.meta
Normal file
8
Gameton-06/Assets/Gameton/Localization.meta
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 7b4aa4883e6720b4289409ef336acb1d
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
BIN
Gameton-06/Assets/Gameton/Localization/Korean (South Korea) (ko-KR).asset
LFS
Normal file
BIN
Gameton-06/Assets/Gameton/Localization/Korean (South Korea) (ko-KR).asset
LFS
Normal file
Binary file not shown.
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 44fe7af925d413d4abd829cd82fddb77
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
BIN
Gameton-06/Assets/Gameton/Localization/Korean (ko).asset
LFS
Normal file
BIN
Gameton-06/Assets/Gameton/Localization/Korean (ko).asset
LFS
Normal file
Binary file not shown.
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: b0c3fd95cda7b0442bcfa2fa8e4a1f17
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
BIN
Gameton-06/Assets/Gameton/Localization/Localization Settings.asset
LFS
Normal file
BIN
Gameton-06/Assets/Gameton/Localization/Localization Settings.asset
LFS
Normal file
Binary file not shown.
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 09dcbbdab6bad534eb5ef5b08dadde20
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
BIN
Gameton-06/Assets/Gameton/Localization/dlrhahdla Shared Data.asset
LFS
Normal file
BIN
Gameton-06/Assets/Gameton/Localization/dlrhahdla Shared Data.asset
LFS
Normal file
Binary file not shown.
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: ff96a387eeb9f8d4dbd9efd39ae04e1f
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
BIN
Gameton-06/Assets/Gameton/Localization/dlrhahdla.asset
LFS
Normal file
BIN
Gameton-06/Assets/Gameton/Localization/dlrhahdla.asset
LFS
Normal file
Binary file not shown.
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: dc283fc8ff2dc42489f7374b4a03caa6
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
BIN
Gameton-06/Assets/Gameton/Localization/dlrhahdla_ko-KR.asset
LFS
Normal file
BIN
Gameton-06/Assets/Gameton/Localization/dlrhahdla_ko-KR.asset
LFS
Normal file
Binary file not shown.
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: cdd4493628941034d83abaecd4abd742
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
BIN
Gameton-06/Assets/Gameton/Localization/dlrhahdla_ko.asset
LFS
Normal file
BIN
Gameton-06/Assets/Gameton/Localization/dlrhahdla_ko.asset
LFS
Normal file
Binary file not shown.
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 34eccca0dc5e0104cb4e4f52ff3afec8
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Binary file not shown.
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: f8f54d7c439b6064487d72e48787ef04
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Binary file not shown.
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: c57811e56171a124595e8c4c07e72bd4
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Binary file not shown.
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 49fcd3d2300f86f4091f156f4047a40a
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: ba1664ec1a0467641a742eaadae146d4
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"name": "Sirenix.OdinInspector.Modules.Unity.Addressables",
|
||||||
|
"references": [
|
||||||
|
"Unity.Addressables",
|
||||||
|
"Unity.Addressables.Editor",
|
||||||
|
"Sirenix.Serialization",
|
||||||
|
"Sirenix.OdinInspector.Attributes",
|
||||||
|
"Sirenix.OdinInspector.Editor",
|
||||||
|
"Sirenix.Utilities.Editor",
|
||||||
|
"Sirenix.Utilities",
|
||||||
|
"Sirenix.OdinValidator.Editor"
|
||||||
|
],
|
||||||
|
"includePlatforms": [],
|
||||||
|
"excludePlatforms": [],
|
||||||
|
"allowUnsafeCode": true,
|
||||||
|
"overrideReferences": false,
|
||||||
|
"precompiledReferences": [
|
||||||
|
"Sirenix.Serialization.dll",
|
||||||
|
"Sirenix.OdinInspector.Attributes.dll",
|
||||||
|
"Sirenix.OdinInspector.Editor.dll",
|
||||||
|
"Sirenix.Utilities.Editor.dll",
|
||||||
|
"Sirenix.Utilities.dll",
|
||||||
|
"Sirenix.OdinValidator.Editor.dll"
|
||||||
|
],
|
||||||
|
"autoReferenced": true,
|
||||||
|
"defineConstraints": [],
|
||||||
|
"versionDefines": [],
|
||||||
|
"noEngineReferences": false
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 3b4d8e09c665bfa47849130d8695171e
|
||||||
|
AssemblyDefinitionImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: b568c1d508ce0b74eb0025b8501d1c1e
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,94 @@
|
|||||||
|
//-----------------------------------------------------------------------
|
||||||
|
// <copyright file="AssetLabelReferenceValidator.cs" company="Sirenix ApS">
|
||||||
|
// Copyright (c) Sirenix ApS. All rights reserved.
|
||||||
|
// </copyright>
|
||||||
|
//-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
#if UNITY_EDITOR
|
||||||
|
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEditor.AddressableAssets;
|
||||||
|
using Sirenix.OdinInspector.Editor.Validation;
|
||||||
|
using UnityEngine.AddressableAssets;
|
||||||
|
using Sirenix.OdinInspector.Modules.Addressables.Editor;
|
||||||
|
|
||||||
|
#if ODIN_VALIDATOR_3_1
|
||||||
|
[assembly: RegisterValidationRule(typeof(AssetLabelReferenceValidator), Description =
|
||||||
|
"This validator ensures that AssetLabelReferences marked with the Required attribute display an error " +
|
||||||
|
"message if they are not set. It can also be configured to require that all AssetLabelReferences be set " +
|
||||||
|
"by default; the Optional attribute can then be used to exclude specific AssetLabelReferences from " +
|
||||||
|
"validation.")]
|
||||||
|
#else
|
||||||
|
[assembly: RegisterValidator(typeof(AssetLabelReferenceValidator))]
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace Sirenix.OdinInspector.Modules.Addressables.Editor
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Validator for AssetLabelReference values.
|
||||||
|
/// </summary>
|
||||||
|
public class AssetLabelReferenceValidator : ValueValidator<AssetLabelReference>
|
||||||
|
{
|
||||||
|
[Tooltip("If enabled, the validator will display an error message if the AssetLabelReference is not set. " +
|
||||||
|
"If disabled, the validator will only display an error message if the AssetLabelReference is set, but the " +
|
||||||
|
"assigned label does not exist.")]
|
||||||
|
[ToggleLeft]
|
||||||
|
public bool RequiredByDefault;
|
||||||
|
|
||||||
|
private bool required;
|
||||||
|
private bool optional;
|
||||||
|
private string requiredMessage;
|
||||||
|
|
||||||
|
protected override void Initialize()
|
||||||
|
{
|
||||||
|
var requiredAttr = this.Property.GetAttribute<RequiredAttribute>();
|
||||||
|
|
||||||
|
this.requiredMessage = requiredAttr?.ErrorMessage ?? $"<b>{this.Property.NiceName}</b> is required.";
|
||||||
|
|
||||||
|
if (this.RequiredByDefault)
|
||||||
|
{
|
||||||
|
required = true;
|
||||||
|
optional = Property.GetAttribute<OptionalAttribute>() != null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
required = requiredAttr != null;
|
||||||
|
optional = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void Validate(ValidationResult result)
|
||||||
|
{
|
||||||
|
// If the Addressables settings have not been created, nothing else is really valid.
|
||||||
|
if (AddressableAssetSettingsDefaultObject.SettingsExists == false)
|
||||||
|
{
|
||||||
|
result.AddError("Addressables Settings have not been created.")
|
||||||
|
.WithButton("Open Settings Window", () => OdinAddressableUtility.OpenGroupsWindow());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var value = Value?.labelString;
|
||||||
|
|
||||||
|
if (string.IsNullOrEmpty(value))
|
||||||
|
{
|
||||||
|
if (optional == false && required) // Optional == false & required? Nice.
|
||||||
|
{
|
||||||
|
result.AddError(requiredMessage).EnableRichText();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var labels = AddressableAssetSettingsDefaultObject.Settings.GetLabels();
|
||||||
|
|
||||||
|
if (labels.Contains(value) == false)
|
||||||
|
{
|
||||||
|
result.AddError($"Label <i>{value}</i> has not been created as a label.")
|
||||||
|
.WithButton("Open Label Settings", () => OdinAddressableUtility.OpenLabelsWindow());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: fcaf7dc3b9a98a545b301a1ea175055b
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,278 @@
|
|||||||
|
//-----------------------------------------------------------------------
|
||||||
|
// <copyright file="AssetReferenceValidator.cs" company="Sirenix ApS">
|
||||||
|
// Copyright (c) Sirenix ApS. All rights reserved.
|
||||||
|
// </copyright>
|
||||||
|
//-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
#if UNITY_EDITOR
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEditor.AddressableAssets;
|
||||||
|
using Sirenix.OdinInspector.Editor.Validation;
|
||||||
|
using Sirenix.Utilities;
|
||||||
|
using Sirenix.Utilities.Editor;
|
||||||
|
using UnityEditor.AddressableAssets.Settings;
|
||||||
|
using UnityEngine.AddressableAssets;
|
||||||
|
using Sirenix.OdinInspector.Modules.Addressables.Editor;
|
||||||
|
|
||||||
|
#if ODIN_VALIDATOR_3_1
|
||||||
|
[assembly: RegisterValidationRule(typeof(AssetReferenceValidator), Description =
|
||||||
|
"This validator provides robust integrity checks for your asset references within Unity. " +
|
||||||
|
"It validates whether an asset reference has been assigned, and if it's missing, raises an error. " +
|
||||||
|
"It further checks the existence of the main asset at the assigned path, ensuring it hasn't been " +
|
||||||
|
"inadvertently deleted or moved. The validator also verifies if the assigned asset is addressable " +
|
||||||
|
"and, if not, offers a fix to make it addressable. Moreover, it ensures the asset adheres to " +
|
||||||
|
"specific label restrictions set through the AssetReferenceUILabelRestriction attribute. " +
|
||||||
|
"Lastly, it performs checks on any sub-object linked to the asset, making sure it hasn't gone missing. " +
|
||||||
|
"This comprehensive validation system prevents hard-to-spot bugs and errors, " +
|
||||||
|
"fostering a more robust and efficient development workflow.")]
|
||||||
|
#else
|
||||||
|
[assembly: RegisterValidator(typeof(AssetReferenceValidator))]
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace Sirenix.OdinInspector.Modules.Addressables.Editor
|
||||||
|
{
|
||||||
|
public class AssetReferenceValidator : ValueValidator<AssetReference>
|
||||||
|
{
|
||||||
|
[Tooltip("If true and the AssetReference is not marked with the Optional attribute, " +
|
||||||
|
"the validator will display an error message if the AssetReference is not set. " +
|
||||||
|
"If false, the validator will only display an error message if the AssetReference is set, " +
|
||||||
|
"but the assigned asset does not exist.")]
|
||||||
|
[ToggleLeft]
|
||||||
|
public bool RequiredByDefault;
|
||||||
|
|
||||||
|
private bool required;
|
||||||
|
private bool optional;
|
||||||
|
private string requiredMessage;
|
||||||
|
|
||||||
|
private List<AssetReferenceUIRestriction> restrictions;
|
||||||
|
|
||||||
|
protected override void Initialize()
|
||||||
|
{
|
||||||
|
var requiredAttr = this.Property.GetAttribute<RequiredAttribute>();
|
||||||
|
|
||||||
|
this.requiredMessage = requiredAttr?.ErrorMessage ?? $"<b>{this.Property.NiceName}</b> is required.";
|
||||||
|
|
||||||
|
if (this.RequiredByDefault)
|
||||||
|
{
|
||||||
|
this.required = true;
|
||||||
|
this.optional = this.Property.GetAttribute<OptionalAttribute>() != null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.required = requiredAttr != null;
|
||||||
|
this.optional = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.restrictions = new List<AssetReferenceUIRestriction>();
|
||||||
|
foreach (var attr in this.Property.Attributes)
|
||||||
|
{
|
||||||
|
if (attr is AssetReferenceUIRestriction r)
|
||||||
|
{
|
||||||
|
this.restrictions.Add(r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void Validate(ValidationResult result)
|
||||||
|
{
|
||||||
|
// If the Addressables settings have not been created, nothing else is really valid.
|
||||||
|
if (AddressableAssetSettingsDefaultObject.SettingsExists == false)
|
||||||
|
{
|
||||||
|
result.AddError("Addressables Settings have not been created.")
|
||||||
|
.WithButton("Open Settings Window", () => OdinAddressableUtility.OpenGroupsWindow());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var assetReference = this.Value;
|
||||||
|
var assetReferenceHasBeenAssigned = !string.IsNullOrEmpty(assetReference?.AssetGUID);
|
||||||
|
|
||||||
|
// No item has been assigned.
|
||||||
|
if (!assetReferenceHasBeenAssigned)
|
||||||
|
{
|
||||||
|
if (optional == false && required) // Optional == false & required? Nice.
|
||||||
|
{
|
||||||
|
result.AddError(this.requiredMessage).EnableRichText();
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var assetPath = AssetDatabase.GUIDToAssetPath(assetReference.AssetGUID);
|
||||||
|
var mainAsset = AssetDatabase.LoadMainAssetAtPath(assetPath);
|
||||||
|
|
||||||
|
// The item has been assigned, but is now missing.
|
||||||
|
if (mainAsset == null)
|
||||||
|
{
|
||||||
|
result.AddError($"The previously assigned main asset with path <b>'{assetPath}'</b> is missing. GUID <b>'{assetReference.AssetGUID}'</b>");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var addressableAssetEntry = AddressableAssetSettingsDefaultObject.Settings.FindAssetEntry(assetReference.AssetGUID, true);
|
||||||
|
var isAddressable = addressableAssetEntry != null;
|
||||||
|
|
||||||
|
// Somehow an item sneaked through all of unity's validation measures and ended up not being addressable
|
||||||
|
// while still ending up in the asset reference object field.
|
||||||
|
if (!isAddressable)
|
||||||
|
{
|
||||||
|
result.AddError("Assigned item is not addressable.")
|
||||||
|
.WithFix<MakeAddressableFixArgs>("Make Addressable", args => OdinAddressableUtility.MakeAddressable(mainAsset, args.Group));
|
||||||
|
}
|
||||||
|
// Check the assigned item against any and all label restrictions.
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (OdinAddressableUtility.ValidateAssetReferenceRestrictions(restrictions, mainAsset, out var failedRestriction) == false)
|
||||||
|
{
|
||||||
|
if (failedRestriction is AssetReferenceUILabelRestriction labelRestriction)
|
||||||
|
{
|
||||||
|
result.AddError($"Asset reference is restricted to items with these specific labels <b>'{string.Join(", ", labelRestriction.m_AllowedLabels)}'</b>. The currently assigned item has none of them.")
|
||||||
|
.WithFix<AddLabelsFixArgs>("Add Labels", args => SetLabels(mainAsset, args.AssetLabels));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result.AddError("Restriction failed: " + failedRestriction.ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// The assigned item had a sub object, but it's missing.
|
||||||
|
if (!string.IsNullOrEmpty(assetReference.SubObjectName))
|
||||||
|
{
|
||||||
|
var subObjects = AssetDatabase.LoadAllAssetRepresentationsAtPath(assetPath);
|
||||||
|
|
||||||
|
var hasMissingSubObject = true;
|
||||||
|
|
||||||
|
foreach (var subObject in subObjects)
|
||||||
|
{
|
||||||
|
if (subObject.name == assetReference.SubObjectName)
|
||||||
|
{
|
||||||
|
hasMissingSubObject = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hasMissingSubObject)
|
||||||
|
{
|
||||||
|
result.AddError($"The previously assigned sub asset with name <b>'{assetReference.SubObjectName}'</b> is missing.").EnableRichText();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check AssetReference.Validate
|
||||||
|
if (mainAsset != null && assetReference.ValidateAsset(mainAsset) == false)
|
||||||
|
{
|
||||||
|
result.AddError($"{assetReference.GetType().GetNiceFullName()}.ValidateAsset failed to validate assigned asset.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void SetLabels(UnityEngine.Object obj, List<AssetLabel> assetLabels)
|
||||||
|
{
|
||||||
|
if (!AddressableAssetSettingsDefaultObject.SettingsExists) return;
|
||||||
|
|
||||||
|
var settings = AddressableAssetSettingsDefaultObject.Settings;
|
||||||
|
var guid = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(obj));
|
||||||
|
var entry = settings.FindAssetEntry(guid, false);
|
||||||
|
|
||||||
|
foreach (var assetLabel in assetLabels.Where(a => a.Toggled))
|
||||||
|
{
|
||||||
|
entry.SetLabel(assetLabel.Label, true, false, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
settings.SetDirty(AddressableAssetSettings.ModificationEvent.LabelAdded, entry, false, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private class MakeAddressableFixArgs
|
||||||
|
{
|
||||||
|
[ValueDropdown(nameof(GetGroups))]
|
||||||
|
[OnInspectorInit(nameof(SelectDefault))]
|
||||||
|
public AddressableAssetGroup Group;
|
||||||
|
|
||||||
|
private void SelectDefault()
|
||||||
|
{
|
||||||
|
this.Group = AddressableAssetSettingsDefaultObject.SettingsExists
|
||||||
|
? AddressableAssetSettingsDefaultObject.Settings.DefaultGroup
|
||||||
|
: null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static IEnumerable<ValueDropdownItem> GetGroups()
|
||||||
|
{
|
||||||
|
return !AddressableAssetSettingsDefaultObject.SettingsExists
|
||||||
|
? Enumerable.Empty<ValueDropdownItem>()
|
||||||
|
: AddressableAssetSettingsDefaultObject.Settings.groups
|
||||||
|
.Where(group => !group.ReadOnly)
|
||||||
|
.Select(group => new ValueDropdownItem(group.Name, group));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Button(SdfIconType.ListNested), PropertySpace(8f)]
|
||||||
|
private void OpenAddressablesGroups() => OdinAddressableUtility.OpenGroupsWindow();
|
||||||
|
}
|
||||||
|
|
||||||
|
private class AddLabelsFixArgs
|
||||||
|
{
|
||||||
|
[HideIf("@true")]
|
||||||
|
public List<AssetLabel> AssetLabels
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (!AddressableAssetSettingsDefaultObject.SettingsExists) return this.assetLabels;
|
||||||
|
|
||||||
|
var settings = AddressableAssetSettingsDefaultObject.Settings;
|
||||||
|
var labels = settings
|
||||||
|
.GetLabels()
|
||||||
|
.Select(l => new AssetLabel { Label = l, Toggled = false })
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
foreach (var assetLabel in this.assetLabels)
|
||||||
|
{
|
||||||
|
var label = labels.FirstOrDefault(l => l.Label == assetLabel.Label);
|
||||||
|
|
||||||
|
if (label != null)
|
||||||
|
{
|
||||||
|
label.Toggled = assetLabel.Toggled;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.assetLabels = labels;
|
||||||
|
return this.assetLabels;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<AssetLabel> assetLabels = new List<AssetLabel>();
|
||||||
|
|
||||||
|
[OnInspectorGUI]
|
||||||
|
private void Draw()
|
||||||
|
{
|
||||||
|
var togglesRect = EditorGUILayout.GetControlRect(false, Mathf.CeilToInt(this.AssetLabels.Count / 2f) * 20f);
|
||||||
|
|
||||||
|
for (var i = 0; i < this.AssetLabels.Count; i++)
|
||||||
|
{
|
||||||
|
var assetLabel = this.AssetLabels[i];
|
||||||
|
var toggleRect = togglesRect.SplitGrid(togglesRect.width / 2f, 20, i);
|
||||||
|
assetLabel.Toggled = GUI.Toggle(toggleRect, assetLabel.Toggled, assetLabel.Label);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!AddressableAssetSettingsDefaultObject.SettingsExists) return;
|
||||||
|
|
||||||
|
GUILayout.Space(8f);
|
||||||
|
|
||||||
|
var buttonsRect = EditorGUILayout.GetControlRect(false, 20f);
|
||||||
|
|
||||||
|
if (SirenixEditorGUI.SDFIconButton(buttonsRect, "Open Addressables Labels", SdfIconType.TagsFill))
|
||||||
|
{
|
||||||
|
OdinAddressableUtility.OpenLabelsWindow();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class AssetLabel
|
||||||
|
{
|
||||||
|
public bool Toggled;
|
||||||
|
public string Label;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: b44b08a1f58a83149988fde5ac600fe4
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,201 @@
|
|||||||
|
//-----------------------------------------------------------------------
|
||||||
|
// <copyright file="CheckDuplicateBundleDependenciesValidator.cs" company="Sirenix ApS">
|
||||||
|
// Copyright (c) Sirenix ApS. All rights reserved.
|
||||||
|
// </copyright>
|
||||||
|
//-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
#if UNITY_EDITOR && ODIN_VALIDATOR_3_1
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEditor.AddressableAssets;
|
||||||
|
using Sirenix.OdinInspector.Editor.Validation;
|
||||||
|
using Sirenix.Utilities;
|
||||||
|
using Sirenix.Utilities.Editor;
|
||||||
|
using UnityEditor.AddressableAssets.Settings;
|
||||||
|
using System.Collections;
|
||||||
|
using System;
|
||||||
|
using Sirenix.OdinValidator.Editor;
|
||||||
|
using Sirenix.OdinInspector.Modules.Addressables.Editor;
|
||||||
|
|
||||||
|
[assembly: RegisterValidationRule(typeof(CheckDuplicateBundleDependenciesValidator),
|
||||||
|
Description = "This validator detects potential duplicate asset dependencies in an addressable group, without the need for a build. " +
|
||||||
|
"For instance, imagine two prefabs in separate groups, both referencing the same material. Each group would then include the material " +
|
||||||
|
"and all its associated dependencies. " +
|
||||||
|
"To address this, the material should be marked as Addressable, either with one of the prefabs or in a distinct group.\n\n" +
|
||||||
|
"<b>Fixes: </b>Executing the fix will make the dependency addressable and move it to the specified group.\n\n" +
|
||||||
|
"<b>Exceptions: </b>It's important to note that duplicate assets aren't inherently problematic. For example, if certain assets are " +
|
||||||
|
"never accessed by the same user group, such as region-specific assets, these duplications might be desired or at least inconsequential. " +
|
||||||
|
"As every project is unique, decisions concerning duplicate asset dependencies should be considered on a case-by-case basis.")]
|
||||||
|
|
||||||
|
namespace Sirenix.OdinInspector.Modules.Addressables.Editor
|
||||||
|
{
|
||||||
|
public class CheckDuplicateBundleDependenciesValidator : GlobalValidator
|
||||||
|
{
|
||||||
|
private static Dictionary<GUID, List<string>> dependencyGroupMap = new Dictionary<GUID, List<string>>();
|
||||||
|
|
||||||
|
[Tooltip("The severity of the validation result.")]
|
||||||
|
public ValidatorSeverity ValidatorSeverity = ValidatorSeverity.Warning;
|
||||||
|
|
||||||
|
[Tooltip("Assets to ignore when validating.")]
|
||||||
|
[LabelText("Ignored GUIDs"), CustomValueDrawer(nameof(DrawGUIDEntry))]
|
||||||
|
public List<string> IgnoredGUIDs = new List<string>();
|
||||||
|
|
||||||
|
public override IEnumerable RunValidation(ValidationResult result)
|
||||||
|
{
|
||||||
|
dependencyGroupMap.Clear();
|
||||||
|
|
||||||
|
var addressableAssetSettings = AddressableAssetSettingsDefaultObject.Settings;
|
||||||
|
|
||||||
|
if (addressableAssetSettings == null) yield break;
|
||||||
|
|
||||||
|
foreach (var addressableAssetGroup in addressableAssetSettings.groups)
|
||||||
|
{
|
||||||
|
if (addressableAssetGroup == null) continue;
|
||||||
|
|
||||||
|
foreach (var addressableAssetEntry in addressableAssetGroup.entries)
|
||||||
|
{
|
||||||
|
var dependencyAssetPaths = AssetDatabase.GetDependencies(addressableAssetEntry.AssetPath)
|
||||||
|
.Where(assetPath => !assetPath.EndsWith(".cs", StringComparison.OrdinalIgnoreCase) &&
|
||||||
|
!assetPath.EndsWith(".dll", StringComparison.OrdinalIgnoreCase));
|
||||||
|
|
||||||
|
foreach (var dependencyAssetPath in dependencyAssetPaths)
|
||||||
|
{
|
||||||
|
var dependencyGUID = new GUID(AssetDatabase.AssetPathToGUID(dependencyAssetPath));
|
||||||
|
|
||||||
|
if (this.IgnoredGUIDs.Contains(dependencyGUID.ToString())) continue;
|
||||||
|
|
||||||
|
var dependencyAddressableAssetEntry = addressableAssetSettings.FindAssetEntry(dependencyGUID.ToString());
|
||||||
|
|
||||||
|
var isAddressable = dependencyAddressableAssetEntry != null;
|
||||||
|
if (isAddressable) continue;
|
||||||
|
|
||||||
|
if (!dependencyGroupMap.ContainsKey(dependencyGUID))
|
||||||
|
{
|
||||||
|
dependencyGroupMap.Add(dependencyGUID, new List<string>());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!dependencyGroupMap[dependencyGUID].Contains(addressableAssetGroup.Name))
|
||||||
|
{
|
||||||
|
dependencyGroupMap[dependencyGUID].Add(addressableAssetGroup.Name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var kvp in dependencyGroupMap)
|
||||||
|
{
|
||||||
|
var dependencyGUID = kvp.Key;
|
||||||
|
var groups = kvp.Value;
|
||||||
|
|
||||||
|
if (groups.Count > 1)
|
||||||
|
{
|
||||||
|
var assetPath = AssetDatabase.GUIDToAssetPath(dependencyGUID.ToString());
|
||||||
|
var message = $"{assetPath} is duplicated in these groups: {string.Join(", ", groups)}";
|
||||||
|
|
||||||
|
result.Add(this.ValidatorSeverity, message).WithFix<FixArgs>(args =>
|
||||||
|
{
|
||||||
|
if (args.FixChoice == FixChoice.Ignore)
|
||||||
|
{
|
||||||
|
var sourceType = args.IgnoreForEveryone ? ConfigSourceType.Project : ConfigSourceType.Local;
|
||||||
|
var data = RuleConfig.Instance.GetRuleData<CheckDuplicateBundleDependenciesValidator>(sourceType);
|
||||||
|
data.IgnoredGUIDs.Add(dependencyGUID.ToString());
|
||||||
|
RuleConfig.Instance.SetAndSaveRuleData(data, sourceType);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var obj = AssetDatabase.LoadAssetAtPath(assetPath, typeof(UnityEngine.Object));
|
||||||
|
AddressableAssetGroup group;
|
||||||
|
|
||||||
|
if (args.Group == "Create New Group")
|
||||||
|
{
|
||||||
|
if (args.GroupName.IsNullOrWhitespace()) return;
|
||||||
|
|
||||||
|
group = addressableAssetSettings.FindGroup(args.GroupName);
|
||||||
|
|
||||||
|
if (group == null)
|
||||||
|
{
|
||||||
|
group = addressableAssetSettings.CreateGroup(args.GroupName, false, false, false, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
group = addressableAssetSettings.FindGroup(args.Group);
|
||||||
|
|
||||||
|
if (group == null)
|
||||||
|
{
|
||||||
|
group = addressableAssetSettings.CreateGroup(args.Group, false, false, false, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
OdinAddressableUtility.MakeAddressable(obj, group);
|
||||||
|
}, false).WithModifyRuleDataContextClick<CheckDuplicateBundleDependenciesValidator>("Ignore", data =>
|
||||||
|
{
|
||||||
|
data.IgnoredGUIDs.Add(dependencyGUID.ToString());
|
||||||
|
}).SetSelectionObject(AssetDatabase.LoadAssetAtPath<UnityEngine.Object>(AssetDatabase.GUIDToAssetPath(dependencyGUID.ToString())));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private string DrawGUIDEntry(string guid)
|
||||||
|
{
|
||||||
|
var assetPath = AssetDatabase.GUIDToAssetPath(guid);
|
||||||
|
EditorGUILayout.TextArea(assetPath, SirenixGUIStyles.MultiLineLabel);
|
||||||
|
EditorGUILayout.TextField(guid);
|
||||||
|
return guid;
|
||||||
|
}
|
||||||
|
|
||||||
|
private enum FixChoice
|
||||||
|
{
|
||||||
|
AddToGroup,
|
||||||
|
Ignore,
|
||||||
|
}
|
||||||
|
|
||||||
|
private class FixArgs
|
||||||
|
{
|
||||||
|
[EnumToggleButtons, HideLabel]
|
||||||
|
public FixChoice FixChoice;
|
||||||
|
|
||||||
|
[PropertySpace(10)]
|
||||||
|
[ValueDropdown("Groups")]
|
||||||
|
//[Title("Group To Add To", TitleAlignment = TitleAlignments.Centered)]
|
||||||
|
[ShowIf(nameof(FixChoice), FixChoice.AddToGroup, Animate = false)]
|
||||||
|
public string Group = "Duplicate Asset Isolation";
|
||||||
|
|
||||||
|
[ValidateInput(nameof(ValidateGroupName), "The group name cannot be empty")]
|
||||||
|
[ShowIf(nameof(ShowNewGroupName), Animate = false)]
|
||||||
|
public string GroupName;
|
||||||
|
|
||||||
|
[LabelWidth(120f)]
|
||||||
|
[PropertySpace(10)]
|
||||||
|
[ShowIf("FixChoice", FixChoice.Ignore, Animate = false)]
|
||||||
|
public bool IgnoreForEveryone = true;
|
||||||
|
|
||||||
|
[OnInspectorGUI]
|
||||||
|
[PropertySpace(10)]
|
||||||
|
[DetailedInfoBox("Note that duplicate assets may not always be an issue", "Note that duplicate assets may not always be an issue. If assets will never be requested by the same set of users (for example, region-specific assets), then duplicate dependencies may be desired, or at least inconsequential. Each Project is unique, so fixing duplicate asset dependencies should be evaluated on a case by case basis")]
|
||||||
|
private void Dummy() { }
|
||||||
|
|
||||||
|
private bool ShowNewGroupName => this.FixChoice != FixChoice.Ignore && this.Group == "Create New Group";
|
||||||
|
|
||||||
|
private bool ValidateGroupName() => !this.GroupName.IsNullOrWhitespace();
|
||||||
|
|
||||||
|
private IEnumerable<string> Groups()
|
||||||
|
{
|
||||||
|
var addressableAssetSettings = AddressableAssetSettingsDefaultObject.Settings;
|
||||||
|
|
||||||
|
return addressableAssetSettings == null
|
||||||
|
? Enumerable.Empty<string>()
|
||||||
|
: addressableAssetSettings.groups
|
||||||
|
.Where(group => group != null && group.Name != "Built In Data")
|
||||||
|
.Select(group => group.Name)
|
||||||
|
.Append("Duplicate Asset Isolation")
|
||||||
|
.Prepend("Create New Group");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: bdc8ee2cf75a17644a0bd81a965cc2e0
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,171 @@
|
|||||||
|
//-----------------------------------------------------------------------
|
||||||
|
// <copyright file="CheckResourcesToAddressableDuplicateDependenciesValidator.cs" company="Sirenix ApS">
|
||||||
|
// Copyright (c) Sirenix ApS. All rights reserved.
|
||||||
|
// </copyright>
|
||||||
|
//-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
#if UNITY_EDITOR && ODIN_VALIDATOR_3_1
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEditor.AddressableAssets;
|
||||||
|
using Sirenix.OdinInspector.Editor.Validation;
|
||||||
|
using Sirenix.Utilities.Editor;
|
||||||
|
using System.Collections;
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using Sirenix.OdinValidator.Editor;
|
||||||
|
using Sirenix.OdinInspector.Modules.Addressables.Editor;
|
||||||
|
|
||||||
|
[assembly: RegisterValidationRule(typeof(CheckResourcesToAddressableDuplicateDependenciesValidator),
|
||||||
|
Description = "This validator identifies dependencies that are duplicated in both addressable groups and the \"Resources\" folder.\n\n" +
|
||||||
|
"These duplications mean that data will be included in both the application build and the addressables build.\n\n" +
|
||||||
|
"You can decide to simply ignore these duplicated dependencies if this behavior is desired, or use the provided fix " +
|
||||||
|
"to move the asset outside of the \"Resources\" folder.")]
|
||||||
|
|
||||||
|
namespace Sirenix.OdinInspector.Modules.Addressables.Editor
|
||||||
|
{
|
||||||
|
public class CheckResourcesToAddressableDuplicateDependenciesValidator : GlobalValidator
|
||||||
|
{
|
||||||
|
[Tooltip("The severity of the validation result.")]
|
||||||
|
public ValidatorSeverity ValidatorSeverity = ValidatorSeverity.Warning;
|
||||||
|
|
||||||
|
[Tooltip("Assets to ignore when validating.")]
|
||||||
|
[LabelText("Ignored GUIDs"), CustomValueDrawer(nameof(DrawGUIDEntry))]
|
||||||
|
public List<string> IgnoredGUIDs = new List<string>();
|
||||||
|
|
||||||
|
public override IEnumerable RunValidation(ValidationResult result)
|
||||||
|
{
|
||||||
|
var addressableAssetSettings = AddressableAssetSettingsDefaultObject.Settings;
|
||||||
|
|
||||||
|
if (addressableAssetSettings == null) yield break;
|
||||||
|
|
||||||
|
foreach (var addressableAssetGroup in addressableAssetSettings.groups)
|
||||||
|
{
|
||||||
|
if (addressableAssetGroup == null) continue;
|
||||||
|
|
||||||
|
foreach (var addressableAssetEntry in addressableAssetGroup.entries)
|
||||||
|
{
|
||||||
|
var dependencyAssetPaths = AssetDatabase.GetDependencies(addressableAssetEntry.AssetPath)
|
||||||
|
.Where(assetPath => !assetPath.EndsWith(".cs", StringComparison.OrdinalIgnoreCase) &&
|
||||||
|
!assetPath.EndsWith(".dll", StringComparison.OrdinalIgnoreCase));
|
||||||
|
|
||||||
|
foreach (var dependencyAssetPath in dependencyAssetPaths)
|
||||||
|
{
|
||||||
|
var dependencyGUID = new GUID(AssetDatabase.AssetPathToGUID(dependencyAssetPath));
|
||||||
|
|
||||||
|
if (this.IgnoredGUIDs.Contains(dependencyGUID.ToString())) continue;
|
||||||
|
|
||||||
|
var dependencyAddressableAssetEntry = addressableAssetSettings.FindAssetEntry(dependencyGUID.ToString());
|
||||||
|
|
||||||
|
var isAddressable = dependencyAddressableAssetEntry != null;
|
||||||
|
if (isAddressable) continue;
|
||||||
|
if (!IsInsideResourcesFolder(dependencyAssetPath)) continue;
|
||||||
|
|
||||||
|
result.Add(this.ValidatorSeverity, $"{dependencyAssetPath} is duplicated in addressable data and resource folders.")
|
||||||
|
.WithFix<FixArgs>(args =>
|
||||||
|
{
|
||||||
|
if (args.FixChoice == FixChoice.Ignore)
|
||||||
|
{
|
||||||
|
var sourceType = args.IgnoreForEveryone ? ConfigSourceType.Project : ConfigSourceType.Local;
|
||||||
|
var data = RuleConfig.Instance.GetRuleData<CheckResourcesToAddressableDuplicateDependenciesValidator>(sourceType);
|
||||||
|
data.IgnoredGUIDs.Add(dependencyGUID.ToString());
|
||||||
|
RuleConfig.Instance.SetAndSaveRuleData(data, sourceType);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ValidNewFolder(args.NewFolder, out _)) return;
|
||||||
|
|
||||||
|
if (!AssetDatabase.IsValidFolder(args.NewFolder))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(new DirectoryInfo(args.NewFolder).FullName);
|
||||||
|
AssetDatabase.Refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
var newPath = $"{args.NewFolder}/{Path.GetFileName(dependencyAssetPath)}";
|
||||||
|
AssetDatabase.MoveAsset(dependencyAssetPath, newPath);
|
||||||
|
}, false).WithModifyRuleDataContextClick<CheckResourcesToAddressableDuplicateDependenciesValidator>("Ignore", data =>
|
||||||
|
{
|
||||||
|
data.IgnoredGUIDs.Add(dependencyGUID.ToString());
|
||||||
|
}).SetSelectionObject(AssetDatabase.LoadAssetAtPath<UnityEngine.Object>(AssetDatabase.GUIDToAssetPath(dependencyGUID.ToString())));
|
||||||
|
|
||||||
|
yield break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private string DrawGUIDEntry(string guid)
|
||||||
|
{
|
||||||
|
var assetPath = AssetDatabase.GUIDToAssetPath(guid);
|
||||||
|
EditorGUILayout.TextArea(assetPath, SirenixGUIStyles.MultiLineLabel);
|
||||||
|
EditorGUILayout.TextField(guid);
|
||||||
|
return guid;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool IsInsideResourcesFolder(string path)
|
||||||
|
{
|
||||||
|
var pathElements = path.Split('/');
|
||||||
|
|
||||||
|
foreach (var pathElement in pathElements)
|
||||||
|
{
|
||||||
|
if (pathElement.Equals("Resources", StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool ValidNewFolder(string path, out string message)
|
||||||
|
{
|
||||||
|
if (IsInsideResourcesFolder(path))
|
||||||
|
{
|
||||||
|
message = "The asset cannot be moved into a 'Resources' folder";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!path.StartsWith("Assets/"))
|
||||||
|
{
|
||||||
|
message = "The asset must be inside the 'Assets' folder";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
message = "The folder is valid";
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private enum FixChoice
|
||||||
|
{
|
||||||
|
MoveAsset,
|
||||||
|
Ignore,
|
||||||
|
}
|
||||||
|
private class FixArgs
|
||||||
|
{
|
||||||
|
[HideLabel]
|
||||||
|
[EnumToggleButtons]
|
||||||
|
public FixChoice FixChoice;
|
||||||
|
|
||||||
|
[FolderPath]
|
||||||
|
[PropertySpace(10)]
|
||||||
|
[ValidateInput(nameof(ValidateFolderPath))]
|
||||||
|
[ShowIf("FixChoice", FixChoice.MoveAsset, Animate = false)]
|
||||||
|
public string NewFolder = "Assets/Resources_moved";
|
||||||
|
|
||||||
|
[LabelWidth(120f)]
|
||||||
|
[PropertySpace(10)]
|
||||||
|
[ShowIf("FixChoice", FixChoice.Ignore, Animate = false)]
|
||||||
|
public bool IgnoreForEveryone = true;
|
||||||
|
|
||||||
|
private bool ValidateFolderPath(string path, ref string message)
|
||||||
|
{
|
||||||
|
return ValidNewFolder(path, out message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: f75aebe03a9aa4a4b82d2b54dcc34de5
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
//-----------------------------------------------------------------------
|
||||||
|
// <copyright file="DisallowAddressableSubAssetFieldAttributeValidator.cs" company="Sirenix ApS">
|
||||||
|
// Copyright (c) Sirenix ApS. All rights reserved.
|
||||||
|
// </copyright>
|
||||||
|
//-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
#if UNITY_EDITOR
|
||||||
|
|
||||||
|
using Sirenix.OdinInspector.Editor.Validation;
|
||||||
|
using Sirenix.OdinInspector.Modules.Addressables.Editor;
|
||||||
|
using UnityEngine.AddressableAssets;
|
||||||
|
|
||||||
|
[assembly: RegisterValidator(typeof(DisallowAddressableSubAssetFieldAttributeValidator))]
|
||||||
|
|
||||||
|
namespace Sirenix.OdinInspector.Modules.Addressables.Editor
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Validator for the DisallowAddressableSubAssetFieldAttribute.
|
||||||
|
/// </summary>
|
||||||
|
public class DisallowAddressableSubAssetFieldAttributeValidator : AttributeValidator<DisallowAddressableSubAssetFieldAttribute, AssetReference>
|
||||||
|
{
|
||||||
|
protected override void Validate(ValidationResult result)
|
||||||
|
{
|
||||||
|
if (this.Value != null && string.IsNullOrEmpty(this.Value.SubObjectName) == false)
|
||||||
|
{
|
||||||
|
result.AddError("Sub-asset references is not allowed on this field.")
|
||||||
|
.WithFix("Remove Sub-Asset", () => this.Value.SubObjectName = null, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 5775d33ffc1143149c4f425f693b04b6
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
//-----------------------------------------------------------------------
|
||||||
|
// <copyright file="MissingAddressableGroupReferenceValidator.cs" company="Sirenix ApS">
|
||||||
|
// Copyright (c) Sirenix ApS. All rights reserved.
|
||||||
|
// </copyright>
|
||||||
|
//-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
#if UNITY_EDITOR && ODIN_VALIDATOR_3_1
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEditor.AddressableAssets;
|
||||||
|
using Sirenix.OdinInspector.Editor.Validation;
|
||||||
|
using UnityEditor.AddressableAssets.Settings;
|
||||||
|
using System.Collections;
|
||||||
|
using Sirenix.OdinInspector.Modules.Addressables.Editor;
|
||||||
|
|
||||||
|
[assembly: RegisterValidator(typeof(MissingAddressableGroupReferenceValidator))]
|
||||||
|
|
||||||
|
namespace Sirenix.OdinInspector.Modules.Addressables.Editor
|
||||||
|
{
|
||||||
|
public class MissingAddressableGroupReferenceValidator : GlobalValidator
|
||||||
|
{
|
||||||
|
public override IEnumerable RunValidation(ValidationResult result)
|
||||||
|
{
|
||||||
|
var addressableAssetSettings = AddressableAssetSettingsDefaultObject.Settings;
|
||||||
|
|
||||||
|
if (addressableAssetSettings == null) yield break;
|
||||||
|
|
||||||
|
var missingGroupIndices = new List<int>();
|
||||||
|
|
||||||
|
for (var i = 0; i < addressableAssetSettings.groups.Count; i++)
|
||||||
|
{
|
||||||
|
var group = addressableAssetSettings.groups[i];
|
||||||
|
|
||||||
|
if (group == null)
|
||||||
|
{
|
||||||
|
missingGroupIndices.Add(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (missingGroupIndices.Count > 0)
|
||||||
|
{
|
||||||
|
result.Add(ValidatorSeverity.Error, "Addressable groups contains missing references").WithFix("Delete missing reference", () =>
|
||||||
|
{
|
||||||
|
for (var i = missingGroupIndices.Count - 1; i >= 0; i--)
|
||||||
|
{
|
||||||
|
addressableAssetSettings.groups.RemoveAt(missingGroupIndices[i]);
|
||||||
|
addressableAssetSettings.SetDirty(AddressableAssetSettings.ModificationEvent.GroupRemoved, null, true, true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 4ae55abdaf19ef4498d1a2fbe1bd9f9b
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
ManifestVersion: 1
|
||||||
|
ModuleID: Unity.Addressables
|
||||||
|
ModuleVersion: 1.1.0.4
|
||||||
|
ModuleFiles:
|
||||||
|
AddressablesInspectors.cs
|
||||||
|
AddressablesInspectors.cs.meta
|
||||||
|
Sirenix.OdinInspector.Modules.Unity.Addressables.asmdef
|
||||||
|
Sirenix.OdinInspector.Modules.Unity.Addressables.asmdef.meta
|
||||||
|
Validators.meta
|
||||||
|
Validators/AssetLabelReferenceValidator.cs
|
||||||
|
Validators/AssetLabelReferenceValidator.cs.meta
|
||||||
|
Validators/AssetReferenceValidator.cs
|
||||||
|
Validators/AssetReferenceValidator.cs.meta
|
||||||
|
Validators/CheckDuplicateBundleDependenciesValidator.cs
|
||||||
|
Validators/CheckDuplicateBundleDependenciesValidator.cs.meta
|
||||||
|
Validators/CheckResourcesToAddressableDuplicateDependenciesValidator.cs
|
||||||
|
Validators/CheckResourcesToAddressableDuplicateDependenciesValidator.cs.meta
|
||||||
|
Validators/DisallowAddressableSubAssetFieldAttributeValidator.cs
|
||||||
|
Validators/DisallowAddressableSubAssetFieldAttributeValidator.cs.meta
|
||||||
|
Validators/MissingAddressableGroupReferenceValidator.cs
|
||||||
|
Validators/MissingAddressableGroupReferenceValidator.cs.meta
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 57fcf272548dfb44b9e3bcb2d9bffa4b
|
||||||
|
TextScriptImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 3fa29a810e898614787d210b1a8c6420
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 175cafb710462ef489cbf56cb46c97d5
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user