Merge pull request 'feature/gfx-action' (#404) from feature/gfx-action into develop

Reviewed-on: https://git.pthub.vn/Unity/perfect-world-unity/pulls/404
This commit is contained in:
hoangvd
2026-05-06 08:45:09 +00:00
8 changed files with 443 additions and 63 deletions
@@ -16,7 +16,7 @@ MonoBehaviour:
m_GUID: 17b5850382b624d15a322e51c0b9b7c7
m_SerializeEntries:
- m_GUID: 00637eb671ccf724cb0e295d9a9b36f4
m_Address: "gfx/\u4EBA\u7269/\u901A\u7528/\u5176\u5B83/daoguang"
m_Address: "gfx/\u4EBA\u7269/\u901A\u7528/\u5176\u5B83/daoguang.gfx"
m_ReadOnly: 0
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
@@ -26,7 +26,7 @@ MonoBehaviour:
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 03cfd33d13b1a574eb91045d147be76a
m_Address: "gfx/\u7B56\u5212\u8054\u5165/\u4EBA\u7269\u6280\u80FD/\u98DE\u884C/\u5DE8\u77F3\u86CA\u98DE\u884C"
m_Address: "gfx/\u7B56\u5212\u8054\u5165/\u4EBA\u7269\u6280\u80FD/\u98DE\u884C/\u5DE8\u77F3\u86CA\u98DE\u884C.gfx"
m_ReadOnly: 0
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
@@ -66,7 +66,7 @@ MonoBehaviour:
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 115fb9b2f809dab478abf20c65eb8525
m_Address: "gfx/\u7B56\u5212\u8054\u5165/\u4EBA\u7269\u6280\u80FD/\u98DE\u884C/\u5343\u8681\u86CA\u98DE\u884C"
m_Address: "gfx/\u7B56\u5212\u8054\u5165/\u4EBA\u7269\u6280\u80FD/\u98DE\u884C/\u5343\u8681\u86CA\u98DE\u884C.gfx"
m_ReadOnly: 0
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
@@ -86,7 +86,7 @@ MonoBehaviour:
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 16f995db29b6c6c4e81eb3ea9aa5734f
m_Address: "gfx/\u7B56\u5212\u8054\u5165/\u4EBA\u7269\u6280\u80FD/\u98DE\u884C/\u94C1\u5CA9\u86CA\u98DE\u884C"
m_Address: "gfx/\u7B56\u5212\u8054\u5165/\u4EBA\u7269\u6280\u80FD/\u98DE\u884C/\u94C1\u5CA9\u86CA\u98DE\u884C.gfx"
m_ReadOnly: 0
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
@@ -146,7 +146,7 @@ MonoBehaviour:
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 244f37f1bea45f44d869afda27a756bd
m_Address: "gfx/\u4EBA\u7269/\u6280\u80FD/\u6CD5\u5E08/\u8840\u796D\u708E\u7206\u65BD\u653E"
m_Address: "gfx/\u4EBA\u7269/\u6280\u80FD/\u6CD5\u5E08/\u8840\u796D\u708E\u7206\u65BD\u653E.gfx"
m_ReadOnly: 0
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
@@ -156,7 +156,7 @@ MonoBehaviour:
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 27efa9095a9bdd049b5f8e9ad441583c
m_Address: "gfx/\u7B56\u5212\u8054\u5165/\u4EBA\u7269\u6280\u80FD/\u51FB\u4E2D/\u8346\u68D8\u7B26\u51FB\u4E2D"
m_Address: "gfx/\u7B56\u5212\u8054\u5165/\u4EBA\u7269\u6280\u80FD/\u51FB\u4E2D/\u8346\u68D8\u7B26\u51FB\u4E2D.gfx"
m_ReadOnly: 0
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
@@ -176,7 +176,7 @@ MonoBehaviour:
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 2bf40ee649beaad40a2e786733fac16f
m_Address: "gfx/\u7B56\u5212\u8054\u5165/\u4EBA\u7269\u6280\u80FD/\u51FB\u4E2D/\u51CC\u971C\u86CA\u51FB\u4E2D"
m_Address: "gfx/\u7B56\u5212\u8054\u5165/\u4EBA\u7269\u6280\u80FD/\u51FB\u4E2D/\u51CC\u971C\u86CA\u51FB\u4E2D.gfx"
m_ReadOnly: 0
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
@@ -211,7 +211,7 @@ MonoBehaviour:
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 37e98f98fc4b4554b942794f0e99a8bb
m_Address: "gfx/\u7B56\u5212\u8054\u5165/\u4EBA\u7269\u6280\u80FD/\u51FB\u4E2D/\u7BAD\u9635\u51FB\u4E2D.gfx"
m_Address: "gfx/\u7B56\u5212\u8054\u5165/\u4EBA\u7269\u6280\u80FD/\u98DE\u884C/\u7BAD\u9635\u51FB\u4E2D.gfx"
m_ReadOnly: 0
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
@@ -231,12 +231,12 @@ MonoBehaviour:
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 3ea5e421923ddee4691c3785527398a7
m_Address: "gfx/\u7B56\u5212\u8054\u5165/\u4EBA\u7269\u6280\u80FD/\u51FB\u4E2D/\u708E\u86CA\u51FB\u4E2D"
m_Address: "gfx/\u7B56\u5212\u8054\u5165/\u4EBA\u7269\u6280\u80FD/\u51FB\u4E2D/\u708E\u86CA\u51FB\u4E2D.gfx"
m_ReadOnly: 0
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 3f8220f959ce0d14b881e63f9d628582
m_Address: "gfx/\u7B56\u5212\u8054\u5165/\u4EBA\u7269\u6280\u80FD/\u51FB\u4E2D/\u6B8B\u4F53\u5492\u51FB\u4E2D"
m_Address: "gfx/\u7B56\u5212\u8054\u5165/\u4EBA\u7269\u6280\u80FD/\u51FB\u4E2D/\u6B8B\u4F53\u5492\u51FB\u4E2D.gfx"
m_ReadOnly: 0
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
@@ -261,7 +261,7 @@ MonoBehaviour:
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 453f07555743bb1418de08cbd40cd159
m_Address: "gfx/\u7B56\u5212\u8054\u5165/\u4EBA\u7269\u6280\u80FD/\u98DE\u884C/\u4E07\u86CA\u98DF\u5929\u98DE\u884C"
m_Address: "gfx/\u7B56\u5212\u8054\u5165/\u4EBA\u7269\u6280\u80FD/\u98DE\u884C/\u4E07\u86CA\u98DF\u5929\u98DE\u884C.gfx"
m_ReadOnly: 0
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
@@ -286,7 +286,7 @@ MonoBehaviour:
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 4b0d5ec992b0bff47ab1eb75342876d2
m_Address: "gfx/\u7B56\u5212\u8054\u5165/\u4EBA\u7269\u6280\u80FD/\u98DE\u884C/\u708E\u86CA\u98DE\u884C"
m_Address: "gfx/\u7B56\u5212\u8054\u5165/\u4EBA\u7269\u6280\u80FD/\u98DE\u884C/\u708E\u86CA\u98DE\u884C.gfx"
m_ReadOnly: 0
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
@@ -346,7 +346,7 @@ MonoBehaviour:
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 561c25709d0290242a2f754075a98c07
m_Address: "gfx/\u7B56\u5212\u8054\u5165/\u4EBA\u7269\u6280\u80FD/\u98DE\u884C/\u5267\u6BD2\u86CA\u98DE\u884C"
m_Address: "gfx/\u7B56\u5212\u8054\u5165/\u4EBA\u7269\u6280\u80FD/\u98DE\u884C/\u5267\u6BD2\u86CA\u98DE\u884C.gfx"
m_ReadOnly: 0
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
@@ -356,12 +356,12 @@ MonoBehaviour:
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 581095497c6338141927488db3aad8fb
m_Address: "gfx/\u7B56\u5212\u8054\u5165/\u4EBA\u7269\u6280\u80FD/\u98DE\u884C/\u5996\u72D0\u9644\u4F53"
m_Address: "gfx/\u7B56\u5212\u8054\u5165/\u4EBA\u7269\u6280\u80FD/\u98DE\u884C/\u5996\u72D0\u9644\u4F53.gfx"
m_ReadOnly: 0
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 5955d3529125eb34489b9c2ff8f3dad6
m_Address: "gfx/\u7A0B\u5E8F\u8054\u5165/\u98DE\u884C/\u98DE\u5251\u98DE\u884C14"
m_Address: "gfx/\u7A0B\u5E8F\u8054\u5165/\u98DE\u884C/\u98DE\u5251\u98DE\u884C14.gfx"
m_ReadOnly: 0
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
@@ -371,7 +371,7 @@ MonoBehaviour:
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 5ba32f6c642a37d479d1e928fb3d58c3
m_Address: "gfx/\u7B56\u5212\u8054\u5165/\u4EBA\u7269\u6280\u80FD/\u51FB\u4E2D/\u5267\u6BD2\u86CA\u51FB\u4E2D"
m_Address: "gfx/\u7B56\u5212\u8054\u5165/\u4EBA\u7269\u6280\u80FD/\u51FB\u4E2D/\u5267\u6BD2\u86CA\u51FB\u4E2D.gfx"
m_ReadOnly: 0
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
@@ -426,7 +426,7 @@ MonoBehaviour:
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 6adb695057ad951409512c3ae23fad55
m_Address: "gfx/\u7B56\u5212\u8054\u5165/\u4EBA\u7269\u6280\u80FD/\u51FB\u4E2D/\u5BA0\u7269\u590D\u6D3B\u51FB\u4E2D"
m_Address: "gfx/\u7B56\u5212\u8054\u5165/\u4EBA\u7269\u6280\u80FD/\u51FB\u4E2D/\u5BA0\u7269\u590D\u6D3B\u51FB\u4E2D.gfx"
m_ReadOnly: 0
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
@@ -496,7 +496,7 @@ MonoBehaviour:
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 7d448b406dfe0334e89732baba65b0af
m_Address: "gfx/\u573A\u666F/\u7075\u9B422"
m_Address: "gfx/\u573A\u666F/\u7075\u9B422.gfx"
m_ReadOnly: 0
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
@@ -556,12 +556,12 @@ MonoBehaviour:
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 89060f898a6828c45b561b58b8b30edc
m_Address: "gfx/\u7B56\u5212\u8054\u5165/\u4EBA\u7269\u6280\u80FD/\u51FB\u4E2D/\u5BA0\u7269\u6CBB\u7597\u51FB\u4E2D"
m_Address: "gfx/\u7B56\u5212\u8054\u5165/\u4EBA\u7269\u6280\u80FD/\u51FB\u4E2D/\u5BA0\u7269\u6CBB\u7597\u51FB\u4E2D.gfx"
m_ReadOnly: 0
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 8973c0335581cdb4daa2f1493635e3d5
m_Address: "gfx/\u7B56\u5212\u8054\u5165/\u4EBA\u7269\u6280\u80FD/\u98DE\u884C/\u9A6F\u670D\u5BA0\u7269\u98DE\u884C"
m_Address: "gfx/\u7B56\u5212\u8054\u5165/\u4EBA\u7269\u6280\u80FD/\u98DE\u884C/\u9A6F\u670D\u5BA0\u7269\u98DE\u884C.gfx"
m_ReadOnly: 0
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
@@ -651,7 +651,7 @@ MonoBehaviour:
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 9eaec1228667693448c1752ecaebac65
m_Address: "gfx/\u7B56\u5212\u8054\u5165/\u4EBA\u7269\u6280\u80FD/\u51FB\u4E2D/\u5343\u8681\u86CA\u51FB\u4E2D"
m_Address: "gfx/\u7B56\u5212\u8054\u5165/\u4EBA\u7269\u6280\u80FD/\u51FB\u4E2D/\u5343\u8681\u86CA\u51FB\u4E2D.gfx"
m_ReadOnly: 0
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
@@ -761,7 +761,7 @@ MonoBehaviour:
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: c7069b1915aaf37408bb668344e6b700
m_Address: "gfx/\u7B56\u5212\u8054\u5165/\u4EBA\u7269\u6280\u80FD/\u51FB\u4E2D/\u5DE8\u77F3\u86CA\u51FB\u4E2D"
m_Address: "gfx/\u7B56\u5212\u8054\u5165/\u4EBA\u7269\u6280\u80FD/\u51FB\u4E2D/\u5DE8\u77F3\u86CA\u51FB\u4E2D.gfx"
m_ReadOnly: 0
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
@@ -771,7 +771,7 @@ MonoBehaviour:
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: c76d769018641e54f9e7af6f9fb456eb
m_Address: "gfx/\u7B56\u5212\u8054\u5165/\u4EBA\u7269\u6280\u80FD/\u98DE\u884C/\u9A71\u9010\u5492\u51FB\u4E2D"
m_Address: "gfx/\u7B56\u5212\u8054\u5165/\u4EBA\u7269\u6280\u80FD/\u98DE\u884C/\u9A71\u9010\u5492\u51FB\u4E2D.gfx"
m_ReadOnly: 0
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
@@ -826,7 +826,7 @@ MonoBehaviour:
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: d969ceef8a707ac4fad67263b6c214fc
m_Address: "gfx/\u7B56\u5212\u8054\u5165/\u4EBA\u7269\u6280\u80FD/\u51FB\u4E2D/\u94C1\u5CA9\u86CA\u51FB\u4E2D"
m_Address: "gfx/\u7B56\u5212\u8054\u5165/\u4EBA\u7269\u6280\u80FD/\u51FB\u4E2D/\u94C1\u5CA9\u86CA\u51FB\u4E2D.gfx"
m_ReadOnly: 0
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
@@ -866,12 +866,12 @@ MonoBehaviour:
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: f296e7e291c2b6448b0ba1ce31bb3335
m_Address: "gfx/\u7B56\u5212\u8054\u5165/\u4EBA\u7269\u6280\u80FD/\u98DE\u884C/\u4E7E\u5764\u4E92\u79FB"
m_Address: "gfx/\u7B56\u5212\u8054\u5165/\u4EBA\u7269\u6280\u80FD/\u98DE\u884C/\u4E7E\u5764\u4E92\u79FB.gfx"
m_ReadOnly: 0
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: f342da9c42df59741b687773687177b8
m_Address: "gfx/\u7B56\u5212\u8054\u5165/\u4EBA\u7269\u6280\u80FD/\u98DE\u884C/\u51CC\u971C\u86CA\u98DE\u884C"
m_Address: "gfx/\u7B56\u5212\u8054\u5165/\u4EBA\u7269\u6280\u80FD/\u98DE\u884C/\u51CC\u971C\u86CA\u98DE\u884C.gfx"
m_ReadOnly: 0
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
@@ -11,7 +11,11 @@ Material:
m_Shader: {fileID: 4800000, guid: 0a016a83287664641b867743f19faf14, type: 3}
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords: []
m_ValidKeywords:
- _DISSOLVETEXUVS_NORMAL
- _DISTORTTEXUVS_NORMAL
- _MAINTEXUVS_NORMAL
- _MASKTEXUVS_NORMAL
m_InvalidKeywords:
- _DISSOLVETEXAR_ON
- _DISTORTTEXAR_ON
@@ -118,7 +122,11 @@ Material:
- _DissolveFactor: 0
- _DissolveSoft: 0.1
- _DissolveTexAR: 1
- _DissolveTexClampU: 0
- _DissolveTexClampV: 0
- _DissolveTexRotate: 0
- _DissolveTexUSpeed: 0
- _DissolveTexUVS: 0
- _DissolveTexVSpeed: 0
- _DissolveWide: 0.05
- _DistortDissolveTex: 0
@@ -126,7 +134,11 @@ Material:
- _DistortMainTex: 0
- _DistortMaskTex: 0
- _DistortTexAR: 1
- _DistortTexClampU: 0
- _DistortTexClampV: 0
- _DistortTexRotate: 0
- _DistortTexUSpeed: 0
- _DistortTexUVS: 0
- _DistortTexVSpeed: 0
- _Dst: 1
- _DstBlend: 0
@@ -144,10 +156,18 @@ Material:
- _GlossyReflections: 0
- _MainAlpha: 1
- _MainTexAR: 0
- _MainTexClampU: 0
- _MainTexClampV: 0
- _MainTexRotate: 0
- _MainTexUSpeed: 0
- _MainTexUVS: 0
- _MainTexVSpeed: 0
- _MaskTexAR: 1
- _MaskTexClampU: 0
- _MaskTexClampV: 0
- _MaskTexRotate: 0
- _MaskTexUSpeed: 0
- _MaskTexUVS: 0
- _MaskTexVSpeed: 0
- _Metallic: 0
- _OcclusionStrength: 1
@@ -12,7 +12,11 @@ Material:
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords:
- _DISSOLVETEXUVS_NORMAL
- _DISTORTTEXUVS_NORMAL
- _FDISTORTTEX_ON
- _MAINTEXUVS_NORMAL
- _MASKTEXUVS_NORMAL
m_InvalidKeywords:
- _DISSOLVETEXAR_ON
- _DISTORTMAINTEX_ON
@@ -120,7 +124,11 @@ Material:
- _DissolveFactor: 0
- _DissolveSoft: 0.1
- _DissolveTexAR: 1
- _DissolveTexClampU: 0
- _DissolveTexClampV: 0
- _DissolveTexRotate: 0
- _DissolveTexUSpeed: 0
- _DissolveTexUVS: 0
- _DissolveTexVSpeed: 0
- _DissolveWide: 0.05
- _DistortDissolveTex: 0
@@ -128,7 +136,11 @@ Material:
- _DistortMainTex: 1
- _DistortMaskTex: 0
- _DistortTexAR: 1
- _DistortTexClampU: 0
- _DistortTexClampV: 0
- _DistortTexRotate: 0
- _DistortTexUSpeed: 0
- _DistortTexUVS: 0
- _DistortTexVSpeed: 0
- _Dst: 1
- _DstBlend: 0
@@ -146,10 +158,18 @@ Material:
- _GlossyReflections: 0
- _MainAlpha: 1
- _MainTexAR: 0
- _MainTexClampU: 0
- _MainTexClampV: 0
- _MainTexRotate: 0
- _MainTexUSpeed: 0
- _MainTexUVS: 0
- _MainTexVSpeed: 0
- _MaskTexAR: 1
- _MaskTexClampU: 0
- _MaskTexClampV: 0
- _MaskTexRotate: 0
- _MaskTexUSpeed: 0
- _MaskTexUVS: 0
- _MaskTexVSpeed: 0
- _Metallic: 0
- _OcclusionStrength: 1
@@ -11,7 +11,11 @@ Material:
m_Shader: {fileID: 4800000, guid: 0a016a83287664641b867743f19faf14, type: 3}
m_Parent: {fileID: 2100000, guid: b4920c329fa148f418f0c83a1d6e4ab1, type: 2}
m_ModifiedSerializedProperties: 0
m_ValidKeywords: []
m_ValidKeywords:
- _DISSOLVETEXUVS_NORMAL
- _DISTORTTEXUVS_NORMAL
- _MAINTEXUVS_NORMAL
- _MASKTEXUVS_NORMAL
m_InvalidKeywords:
- _DISSOLVETEXAR_ON
- _DISTORTMAINTEX_ON
@@ -575,7 +575,7 @@ namespace BrewMonster
m_szHitGfx = string.IsNullOrEmpty(hitGfxName) ? null : await AddressableManager.Instance.LoadPrefabAsync("gfx/" + hitGfxName);
m_szHitGrndGfx = string.IsNullOrEmpty(hitGrdGfxName) ? null : await AddressableManager.Instance.LoadPrefabAsync("gfx/" + hitGrdGfxName);
//BMLogger.LogError("HoangDev: Load A3DSkillGfxComposer GFX name: " + name);
BMLogger.LogError("HoangDev: Load A3DSkillGfxComposer GFX name: " + hitGfxName);
if (m_szFlyGfx == null && !string.IsNullOrEmpty(flyGfxName))
{
m_szFlyGfx = Resources.Load<GameObject>("GFX/" + "PlaceHolder");
@@ -431,7 +431,7 @@ namespace BrewMonster
bool bTargetExists = m_bTargetExist && m_nTargetID != 0;
GameObject prefab = bTargetExists ? m_pComposer.GetHitGFX() : m_pComposer.GetHitGrdGFX();
//BMLogger.LogError("bTargetExists : " + bTargetExists);
//BMLogger.LogError("HitGfx : " + m_pComposer.hitGfxName);
BMLogger.LogError("HitGfx : " + m_pComposer.hitGfxName);
if (prefab == null)
{
@@ -1,4 +1,5 @@
#if UNITY_EDITOR
using System;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
@@ -10,12 +11,18 @@ namespace BrewMonster
{
/// <summary>
/// Assign a parent folder, then register all assets under it into an Addressables group named after that folder.
/// Addresses are relative to the parent folder, without the file extension (e.g. .png, .wav). Text files and
/// extensionless files and excluded extensions (e.g. .pk) are skipped; existing addressable entries for those are removed.
/// Addresses are relative to the parent folder; by default the file extension is removed from the key.
/// Optional EditorPrefs: extra excluded extensions (never addressable), and saved address-tail presets with a per-run choice
/// of which tail to append to every address (after stripping the assets real extension).
/// Text files, extensionless files, and built-in excluded extensions (e.g. .pk) are skipped; existing addressable entries for those are removed.
/// </summary>
public class FolderToAddressablesWindow : EditorWindow
{
private const string MenuPath = "Tools/Addressable/Folder To Addressables…";
private const string EditorPrefsUserExcludedExtensionsKey = "BrewMonster.FolderToAddressables.UserExcludedExtensions";
private const string EditorPrefsAddressTailPresetsKey = "BrewMonster.FolderToAddressables.AddressTailPresets";
private const string EditorPrefsSelectedAddressTailKey = "BrewMonster.FolderToAddressables.SelectedAddressTail";
private const string EditorPrefsLegacyKeepExtensionInAddressKey = "BrewMonster.FolderToAddressables.KeepExtensionInAddress";
private static readonly HashSet<string> TextExtensions = new HashSet<string>(System.StringComparer.OrdinalIgnoreCase)
{
@@ -31,17 +38,31 @@ namespace BrewMonster
private DefaultAsset _parentFolder;
private bool _includeFolderName;
private bool _overrideExisting;
private readonly List<string> _userExcludedExtensions = new List<string>();
private readonly HashSet<string> _userExcludedExtensionSet = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
private readonly List<string> _addressTailPresets = new List<string>();
private Vector2 _scrollExcluded;
private Vector2 _scrollAddressTails;
private Vector2 _scroll;
private string _log = "";
/// <summary>Normalized tail to append to every address this run (e.g. ".gfx"), or null for none.</summary>
private string _selectedAddressTail;
[MenuItem(MenuPath)]
public static void Open()
{
var w = GetWindow<FolderToAddressablesWindow>(false, "Folder To Addressables", true);
w.minSize = new Vector2(420, 280);
w.minSize = new Vector2(420, 520);
w.Show();
}
private void OnEnable()
{
LoadUserExcludedExtensionsFromPrefs();
LoadAddressTailPresetsFromPrefs();
LoadSelectedAddressTailFromPrefs();
}
private void OnGUI()
{
EditorGUILayout.Space(4);
@@ -49,13 +70,114 @@ namespace BrewMonster
EditorGUILayout.HelpBox(
"Group name = last segment of the folder path. Two different paths with the same folder name share one group. " +
"Address keys omit file extensions (e.g. Sub/Sprite not Sub/Sprite.png). " +
"The assets real extension is stripped from the address; you can optionally append one chosen tail from the presets (e.g. gfx/a/b.gfx). " +
"If nothing updates, ensure the target group is not Read Only in the Addressables Groups window. " +
"Files with no extension (e.g. raw data), .pk, and other excluded types are not made addressable.",
"Files with no extension (e.g. raw data), .pk, built-in excluded types, and extensions in Extra excluded are not made addressable.",
MessageType.Info);
EditorGUILayout.Space(4);
EditorGUILayout.LabelField("Extra excluded extensions (EditorPrefs)", EditorStyles.boldLabel);
EditorGUILayout.HelpBox(
"Optional tails such as .gfx or .wav. These files are skipped and removed from Addressables like .pk. " +
"The list is stored in Editor preferences on this machine.",
MessageType.None);
_scrollExcluded = EditorGUILayout.BeginScrollView(_scrollExcluded, GUILayout.MaxHeight(120));
EditorGUI.BeginChangeCheck();
for (int i = 0; i < _userExcludedExtensions.Count; i++)
{
EditorGUILayout.BeginHorizontal();
_userExcludedExtensions[i] = EditorGUILayout.TextField(_userExcludedExtensions[i]);
if (GUILayout.Button("Remove", GUILayout.Width(64)))
{
_userExcludedExtensions.RemoveAt(i);
i--;
SaveUserExcludedExtensionsToPrefs();
continue;
}
EditorGUILayout.EndHorizontal();
}
if (EditorGUI.EndChangeCheck())
SaveUserExcludedExtensionsToPrefs();
EditorGUILayout.EndScrollView();
if (GUILayout.Button("Add excluded type"))
{
_userExcludedExtensions.Add("");
SaveUserExcludedExtensionsToPrefs();
}
EditorGUILayout.Space(8);
EditorGUILayout.LabelField("Address tail presets (EditorPrefs)", EditorStyles.boldLabel);
EditorGUILayout.HelpBox(
"Add tails you reuse (e.g. .wav, .gfx). Then pick one below: that suffix is appended to every address for this run " +
"after the real file extension is removed (e.g. …/a/b.png with Include folder name and tail .gfx → gfx/a/b.gfx).",
MessageType.None);
_scrollAddressTails = EditorGUILayout.BeginScrollView(_scrollAddressTails, GUILayout.MaxHeight(100));
EditorGUI.BeginChangeCheck();
for (int i = 0; i < _addressTailPresets.Count; i++)
{
EditorGUILayout.BeginHorizontal();
_addressTailPresets[i] = EditorGUILayout.TextField(_addressTailPresets[i]);
if (GUILayout.Button("Remove", GUILayout.Width(64)))
{
_addressTailPresets.RemoveAt(i);
i--;
SaveAddressTailPresetsToPrefs();
NormalizeSelectedAddressTailAgainstPresets();
continue;
}
EditorGUILayout.EndHorizontal();
}
if (EditorGUI.EndChangeCheck())
{
SaveAddressTailPresetsToPrefs();
NormalizeSelectedAddressTailAgainstPresets();
}
EditorGUILayout.EndScrollView();
if (GUILayout.Button("Add tail preset"))
{
_addressTailPresets.Add("");
SaveAddressTailPresetsToPrefs();
}
List<string> orderedTails = GetOrderedNormalizedAddressTailPresets();
NormalizeSelectedAddressTailAgainstPresets();
string[] tailPopupOptions = new string[orderedTails.Count + 1];
tailPopupOptions[0] = "None (no added tail)";
for (int i = 0; i < orderedTails.Count; i++)
tailPopupOptions[i + 1] = orderedTails[i];
int tailPopupIndex = 0;
if (!string.IsNullOrEmpty(_selectedAddressTail))
{
for (int i = 0; i < orderedTails.Count; i++)
{
if (string.Equals(orderedTails[i], _selectedAddressTail, StringComparison.OrdinalIgnoreCase))
{
tailPopupIndex = i + 1;
break;
}
}
}
EditorGUI.BeginChangeCheck();
tailPopupIndex = EditorGUILayout.Popup(
new GUIContent(
"Address tail for this run",
"Appended to every generated address. The assets on-disk extension is always stripped first."),
tailPopupIndex,
tailPopupOptions);
if (EditorGUI.EndChangeCheck())
{
_selectedAddressTail = tailPopupIndex <= 0 ? null : orderedTails[tailPopupIndex - 1];
SaveSelectedAddressTailToPrefs();
}
EditorGUILayout.Space(6);
var newFolder = (DefaultAsset)EditorGUILayout.ObjectField(
"Parent folder", _parentFolder, typeof(DefaultAsset), false);
@@ -106,6 +228,8 @@ namespace BrewMonster
private void Run(string parentPath, string groupName)
{
_log = "";
RebuildUserExcludedExtensionSet();
NormalizeSelectedAddressTailAgainstPresets();
var settings = AddressableAssetSettingsDefaultObject.Settings;
if (settings == null)
@@ -274,7 +398,10 @@ namespace BrewMonster
if (_includeFolderName)
relative = groupName + "/" + relative;
string newAddress = ToAddressWithoutExtension(relative);
string baseAddress = ToAddressWithoutExtension(relative);
string newAddress = string.IsNullOrEmpty(_selectedAddressTail)
? baseAddress
: baseAddress + _selectedAddressTail;
entry.SetAddress(newAddress, false);
processed++;
}
@@ -318,10 +445,165 @@ namespace BrewMonster
return !string.IsNullOrEmpty(ext) && TextExtensions.Contains(ext);
}
private static bool ShouldSkipNeverAddressableExtension(string assetPath)
private void LoadUserExcludedExtensionsFromPrefs()
{
_userExcludedExtensions.Clear();
string raw = EditorPrefs.GetString(EditorPrefsUserExcludedExtensionsKey, "");
if (string.IsNullOrEmpty(raw))
{
RebuildUserExcludedExtensionSet();
return;
}
var seen = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
foreach (var part in raw.Split(new[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries))
{
string n = NormalizeExtensionToken(part);
if (n == null || !seen.Add(n))
continue;
_userExcludedExtensions.Add(n);
}
RebuildUserExcludedExtensionSet();
}
private void SaveUserExcludedExtensionsToPrefs()
{
var deduped = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
var lines = new List<string>();
foreach (string raw in _userExcludedExtensions)
{
string n = NormalizeExtensionToken(raw);
if (n == null || !deduped.Add(n))
continue;
lines.Add(n);
}
lines.Sort(StringComparer.OrdinalIgnoreCase);
EditorPrefs.SetString(EditorPrefsUserExcludedExtensionsKey, string.Join("\n", lines));
RebuildUserExcludedExtensionSet();
}
private void RebuildUserExcludedExtensionSet()
{
_userExcludedExtensionSet.Clear();
foreach (string raw in _userExcludedExtensions)
{
string n = NormalizeExtensionToken(raw);
if (n != null)
_userExcludedExtensionSet.Add(n);
}
}
private void LoadAddressTailPresetsFromPrefs()
{
_addressTailPresets.Clear();
string raw = EditorPrefs.GetString(EditorPrefsAddressTailPresetsKey, "");
if (string.IsNullOrEmpty(raw))
{
string legacy = EditorPrefs.GetString(EditorPrefsLegacyKeepExtensionInAddressKey, "");
if (!string.IsNullOrEmpty(legacy))
{
EditorPrefs.SetString(EditorPrefsAddressTailPresetsKey, legacy);
EditorPrefs.DeleteKey(EditorPrefsLegacyKeepExtensionInAddressKey);
raw = legacy;
}
}
if (string.IsNullOrEmpty(raw))
return;
var seen = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
foreach (var part in raw.Split(new[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries))
{
string n = NormalizeExtensionToken(part);
if (n == null || !seen.Add(n))
continue;
_addressTailPresets.Add(n);
}
}
private void SaveAddressTailPresetsToPrefs()
{
var deduped = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
var lines = new List<string>();
foreach (string raw in _addressTailPresets)
{
string n = NormalizeExtensionToken(raw);
if (n == null || !deduped.Add(n))
continue;
lines.Add(n);
}
lines.Sort(StringComparer.OrdinalIgnoreCase);
EditorPrefs.SetString(EditorPrefsAddressTailPresetsKey, string.Join("\n", lines));
}
private void LoadSelectedAddressTailFromPrefs()
{
string raw = EditorPrefs.GetString(EditorPrefsSelectedAddressTailKey, "");
_selectedAddressTail = string.IsNullOrWhiteSpace(raw) ? null : NormalizeExtensionToken(raw);
NormalizeSelectedAddressTailAgainstPresets();
}
private void SaveSelectedAddressTailToPrefs()
{
EditorPrefs.SetString(EditorPrefsSelectedAddressTailKey, _selectedAddressTail ?? "");
}
private List<string> GetOrderedNormalizedAddressTailPresets()
{
var seen = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
var list = new List<string>();
foreach (string raw in _addressTailPresets)
{
string n = NormalizeExtensionToken(raw);
if (n == null || !seen.Add(n))
continue;
list.Add(n);
}
return list;
}
private void NormalizeSelectedAddressTailAgainstPresets()
{
if (string.IsNullOrEmpty(_selectedAddressTail))
return;
List<string> ordered = GetOrderedNormalizedAddressTailPresets();
foreach (string t in ordered)
{
if (string.Equals(t, _selectedAddressTail, StringComparison.OrdinalIgnoreCase))
{
_selectedAddressTail = t;
return;
}
}
_selectedAddressTail = null;
SaveSelectedAddressTailToPrefs();
}
private static string NormalizeExtensionToken(string s)
{
if (string.IsNullOrWhiteSpace(s))
return null;
s = s.Trim();
if (s.Length == 0)
return null;
if (s[0] != '.')
s = "." + s;
return s;
}
private bool ShouldSkipNeverAddressableExtension(string assetPath)
{
string ext = Path.GetExtension(assetPath);
return !string.IsNullOrEmpty(ext) && NeverAddressableExtensions.Contains(ext);
if (string.IsNullOrEmpty(ext))
return false;
if (NeverAddressableExtensions.Contains(ext))
return true;
return _userExcludedExtensionSet.Contains(ext);
}
/// <summary>
File diff suppressed because one or more lines are too long