大活:Tracker和Interferometer

等待改进
Signed-off-by: TRAfoer <lhf190@outlook.com>
This commit is contained in:
2025-11-02 03:08:40 +08:00
parent eab38e36fe
commit 1280e32612
53 changed files with 3446 additions and 35373 deletions

View File

@@ -44,15 +44,15 @@ MonoBehaviour:
UseGUIDsList: []
- guid: 00000000000000004000000000000000
type: 5
m_fileInfoHash: 26776.asset
m_fileInfoHash: 26810.asset
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 26776
m_assetChangeTS: 1760787584
m_fileInfoReadTS: 1760787600
m_fileWriteTS: 1760787584
m_cachefileWriteTS: 1760787584
m_fileSize: 26810
m_assetChangeTS: 1762020007
m_fileInfoReadTS: 1762020026
m_fileWriteTS: 1762020007
m_cachefileWriteTS: 1762020007
refreshStamp: 2
UseGUIDsList:
- guid: cd62869af1bc6534d83427c72b66bb9f
@@ -3589,15 +3589,15 @@ MonoBehaviour:
UseGUIDsList: []
- guid: 30dde730c51f742719fcc5c36eb811e5
type: 2
m_fileInfoHash: 7248.cs
m_fileInfoHash: 9023.cs
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 7248
m_assetChangeTS: 1755714598
m_fileInfoReadTS: 1755714604
m_fileWriteTS: 1755160173
m_cachefileWriteTS: 1755160173
m_fileSize: 9023
m_assetChangeTS: 1762017541
m_fileInfoReadTS: 1762017563
m_fileWriteTS: 1762016608
m_cachefileWriteTS: 1762016608
refreshStamp: 2
UseGUIDsList: []
- guid: 30fdb7163494e28429d56613fe407bf4
@@ -11637,10 +11637,10 @@ MonoBehaviour:
m_addressable:
m_atlas:
m_fileSize: 3645
m_assetChangeTS: 1760787709
m_fileInfoReadTS: 1760787791
m_fileWriteTS: 1760787708
m_cachefileWriteTS: 1760787708
m_assetChangeTS: 1760856139
m_fileInfoReadTS: 1760856477
m_fileWriteTS: 1760856139
m_cachefileWriteTS: 1760856139
refreshStamp: 2
UseGUIDsList:
- guid: bf2edee5c58d82540a51f03df9d42094
@@ -15457,15 +15457,15 @@ MonoBehaviour:
UseGUIDsList: []
- guid: 1119784540bef4e73b37c7cb9f597065
type: 2
m_fileInfoHash: 6877.cs
m_fileInfoHash: 9315.cs
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 6877
m_assetChangeTS: 1755714598
m_fileInfoReadTS: 1755714604
m_fileWriteTS: 1755160177
m_cachefileWriteTS: 1755160177
m_fileSize: 9315
m_assetChangeTS: 1762023839
m_fileInfoReadTS: 1762023856
m_fileWriteTS: 1762023824
m_cachefileWriteTS: 1762023824
refreshStamp: 2
UseGUIDsList: []
- guid: 1139f30c04130724d998e1bae48d15c6
@@ -21573,15 +21573,15 @@ MonoBehaviour:
UseGUIDsList: []
- guid: 81e2cda70e8084a3fb324d644db244fd
type: 5
m_fileInfoHash: 348808.asset
m_fileInfoHash: 349253.asset
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 348808
m_assetChangeTS: 1760787305
m_fileInfoReadTS: 1760787320
m_fileWriteTS: 1760787305
m_cachefileWriteTS: 1760787305
m_fileSize: 349253
m_assetChangeTS: 1760856139
m_fileInfoReadTS: 1760856476
m_fileWriteTS: 1760856139
m_cachefileWriteTS: 1760856139
refreshStamp: 2
UseGUIDsList:
- guid: e6b16dc7c203450459bb86e24305f9ca
@@ -22846,6 +22846,16 @@ MonoBehaviour:
ids: d50000001c000000
- guid: eea08375da243a441b88d1e6b0713006
ids: 73000000
- guid: 2fd6421f253b4ef1a19526541f9ffc0c
ids: 1c000000
- guid: 3ee40aa79cd242a5b53b0b0ca4f13f0f
ids: 1c000000
- guid: ee148e281f3c41c5b4ff5f8a5afe5a6c
ids: 1c000000
- guid: f87b5805002ec9649bcb1b96d8a16ba9
ids: 1c000000
- guid: 3028dc075ba8c584d9bc7d1e0255e038
ids: 1c000000
- guid: 8113366f9f7cec647878e3af2fb98922
type: 9
m_fileInfoHash: 19671.png
@@ -23047,15 +23057,15 @@ MonoBehaviour:
UseGUIDsList: []
- guid: 8136d0b00cb8049c98eb2b1d40ad0820
type: 2
m_fileInfoHash: 2669.cs
m_fileInfoHash: 2799.cs
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 2669
m_assetChangeTS: 1755714598
m_fileInfoReadTS: 1755714604
m_fileWriteTS: 1753541100
m_cachefileWriteTS: 1753541100
m_fileSize: 2799
m_assetChangeTS: 1762010317
m_fileInfoReadTS: 1762010340
m_fileWriteTS: 1762008614
m_cachefileWriteTS: 1762008614
refreshStamp: 2
UseGUIDsList: []
- guid: 8146dbbd8d7184f43bb0049a7ce3ade8
@@ -28005,10 +28015,10 @@ MonoBehaviour:
m_addressable:
m_atlas:
m_fileSize: 3642
m_assetChangeTS: 1760787709
m_fileInfoReadTS: 1760787791
m_fileWriteTS: 1760787708
m_cachefileWriteTS: 1760787708
m_assetChangeTS: 1760856139
m_fileInfoReadTS: 1760856476
m_fileWriteTS: 1760856139
m_cachefileWriteTS: 1760856139
refreshStamp: 2
UseGUIDsList:
- guid: bf2edee5c58d82540a51f03df9d42094
@@ -32852,15 +32862,15 @@ MonoBehaviour:
UseGUIDsList: []
- guid: 42c83e2f698b543f98d2cfcfb1ac5228
type: 2
m_fileInfoHash: 9296.cs
m_fileInfoHash: 10814.cs
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 9296
m_assetChangeTS: 1755714598
m_fileInfoReadTS: 1755714604
m_fileWriteTS: 1755605184
m_cachefileWriteTS: 1755605184
m_fileSize: 10814
m_assetChangeTS: 1762017541
m_fileInfoReadTS: 1762017563
m_fileWriteTS: 1762016942
m_cachefileWriteTS: 1762016942
refreshStamp: 2
UseGUIDsList: []
- guid: 42f876c7bad484946a19cce672fc2ff4
@@ -96173,15 +96183,15 @@ MonoBehaviour:
UseGUIDsList: []
- guid: e6daf69621681491bb09cc72e2ff4bdb
type: 2
m_fileInfoHash: 7204.cs
m_fileInfoHash: 9627.cs
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 7204
m_assetChangeTS: 1755714598
m_fileInfoReadTS: 1755714604
m_fileWriteTS: 1755160183
m_cachefileWriteTS: 1755160183
m_fileSize: 9627
m_assetChangeTS: 1762021720
m_fileInfoReadTS: 1762021736
m_fileWriteTS: 1762021719
m_cachefileWriteTS: 1762021719
refreshStamp: 2
UseGUIDsList: []
- guid: e60bdd1e4f6314d2382f323172110798
@@ -105750,15 +105760,15 @@ MonoBehaviour:
UseGUIDsList: []
- guid: 97779e95563721b4e8d4a28bb0d46cb9
type: 2
m_fileInfoHash: 2311.cs
m_fileInfoHash: 3266.cs
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 2311
m_assetChangeTS: 1755714598
m_fileInfoReadTS: 1755714604
m_fileWriteTS: 1752387529
m_cachefileWriteTS: 1752387529
m_fileSize: 3266
m_assetChangeTS: 1762023486
m_fileInfoReadTS: 1762023502
m_fileWriteTS: 1762023483
m_cachefileWriteTS: 1762023483
refreshStamp: 2
UseGUIDsList: []
- guid: 970810a7c55d644b9ba0de7badcc79a8
@@ -125722,15 +125732,15 @@ MonoBehaviour:
UseGUIDsList: []
- guid: 09efd164733b64d539127e1d09f6ef5a
type: 2
m_fileInfoHash: 6253.cs
m_fileInfoHash: 6269.cs
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 6253
m_assetChangeTS: 1756559786
m_fileInfoReadTS: 1756559802
m_fileWriteTS: 1756559784
m_cachefileWriteTS: 1756559784
m_fileSize: 6269
m_assetChangeTS: 1762007022
m_fileInfoReadTS: 1762007042
m_fileWriteTS: 1762007016
m_cachefileWriteTS: 1762007016
refreshStamp: 2
UseGUIDsList: []
- guid: 1900baa5498f6417b8a7037bb313eb83
@@ -131131,15 +131141,15 @@ MonoBehaviour:
UseGUIDsList: []
- guid: 79d811a12f27f43629797719fcbfc6ae
type: 2
m_fileInfoHash: 7015.cs
m_fileInfoHash: 7172.cs
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 7015
m_assetChangeTS: 1755714598
m_fileInfoReadTS: 1755714604
m_fileWriteTS: 1752741169
m_cachefileWriteTS: 1752741169
m_fileSize: 7172
m_assetChangeTS: 1762007022
m_fileInfoReadTS: 1762007042
m_fileWriteTS: 1762007016
m_cachefileWriteTS: 1762007016
refreshStamp: 2
UseGUIDsList: []
- guid: 79e8584360be43649ad60cb0f180e904
@@ -137127,15 +137137,15 @@ MonoBehaviour:
UseGUIDsList: []
- guid: d9388465a0abc4ef2ab1be2c62476fca
type: 2
m_fileInfoHash: 5413.cs
m_fileInfoHash: 6957.cs
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 5413
m_assetChangeTS: 1755714598
m_fileInfoReadTS: 1755714604
m_fileWriteTS: 1753541100
m_cachefileWriteTS: 1753541100
m_fileSize: 6957
m_assetChangeTS: 1762019317
m_fileInfoReadTS: 1762019337
m_fileWriteTS: 1762019316
m_cachefileWriteTS: 1762019316
refreshStamp: 2
UseGUIDsList: []
- guid: d948bd127b797e94fbf989672ffe1847
@@ -148066,15 +148076,15 @@ MonoBehaviour:
UseGUIDsList: []
- guid: aaf1c7bed195b4399aa6d3b5b4265930
type: 2
m_fileInfoHash: 2125.cs
m_fileInfoHash: 2339.cs
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 2125
m_assetChangeTS: 1755714598
m_fileInfoReadTS: 1755714604
m_fileWriteTS: 1754910644
m_cachefileWriteTS: 1754910644
m_fileSize: 2339
m_assetChangeTS: 1762020762
m_fileInfoReadTS: 1762020780
m_fileWriteTS: 1762020761
m_cachefileWriteTS: 1762020761
refreshStamp: 2
UseGUIDsList: []
- guid: aa2238545a2849ecb0a6285b5a632a69
@@ -152362,15 +152372,15 @@ MonoBehaviour:
ids: 73000000
- guid: eaac9d0bf222646fc89d03493f9fca69
type: 2
m_fileInfoHash: 22668.cs
m_fileInfoHash: 22686.cs
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 22668
m_assetChangeTS: 1759652858
m_fileInfoReadTS: 1759652866
m_fileWriteTS: 1759651975
m_cachefileWriteTS: 1759651975
m_fileSize: 22686
m_assetChangeTS: 1761996803
m_fileInfoReadTS: 1761996815
m_fileWriteTS: 1761996064
m_cachefileWriteTS: 1761996064
refreshStamp: 2
UseGUIDsList: []
- guid: ea6dbc5d03b50f148a26b55c617dcb22
@@ -160356,10 +160366,10 @@ MonoBehaviour:
m_addressable:
m_atlas:
m_fileSize: 3649
m_assetChangeTS: 1760787709
m_fileInfoReadTS: 1760787791
m_fileWriteTS: 1760787708
m_cachefileWriteTS: 1760787708
m_assetChangeTS: 1760856139
m_fileInfoReadTS: 1760856476
m_fileWriteTS: 1760856139
m_cachefileWriteTS: 1760856139
refreshStamp: 2
UseGUIDsList:
- guid: bf2edee5c58d82540a51f03df9d42094
@@ -173072,10 +173082,10 @@ MonoBehaviour:
m_addressable:
m_atlas:
m_fileSize: 2814
m_assetChangeTS: 1760787709
m_fileInfoReadTS: 1760787791
m_fileWriteTS: 1760787708
m_cachefileWriteTS: 1760787708
m_assetChangeTS: 1760856139
m_fileInfoReadTS: 1760856476
m_fileWriteTS: 1760856139
m_cachefileWriteTS: 1760856139
refreshStamp: 2
UseGUIDsList:
- guid: 06e8da9b2b26f09459e8a93e84b2e0c9
@@ -182370,15 +182380,15 @@ MonoBehaviour:
UseGUIDsList: []
- guid: 1d27859adda1341aaa0db8a117d5431c
type: 2
m_fileInfoHash: 8844.cs
m_fileInfoHash: 8999.cs
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 8844
m_assetChangeTS: 1755714598
m_fileInfoReadTS: 1755714603
m_fileWriteTS: 1752396359
m_cachefileWriteTS: 1752396359
m_fileSize: 8999
m_assetChangeTS: 1762020762
m_fileInfoReadTS: 1762020780
m_fileWriteTS: 1762020761
m_cachefileWriteTS: 1762020761
refreshStamp: 2
UseGUIDsList: []
- guid: 1d575a145584c7549994d8a51c689ef8
@@ -188366,15 +188376,15 @@ MonoBehaviour:
UseGUIDsList: []
- guid: 8d2b6af5deaa046ff89ed3c74bb2ffdc
type: 2
m_fileInfoHash: 22854.cs
m_fileInfoHash: 22870.cs
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 22854
m_assetChangeTS: 1759652858
m_fileInfoReadTS: 1759652865
m_fileWriteTS: 1759652675
m_cachefileWriteTS: 1759652675
m_fileSize: 22870
m_assetChangeTS: 1762007022
m_fileInfoReadTS: 1762007042
m_fileWriteTS: 1762007016
m_cachefileWriteTS: 1762007016
refreshStamp: 2
UseGUIDsList: []
- guid: 8d4bc6bfa28760b29f13174d6b6ea710
@@ -196527,15 +196537,15 @@ MonoBehaviour:
ids: 73000000
- guid: 2e498d1c8094910479dc3e1b768306a4
type: 5
m_fileInfoHash: 9628.asset
m_fileInfoHash: 569620.asset
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 9628
m_assetChangeTS: 1760787709
m_fileInfoReadTS: 1760787791
m_fileWriteTS: 1760787708
m_cachefileWriteTS: 1760787708
m_fileSize: 569620
m_assetChangeTS: 1762020007
m_fileInfoReadTS: 1762020026
m_fileWriteTS: 1762020007
m_cachefileWriteTS: 1762020007
refreshStamp: 2
UseGUIDsList:
- guid: fe393ace9b354375a9cb14cdbbc28be4
@@ -222596,28 +222606,28 @@ MonoBehaviour:
UseGUIDsList: []
- guid: 9251305e5ad58f14f9b08f20e97e249f
type: 9
m_fileInfoHash: 320.json
m_fileInfoHash: 311.json
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 320
m_assetChangeTS: 0
m_fileInfoReadTS: 1757811248
m_fileWriteTS: 1757761360
m_cachefileWriteTS: 1757761360
m_fileSize: 311
m_assetChangeTS: 1762007022
m_fileInfoReadTS: 1762007042
m_fileWriteTS: 1762007022
m_cachefileWriteTS: 1762007022
refreshStamp: 2
UseGUIDsList: []
- guid: a4f7d2c6cab636c47b06b244a10752c1
type: 9
m_fileInfoHash: 113151.json
m_fileInfoHash: 28857.json
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 113151
m_assetChangeTS: 1759652858
m_fileInfoReadTS: 1759652868
m_fileWriteTS: 1759651975
m_cachefileWriteTS: 1759651975
m_fileSize: 28857
m_assetChangeTS: 1762023839
m_fileInfoReadTS: 1762023856
m_fileWriteTS: 1762023835
m_cachefileWriteTS: 1762023835
refreshStamp: 2
UseGUIDsList: []
- guid: f4ff864c59d959f4e98c0119f0259d6d
@@ -222653,10 +222663,10 @@ MonoBehaviour:
m_addressable:
m_atlas:
m_fileSize: 252
m_assetChangeTS: 0
m_fileInfoReadTS: 1757811248
m_fileWriteTS: 1757761360
m_cachefileWriteTS: 1757761360
m_assetChangeTS: 1762007022
m_fileInfoReadTS: 1762007042
m_fileWriteTS: 1762007022
m_cachefileWriteTS: 1762007022
refreshStamp: 2
UseGUIDsList: []
- guid: 29f0302d9bc8ad540bcfe7b38cd8c6e7
@@ -222692,62 +222702,36 @@ MonoBehaviour:
m_addressable:
m_atlas:
m_fileSize: 448
m_assetChangeTS: 0
m_fileInfoReadTS: 1757811248
m_fileWriteTS: 1757761360
m_cachefileWriteTS: 1757761360
refreshStamp: 2
UseGUIDsList: []
- guid: 6f99efda09a3e9a4f9deaff6736034b0
type: 9
m_fileInfoHash: 33860650.wav
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 33860650
m_assetChangeTS: 0
m_fileInfoReadTS: 1757811248
m_fileWriteTS: 1757761360
m_cachefileWriteTS: 1757761360
refreshStamp: 2
UseGUIDsList: []
- guid: 8fb22b1768a50f049bbe1a932e358f8d
type: 9
m_fileInfoHash: 113151.json
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 113151
m_assetChangeTS: 1759652858
m_fileInfoReadTS: 1759652865
m_fileWriteTS: 1759651975
m_cachefileWriteTS: 1759651975
m_assetChangeTS: 1762007022
m_fileInfoReadTS: 1762007042
m_fileWriteTS: 1762007022
m_cachefileWriteTS: 1762007022
refreshStamp: 2
UseGUIDsList: []
- guid: 1f4f8092e8f9f4c428ae331e7f354862
type: 9
m_fileInfoHash: 112545.json
m_fileInfoHash: 29202.json
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 112545
m_assetChangeTS: 1759652858
m_fileInfoReadTS: 1759652865
m_fileWriteTS: 1759651975
m_cachefileWriteTS: 1759651975
m_fileSize: 29202
m_assetChangeTS: 1762022969
m_fileInfoReadTS: 1762022978
m_fileWriteTS: 1762022562
m_cachefileWriteTS: 1762022562
refreshStamp: 2
UseGUIDsList: []
- guid: dcf79458996b9294e9622caeeeabacc4
type: 9
m_fileInfoHash: 113154.json
m_fileInfoHash: 29202.json
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 113154
m_assetChangeTS: 1759652858
m_fileInfoReadTS: 1759652865
m_fileWriteTS: 1759651975
m_cachefileWriteTS: 1759651975
m_fileSize: 29202
m_assetChangeTS: 1762022969
m_fileInfoReadTS: 1762022978
m_fileWriteTS: 1762022262
m_cachefileWriteTS: 1762022262
refreshStamp: 2
UseGUIDsList: []
- guid: 102e46de009e849cdba7cdbee965fb23
@@ -226813,10 +226797,10 @@ MonoBehaviour:
m_addressable:
m_atlas:
m_fileSize: 8454
m_assetChangeTS: 1759309536
m_fileInfoReadTS: 1759309555
m_fileWriteTS: 1759309529
m_cachefileWriteTS: 1759309529
m_assetChangeTS: 1761991569
m_fileInfoReadTS: 1761991593
m_fileWriteTS: 1760856865
m_cachefileWriteTS: 1760856865
refreshStamp: 2
UseGUIDsList: []
- guid: 72a537e19a9032a41bb95ae02311c661
@@ -226899,15 +226883,15 @@ MonoBehaviour:
UseGUIDsList: []
- guid: 6fe401fc051728b49a4e682f518ffc54
type: 2
m_fileInfoHash: 2003.cs
m_fileInfoHash: 1649.cs
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 2003
m_assetChangeTS: 1760855021
m_fileInfoReadTS: 1760855044
m_fileWriteTS: 1760855018
m_cachefileWriteTS: 1760855018
m_fileSize: 1649
m_assetChangeTS: 1760855428
m_fileInfoReadTS: 1760855448
m_fileWriteTS: 1760855423
m_cachefileWriteTS: 1760855423
refreshStamp: 2
UseGUIDsList: []
- guid: 883ef17754a31e741b58fa60ce21b740
@@ -227560,45 +227544,6 @@ MonoBehaviour:
m_cachefileWriteTS: 1759283056
refreshStamp: 2
UseGUIDsList: []
- guid: 07d349221d0c50c448b75f0f3f9c6260
type: 9
m_fileInfoHash: 542823.json
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 542823
m_assetChangeTS: 0
m_fileInfoReadTS: 1760854837
m_fileWriteTS: 1760854833
m_cachefileWriteTS: 1760854833
refreshStamp: 2
UseGUIDsList: []
- guid: 46b458474db32b44e95aef1050b88adc
type: 9
m_fileInfoHash: 7778290.mp3
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 7778290
m_assetChangeTS: 0
m_fileInfoReadTS: 1760854837
m_fileWriteTS: 1760854833
m_cachefileWriteTS: 1760854833
refreshStamp: 2
UseGUIDsList: []
- guid: 7f58bf294f7b1c44bb4efff5344adfc7
type: 9
m_fileInfoHash: 305.json
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 305
m_assetChangeTS: 0
m_fileInfoReadTS: 1760854837
m_fileWriteTS: 1760854833
m_cachefileWriteTS: 1760854833
refreshStamp: 2
UseGUIDsList: []
- guid: 391e84f9d07baa741b2ebcf5413513d3
type: 1
m_fileInfoHash:
@@ -227612,30 +227557,186 @@ MonoBehaviour:
m_cachefileWriteTS: 0
refreshStamp: 2
UseGUIDsList: []
- guid: 98c115a2af755f94eaeba3d4a7d94b74
type: 9
m_fileInfoHash: 252.json
- guid: c59ac55bda5746b429dea11680098277
type: 1
m_fileInfoHash:
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 252
m_fileSize: 0
m_assetChangeTS: 0
m_fileInfoReadTS: 1760854837
m_fileWriteTS: 1760854833
m_cachefileWriteTS: 1760854833
m_fileInfoReadTS: 1761991621
m_fileWriteTS: 0
m_cachefileWriteTS: 0
refreshStamp: 2
UseGUIDsList: []
- guid: a06baf8cae5347b438ae94261f0525f4
type: 9
m_fileInfoHash: 492.json
- guid: 6d87960788a4be94e87ff13bb81625cd
type: 2
m_fileInfoHash: 9658.cs
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 492
m_fileSize: 9658
m_assetChangeTS: 1762020242
m_fileInfoReadTS: 1762020260
m_fileWriteTS: 1762020239
m_cachefileWriteTS: 1762020239
refreshStamp: 2
UseGUIDsList: []
- guid: 43c59b01d1d25b9448e5a5fecbc7e989
type: 1
m_fileInfoHash:
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 0
m_assetChangeTS: 1761993841
m_fileInfoReadTS: 1761993844
m_fileWriteTS: 0
m_cachefileWriteTS: 0
refreshStamp: 2
UseGUIDsList: []
- guid: ef1be148d7f177a419f2de084f657248
type: 2
m_fileInfoHash: 6397.cs
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 6397
m_assetChangeTS: 1762020612
m_fileInfoReadTS: 1762020628
m_fileWriteTS: 1762020609
m_cachefileWriteTS: 1762020609
refreshStamp: 2
UseGUIDsList: []
- guid: 40784921009324241a68ffc3b2ed7fcf
type: 9
m_fileInfoHash: 1812.cs
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 1812
m_assetChangeTS: 1762003549
m_fileInfoReadTS: 1762003568
m_fileWriteTS: 1762003534
m_cachefileWriteTS: 1762003534
refreshStamp: 2
UseGUIDsList: []
- guid: 80b556a28f0729f428527c6f46378b95
type: 9
m_fileInfoHash: 288.bytes
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 288
m_assetChangeTS: 1762021650
m_fileInfoReadTS: 1762021665
m_fileWriteTS: 1762020960
m_cachefileWriteTS: 1762020960
refreshStamp: 2
UseGUIDsList: []
- guid: 99e8bcadcf29feb46b2d7edd529e16fe
type: 1
m_fileInfoHash:
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 0
m_assetChangeTS: 0
m_fileInfoReadTS: 1760854837
m_fileWriteTS: 1760854833
m_cachefileWriteTS: 1760854833
m_fileInfoReadTS: 1762001902
m_fileWriteTS: 0
m_cachefileWriteTS: 0
refreshStamp: 2
UseGUIDsList: []
- guid: 02925c6c6666052489200cc3fd84b49a
type: 9
m_fileInfoHash: 224.bytes
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 224
m_assetChangeTS: 1762021650
m_fileInfoReadTS: 1762021665
m_fileWriteTS: 1762020960
m_cachefileWriteTS: 1762020960
refreshStamp: 2
UseGUIDsList: []
- guid: 1db26db29f28f3f4996e492b8158e611
type: 9
m_fileInfoHash: 1136.bytes
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 1136
m_assetChangeTS: 1762021650
m_fileInfoReadTS: 1762021665
m_fileWriteTS: 1762020960
m_cachefileWriteTS: 1762020960
refreshStamp: 2
UseGUIDsList: []
- guid: 24782b8b45c659c4d9d02229b5b19372
type: 9
m_fileInfoHash: 192.bytes
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 192
m_assetChangeTS: 1762021650
m_fileInfoReadTS: 1762021665
m_fileWriteTS: 1762020960
m_cachefileWriteTS: 1762020960
refreshStamp: 2
UseGUIDsList: []
- guid: d4ec2022c82788447a56cff9cfc8003b
type: 9
m_fileInfoHash: 24352760.wav
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 24352760
m_assetChangeTS: 0
m_fileInfoReadTS: 1762007042
m_fileWriteTS: 1762007022
m_cachefileWriteTS: 1762007022
refreshStamp: 2
UseGUIDsList: []
- guid: 8fb22b1768a50f049bbe1a932e358f8d
type: 9
m_fileInfoHash: 29365.json
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 29365
m_assetChangeTS: 1762022969
m_fileInfoReadTS: 1762022978
m_fileWriteTS: 1762022862
m_cachefileWriteTS: 1762022862
refreshStamp: 2
UseGUIDsList: []
- guid: fa441a41a13cc794cb909abea76cd7a1
type: 2
m_fileInfoHash: 8784.cs
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 8784
m_assetChangeTS: 1762021720
m_fileInfoReadTS: 1762021736
m_fileWriteTS: 1762021719
m_cachefileWriteTS: 1762021719
refreshStamp: 2
UseGUIDsList: []
- guid: 771a58a2b0d89ca4d9440f8463a03ff2
type: 2
m_fileInfoHash: 8754.cs
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 8754
m_assetChangeTS: 1762023198
m_fileInfoReadTS: 1762023216
m_fileWriteTS: 1762023197
m_cachefileWriteTS: 1762023197
refreshStamp: 2
UseGUIDsList: []
setting:

File diff suppressed because one or more lines are too long

View File

@@ -19,22 +19,36 @@ namespace Ichni.Editor
var displacementButton = inspector.GenerateButton(gameElement, animationSubcontainer, "Displacement", () =>
{
Displacement.GenerateElement("New Displacement", Guid.NewGuid(), new List<string>(), true, gameElement,
new FlexibleFloat(), new FlexibleFloat(), new FlexibleFloat());
new FlexibleFloat(true), new FlexibleFloat(true), new FlexibleFloat(true));
}); //位移
var swirlButton = inspector.GenerateButton(gameElement, animationSubcontainer, "Swirl", () =>
{
Swirl.GenerateElement("New Swirl", Guid.NewGuid(), new List<string>(), true, gameElement,
new FlexibleFloat(), new FlexibleFloat(), new FlexibleFloat());
new FlexibleFloat(true), new FlexibleFloat(true), new FlexibleFloat(true));
}); //旋转
var scaleButton = inspector.GenerateButton(gameElement, animationSubcontainer, "Scale", () =>
{
Scale.GenerateElement("New Scale", Guid.NewGuid(), new List<string>(), true, gameElement,
new FlexibleFloat(), new FlexibleFloat(), new FlexibleFloat());
new FlexibleFloat(true), new FlexibleFloat(true), new FlexibleFloat(true));
}); //缩放
var LookAtButton = inspector.GenerateButton(gameElement, animationSubcontainer, "Look At",
() => LookAt.GenerateElement("New Look At", Guid.NewGuid(),
new List<string>(), true, gameElement, null, new FlexibleBool()));
var displacementTrackerButton = inspector.GenerateButton(gameElement, animationSubcontainer, "Displacement Tracker", () =>
{
DisplacementTracker.GenerateElement("New Displacement Tracker", Guid.NewGuid(), new List<string>(), true, gameElement,
null, 0f);
});
var swirlTrackerButton = inspector.GenerateButton(gameElement, animationSubcontainer, "Swirl Tracker", () =>
{
SwirlTracker.GenerateElement("New Swirl Tracker", Guid.NewGuid(), new List<string>(), true, gameElement,
null, 0f);
}); var ScaleTrackerButton = inspector.GenerateButton(gameElement, animationSubcontainer, "Scale Tracker", () =>
{
ScaleTracker.GenerateElement("New Scale Tracker", Guid.NewGuid(), new List<string>(), true, gameElement,
null, 0f);
});
}
public static void GenerateForLoading()
{

View File

@@ -12,7 +12,6 @@ namespace Ichni.RhythmGame
public FlexibleReturnType animationReturnType;
public TimeDurationSubmodule timeDurationSubmodule { get; set; }
public override void SetDefaultSubmodules()
{
timeDurationSubmodule = new TimeDurationSubmodule(this);
@@ -47,6 +46,10 @@ namespace Ichni.RhythmGame
{
return Vector3.zero;
}
public virtual FlexibleReturnType getReturnType(float time)
{
return animationReturnType;
}
/// <summary>
/// 施加时间偏移即移动所有Flexible参数的时间
/// </summary>

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: c59ac55bda5746b429dea11680098277
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 43c59b01d1d25b9448e5a5fecbc7e989
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,64 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Net.NetworkInformation;
using Ichni.RhythmGame.Beatmap;
using UnityEngine;
namespace Ichni.RhythmGame
{
public enum InterferomType
{
Additive,
Multiplicative,
Override
}
public abstract class InterferometerBase : GameElement, IHaveTimeDurationSubmodule, IBeChangeInExport
{
public AnimationBase parentAnimationElement;
public TimeDurationSubmodule timeDurationSubmodule { get; set; }
public BaseElement_BM MatchingExportElement { get; set; }
public virtual void SaveExportBM()
{
MatchingExportElement = null;
}
public InterferomType InterferomType;
}
public interface IBeChangeInExport
{
public BaseElement_BM MatchingExportElement { get; set; }
void SaveExportBM();
}
public interface IHaveInterferometer
{
public List<InterferometerBase> Interferometers { get; set; }
}
public interface IHaveVector3Interferometer : IHaveInterferometer
{
public void ApplyVector3Interferometers(ref Vector3 value)
{
foreach (Vector3Interferometer interferometer in Interferometers.OfType<Vector3Interferometer>())
{
interferometer.InterferomValue(ref value);
}
}
public void ApplyVector3InterferometersBM(FlexibleFloat_BM X, FlexibleFloat_BM Y, FlexibleFloat_BM Z)
{
foreach (Vector3Interferometer interferometer in Interferometers.OfType<Vector3Interferometer>())
{
interferometer.InterferomValueBM(X, Y, Z);
}
}
}
}

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 98c115a2af755f94eaeba3d4a7d94b74
guid: 40784921009324241a68ffc3b2ed7fcf
DefaultImporter:
externalObjects: {}
userData:

View File

@@ -0,0 +1,147 @@
using System;
using System.Collections;
using System.Collections.Generic;
using Beatmap;
using Ichni.Editor;
using Ichni.RhythmGame;
using Ichni.RhythmGame.Beatmap;
using UnityEngine;
namespace Ichni.RhythmGame
{
public class Vector3Interferometer : InterferometerBase
{
public static Vector3Interferometer GenerateElement(string elementName, Guid id,
List<string> tags, bool isFirstGenerated, AnimationBase parentAnimationElement,
InterferomType interferomType, Vector3 interferomValue)
{
Vector3Interferometer vector3Interferometer = Instantiate(EditorManager.instance.basePrefabs.emptyObject).AddComponent<Vector3Interferometer>();
vector3Interferometer.Initialize(elementName, id, tags, isFirstGenerated, parentAnimationElement);
vector3Interferometer.parentAnimationElement = parentAnimationElement;
vector3Interferometer.InterferomType = interferomType;
vector3Interferometer.InterferomValueVector3 = interferomValue;
if (isFirstGenerated) vector3Interferometer.timeDurationSubmodule = new TimeDurationSubmodule(vector3Interferometer, false, parentAnimationElement.timeDurationSubmodule.startTime, parentAnimationElement.timeDurationSubmodule.endTime);
if (parentAnimationElement is IHaveVector3Interferometer haveVector3Interferometer)
{
haveVector3Interferometer.Interferometers.Add(vector3Interferometer);
}
else
{
Debug.LogError("Trying to add Vector3Interferometer to an AnimationBase that does not implement IHaveVector3Interferometer.");
Destroy(vector3Interferometer.gameObject);
return null;
}
return vector3Interferometer;
}
public Vector3 InterferomValueVector3;
public virtual void InterferomValue(ref Vector3 value)
{
switch (InterferomType)
{
case InterferomType.Additive:
// Additive: add interferometer effect to the current value (placeholder)
value += InterferomValueVector3;
break;
case InterferomType.Multiplicative:
// Multiplicative: multiply current value by interferometer effect (placeholder)
value = Vector3.Scale(value, InterferomValueVector3);
break;
case InterferomType.Override:
// Override: replace current value with interferometer effect (placeholder)
value = InterferomValueVector3;
break;
default:
break;
}
}
public void InterferomValueBM(FlexibleFloat_BM X, FlexibleFloat_BM Y, FlexibleFloat_BM Z)
{
void tmpoffset(FlexibleFloat_BM a, int point)
{
foreach (var anim in a.animatedFloatList)
{
switch (InterferomType)
{
case InterferomType.Additive:
anim.endValue += InterferomValueVector3[point];
anim.startValue += InterferomValueVector3[point];
break;
case InterferomType.Multiplicative:
anim.endValue *= InterferomValueVector3[point];
anim.startValue *= InterferomValueVector3[point];
break;
case InterferomType.Override:
anim.endValue = InterferomValueVector3[point];
anim.startValue = InterferomValueVector3[point];
break;
default:
break;
}
}
}
tmpoffset(X, 0);
tmpoffset(Y, 1);
tmpoffset(Z, 2);
}
public override void SetUpInspector()
{
base.SetUpInspector();
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Vector3 Interferometer");
var subcontainer = container.GenerateSubcontainer(1);
inspector.GenerateVector3InputField(this, subcontainer, "Interferom Value", nameof(InterferomValueVector3));
inspector.GenerateDropdown(this, subcontainer, "Interferom Type", typeof(InterferomType), nameof(InterferomType));
}
public override void SaveBM()
{
matchedBM = new Vector3Interferometer_BM(elementName, elementGuid, tags, parentElement.matchedBM as GameElement_BM,
InterferomType, InterferomValueVector3);
}
private void OnDestroy()
{
((IHaveVector3Interferometer)parentElement)?.Interferometers.Remove(this);
}
}
}
namespace Beatmap
{
public class Vector3Interferometer_BM : AnimationBase_BM, ICanNotInExport
{
public Vector3 InterferomValueVector3;
public InterferomType InterferomType;
public Vector3Interferometer_BM() { }
public Vector3Interferometer_BM(string elementName, Guid elementGuid, List<string> tags,
GameElement_BM attachedElement, InterferomType interferomType, Vector3 interferomValue)
: base(elementName, elementGuid, tags, attachedElement)
{
this.InterferomType = interferomType;
this.InterferomValueVector3 = interferomValue;
}
public override void ExecuteBM()
{
matchedElement = Vector3Interferometer.GenerateElement(elementName, elementGuid, tags, false,
GetElement(attachedElementGuid) as AnimationBase, InterferomType, InterferomValueVector3);
}
public override GameElement DuplicateBM(GameElement parent)
{
return Vector3Interferometer.GenerateElement(elementName, Guid.NewGuid(), tags, false,
parent as AnimationBase, InterferomType, InterferomValueVector3);
}
}
public interface ICanNotInExport { }
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: ef1be148d7f177a419f2de084f657248
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,212 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Beatmap;
using Ichni;
using Ichni.Editor;
using Ichni.RhythmGame;
using Ichni.RhythmGame.Beatmap;
using UnityEngine;
namespace Ichni.RhythmGame
{
public class DisplacementTracker : AnimationBase, IBeChangeInExport, IHaveVector3Interferometer, IHaveTimeDurationSubmodule, ICanBeTrackedDisplacement
{
private TransformSubmodule targetTransformSubmodule;
public ICanBeTrackedDisplacement targetDisplacement;
public Vector3 PreviewValue = Vector3.zero;
public float TimeOffset;
public BaseElement_BM MatchingExportElement { get; set; } = null;
public List<InterferometerBase> Interferometers { get; set; } = new();
public static DisplacementTracker GenerateElement(string elementName, System.Guid id,
List<string> tags, bool isFirstGenerated, GameElement animatedObject, Displacement targetDisplacement, float timeOffset)
{
DisplacementTracker tracker = Instantiate(EditorManager.instance.basePrefabs.emptyObject).AddComponent<DisplacementTracker>();
tracker.Initialize(elementName, id, tags, isFirstGenerated, animatedObject);
tracker.animatedObject = animatedObject;
tracker.targetDisplacement = targetDisplacement;
tracker.TimeOffset = timeOffset;
tracker.targetTransformSubmodule = (animatedObject as IHaveTransformSubmodule).transformSubmodule;
return tracker;
}
protected override void UpdateAnimation(float songTime)
{
if (targetDisplacement == null)
{
return;
}
var a = GetCurrentReturnTypes(songTime);
var (x, y, z) = (a[0], a[1], a[2]);
if (x.Item1 is FlexibleReturnType.MiddleExecuting ||
y.Item1 is FlexibleReturnType.MiddleExecuting ||
z.Item1 is FlexibleReturnType.MiddleExecuting)
{
animationReturnType = FlexibleReturnType.MiddleExecuting;
ApplyValue(songTime);
}
else if (x.Item2 || y.Item2 || z.Item2)
{
animationReturnType = FlexibleReturnType.MiddleExecuting;
ApplyValue(songTime);
}
else
{
if (!EditorManager.instance.musicPlayer.isPlaying && animationReturnType != FlexibleReturnType.MiddleInterval)
{
ApplyValue(songTime);
}
animationReturnType = FlexibleReturnType.MiddleInterval;
}
}
private void ApplyValue(float time)
{
Vector3 currentPosition = targetDisplacement.getValue(time + TimeOffset);
// 用接口强制调用默认实现
((IHaveVector3Interferometer)this).ApplyVector3Interferometers(ref currentPosition);
targetTransformSubmodule.positionOffset += currentPosition;
targetTransformSubmodule.positionDirtyMark = true;
PreviewValue = currentPosition;
}
public (FlexibleReturnType, bool)[] GetCurrentReturnTypes(float time)
{
return targetDisplacement.GetCurrentReturnTypes(time + TimeOffset);
}
public override Vector3 getValue(float time)
{
Vector3 currentPosition = targetDisplacement.getValue(time + TimeOffset);
((IHaveVector3Interferometer)this).ApplyVector3Interferometers(ref currentPosition);
return currentPosition;
}
public override void SetUpInspector()
{
base.SetUpInspector();
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
Inspector inspectorMain = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Enable Control");
var effectSettings = container.GenerateSubcontainer(2);
var connectedGameElementInputField = inspector.GenerateInputField(effectSettings, "Try Get Displacement");
var connectGameElementButton = inspector.GenerateButton(this, effectSettings, "Connect Displacement", () =>
{
ICanBeTrackedDisplacement targetElement = EditorManager.instance.beatmapContainer.gameElementList.OfType<ICanBeTrackedDisplacement>()
.First(e => ((GameElement)e).elementName == connectedGameElementInputField.GetValue<string>());
if (targetElement == null)
{
LogWindow.Log("Game Element not found.", Color.yellow);
}
targetDisplacement = targetElement;
//targetTransformSubmodule = (targetElement as IHaveTransformSubmodule).transformSubmodule;
inspectorMain.SetInspector(this);
});
string ShowConnection() => targetDisplacement == null ? "No Displacement Connected" : "Connected With: " + ((GameElement)targetDisplacement).elementName;
var connectHintText = inspector.GenerateHintText(this, effectSettings, ShowConnection);
var InputField = inspector.GenerateInputField(this, effectSettings, "Offset", nameof(TimeOffset));
}
public override void SaveBM()
{
matchedBM = new DisplacementTracker_BM(elementName, elementGuid, tags, parentElement.matchedBM as GameElement_BM,
((GameElement)targetDisplacement).elementGuid, TimeOffset);
}
public bool MaybeDeadLoop = true;
public void SaveExportBM()
{
SaveBM();
MatchingExportElement = matchedBM;
float finalTimeOffset = 0;
Displacement displacement = GetOriginDisplacementWithOffset(ref finalTimeOffset);
displacement.SaveBM();
var x = ((Displacement_BM)displacement.matchedBM).positionX.DeepCopyBM();
var y = ((Displacement_BM)displacement.matchedBM).positionY.DeepCopyBM();
var z = ((Displacement_BM)displacement.matchedBM).positionZ.DeepCopyBM();
x.ApplyTimeOffset(finalTimeOffset); y.ApplyTimeOffset(finalTimeOffset); z.ApplyTimeOffset(finalTimeOffset);
List<ICanBeTrackedDisplacement> ICanBeTrackedDisplacements = new List<ICanBeTrackedDisplacement> { this as ICanBeTrackedDisplacement };
while (MaybeDeadLoop && ICanBeTrackedDisplacements[0] is not Displacement)
{
ICanBeTrackedDisplacement ao = (ICanBeTrackedDisplacements[0] as DisplacementTracker).targetDisplacement;
ICanBeTrackedDisplacements.Insert(0, ao);
}
ICanBeTrackedDisplacements.ForEach(o =>
{
((IHaveVector3Interferometer)o).ApplyVector3InterferometersBM(x, y, z);
});
parentElement.SaveBM();
Displacement_BM a = new Displacement_BM("Displacement", elementGuid, new List<string>(), parentElement.matchedBM as GameElement_BM,
x, y, z);
MatchingExportElement = a;
}
public Displacement GetOriginDisplacementWithOffset(ref float timeOffset)
{
timeOffset += TimeOffset;
if (targetDisplacement is Displacement disp)
{
return disp;
}
else if (targetDisplacement is DisplacementTracker dispt)
{
return dispt.GetOriginDisplacementWithOffset(ref timeOffset);
}
else
{
throw new Exception("WTF type of tracked displacement.");
}
}
}
public interface ICanBeTracked
{
Vector3 getValue(float time);
(FlexibleReturnType, bool)[] GetCurrentReturnTypes(float time);
}
public interface ICanBeTrackedDisplacement : ICanBeTracked
{
Displacement GetOriginDisplacementWithOffset(ref float timeOffset);
}
}
namespace Beatmap
{
public class DisplacementTracker_BM : AnimationBase_BM, ICanNotInExport
{
public Guid targetDisplacementGuid;
public float timeOffset;
public DisplacementTracker_BM() { }
public DisplacementTracker_BM(string elementName, System.Guid elementGuid, List<string> tags,
GameElement_BM attachedElement, Guid targetDisplacementGuid, float timeOffset)
: base(elementName, elementGuid, tags, attachedElement)
{
this.targetDisplacementGuid = targetDisplacementGuid;
this.timeOffset = timeOffset;
}
public override void ExecuteBM()
{
matchedElement = DisplacementTracker.GenerateElement(elementName, elementGuid, tags, false,
GetElement(attachedElementGuid), GetElement(targetDisplacementGuid) as Displacement, timeOffset);
matchedElement.matchedBM = this;
}
public override GameElement DuplicateBM(GameElement parent)
{
return DisplacementTracker.GenerateElement(elementName, System.Guid.NewGuid(), tags, false, parent,
GetElement(targetDisplacementGuid) as Displacement, timeOffset);
}
public override void AfterExecute()
{
(matchedElement as DisplacementTracker).targetDisplacement = GetElement(targetDisplacementGuid) as ICanBeTrackedDisplacement;
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 6d87960788a4be94e87ff13bb81625cd
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,200 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Beatmap;
using Ichni;
using Ichni.Editor;
using Ichni.RhythmGame;
using Ichni.RhythmGame.Beatmap;
using UnityEngine;
namespace Ichni.RhythmGame
{
public class ScaleTracker : AnimationBase, IBeChangeInExport, IHaveVector3Interferometer, IHaveTimeDurationSubmodule, ICanBeTrackedScale
{
private TransformSubmodule targetTransformSubmodule;
public ICanBeTrackedScale targetScale;
public Vector3 PreviewValue = Vector3.zero;
public float TimeOffset;
public BaseElement_BM MatchingExportElement { get; set; } = null;
public List<InterferometerBase> Interferometers { get; set; } = new();
public static ScaleTracker GenerateElement(string elementName, Guid id,
List<string> tags, bool isFirstGenerated, GameElement animatedObject, ICanBeTrackedScale targetScale, float timeOffset)
{
ScaleTracker tracker = Instantiate(EditorManager.instance.basePrefabs.emptyObject).AddComponent<ScaleTracker>();
tracker.Initialize(elementName, id, tags, isFirstGenerated, animatedObject);
tracker.animatedObject = animatedObject;
tracker.targetScale = targetScale;
tracker.TimeOffset = timeOffset;
tracker.targetTransformSubmodule = (animatedObject as IHaveTransformSubmodule).transformSubmodule;
return tracker;
}
protected override void UpdateAnimation(float songTime)
{
if (targetScale == null)
{
return;
}
var a = GetCurrentReturnTypes(songTime);
var (x, y, z) = (a[0], a[1], a[2]);
if (x.Item1 is FlexibleReturnType.MiddleExecuting ||
y.Item1 is FlexibleReturnType.MiddleExecuting ||
z.Item1 is FlexibleReturnType.MiddleExecuting)
{
animationReturnType = FlexibleReturnType.MiddleExecuting;
ApplyValue(songTime);
}
else if (x.Item2 || y.Item2 || z.Item2)
{
animationReturnType = FlexibleReturnType.MiddleExecuting;
ApplyValue(songTime);
}
else
{
if (!EditorManager.instance.musicPlayer.isPlaying && animationReturnType != FlexibleReturnType.MiddleInterval)
{
ApplyValue(songTime);
}
animationReturnType = FlexibleReturnType.MiddleInterval;
}
}
private void ApplyValue(float time)
{
Vector3 currentScale = targetScale.getValue(time + TimeOffset);
((IHaveVector3Interferometer)this).ApplyVector3Interferometers(ref currentScale);
targetTransformSubmodule.scaleOffset += currentScale;
targetTransformSubmodule.scaleDirtyMark = true;
PreviewValue = currentScale;
}
public (FlexibleReturnType, bool)[] GetCurrentReturnTypes(float time)
{
return targetScale.GetCurrentReturnTypes(time + TimeOffset);
}
public override Vector3 getValue(float time)
{
Vector3 currentScale = targetScale.getValue(time + TimeOffset);
((IHaveVector3Interferometer)this).ApplyVector3Interferometers(ref currentScale);
return currentScale;
}
public override void SetUpInspector()
{
base.SetUpInspector();
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
Inspector inspectorMain = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Enable Control");
var effectSettings = container.GenerateSubcontainer(2);
var connectedGameElementInputField = inspector.GenerateInputField(effectSettings, "Try Get Scale");
var connectGameElementButton = inspector.GenerateButton(this, effectSettings, "Connect Scale", () =>
{
ICanBeTrackedScale targetElement = EditorManager.instance.beatmapContainer.gameElementList.OfType<ICanBeTrackedScale>()
.First(e => ((GameElement)e).elementName == connectedGameElementInputField.GetValue<string>());
if (targetElement == null)
{
LogWindow.Log("Game Element not found.", Color.yellow);
}
targetScale = targetElement;
inspectorMain.SetInspector(this);
});
string ShowConnection() => targetScale == null ? "No Scale Connected" : "Connected With: " + ((GameElement)targetScale).elementName;
var connectHintText = inspector.GenerateHintText(this, effectSettings, ShowConnection);
var InputField = inspector.GenerateInputField(this, effectSettings, "Offset", nameof(TimeOffset));
}
public override void SaveBM()
{
matchedBM = new ScaleTracker_BM(elementName, elementGuid, tags, parentElement.matchedBM as GameElement_BM,
((GameElement)targetScale).elementGuid, TimeOffset);
}
public bool MaybeDeadLoop = true;
public void SaveExportBM()
{
SaveBM();
MatchingExportElement = matchedBM;
float finalTimeOffset = 0;
Scale scale = GetOriginScaleWithOffset(ref finalTimeOffset);
scale.SaveBM();
var x = ((Scale_BM)scale.matchedBM).scaleX.DeepCopyBM();
var y = ((Scale_BM)scale.matchedBM).scaleY.DeepCopyBM();
var z = ((Scale_BM)scale.matchedBM).scaleZ.DeepCopyBM();
x.ApplyTimeOffset(finalTimeOffset); y.ApplyTimeOffset(finalTimeOffset); z.ApplyTimeOffset(finalTimeOffset);
List<ICanBeTrackedScale> ICanBeTrackedScales = new List<ICanBeTrackedScale> { this as ICanBeTrackedScale };
while (MaybeDeadLoop && ICanBeTrackedScales[0] is not Scale)
{
ICanBeTrackedScale ao = (ICanBeTrackedScales[0] as ScaleTracker).targetScale;
ICanBeTrackedScales.Insert(0, ao);
}
ICanBeTrackedScales.ForEach(o =>
{
((IHaveVector3Interferometer)o).ApplyVector3InterferometersBM(x, y, z);
});
parentElement.SaveBM();
Scale_BM a = new Scale_BM("Scale", elementGuid, new List<string>(), parentElement.matchedBM as GameElement_BM,
x, y, z);
MatchingExportElement = a;
}
public Scale GetOriginScaleWithOffset(ref float timeOffset)
{
timeOffset += TimeOffset;
if (targetScale is Scale scale)
{
return scale;
}
else if (targetScale is ScaleTracker scaleTracker)
{
return scaleTracker.GetOriginScaleWithOffset(ref timeOffset);
}
else
{
throw new Exception("WTF type of tracked scale.");
}
}
}
public interface ICanBeTrackedScale : ICanBeTracked
{
Scale GetOriginScaleWithOffset(ref float timeOffset);
}
}
namespace Beatmap
{
public class ScaleTracker_BM : AnimationBase_BM, ICanNotInExport
{
public Guid targetScaleGuid;
public float timeOffset;
public ScaleTracker_BM() { }
public ScaleTracker_BM(string elementName, Guid elementGuid, List<string> tags,
GameElement_BM attachedElement, Guid targetScaleGuid, float timeOffset)
: base(elementName, elementGuid, tags, attachedElement)
{
this.targetScaleGuid = targetScaleGuid;
this.timeOffset = timeOffset;
}
public override void ExecuteBM()
{
matchedElement = ScaleTracker.GenerateElement(elementName, elementGuid, tags, false,
GetElement(attachedElementGuid), GetElement(targetScaleGuid) as ICanBeTrackedScale, timeOffset);
matchedElement.matchedBM = this;
}
public override GameElement DuplicateBM(GameElement parent)
{
return ScaleTracker.GenerateElement(elementName, Guid.NewGuid(), tags, false, parent,
GetElement(targetScaleGuid) as ICanBeTrackedScale, timeOffset);
}
public override void AfterExecute()
{
(matchedElement as ScaleTracker).targetScale = GetElement(targetScaleGuid) as ICanBeTrackedScale;
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 771a58a2b0d89ca4d9440f8463a03ff2
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,200 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Beatmap;
using Ichni;
using Ichni.Editor;
using Ichni.RhythmGame;
using Ichni.RhythmGame.Beatmap;
using UnityEngine;
namespace Ichni.RhythmGame
{
public class SwirlTracker : AnimationBase, IBeChangeInExport, IHaveVector3Interferometer, IHaveTimeDurationSubmodule, ICanBeTrackedSwirl
{
private TransformSubmodule targetTransformSubmodule;
public ICanBeTrackedSwirl targetSwirl;
public Vector3 PreviewValue = Vector3.zero;
public float TimeOffset;
public BaseElement_BM MatchingExportElement { get; set; } = null;
public List<InterferometerBase> Interferometers { get; set; } = new();
public static SwirlTracker GenerateElement(string elementName, Guid id,
List<string> tags, bool isFirstGenerated, GameElement animatedObject, Swirl targetSwirl, float timeOffset)
{
SwirlTracker tracker = Instantiate(EditorManager.instance.basePrefabs.emptyObject).AddComponent<SwirlTracker>();
tracker.Initialize(elementName, id, tags, isFirstGenerated, animatedObject);
tracker.animatedObject = animatedObject;
tracker.targetSwirl = targetSwirl;
tracker.TimeOffset = timeOffset;
tracker.targetTransformSubmodule = (animatedObject as IHaveTransformSubmodule).transformSubmodule;
return tracker;
}
protected override void UpdateAnimation(float songTime)
{
if (targetSwirl == null)
{
return;
}
var a = GetCurrentReturnTypes(songTime);
var (x, y, z) = (a[0], a[1], a[2]);
if (x.Item1 is FlexibleReturnType.MiddleExecuting ||
y.Item1 is FlexibleReturnType.MiddleExecuting ||
z.Item1 is FlexibleReturnType.MiddleExecuting)
{
animationReturnType = FlexibleReturnType.MiddleExecuting;
ApplyValue(songTime);
}
else if (x.Item2 || y.Item2 || z.Item2)
{
animationReturnType = FlexibleReturnType.MiddleExecuting;
ApplyValue(songTime);
}
else
{
if (!EditorManager.instance.musicPlayer.isPlaying && animationReturnType != FlexibleReturnType.MiddleInterval)
{
ApplyValue(songTime);
}
animationReturnType = FlexibleReturnType.MiddleInterval;
}
}
private void ApplyValue(float time)
{
Vector3 currentEulerAngles = targetSwirl.getValue(time + TimeOffset);
((IHaveVector3Interferometer)this).ApplyVector3Interferometers(ref currentEulerAngles);
targetTransformSubmodule.eulerAnglesOffset += currentEulerAngles;
targetTransformSubmodule.eulerAnglesDirtyMark = true;
PreviewValue = currentEulerAngles;
}
public (FlexibleReturnType, bool)[] GetCurrentReturnTypes(float time)
{
return targetSwirl.GetCurrentReturnTypes(time + TimeOffset);
}
public override Vector3 getValue(float time)
{
Vector3 currentEulerAngles = targetSwirl.getValue(time + TimeOffset);
((IHaveVector3Interferometer)this).ApplyVector3Interferometers(ref currentEulerAngles);
return currentEulerAngles;
}
public override void SetUpInspector()
{
base.SetUpInspector();
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
Inspector inspectorMain = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Enable Control");
var effectSettings = container.GenerateSubcontainer(2);
var connectedGameElementInputField = inspector.GenerateInputField(effectSettings, "Try Get Swirl");
var connectGameElementButton = inspector.GenerateButton(this, effectSettings, "Connect Swirl", () =>
{
ICanBeTrackedSwirl targetElement = EditorManager.instance.beatmapContainer.gameElementList.OfType<ICanBeTrackedSwirl>()
.First(e => ((GameElement)e).elementName == connectedGameElementInputField.GetValue<string>());
if (targetElement == null)
{
LogWindow.Log("Game Element not found.", Color.yellow);
}
targetSwirl = targetElement;
inspectorMain.SetInspector(this);
});
string ShowConnection() => targetSwirl == null ? "No Swirl Connected" : "Connected With: " + ((GameElement)targetSwirl).elementName;
var connectHintText = inspector.GenerateHintText(this, effectSettings, ShowConnection);
var InputField = inspector.GenerateInputField(this, effectSettings, "Offset", nameof(TimeOffset));
}
public override void SaveBM()
{
matchedBM = new SwirlTracker_BM(elementName, elementGuid, tags, parentElement.matchedBM as GameElement_BM,
((GameElement)targetSwirl).elementGuid, TimeOffset);
}
public bool MaybeDeadLoop = true;
public void SaveExportBM()
{
SaveBM();
MatchingExportElement = matchedBM;
float finalTimeOffset = 0;
Swirl swirl = GetOriginSwirlWithOffset(ref finalTimeOffset);
swirl.SaveBM();
var x = ((Swirl_BM)swirl.matchedBM).eulerAngleX.DeepCopyBM();
var y = ((Swirl_BM)swirl.matchedBM).eulerAngleY.DeepCopyBM();
var z = ((Swirl_BM)swirl.matchedBM).eulerAngleZ.DeepCopyBM();
x.ApplyTimeOffset(finalTimeOffset); y.ApplyTimeOffset(finalTimeOffset); z.ApplyTimeOffset(finalTimeOffset);
List<ICanBeTrackedSwirl> ICanBeTrackedSwirls = new List<ICanBeTrackedSwirl> { this as ICanBeTrackedSwirl };
while (MaybeDeadLoop && ICanBeTrackedSwirls[0] is not Swirl)
{
ICanBeTrackedSwirl ao = (ICanBeTrackedSwirls[0] as SwirlTracker).targetSwirl;
ICanBeTrackedSwirls.Insert(0, ao);
}
ICanBeTrackedSwirls.ForEach(o =>
{
((IHaveVector3Interferometer)o).ApplyVector3InterferometersBM(x, y, z);
});
parentElement.SaveBM();
Swirl_BM a = new Swirl_BM("Swirl", elementGuid, new List<string>(), parentElement.matchedBM as GameElement_BM,
x, y, z);
MatchingExportElement = a;
}
public Swirl GetOriginSwirlWithOffset(ref float timeOffset)
{
timeOffset += TimeOffset;
if (targetSwirl is Swirl swirl)
{
return swirl;
}
else if (targetSwirl is SwirlTracker swirlTracker)
{
return swirlTracker.GetOriginSwirlWithOffset(ref timeOffset);
}
else
{
throw new Exception("WTF type of tracked swirl.");
}
}
}
public interface ICanBeTrackedSwirl : ICanBeTracked
{
Swirl GetOriginSwirlWithOffset(ref float timeOffset);
}
}
namespace Beatmap
{
public class SwirlTracker_BM : AnimationBase_BM, ICanNotInExport
{
public Guid targetSwirlGuid;
public float timeOffset;
public SwirlTracker_BM() { }
public SwirlTracker_BM(string elementName, Guid elementGuid, List<string> tags,
GameElement_BM attachedElement, Guid targetSwirlGuid, float timeOffset)
: base(elementName, elementGuid, tags, attachedElement)
{
this.targetSwirlGuid = targetSwirlGuid;
this.timeOffset = timeOffset;
}
public override void ExecuteBM()
{
matchedElement = SwirlTracker.GenerateElement(elementName, elementGuid, tags, false,
GetElement(attachedElementGuid), GetElement(targetSwirlGuid) as Swirl, timeOffset);
matchedElement.matchedBM = this;
}
public override GameElement DuplicateBM(GameElement parent)
{
return SwirlTracker.GenerateElement(elementName, Guid.NewGuid(), tags, false, parent,
GetElement(targetSwirlGuid) as Swirl, timeOffset);
}
public override void AfterExecute()
{
(matchedElement as SwirlTracker).targetSwirl = GetElement(targetSwirlGuid) as ICanBeTrackedSwirl;
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: fa441a41a13cc794cb909abea76cd7a1
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -12,11 +12,13 @@ using UnityEngine;
namespace Ichni.RhythmGame
{
public partial class Displacement : AnimationBase
public partial class Displacement : AnimationBase, IHaveVector3Interferometer, ICanBeTrackedDisplacement
{
private TransformSubmodule targetTransformSubmodule;
public FlexibleFloat positionX, positionY, positionZ;
public List<InterferometerBase> Interferometers { get; set; } = new List<InterferometerBase>();
public Vector3 PreviewValue = Vector3.zero;
public static Displacement GenerateElement(string elementName, Guid id,
List<string> tags, bool isFirstGenerated, GameElement animatedObject,
FlexibleFloat positionX, FlexibleFloat positionY, FlexibleFloat positionZ)
@@ -33,7 +35,6 @@ namespace Ichni.RhythmGame
displacement.animationReturnType = FlexibleReturnType.Before;
displacement.targetTransformSubmodule = (animatedObject as IHaveTransformSubmodule).transformSubmodule;
//displacement.timeDurationSubmodule.SetDuration(positionX, positionY, positionZ);
return displacement;
@@ -50,36 +51,43 @@ namespace Ichni.RhythmGame
positionZ.returnType is FlexibleReturnType.MiddleExecuting)
{
animationReturnType = FlexibleReturnType.MiddleExecuting;
Vector3 currentPosition = new Vector3(positionX.value, positionY.value, positionZ.value);
targetTransformSubmodule.positionOffset += currentPosition;
targetTransformSubmodule.positionDirtyMark = true;
ApplyValue();
}
else if (positionX.isSwitchingReturnType || positionY.isSwitchingReturnType || positionZ.isSwitchingReturnType)
{
animationReturnType = FlexibleReturnType.MiddleExecuting;
Vector3 currentPosition = new Vector3(positionX.value, positionY.value, positionZ.value);
targetTransformSubmodule.positionOffset += currentPosition;
targetTransformSubmodule.positionDirtyMark = true;
ApplyValue();
}
else
{
if (!EditorManager.instance.musicPlayer.isPlaying && animationReturnType != FlexibleReturnType.MiddleInterval)
{
Vector3 currentPosition = new Vector3(positionX.value, positionY.value, positionZ.value);
targetTransformSubmodule.positionOffset += currentPosition;
targetTransformSubmodule.positionDirtyMark = true;
ApplyValue();
}
animationReturnType = FlexibleReturnType.MiddleInterval;
}
}
private void ApplyValue()
{
Vector3 currentPosition = new Vector3(positionX.value, positionY.value, positionZ.value);
// 用接口强制调用默认实现
((IHaveVector3Interferometer)this).ApplyVector3Interferometers(ref currentPosition);
targetTransformSubmodule.positionOffset += currentPosition;
targetTransformSubmodule.positionDirtyMark = true;
PreviewValue = currentPosition;
}
public override Vector3 getValue(float time)
{
float x = positionX.GetValue(time);
float y = positionY.GetValue(time);
float z = positionZ.GetValue(time);
return new Vector3(x, y, z);
Vector3 currentPosition = new Vector3(x, y, z);
((IHaveVector3Interferometer)this).ApplyVector3Interferometers(ref currentPosition);
return currentPosition;
}
public override void ApplyTimeOffset(float offset)
{
base.ApplyTimeOffset(offset);
@@ -87,6 +95,21 @@ namespace Ichni.RhythmGame
positionY.animations.ForEach(anim => anim.ApplyTimeOffset(offset));
positionZ.animations.ForEach(anim => anim.ApplyTimeOffset(offset));
}
public (FlexibleReturnType, bool)[] GetCurrentReturnTypes(float time)
{
(FlexibleReturnType, bool) x = positionX.getReturnType(time);
(FlexibleReturnType, bool) y = positionY.getReturnType(time);
(FlexibleReturnType, bool) z = positionZ.getReturnType(time);
return new (FlexibleReturnType, bool)[] { x, y, z };
}
public Displacement GetOriginDisplacementWithOffset(ref float timeOffset)
{
return this;
}
public BaseElement_BM MatchingExportElement { get; set; }
}
public partial class Displacement
@@ -120,6 +143,24 @@ namespace Ichni.RhythmGame
inspector.GenerateGraphicalFlexibleFloatWindow(this, "Displacement",
new FlexibleFloat[] { positionX, positionY, positionZ }, new string[] { "PosX", "PosY", "PosZ" });
});
var subcontainer2 = container.GenerateSubcontainer(1);
var valuetext = inspector.GenerateParameterText(this, subcontainer2, "value:", nameof(PreviewValue), true);
var interferometerButton = inspector.GenerateButton(this, subcontainer2, "Interferometer", () =>
{
Vector3Interferometer.GenerateElement("New Vector3 Interferometer", Guid.NewGuid(), new List<string>(), true,
this, InterferomType.Additive, Vector3.zero);
});
}
public void SaveExportBM()
{
SaveBM();
MatchingExportElement = matchedBM;
((IHaveVector3Interferometer)this).ApplyVector3InterferometersBM(
(MatchingExportElement as Beatmap.Displacement_BM).positionX,
(MatchingExportElement as Beatmap.Displacement_BM).positionY,
(MatchingExportElement as Beatmap.Displacement_BM).positionZ);
}
}

View File

@@ -7,11 +7,18 @@ using UnityEngine;
namespace Ichni.RhythmGame
{
public partial class Scale : AnimationBase
public partial class Scale : AnimationBase, IHaveVector3Interferometer, IBeChangeInExport, ICanBeTrackedScale
{
public TransformSubmodule targetTransformSubmodule;
public FlexibleFloat scaleX, scaleY, scaleZ;
public List<InterferometerBase> Interferometers { get; set; } = new List<InterferometerBase>();
public BaseElement_BM MatchingExportElement { get; set; }
public Vector3 PreviewValue = Vector3.zero;
public static Scale GenerateElement(string elementName, Guid id,
List<string> tags, bool isFirstGenerated, GameElement animatedObject,
FlexibleFloat scaleX, FlexibleFloat scaleY, FlexibleFloat scaleZ)
@@ -50,29 +57,33 @@ namespace Ichni.RhythmGame
scaleZ.returnType is FlexibleReturnType.MiddleExecuting)
{
animationReturnType = FlexibleReturnType.MiddleExecuting;
Vector3 currentScale = new Vector3(scaleX.value, scaleY.value, scaleZ.value);
targetTransformSubmodule.scaleOffset += currentScale;
targetTransformSubmodule.scaleDirtyMark = true;
ApplyValue();
}
else if (scaleX.isSwitchingReturnType || scaleY.isSwitchingReturnType || scaleZ.isSwitchingReturnType)
{
animationReturnType = FlexibleReturnType.MiddleExecuting;
Vector3 currentScale = new Vector3(scaleX.value, scaleY.value, scaleZ.value);
targetTransformSubmodule.scaleOffset += currentScale;
targetTransformSubmodule.scaleDirtyMark = true;
ApplyValue();
}
else
{
if (!EditorManager.instance.musicPlayer.isPlaying && animationReturnType != FlexibleReturnType.MiddleInterval)
{
Vector3 currentScale = new Vector3(scaleX.value, scaleY.value, scaleZ.value);
targetTransformSubmodule.scaleOffset += currentScale;
targetTransformSubmodule.scaleDirtyMark = true;
ApplyValue();
}
animationReturnType = FlexibleReturnType.MiddleInterval;
}
}
private void ApplyValue()
{
Vector3 currentScale = new Vector3(scaleX.value, scaleY.value, scaleZ.value);
// 用接口强制调用默认实现
((IHaveVector3Interferometer)this).ApplyVector3Interferometers(ref currentScale);
targetTransformSubmodule.scaleOffset += currentScale;
targetTransformSubmodule.scaleDirtyMark = true;
PreviewValue = currentScale;
}
public override Vector3 getValue(float time)
{
float x = scaleX.GetValue(time);
@@ -80,6 +91,26 @@ namespace Ichni.RhythmGame
float z = scaleZ.GetValue(time);
return new Vector3(x, y, z);
}
public override FlexibleReturnType getReturnType(float time)
{
(FlexibleReturnType, bool) x = scaleX.getReturnType(time);
(FlexibleReturnType, bool) y = scaleY.getReturnType(time);
(FlexibleReturnType, bool) z = scaleZ.getReturnType(time);
if (x.Item1 is FlexibleReturnType.MiddleExecuting ||
y.Item1 is FlexibleReturnType.MiddleExecuting ||
z.Item1 is FlexibleReturnType.MiddleExecuting)
{
return FlexibleReturnType.MiddleExecuting;
}
else if (x.Item2 || x.Item2 || x.Item2)
{
return FlexibleReturnType.MiddleExecuting;
}
else
{
return FlexibleReturnType.MiddleInterval;
}
}
public override void ApplyTimeOffset(float offset)
{
base.ApplyTimeOffset(offset);
@@ -87,6 +118,18 @@ namespace Ichni.RhythmGame
scaleY.animations.ForEach(anim => anim.ApplyTimeOffset(offset));
scaleZ.animations.ForEach(anim => anim.ApplyTimeOffset(offset));
}
public (FlexibleReturnType, bool)[] GetCurrentReturnTypes(float time)
{
(FlexibleReturnType, bool) x = scaleX.getReturnType(time);
(FlexibleReturnType, bool) y = scaleY.getReturnType(time);
(FlexibleReturnType, bool) z = scaleZ.getReturnType(time);
return new (FlexibleReturnType, bool)[] { x, y, z };
}
public Scale GetOriginScaleWithOffset(ref float timeOffset)
{
return this;
}
}
public partial class Scale
@@ -96,6 +139,15 @@ namespace Ichni.RhythmGame
matchedBM = new Scale_BM(elementName, elementGuid, tags, parentElement.matchedBM as GameElement_BM,
scaleX.ConvertToBM(), scaleY.ConvertToBM(), scaleZ.ConvertToBM());
}
public void SaveExportBM()
{
SaveBM();
MatchingExportElement = matchedBM;
((IHaveVector3Interferometer)this).ApplyVector3InterferometersBM(
(MatchingExportElement as Scale_BM).scaleX,
(MatchingExportElement as Scale_BM).scaleY,
(MatchingExportElement as Scale_BM).scaleZ);
}
public override void SetUpInspector()
{
@@ -121,6 +173,14 @@ namespace Ichni.RhythmGame
new FlexibleFloat[] { scaleX, scaleY, scaleZ },
new string[] { "ScaleX", "ScaleY", "ScaleZ" });
});
var subcontainer2 = container.GenerateSubcontainer(1);
var valuetext = inspector.GenerateParameterText(this, subcontainer2, "value:", nameof(PreviewValue), true);
var interferometerButton = inspector.GenerateButton(this, subcontainer2, "Interferometer", () =>
{
Vector3Interferometer.GenerateElement("New Vector3 Interferometer", Guid.NewGuid(), new List<string>(), true,
this, InterferomType.Additive, Vector3.zero);
});
}
}

View File

@@ -8,10 +8,15 @@ using UnityEngine;
namespace Ichni.RhythmGame
{
public partial class Swirl : AnimationBase
public partial class Swirl : AnimationBase, IHaveVector3Interferometer, IBeChangeInExport, ICanBeTrackedSwirl
{
private TransformSubmodule targetTransformSubmodule;
public FlexibleFloat eulerAngleX, eulerAngleY, eulerAngleZ;
public List<InterferometerBase> Interferometers { get; set; } = new List<InterferometerBase>();
public Vector3 PreviewValue = Vector3.zero;
public BaseElement_BM MatchingExportElement { get; set; }
public static Swirl GenerateElement(string elementName, Guid id,
List<string> tags, bool isFirstGenerated, GameElement animatedObject,
@@ -49,29 +54,33 @@ namespace Ichni.RhythmGame
eulerAngleZ.returnType is FlexibleReturnType.MiddleExecuting)
{
animationReturnType = FlexibleReturnType.MiddleExecuting;
Vector3 currentEulerAngles = new Vector3(eulerAngleX.value, eulerAngleY.value, eulerAngleZ.value);
targetTransformSubmodule.eulerAnglesOffset += currentEulerAngles;
targetTransformSubmodule.eulerAnglesDirtyMark = true;
ApplyValue();
}
else if (eulerAngleX.isSwitchingReturnType || eulerAngleY.isSwitchingReturnType || eulerAngleZ.isSwitchingReturnType)
{
animationReturnType = FlexibleReturnType.MiddleExecuting;
Vector3 currentEulerAngles = new Vector3(eulerAngleX.value, eulerAngleY.value, eulerAngleZ.value);
targetTransformSubmodule.eulerAnglesOffset += currentEulerAngles;
targetTransformSubmodule.eulerAnglesDirtyMark = true;
ApplyValue();
}
else
{
if (!EditorManager.instance.musicPlayer.isPlaying && animationReturnType != FlexibleReturnType.MiddleInterval)
{
Vector3 currentRotation = new Vector3(eulerAngleX.value, eulerAngleY.value, eulerAngleZ.value);
targetTransformSubmodule.eulerAnglesOffset += currentRotation;
targetTransformSubmodule.eulerAnglesDirtyMark = true;
ApplyValue();
}
animationReturnType = FlexibleReturnType.MiddleInterval;
}
}
private void ApplyValue()
{
Vector3 currentEulerAngles = new Vector3(eulerAngleX.value, eulerAngleY.value, eulerAngleZ.value);
// 用接口强制调用默认实现
((IHaveVector3Interferometer)this).ApplyVector3Interferometers(ref currentEulerAngles);
targetTransformSubmodule.eulerAnglesOffset += currentEulerAngles;
targetTransformSubmodule.eulerAnglesDirtyMark = true;
PreviewValue = currentEulerAngles;
}
public override Vector3 getValue(float time)
{
float x = eulerAngleX.GetValue(time);
@@ -79,6 +88,26 @@ namespace Ichni.RhythmGame
float z = eulerAngleZ.GetValue(time);
return new Vector3(x, y, z);
}
public override FlexibleReturnType getReturnType(float time)
{
(FlexibleReturnType, bool) x = eulerAngleX.getReturnType(time);
(FlexibleReturnType, bool) y = eulerAngleY.getReturnType(time);
(FlexibleReturnType, bool) z = eulerAngleZ.getReturnType(time);
if (x.Item1 is FlexibleReturnType.MiddleExecuting ||
y.Item1 is FlexibleReturnType.MiddleExecuting ||
z.Item1 is FlexibleReturnType.MiddleExecuting)
{
return FlexibleReturnType.MiddleExecuting;
}
else if (x.Item2 || x.Item2 || x.Item2)
{
return FlexibleReturnType.MiddleExecuting;
}
else
{
return FlexibleReturnType.MiddleInterval;
}
}
public override void ApplyTimeOffset(float offset)
{
base.ApplyTimeOffset(offset);
@@ -86,6 +115,19 @@ namespace Ichni.RhythmGame
eulerAngleY.animations.ForEach(anim => anim.ApplyTimeOffset(offset));
eulerAngleZ.animations.ForEach(anim => anim.ApplyTimeOffset(offset));
}
public (FlexibleReturnType, bool)[] GetCurrentReturnTypes(float time)
{
(FlexibleReturnType, bool) x = eulerAngleX.getReturnType(time);
(FlexibleReturnType, bool) y = eulerAngleY.getReturnType(time);
(FlexibleReturnType, bool) z = eulerAngleZ.getReturnType(time);
return new (FlexibleReturnType, bool)[] { x, y, z };
}
public Swirl GetOriginSwirlWithOffset(ref float timeOffset)
{
return this;
}
}
public partial class Swirl
@@ -96,6 +138,16 @@ namespace Ichni.RhythmGame
eulerAngleX.ConvertToBM(), eulerAngleY.ConvertToBM(), eulerAngleZ.ConvertToBM());
}
public void SaveExportBM()
{
SaveBM();
MatchingExportElement = matchedBM;
((IHaveVector3Interferometer)this).ApplyVector3InterferometersBM(
(MatchingExportElement as Swirl_BM).eulerAngleX,
(MatchingExportElement as Swirl_BM).eulerAngleY,
(MatchingExportElement as Swirl_BM).eulerAngleZ);
}
public override void SetUpInspector()
{
base.SetUpInspector();
@@ -121,6 +173,14 @@ namespace Ichni.RhythmGame
new FlexibleFloat[] { eulerAngleX, eulerAngleY, eulerAngleZ },
new string[] { "EulerX", "EulerY", "EulerZ" });
});
var subcontainer2 = container.GenerateSubcontainer(1);
var valuetext = inspector.GenerateParameterText(this, subcontainer2, "value:", nameof(PreviewValue), true);
var interferometerButton = inspector.GenerateButton(this, subcontainer2, "Interferometer", () =>
{
Vector3Interferometer.GenerateElement("New Vector3 Interferometer", Guid.NewGuid(), new List<string>(), true,
this, InterferomType.Additive, Vector3.zero);
});
}
}

View File

@@ -53,11 +53,16 @@ namespace Ichni.RhythmGame
public FlexibleReturnType lastReturnType;
public FlexibleReturnType returnType;
public FlexibleFloat()
public FlexibleFloat(bool withFirstAnimation = false)
{
animations = new List<AnimatedFloat>();
if (withFirstAnimation)
{
animations.Add(new AnimatedFloat(0f, 1f, 0f, 0f, AnimationCurveType.Linear));
}
}
public FlexibleFloat(List<AnimatedFloat> anim)
{
animations = anim;
@@ -198,9 +203,18 @@ namespace Ichni.RhythmGame
{
UpdateFlexibleFloat(songtime);
float a = value;
UpdateFlexibleFloat(EditorManager.instance.songInformation.songTime);
return a;
}
public (FlexibleReturnType, bool) getReturnType(float Songtime)
{
UpdateFlexibleFloat(Songtime);
return (returnType, isSwitchingReturnType);
}
public (FlexibleReturnType, bool, float) GetReturnTypeAndValue(float songtime)
{
UpdateFlexibleFloat(songtime);
return (returnType, isSwitchingReturnType, value);
}
/// <summary>
/// 转换为Beatmap存档类型
/// </summary>
@@ -216,6 +230,14 @@ namespace Ichni.RhythmGame
return flexibleFloat_BM;
}
public void ApplyTimeOffset(float OffsetTime)
{
animations.ForEach(i =>
{
i.ApplyTimeOffset(OffsetTime);
});
}
}
namespace Beatmap
@@ -259,6 +281,26 @@ namespace Ichni.RhythmGame
return flexibleFloat;
}
public FlexibleFloat_BM DeepCopyBM()
{
FlexibleFloat_BM copy = new FlexibleFloat_BM();
foreach (AnimatedFloat animatedFloat in animatedFloatList)
{
copy.animatedFloatList.Add(new AnimatedFloat(
animatedFloat.startTime, animatedFloat.endTime,
animatedFloat.startValue, animatedFloat.endValue,
animatedFloat.animationCurveType));
}
return copy;
}
public void ApplyTimeOffset(float OffsetTime)
{
animatedFloatList.ForEach(i =>
{
i.ApplyTimeOffset(OffsetTime);
});
}
}
}
}

View File

@@ -2,6 +2,7 @@ using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Beatmap;
using Ichni.RhythmGame.Beatmap;
using UniRx;
using UnityEngine;
@@ -9,7 +10,7 @@ using UnityEngine.Events;
namespace Ichni.RhythmGame
{
public class BeatmapContainer : IBaseElement
public class BeatmapContainer : IBaseElement, IBeChangeInExport
{
public List<GameElement> gameElementList;
@@ -17,6 +18,7 @@ namespace Ichni.RhythmGame
public List<UnityAction> lowPriorityActions;
public BaseElement_BM matchedBM { get; set; }
public BaseElement_BM MatchingExportElement { get; set; }
public BeatmapContainer()
{
@@ -72,6 +74,15 @@ namespace Ichni.RhythmGame
}
public void SaveExportBM()
{
MatchingExportElement = new BeatmapContainer_BM(gameElementList, true);
if (((BeatmapContainer_BM)MatchingExportElement).elementList.Any(i => i is ICanNotInExport))
{
Debug.LogError("Export Error!");
}
}
}
namespace Beatmap
@@ -86,7 +97,7 @@ namespace Ichni.RhythmGame
}
public BeatmapContainer_BM(List<GameElement> gameElementList)
public BeatmapContainer_BM(List<GameElement> gameElementList, bool forExport = false)
{
elementList = new List<BaseElement_BM>();
@@ -95,18 +106,39 @@ namespace Ichni.RhythmGame
e.SaveBM();
e.submoduleList.RemoveAll(s => s == null);
e.submoduleList.ForEach(s => s.SaveBM());
if (forExport && e is IBeChangeInExport changeInExport)
{
changeInExport.SaveExportBM();
}
});
foreach (var gameElement in gameElementList)
{
if (gameElement.matchedBM != null)
{
elementList.Add(gameElement.matchedBM);
}
if (forExport && gameElement is IBeChangeInExport changeInExport)
{
if (changeInExport.MatchingExportElement != null)
{
elementList.Add(changeInExport.MatchingExportElement);
List<BaseElement_BM> submodules = gameElement.submoduleList.ConvertAll(s => s.matchedBM);
submodules.RemoveAll(s => s == null);
submodules.ForEach(e => { e.attachedElementGuid = ((GameElement_BM)changeInExport.MatchingExportElement).elementGuid; });
elementList.AddRange(submodules);
}
}
else
{
elementList.Add(gameElement.matchedBM);
List<BaseElement_BM> submodules = gameElement.submoduleList.ConvertAll(s => s.matchedBM);
submodules.RemoveAll(s => s == null);
elementList.AddRange(submodules);
}
List<BaseElement_BM> submodules = gameElement.submoduleList.ConvertAll(s => s.matchedBM);
submodules.RemoveAll(s => s == null);
elementList.AddRange(submodules);
}
}
}

View File

@@ -74,7 +74,10 @@ namespace Ichni.RhythmGame
var generateAnimation = container.GenerateSubcontainer(3);
var fovAnimationButton = inspector.GenerateButton(this, generateAnimation, "Field of View",
() => CameraFieldOfView.GenerateElement("New Field of View", Guid.NewGuid(),
new List<string>(), true, this, new FlexibleFloat()));
new List<string>(), true, this, new FlexibleFloat(new List<AnimatedFloat>
{
new AnimatedFloat(0f, 1f, 60f, 60f, AnimationCurveType.Linear)
})));
var extensionButton = inspector.GenerateButton(this, generateAnimation, "Extension",
() => GameCameraExtension.GenerateElement("New Extension", Guid.NewGuid(),
new List<string>(), true, this, 1000f));

View File

@@ -130,7 +130,7 @@ namespace Ichni.RhythmGame
StandardInspectionElement.GenerateForTransform(this, container);
var generateBaseColorChangeButton = inspector.GenerateButton(this, generateAnimation, "Base Color Change",
() => BaseColorChange.GenerateElement("New Base Color Change", Guid.NewGuid(), new List<string>(), true,
this, new FlexibleFloat(), new FlexibleFloat(), new FlexibleFloat(), new FlexibleFloat()));
this, new FlexibleFloat(true), new FlexibleFloat(true), new FlexibleFloat(true), new FlexibleFloat(true)));
}
}

View File

@@ -189,7 +189,7 @@ namespace Ichni.RhythmGame
StandardInspectionElement.GenerateForTransform(this, generateContainer); //关于有Transform的元素
inspector.GenerateButton(this, particleSubcontainer, "Track Global Color Change",
() => { TrackGlobalColorChange.GenerateElement("New Track Global Color Change", Guid.NewGuid(), new List<string>(), true, this, new FlexibleFloat(), new FlexibleFloat(), new FlexibleFloat(), new FlexibleFloat()); }); //变量容器
() => { TrackGlobalColorChange.GenerateElement("New Track Global Color Change", Guid.NewGuid(), new List<string>(), true, this, new FlexibleFloat(true), new FlexibleFloat(true), new FlexibleFloat(true), new FlexibleFloat(true)); }); //变量容器
// var animationSubcontainer = generateContainer.GenerateSubcontainer(3);
// var displacementButton = inspector.GenerateButton(this, animationSubcontainer, "Displacement", () =>

View File

@@ -94,8 +94,8 @@ namespace Ichni
private void ExportBeatMap(string exportPath)
{
EditorManager.instance.beatmapContainer.SaveBM();
ES3.Save("Beatmap", EditorManager.instance.beatmapContainer.matchedBM as BeatmapContainer_BM,
EditorManager.instance.beatmapContainer.SaveExportBM();
ES3.Save("Beatmap", EditorManager.instance.beatmapContainer.MatchingExportElement as BeatmapContainer_BM,
exportPath, ProjectManager.ExportSettings);
}

View File

@@ -56,10 +56,15 @@ namespace Ichni
{
AssetBundle.UnloadAllAssetBundles(true);
loadedThemeBundleList.Clear();
LogWindow = StartMenuManager.instance.startPage.logText;
if (InformationTransistor.instance.isRecovery)
{
LogWindow.text += "Recovery Mode.\n";
LogWindow.color = Color.red;
}
LogWindow.text += "Loading ThemeBundles, Please wait...\n";
waitingBundleAmount = new IntReactiveProperty(list.Count);
Debug.Log("Waiting for " + list.Count + " AssetBundles to load.");
LogWindow.text += "Waiting for " + list.Count + " AssetBundles to load.\n";
@@ -120,7 +125,7 @@ namespace Ichni
AssetBundle bundle = AssetBundle.LoadFromFile(uri);
Object[] ob = bundle.LoadAllAssets<Object>();
loadedThemeBundleList.Add(new ThemeBundle(themeBundleName));
for (int i = 0; i < ob.Length; i++)
{
if (ob[i].GetType() == typeof(GameObject))

View File

@@ -4,6 +4,7 @@ using Ichni.RhythmGame.Beatmap;
using TMPro;
using UniRx;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
@@ -33,6 +34,10 @@ namespace Ichni.StartMenu
InformationTransistor.instance.isLoadedProject = true;
InformationTransistor.instance.loadedProjectName = projectName;
InformationTransistor.instance.isRecovery = isRecovery;
if (Keyboard.current.sKey.isPressed && Keyboard.current.lKey.isPressed)
{
InformationTransistor.instance.isRecovery = true;
}
string projectPath = Application.streamingAssetsPath + "/Projects/" + projectName;
InformationTransistor.instance.projectInfo_BM = ES3.Load<ProjectInformation_BM>("ProjectInformation", projectPath + "/ProjectInfo.json");

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 99e8bcadcf29feb46b2d7edd529e16fe
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 6f99efda09a3e9a4f9deaff6736034b0
guid: 1db26db29f28f3f4996e492b8158e611
DefaultImporter:
externalObjects: {}
userData:

Binary file not shown.

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: a06baf8cae5347b438ae94261f0525f4
guid: 24782b8b45c659c4d9d02229b5b19372
DefaultImporter:
externalObjects: {}
userData:

Binary file not shown.

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 07d349221d0c50c448b75f0f3f9c6260
guid: 80b556a28f0729f428527c6f46378b95
DefaultImporter:
externalObjects: {}
userData:

View File

@@ -0,0 +1 @@
о╒HЪzЩмЮWяз4▌ ≥B"5}[Y┐О>T~WZЙхы╣ШеKз> ┌kд4+И8Г╨LH`шk-⌡-l·┼р╒e\^┴╤Дбb╒JfН┴╟yдP┬Qд║eнs@═■FYY/T,mSэ

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 02925c6c6666052489200cc3fd84b49a
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@@ -5,8 +5,8 @@
"projectName" : "1",
"creatorName" : "1",
"editorVersion" : "0.1.0",
"createTime" : "2025\/9\/13 18:58:54",
"lastSaveTime" : "2025\/9\/13 18:58:54",
"createTime" : "2025\/11\/1 22:15:17",
"lastSaveTime" : "2025\/11\/1 22:15:17",
"selectedThemeBundleList" : [
"basic"
],

View File

@@ -2,8 +2,8 @@
"SongInformation" : {
"__type" : "Ichni.RhythmGame.Beatmap.SongInformation_BM,Assembly-CSharp",
"value" : {
"songName" : "OERA - register@fantobia.wav",
"bpm" : 120,
"songName" : "Your Shadow (1).wav",
"bpm" : 100,
"delay" : 0,
"offset" : 0,
"attachedElementGuid" : {

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: d4ec2022c82788447a56cff9cfc8003b
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@@ -1,13 +0,0 @@
{
"CommandScripts" : {
"__type" : "Ichni.RhythmGame.Beatmap.CommandScripts_BM,Assembly-CSharp",
"value" : {
"commandList" : [
],
"attachedElementGuid" : {
"value" : "00000000-0000-0000-0000-000000000000"
}
}
}
}

View File

@@ -1,18 +0,0 @@
{
"ProjectInformation" : {
"__type" : "Ichni.RhythmGame.Beatmap.ProjectInformation_BM,Assembly-CSharp",
"value" : {
"projectName" : "Solitudes SP",
"creatorName" : "TRADER",
"editorVersion" : "0.1.0",
"createTime" : "2025\/10\/18 20:34:07",
"lastSaveTime" : "2025\/10\/18 20:34:07",
"selectedThemeBundleList" : [
"basic","departure_to_multiverse"
],
"attachedElementGuid" : {
"value" : "00000000-0000-0000-0000-000000000000"
}
}
}
}

View File

@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 46b458474db32b44e95aef1050b88adc
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,14 +0,0 @@
{
"SongInformation" : {
"__type" : "Ichni.RhythmGame.Beatmap.SongInformation_BM,Assembly-CSharp",
"value" : {
"songName" : "Solitudes.mp3",
"bpm" : 200,
"delay" : 0,
"offset" : 0,
"attachedElementGuid" : {
"value" : "00000000-0000-0000-0000-000000000000"
}
}
}
}

View File

@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 7f58bf294f7b1c44bb4efff5344adfc7
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant: