修改track复制步进和撤销模式

Signed-off-by: TRADER_FOER <lhf190@outlook.com>
This commit is contained in:
2026-07-10 14:05:45 +08:00
parent fdc20cd66f
commit a835e8321b
30 changed files with 1501 additions and 367 deletions

View File

@@ -49,10 +49,10 @@ MonoBehaviour:
m_addressable:
m_atlas:
m_fileSize: 28008
m_assetChangeTS: 1783188822
m_fileInfoReadTS: 1783188909
m_fileWriteTS: 1783188822
m_cachefileWriteTS: 1783188822
m_assetChangeTS: 1783610837
m_fileInfoReadTS: 1783610909
m_fileWriteTS: 1783610837
m_cachefileWriteTS: 1783610837
refreshStamp: 2
UseGUIDsList:
- guid: cd62869af1bc6534d83427c72b66bb9f
@@ -193,10 +193,10 @@ MonoBehaviour:
m_addressable:
m_atlas:
m_fileSize: 2641
m_assetChangeTS: 1783188822
m_fileInfoReadTS: 1783188909
m_fileWriteTS: 1783188822
m_cachefileWriteTS: 1783188822
m_assetChangeTS: 1783610837
m_fileInfoReadTS: 1783610909
m_fileWriteTS: 1783610837
m_cachefileWriteTS: 1783610837
refreshStamp: 2
UseGUIDsList:
- guid: 0000000000000000f000000000000000
@@ -5699,15 +5699,15 @@ MonoBehaviour:
UseGUIDsList: []
- guid: 5037ef52545d81a4db6b8f6787fb1d06
type: 2
m_fileInfoHash: 1557.cs
m_fileInfoHash: 1622.cs
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 1557
m_assetChangeTS: 0
m_fileInfoReadTS: 1783088720
m_fileWriteTS: 1780686680
m_cachefileWriteTS: 1780686680
m_fileSize: 1622
m_assetChangeTS: 1783662864
m_fileInfoReadTS: 1783662889
m_fileWriteTS: 1783662667
m_cachefileWriteTS: 1783662667
refreshStamp: 2
UseGUIDsList: []
- guid: 5057a30c9a654e0bb16bd234bf770359
@@ -13299,10 +13299,10 @@ MonoBehaviour:
m_addressable:
m_atlas:
m_fileSize: 4590
m_assetChangeTS: 1783609901
m_fileInfoReadTS: 1783609902
m_fileWriteTS: 1783609901
m_cachefileWriteTS: 1783609901
m_assetChangeTS: 1783610836
m_fileInfoReadTS: 1783610909
m_fileWriteTS: 1783610836
m_cachefileWriteTS: 1783610836
refreshStamp: 2
UseGUIDsList:
- guid: bf2edee5c58d82540a51f03df9d42094
@@ -28229,15 +28229,15 @@ MonoBehaviour:
UseGUIDsList: []
- guid: 914dd73ddae7943148ea71537167542b
type: 2
m_fileInfoHash: 15588.cs
m_fileInfoHash: 15838.cs
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 15588
m_assetChangeTS: 0
m_fileInfoReadTS: 1783088713
m_fileWriteTS: 1781390586
m_cachefileWriteTS: 1781390586
m_fileSize: 15838
m_assetChangeTS: 1783662864
m_fileInfoReadTS: 1783662889
m_fileWriteTS: 1783655016
m_cachefileWriteTS: 1783655016
refreshStamp: 2
UseGUIDsList: []
- guid: 919d97c1a707113409177d498d31cf51
@@ -32588,10 +32588,10 @@ MonoBehaviour:
m_addressable:
m_atlas:
m_fileSize: 4587
m_assetChangeTS: 1783397504
m_fileInfoReadTS: 1783397511
m_fileWriteTS: 1783397504
m_cachefileWriteTS: 1783397504
m_assetChangeTS: 1783610836
m_fileInfoReadTS: 1783610909
m_fileWriteTS: 1783610836
m_cachefileWriteTS: 1783610836
refreshStamp: 2
UseGUIDsList:
- guid: bf2edee5c58d82540a51f03df9d42094
@@ -50724,15 +50724,15 @@ MonoBehaviour:
UseGUIDsList: []
- guid: 13a766a7f5125104cbf4967ec56b300e
type: 2
m_fileInfoHash: 3754.cs
m_fileInfoHash: 3999.cs
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 3754
m_assetChangeTS: 0
m_fileInfoReadTS: 1783088707
m_fileWriteTS: 1780689737
m_cachefileWriteTS: 1780689737
m_fileSize: 3999
m_assetChangeTS: 1783662864
m_fileInfoReadTS: 1783662889
m_fileWriteTS: 1783662667
m_cachefileWriteTS: 1783662667
refreshStamp: 2
UseGUIDsList: []
- guid: 13b75c95f34a00d4e8c04f76b73312e6
@@ -54927,15 +54927,15 @@ MonoBehaviour:
UseGUIDsList: []
- guid: 53e4a3f4417b16c4a8371fed037c2962
type: 2
m_fileInfoHash: 1871.cs
m_fileInfoHash: 1936.cs
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 1871
m_assetChangeTS: 0
m_fileInfoReadTS: 1783088705
m_fileWriteTS: 1780689513
m_cachefileWriteTS: 1780689513
m_fileSize: 1936
m_assetChangeTS: 1783662864
m_fileInfoReadTS: 1783662889
m_fileWriteTS: 1783662667
m_cachefileWriteTS: 1783662667
refreshStamp: 2
UseGUIDsList: []
- guid: 5315c047999aa4d869298f6988dfeb30
@@ -66633,15 +66633,15 @@ MonoBehaviour:
UseGUIDsList: []
- guid: 14f2bbe520e9b084dbbcd01854f179ea
type: 2
m_fileInfoHash: 1890.cs
m_fileInfoHash: 1893.cs
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 1890
m_assetChangeTS: 0
m_fileInfoReadTS: 1783088699
m_fileWriteTS: 1780689896
m_cachefileWriteTS: 1780689896
m_fileSize: 1893
m_assetChangeTS: 1783662864
m_fileInfoReadTS: 1783662889
m_fileWriteTS: 1783662667
m_cachefileWriteTS: 1783662667
refreshStamp: 2
UseGUIDsList: []
- guid: 14f21d7a1e53a8c4e87b25526a7eb63c
@@ -67362,15 +67362,15 @@ MonoBehaviour:
UseGUIDsList: []
- guid: 14aeb2826cddec04094e132d9ad2d320
type: 2
m_fileInfoHash: 2664.cs
m_fileInfoHash: 2657.cs
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 2664
m_assetChangeTS: 0
m_fileInfoReadTS: 1783088699
m_fileWriteTS: 1780682031
m_cachefileWriteTS: 1780682031
m_fileSize: 2657
m_assetChangeTS: 1783662864
m_fileInfoReadTS: 1783662889
m_fileWriteTS: 1783662667
m_cachefileWriteTS: 1783662667
refreshStamp: 2
UseGUIDsList: []
- guid: 14dea3cd6f9354539a93235fc98c74bb
@@ -70879,15 +70879,15 @@ MonoBehaviour:
UseGUIDsList: []
- guid: 54748045ed19d4ea6889de9b617f6f8b
type: 2
m_fileInfoHash: 8287.cs
m_fileInfoHash: 8376.cs
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 8287
m_assetChangeTS: 0
m_fileInfoReadTS: 1783088697
m_fileWriteTS: 1779543480
m_cachefileWriteTS: 1779543480
m_fileSize: 8376
m_assetChangeTS: 1783662864
m_fileInfoReadTS: 1783662889
m_fileWriteTS: 1783662667
m_cachefileWriteTS: 1783662667
refreshStamp: 2
UseGUIDsList: []
- guid: 5474f72bf7b54b743bbc3868e205ef2d
@@ -75824,15 +75824,15 @@ MonoBehaviour:
UseGUIDsList: []
- guid: a464b4e255d397d4180d3bacf74dcc5c
type: 2
m_fileInfoHash: 6872.cs
m_fileInfoHash: 7412.cs
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 6872
m_assetChangeTS: 0
m_fileInfoReadTS: 1783088696
m_fileWriteTS: 1772539206
m_cachefileWriteTS: 1772539206
m_fileSize: 7412
m_assetChangeTS: 1783662864
m_fileInfoReadTS: 1783662889
m_fileWriteTS: 1783662667
m_cachefileWriteTS: 1783662667
refreshStamp: 2
UseGUIDsList: []
- guid: a48458ea708872f44bf79d4c9e33ff07
@@ -80879,15 +80879,15 @@ MonoBehaviour:
UseGUIDsList: []
- guid: f497f16c91f01db48ab2e21dc67a0f3b
type: 2
m_fileInfoHash: 52154.cs
m_fileInfoHash: 52435.cs
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 52154
m_assetChangeTS: 0
m_fileInfoReadTS: 1783088695
m_fileWriteTS: 1780690576
m_cachefileWriteTS: 1780690576
m_fileSize: 52435
m_assetChangeTS: 1783662864
m_fileInfoReadTS: 1783662889
m_fileWriteTS: 1783662667
m_cachefileWriteTS: 1783662667
refreshStamp: 2
UseGUIDsList: []
- guid: f4c78ca7f2e9828499e1861881e6e143
@@ -100893,15 +100893,15 @@ MonoBehaviour:
UseGUIDsList: []
- guid: 166bf8a5ee9f19e4d9ddecfab43469ce
type: 2
m_fileInfoHash: 15285.cs
m_fileInfoHash: 16916.cs
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 15285
m_assetChangeTS: 0
m_fileInfoReadTS: 1783088690
m_fileWriteTS: 1780689815
m_cachefileWriteTS: 1780689815
m_fileSize: 16916
m_assetChangeTS: 1783662864
m_fileInfoReadTS: 1783662889
m_fileWriteTS: 1783662667
m_cachefileWriteTS: 1783662667
refreshStamp: 2
UseGUIDsList: []
- guid: 168b55aaa8b259147b4b5ce9d360e311
@@ -101718,15 +101718,15 @@ MonoBehaviour:
UseGUIDsList: []
- guid: 26ca158aed8cec04d8455a7119eae07b
type: 2
m_fileInfoHash: 4535.cs
m_fileInfoHash: 4600.cs
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 4535
m_assetChangeTS: 0
m_fileInfoReadTS: 1783088689
m_fileWriteTS: 1780689689
m_cachefileWriteTS: 1780689689
m_fileSize: 4600
m_assetChangeTS: 1783662864
m_fileInfoReadTS: 1783662889
m_fileWriteTS: 1783662667
m_cachefileWriteTS: 1783662667
refreshStamp: 2
UseGUIDsList: []
- guid: 260b531edc40677429c0198d6961e448
@@ -101882,15 +101882,15 @@ MonoBehaviour:
UseGUIDsList: []
- guid: 26ed323898e48044589649bfb4c62083
type: 2
m_fileInfoHash: 1685.cs
m_fileInfoHash: 1985.cs
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 1685
m_assetChangeTS: 0
m_fileInfoReadTS: 1783088689
m_fileWriteTS: 1774190667
m_cachefileWriteTS: 1774190667
m_fileSize: 1985
m_assetChangeTS: 1783662864
m_fileInfoReadTS: 1783662889
m_fileWriteTS: 1783662487
m_cachefileWriteTS: 1783662487
refreshStamp: 2
UseGUIDsList: []
- guid: 260e630c5c1b1af42991291f6de23ede
@@ -110161,15 +110161,15 @@ MonoBehaviour:
UseGUIDsList: []
- guid: b616c828cf8808147907365ad776142d
type: 2
m_fileInfoHash: 1871.cs
m_fileInfoHash: 1936.cs
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 1871
m_assetChangeTS: 0
m_fileInfoReadTS: 1783088687
m_fileWriteTS: 1780689509
m_cachefileWriteTS: 1780689509
m_fileSize: 1936
m_assetChangeTS: 1783662864
m_fileInfoReadTS: 1783662889
m_fileWriteTS: 1783662667
m_cachefileWriteTS: 1783662667
refreshStamp: 2
UseGUIDsList: []
- guid: b63607ddb964c4897880a99d41c70efd
@@ -123123,15 +123123,15 @@ MonoBehaviour:
UseGUIDsList: []
- guid: 773c77098921d4c1a87dc6068b5253e8
type: 2
m_fileInfoHash: 8041.cs
m_fileInfoHash: 9599.cs
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 8041
m_assetChangeTS: 1783609273
m_fileInfoReadTS: 1783609282
m_fileWriteTS: 1783609146
m_cachefileWriteTS: 1783609146
m_fileSize: 9599
m_assetChangeTS: 1783662864
m_fileInfoReadTS: 1783662889
m_fileWriteTS: 1783662268
m_cachefileWriteTS: 1783662268
refreshStamp: 2
UseGUIDsList: []
- guid: 774c00e683b6094459a1ed557b35694b
@@ -133489,10 +133489,10 @@ MonoBehaviour:
m_addressable:
m_atlas:
m_fileSize: 23881
m_assetChangeTS: 1783188822
m_fileInfoReadTS: 1783188909
m_fileWriteTS: 1783188822
m_cachefileWriteTS: 1783188822
m_assetChangeTS: 1783610837
m_fileInfoReadTS: 1783610909
m_fileWriteTS: 1783610837
m_cachefileWriteTS: 1783610837
refreshStamp: 2
UseGUIDsList:
- guid: 2ec995e51a6e251468d2a3fd8a686257
@@ -139124,15 +139124,15 @@ MonoBehaviour:
UseGUIDsList: []
- guid: 78139f91998ceef4dbcba970e25e9066
type: 2
m_fileInfoHash: 4414.cs
m_fileInfoHash: 4587.cs
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 4414
m_assetChangeTS: 1783609273
m_fileInfoReadTS: 1783609282
m_fileWriteTS: 1783609115
m_cachefileWriteTS: 1783609115
m_fileSize: 4587
m_assetChangeTS: 1783662864
m_fileInfoReadTS: 1783662889
m_fileWriteTS: 1783662117
m_cachefileWriteTS: 1783662117
refreshStamp: 2
UseGUIDsList: []
- guid: 7883cd788d83a71478342eef943e8150
@@ -142193,15 +142193,15 @@ MonoBehaviour:
UseGUIDsList: []
- guid: a8b322c654c10e14cb10f8a02c9411dc
type: 2
m_fileInfoHash: 2122.cs
m_fileInfoHash: 2259.cs
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 2122
m_assetChangeTS: 0
m_fileInfoReadTS: 1783088661
m_fileWriteTS: 1780688070
m_cachefileWriteTS: 1780688070
m_fileSize: 2259
m_assetChangeTS: 1783662864
m_fileInfoReadTS: 1783662889
m_fileWriteTS: 1783662667
m_cachefileWriteTS: 1783662667
refreshStamp: 2
UseGUIDsList: []
- guid: a834bac5135fab746bc234ec665972de
@@ -143206,15 +143206,15 @@ MonoBehaviour:
UseGUIDsList: []
- guid: b8b3a4599898ef24aa9b77020f5f6a5a
type: 2
m_fileInfoHash: 2562.cs
m_fileInfoHash: 2627.cs
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 2562
m_assetChangeTS: 0
m_fileInfoReadTS: 1783088661
m_fileWriteTS: 1780690469
m_cachefileWriteTS: 1780690469
m_fileSize: 2627
m_assetChangeTS: 1783662864
m_fileInfoReadTS: 1783662889
m_fileWriteTS: 1783662667
m_cachefileWriteTS: 1783662667
refreshStamp: 2
UseGUIDsList: []
- guid: b8b3da1ab40a53c49a3de1e3fe357ad2
@@ -156106,15 +156106,15 @@ MonoBehaviour:
UseGUIDsList: []
- guid: 8902bbaa297d89248bbb17ee0564edd0
type: 2
m_fileInfoHash: 1491.cs
m_fileInfoHash: 1556.cs
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 1491
m_assetChangeTS: 0
m_fileInfoReadTS: 1783088657
m_fileWriteTS: 1780686683
m_cachefileWriteTS: 1780686683
m_fileSize: 1556
m_assetChangeTS: 1783662864
m_fileInfoReadTS: 1783662889
m_fileWriteTS: 1783662667
m_cachefileWriteTS: 1783662667
refreshStamp: 2
UseGUIDsList: []
- guid: 896223e567b01c747b4726ef429e31ea
@@ -163167,15 +163167,15 @@ MonoBehaviour:
UseGUIDsList: []
- guid: e9538206e110cae4bb725767761790a9
type: 2
m_fileInfoHash: 1518.cs
m_fileInfoHash: 1583.cs
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 1518
m_assetChangeTS: 0
m_fileInfoReadTS: 1783088654
m_fileWriteTS: 1780686675
m_cachefileWriteTS: 1780686675
m_fileSize: 1583
m_assetChangeTS: 1783662864
m_fileInfoReadTS: 1783662889
m_fileWriteTS: 1783662667
m_cachefileWriteTS: 1783662667
refreshStamp: 2
UseGUIDsList: []
- guid: e963dcd72924ca1448e01147b483fb05
@@ -180641,15 +180641,15 @@ MonoBehaviour:
UseGUIDsList: []
- guid: eaac9d0bf222646fc89d03493f9fca69
type: 2
m_fileInfoHash: 22664.cs
m_fileInfoHash: 25140.cs
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 22664
m_assetChangeTS: 0
m_fileInfoReadTS: 1783088634
m_fileWriteTS: 1782718823
m_cachefileWriteTS: 1782718823
m_fileSize: 25140
m_assetChangeTS: 1783662864
m_fileInfoReadTS: 1783662889
m_fileWriteTS: 1783655016
m_cachefileWriteTS: 1783655016
refreshStamp: 2
UseGUIDsList: []
- guid: eacc8c07331ade049a6102ca81caa612
@@ -189735,10 +189735,10 @@ MonoBehaviour:
m_addressable:
m_atlas:
m_fileSize: 4597
m_assetChangeTS: 1783397504
m_fileInfoReadTS: 1783397511
m_fileWriteTS: 1783397504
m_cachefileWriteTS: 1783397504
m_assetChangeTS: 1783610836
m_fileInfoReadTS: 1783610909
m_fileWriteTS: 1783610836
m_cachefileWriteTS: 1783610836
refreshStamp: 2
UseGUIDsList:
- guid: bf2edee5c58d82540a51f03df9d42094
@@ -207554,15 +207554,15 @@ MonoBehaviour:
UseGUIDsList: []
- guid: 7c39beb8ca959c747820aa38886ed3a2
type: 2
m_fileInfoHash: 1943.cs
m_fileInfoHash: 2008.cs
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 1943
m_assetChangeTS: 0
m_fileInfoReadTS: 1783088627
m_fileWriteTS: 1780689505
m_cachefileWriteTS: 1780689505
m_fileSize: 2008
m_assetChangeTS: 1783662864
m_fileInfoReadTS: 1783662889
m_fileWriteTS: 1783662667
m_cachefileWriteTS: 1783662667
refreshStamp: 2
UseGUIDsList: []
- guid: 7c499715fdb4d7c479dcd3fd13abe0d0
@@ -208563,15 +208563,15 @@ MonoBehaviour:
UseGUIDsList: []
- guid: 8c3c6c8aa2d7f5d48aee5ced0ffe9bb8
type: 2
m_fileInfoHash: 9537.cs
m_fileInfoHash: 9769.cs
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 9537
m_assetChangeTS: 0
m_fileInfoReadTS: 1783088627
m_fileWriteTS: 1780689785
m_cachefileWriteTS: 1780689785
m_fileSize: 9769
m_assetChangeTS: 1783662864
m_fileInfoReadTS: 1783662889
m_fileWriteTS: 1783662667
m_cachefileWriteTS: 1783662667
refreshStamp: 2
UseGUIDsList: []
- guid: 8c7c7e69d9574cd6994b42e64fb32db2
@@ -234740,15 +234740,15 @@ MonoBehaviour:
UseGUIDsList: []
- guid: 2e498d1c8094910479dc3e1b768306a4
type: 5
m_fileInfoHash: 604828.asset
m_fileInfoHash: 604949.asset
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 604828
m_assetChangeTS: 1783609901
m_fileInfoReadTS: 1783609902
m_fileWriteTS: 1783609901
m_cachefileWriteTS: 1783609901
m_fileSize: 604949
m_assetChangeTS: 1783654224
m_fileInfoReadTS: 1783654225
m_fileWriteTS: 1783654224
m_cachefileWriteTS: 1783654224
refreshStamp: 2
UseGUIDsList:
- guid: fe393ace9b354375a9cb14cdbbc28be4
@@ -248849,15 +248849,15 @@ MonoBehaviour:
UseGUIDsList: []
- guid: 1f2679cb25973a04299c960841e384a5
type: 2
m_fileInfoHash: 3279.cs
m_fileInfoHash: 3259.cs
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 3279
m_assetChangeTS: 0
m_fileInfoReadTS: 1783088608
m_fileWriteTS: 1780682017
m_cachefileWriteTS: 1780682017
m_fileSize: 3259
m_assetChangeTS: 1783662864
m_fileInfoReadTS: 1783662889
m_fileWriteTS: 1783662667
m_cachefileWriteTS: 1783662667
refreshStamp: 2
UseGUIDsList: []
- guid: 1f262e722aecf4d02a1103c1e8a96c3f
@@ -257740,15 +257740,15 @@ MonoBehaviour:
UseGUIDsList: []
- guid: aff80908d5bdc8e438b6d006be38d4b3
type: 2
m_fileInfoHash: 1818.cs
m_fileInfoHash: 1919.cs
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 1818
m_assetChangeTS: 0
m_fileInfoReadTS: 1783088606
m_fileWriteTS: 1780689763
m_cachefileWriteTS: 1780689763
m_fileSize: 1919
m_assetChangeTS: 1783662864
m_fileInfoReadTS: 1783662889
m_fileWriteTS: 1783662667
m_cachefileWriteTS: 1783662667
refreshStamp: 2
UseGUIDsList: []
- guid: af19581c6078849139e0671f575e4b7c
@@ -262813,15 +262813,15 @@ MonoBehaviour:
UseGUIDsList: []
- guid: ff4f07b63a568fc4a86f757969b47fce
type: 2
m_fileInfoHash: 2057.cs
m_fileInfoHash: 2194.cs
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 2057
m_assetChangeTS: 0
m_fileInfoReadTS: 1783088605
m_fileWriteTS: 1780688065
m_cachefileWriteTS: 1780688065
m_fileSize: 2194
m_assetChangeTS: 1783662864
m_fileInfoReadTS: 1783662889
m_fileWriteTS: 1783662667
m_cachefileWriteTS: 1783662667
refreshStamp: 2
UseGUIDsList: []
- guid: ff5f5220af00e574287547dab664b9ab
@@ -263360,6 +263360,32 @@ MonoBehaviour:
m_cachefileWriteTS: 1783563309
refreshStamp: 2
UseGUIDsList: []
- guid: f743f8f91400ea04097346d48e479fd8
type: 9
m_fileInfoHash: 17887.json
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 17887
m_assetChangeTS: 0
m_fileInfoReadTS: 1783662889
m_fileWriteTS: 1783662864
m_cachefileWriteTS: 1783662864
refreshStamp: 2
UseGUIDsList: []
- guid: 96273157236b1a54fbf492d88d4c540f
type: 2
m_fileInfoHash: 7703.cs
m_assetbundle:
m_addressable:
m_atlas:
m_fileSize: 7703
m_assetChangeTS: 1783663381
m_fileInfoReadTS: 1783663388
m_fileWriteTS: 1783663346
m_cachefileWriteTS: 1783663346
refreshStamp: 2
UseGUIDsList: []
setting:
alternateColor: 1
excludeTypes: 0

View File

@@ -1,5 +1,6 @@
using System.Collections;
using System;
using System.Collections.Generic;
using Ichni.RhythmGame;
using UnityEngine;
namespace Ichni.Editor.Commands
@@ -14,6 +15,8 @@ namespace Ichni.Editor.Commands
/// </summary>
public static void ExecuteCommand(ICommand command)
{
if (command == null) return;
if (undoStack.Count > 0)
{
var topCommand = undoStack.Peek();
@@ -28,7 +31,14 @@ namespace Ichni.Editor.Commands
// 新操作彻底切断原本可能存在的重做未来
command.Execute();
undoStack.Push(command);
redoStack.Clear();
redoStack.Clear();
}
public static GameElement ExecuteCreate(Func<GameElement> createAction)
{
var command = new CreateElementCommand(createAction);
ExecuteCommand(command);
return command.CreatedElement;
}
public static void Undo()

View File

@@ -0,0 +1,245 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Ichni.RhythmGame;
using Ichni.RhythmGame.Beatmap;
using UnityEngine;
namespace Ichni.Editor.Commands
{
internal sealed class ElementTreeSnapshot
{
private readonly List<BaseElement_BM> elements = new List<BaseElement_BM>();
private readonly Guid rootGuid;
private readonly Guid parentGuid;
private readonly int parentChildIndex;
private ElementTreeSnapshot(GameElement root)
{
rootGuid = root.elementGuid;
parentGuid = root.parentElement?.elementGuid ?? Guid.Empty;
parentChildIndex = root.parentElement != null
? root.parentElement.childElementList.IndexOf(root)
: -1;
RegisterExistingAncestorChain(root.parentElement);
foreach (GameElement element in root.GetAllGameElementsFromThis())
{
if (element == null) continue;
element.SaveBM();
if (element.matchedBM != null)
elements.Add(element.matchedBM);
element.submoduleList.RemoveAll(submodule => submodule == null);
foreach (SubmoduleBase submodule in element.submoduleList)
{
submodule.SaveBM();
if (submodule.matchedBM != null)
elements.Add(submodule.matchedBM);
}
}
}
public static ElementTreeSnapshot Capture(GameElement root)
{
return root == null ? null : new ElementTreeSnapshot(root);
}
public GameElement Restore()
{
if (elements.Count == 0) return null;
GameElement parent = parentGuid == Guid.Empty ? null : FindExistingElement(parentGuid);
RegisterExistingAncestorChain(parent);
RepairRootAttachment();
foreach (GameElement_BM gameElementBM in elements.OfType<GameElement_BM>())
{
GameElement_BM.identifier[gameElementBM.elementGuid] = gameElementBM;
}
foreach (BaseElement_BM elementBM in elements)
{
elementBM.ExecuteBM();
}
EditorManager.instance.beatmapContainer.ExecuteLowPriorityActions();
GameElement root = GameElement_BM.GetElement(rootGuid);
if (root == null) return null;
RestoreParentOrder(root, parent);
foreach (GameElement element in root.GetAllGameElementsFromThis())
{
if (element == null) continue;
element.AfterInitialize();
element.Refresh();
}
EditorManager.instance.uiManager.hierarchy.FindTab(root);
return root;
}
private GameElement FindExistingElement(Guid elementGuid)
{
GameElement element = GameElement_BM.GetElement(elementGuid);
if (element != null) return element;
return EditorManager.instance.beatmapContainer.gameElementList
.FirstOrDefault(gameElement => gameElement != null && gameElement.elementGuid == elementGuid);
}
private void RepairRootAttachment()
{
if (parentGuid == Guid.Empty) return;
GameElement_BM rootBM = elements
.OfType<GameElement_BM>()
.FirstOrDefault(gameElementBM => gameElementBM.elementGuid == rootGuid);
if (rootBM != null)
{
rootBM.attachedElementGuid = parentGuid;
}
}
private void RegisterExistingAncestorChain(GameElement parent)
{
if (parent == null) return;
List<GameElement> ancestors = new List<GameElement>();
for (GameElement current = parent; current != null; current = current.parentElement)
{
ancestors.Add(current);
}
ancestors.Reverse();
foreach (GameElement ancestor in ancestors)
{
ancestor.SaveBM();
if (ancestor.matchedBM is not GameElement_BM ancestorBM) continue;
GameElement_BM.identifier[ancestor.elementGuid] = ancestorBM;
ancestorBM.matchedElement = ancestor;
}
}
private void RestoreParentOrder(GameElement root, GameElement parent)
{
if (parent == null || parentChildIndex < 0) return;
parent.childElementList.Remove(root);
int insertIndex = Mathf.Clamp(parentChildIndex, 0, parent.childElementList.Count);
parent.childElementList.Insert(insertIndex, root);
root.transform.SetSiblingIndex(insertIndex);
parent.Refresh();
}
}
public sealed class DeleteElementCommand : ICommand
{
private readonly ElementTreeSnapshot snapshot;
private GameElement target;
public DeleteElementCommand(GameElement target)
{
this.target = target;
snapshot = ElementTreeSnapshot.Capture(target);
}
public void Execute()
{
DeleteCurrentTarget();
}
public void Undo()
{
target = snapshot?.Restore();
}
public void Redo()
{
DeleteCurrentTarget();
}
public bool TryMerge(ICommand other) => false;
private void DeleteCurrentTarget()
{
if (target == null) return;
EditorManager.instance.operationManager.CopyPasteDeleteModule.DeleteElementRaw(target);
target = null;
}
}
public sealed class PasteElementCommand : ICommand
{
private readonly CopyPasteDeleteModule module;
private readonly GameElement source;
private readonly GameElement parent;
private ElementTreeSnapshot snapshot;
private GameElement pastedRoot;
public PasteElementCommand(CopyPasteDeleteModule module, GameElement source, GameElement parent)
{
this.module = module;
this.source = source;
this.parent = parent;
}
public void Execute()
{
pastedRoot = module.PasteElementRaw(source, parent);
snapshot ??= ElementTreeSnapshot.Capture(pastedRoot);
}
public void Undo()
{
if (pastedRoot == null) return;
module.DeleteElementRaw(pastedRoot, false);
pastedRoot = null;
}
public void Redo()
{
pastedRoot = snapshot?.Restore();
}
public bool TryMerge(ICommand other) => false;
}
public sealed class CreateElementCommand : ICommand
{
private readonly Func<GameElement> createAction;
private ElementTreeSnapshot snapshot;
public GameElement CreatedElement { get; private set; }
public CreateElementCommand(Func<GameElement> createAction)
{
this.createAction = createAction;
}
public void Execute()
{
CreatedElement = createAction?.Invoke();
snapshot ??= ElementTreeSnapshot.Capture(CreatedElement);
}
public void Undo()
{
if (CreatedElement == null) return;
EditorManager.instance.operationManager.CopyPasteDeleteModule.DeleteElementRaw(CreatedElement, false);
CreatedElement = null;
}
public void Redo()
{
CreatedElement = snapshot?.Restore();
}
public bool TryMerge(ICommand other) => false;
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 96273157236b1a54fbf492d88d4c540f

View File

@@ -2,6 +2,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Ichni.Editor.Commands;
using Ichni.RhythmGame;
using Lean.Pool;
using UnityEngine;
@@ -784,29 +785,29 @@ namespace Ichni.Editor
builder
.Button("Displacement", () =>
Displacement.GenerateElement("New Displacement", Guid.NewGuid(),
CommandManager.ExecuteCreate(() => Displacement.GenerateElement("New Displacement", Guid.NewGuid(),
new List<string>(), true, gameElement,
new FlexibleFloat(true), new FlexibleFloat(true), new FlexibleFloat(true)))
new FlexibleFloat(true), new FlexibleFloat(true), new FlexibleFloat(true))))
.Button("Swirl", () =>
Swirl.GenerateElement("New Swirl", Guid.NewGuid(),
CommandManager.ExecuteCreate(() => Swirl.GenerateElement("New Swirl", Guid.NewGuid(),
new List<string>(), true, gameElement,
new FlexibleFloat(true), new FlexibleFloat(true), new FlexibleFloat(true)))
new FlexibleFloat(true), new FlexibleFloat(true), new FlexibleFloat(true))))
.Button("Scale", () =>
Scale.GenerateElement("New Scale", Guid.NewGuid(),
CommandManager.ExecuteCreate(() => Scale.GenerateElement("New Scale", Guid.NewGuid(),
new List<string>(), true, gameElement,
new FlexibleFloat(true), new FlexibleFloat(true), new FlexibleFloat(true)))
new FlexibleFloat(true), new FlexibleFloat(true), new FlexibleFloat(true))))
.Button("Look At", () =>
LookAt.GenerateElement("New Look At", Guid.NewGuid(),
new List<string>(), true, gameElement, null, new FlexibleBool()))
CommandManager.ExecuteCreate(() => LookAt.GenerateElement("New Look At", Guid.NewGuid(),
new List<string>(), true, gameElement, null, new FlexibleBool())))
.Button("Displacement Tracker", () =>
DisplacementTracker.GenerateElement("New Displacement Tracker", Guid.NewGuid(),
new List<string>(), true, gameElement, null, 0f))
CommandManager.ExecuteCreate(() => DisplacementTracker.GenerateElement("New Displacement Tracker", Guid.NewGuid(),
new List<string>(), true, gameElement, null, 0f)))
.Button("Swirl Tracker", () =>
SwirlTracker.GenerateElement("New Swirl Tracker", Guid.NewGuid(),
new List<string>(), true, gameElement, null, 0f))
CommandManager.ExecuteCreate(() => SwirlTracker.GenerateElement("New Swirl Tracker", Guid.NewGuid(),
new List<string>(), true, gameElement, null, 0f)))
.Button("Scale Tracker", () =>
ScaleTracker.GenerateElement("New Scale Tracker", Guid.NewGuid(),
new List<string>(), true, gameElement, null, 0f));
CommandManager.ExecuteCreate(() => ScaleTracker.GenerateElement("New Scale Tracker", Guid.NewGuid(),
new List<string>(), true, gameElement, null, 0f)));
}
// ════════════════════════════════════════════════════════

View File

@@ -4,6 +4,7 @@ using System.Collections.Generic;
using System.Threading.Tasks;
using DG.Tweening;
using Lean.Pool;
using Ichni.Editor.Commands;
using Ichni.RhythmGame;
using Unity.VisualScripting;
using UnityEngine;
@@ -24,7 +25,8 @@ namespace Ichni.Editor
tabList = new List<HierarchyTab>();
addFolderButton.onClick.AddListener(() =>
{
ElementFolder.GenerateElement("New Folder", Guid.NewGuid(), new List<string>(), true, null);
CommandManager.ExecuteCreate(() =>
ElementFolder.GenerateElement("New Folder", Guid.NewGuid(), new List<string>(), true, null));
});
expandButtom.onClick.AddListener(Expand);
rectTransform = this.GetComponent<RectTransform>();
@@ -201,4 +203,4 @@ namespace Ichni.Editor
upLoadElement = null;
}
}
}
}

View File

@@ -176,13 +176,7 @@ namespace Ichni.Editor
private void GenerateSaveClipWindow()
{
GameElement currentElement = EditorManager.instance.operationManager.currentSelectedElements[0];
if (currentElement == null)
{
LogWindow.Log("No Game Element selected.", Color.red);
return;
}
if (!TryGetSingleSelectedElementForClip(out GameElement currentElement)) return;
if (clipManagementWindow != null)
{
@@ -208,15 +202,7 @@ namespace Ichni.Editor
private void GenerateLoadClipWindow()
{
GameElement currentElement = EditorManager.instance.operationManager.currentSelectedElements[0];
if (currentElement == null)
{
LogWindow.Log("No Game Element selected.", Color.red);
return;
}
GameElement loadTarget = currentElement == EditorManager.instance ? null : currentElement.parentElement;
if (!TryGetSingleSelectedElementForClip(out GameElement currentElement)) return;
if (clipManagementWindow != null)
{
@@ -240,6 +226,26 @@ namespace Ichni.Editor
});
}
private bool TryGetSingleSelectedElementForClip(out GameElement currentElement)
{
currentElement = null;
var selectedElements = EditorManager.instance.operationManager.currentSelectedElements;
if (selectedElements == null || selectedElements.Count != 1)
{
LogWindow.Log("Please select only one Game Element for clip operation.", Color.red);
return false;
}
currentElement = selectedElements[0];
if (currentElement == null)
{
LogWindow.Log("No Game Element selected.", Color.red);
return false;
}
return true;
}
private void GenerateMergeWindow()
{
GeneralSecondaryWindow mergeWindow = Instantiate(EditorManager.instance.basePrefabs.generalSecondaryWindow,

View File

@@ -2,6 +2,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
using Ichni.Editor;
using Ichni.Editor.Commands;
using UnityEngine;
namespace Ichni.RhythmGame
@@ -37,8 +38,8 @@ namespace Ichni.RhythmGame
.InputField(nameof(TimeOffset), "Offset")
.Button("Interferometer", () =>
{
Vector3Interferometer.GenerateElement("New Vector3 Interferometer", Guid.NewGuid(),
new List<string>(), true, this, InterferomType.Additive, Vector3.zero);
CommandManager.ExecuteCreate(() => Vector3Interferometer.GenerateElement("New Vector3 Interferometer", Guid.NewGuid(),
new List<string>(), true, this, InterferomType.Additive, Vector3.zero));
})
.Build();
}

View File

@@ -2,6 +2,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
using Ichni.Editor;
using Ichni.Editor.Commands;
using UnityEngine;
namespace Ichni.RhythmGame
@@ -37,8 +38,8 @@ namespace Ichni.RhythmGame
.InputField(nameof(TimeOffset), "Offset")
.Button("Interferometer", () =>
{
Vector3Interferometer.GenerateElement("New Vector3 Interferometer", Guid.NewGuid(),
new List<string>(), true, this, InterferomType.Additive, Vector3.zero);
CommandManager.ExecuteCreate(() => Vector3Interferometer.GenerateElement("New Vector3 Interferometer", Guid.NewGuid(),
new List<string>(), true, this, InterferomType.Additive, Vector3.zero));
})
.Build();
}

View File

@@ -2,6 +2,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
using Ichni.Editor;
using Ichni.Editor.Commands;
using UnityEngine;
namespace Ichni.RhythmGame
@@ -37,8 +38,8 @@ namespace Ichni.RhythmGame
.InputField(nameof(TimeOffset), "Offset")
.Button("Interferometer", () =>
{
Vector3Interferometer.GenerateElement("New Vector3 Interferometer", Guid.NewGuid(),
new List<string>(), true, this, InterferomType.Additive, Vector3.zero);
CommandManager.ExecuteCreate(() => Vector3Interferometer.GenerateElement("New Vector3 Interferometer", Guid.NewGuid(),
new List<string>(), true, this, InterferomType.Additive, Vector3.zero));
})
.Build();
}

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using Ichni.Editor;
using Ichni.Editor.Commands;
using UnityEngine;
namespace Ichni.RhythmGame
@@ -21,8 +22,8 @@ namespace Ichni.RhythmGame
new FlexibleFloat[] { positionX, positionY, positionZ }, new string[] { "PosX", "PosY", "PosZ" }))
.ParameterText(nameof(PreviewValue), "value:", autoUpdate: true)
.Span(3)
.Button("Interferometer", () => Vector3Interferometer.GenerateElement("New Vector3 Interferometer",
Guid.NewGuid(), new List<string>(), true, this, InterferomType.Additive, Vector3.zero))
.Button("Interferometer", () => CommandManager.ExecuteCreate(() => Vector3Interferometer.GenerateElement("New Vector3 Interferometer",
Guid.NewGuid(), new List<string>(), true, this, InterferomType.Additive, Vector3.zero)))
.Span(3)
.Build();
}

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using Ichni.Editor;
using Ichni.Editor.Commands;
using UnityEngine;
namespace Ichni.RhythmGame
@@ -22,8 +23,8 @@ namespace Ichni.RhythmGame
new string[] { "ScaleX", "ScaleY", "ScaleZ" }))
.ParameterText(nameof(PreviewValue), "value:", autoUpdate: true)
.Span(3)
.Button("Interferometer", () => Vector3Interferometer.GenerateElement("New Vector3 Interferometer",
Guid.NewGuid(), new List<string>(), true, this, InterferomType.Additive, Vector3.zero))
.Button("Interferometer", () => CommandManager.ExecuteCreate(() => Vector3Interferometer.GenerateElement("New Vector3 Interferometer",
Guid.NewGuid(), new List<string>(), true, this, InterferomType.Additive, Vector3.zero)))
.Span(3)
.Build();
}

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using Ichni.Editor;
using Ichni.Editor.Commands;
using UnityEngine;
namespace Ichni.RhythmGame
@@ -22,8 +23,8 @@ namespace Ichni.RhythmGame
new string[] { "EulerX", "EulerY", "EulerZ" }))
.ParameterText(nameof(PreviewValue), "value:", autoUpdate: true)
.Span(3)
.Button("Interferometer", () => Vector3Interferometer.GenerateElement("New Vector3 Interferometer",
Guid.NewGuid(), new List<string>(), true, this, InterferomType.Additive, Vector3.zero))
.Button("Interferometer", () => CommandManager.ExecuteCreate(() => Vector3Interferometer.GenerateElement("New Vector3 Interferometer",
Guid.NewGuid(), new List<string>(), true, this, InterferomType.Additive, Vector3.zero)))
.Span(3)
.Build();
}

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using Ichni.Editor;
using Ichni.Editor.Commands;
using Ichni.RhythmGame.Beatmap;
namespace Ichni.RhythmGame
@@ -23,41 +24,41 @@ namespace Ichni.RhythmGame
var builder = InspectorBuilder.For(this)
.Section("Generate")
.Button("Environment Object", () =>
TemporaryObject.GenerateElement("New Environment Object", Guid.NewGuid(),
new List<string>(), true, this))
CommandManager.ExecuteCreate(() => TemporaryObject.GenerateElement("New Environment Object", Guid.NewGuid(),
new List<string>(), true, this)))
.Toggle(nameof(isStatic), "Is Static")
.OnChanged(() => gameObject.isStatic = isStatic)
.Preset(InspectorBuilder.TransformPreset)
.Section("Generate Animations")
.Button("Base Color Change", () =>
BaseColorChange.GenerateElement("New Base Color Change", Guid.NewGuid(), new List<string>(), true,
CommandManager.ExecuteCreate(() => BaseColorChange.GenerateElement("New Base Color Change", Guid.NewGuid(), new List<string>(), true,
this,
new FlexibleFloat(new List<AnimatedFloat> { new AnimatedFloat(0f, 0.1f, colorSubmodule.originalBaseColor.r, colorSubmodule.originalBaseColor.r, animationCurveType: AnimationCurveType.Linear) }),
new FlexibleFloat(new List<AnimatedFloat> { new AnimatedFloat(0f, 0.1f, colorSubmodule.originalBaseColor.g, colorSubmodule.originalBaseColor.g, animationCurveType: AnimationCurveType.Linear) }),
new FlexibleFloat(new List<AnimatedFloat> { new AnimatedFloat(0f, 0.1f, colorSubmodule.originalBaseColor.b, colorSubmodule.originalBaseColor.b, animationCurveType: AnimationCurveType.Linear) }),
new FlexibleFloat(new List<AnimatedFloat> { new AnimatedFloat(0f, 0.1f, colorSubmodule.originalBaseColor.a, colorSubmodule.originalBaseColor.a, animationCurveType: AnimationCurveType.Linear) })
));
)));
if (haveEmissionColor)
{
builder.Button("Emission Color Change", () =>
EmissionColorChange.GenerateElement("New Emission Color Change", Guid.NewGuid(),
CommandManager.ExecuteCreate(() => EmissionColorChange.GenerateElement("New Emission Color Change", Guid.NewGuid(),
new List<string>(), true, this,
new FlexibleFloat(), new FlexibleFloat(), new FlexibleFloat(), new FlexibleFloat()));
new FlexibleFloat(), new FlexibleFloat(), new FlexibleFloat(), new FlexibleFloat())));
}
builder
.Button("Property Animation Color", () =>
PropertyAnimationColor.GenerateElement("New Property Animation Color", Guid.NewGuid(),
CommandManager.ExecuteCreate(() => PropertyAnimationColor.GenerateElement("New Property Animation Color", Guid.NewGuid(),
new List<string>(), true, this, GetType().FullName, "",
new FlexibleFloat(), new FlexibleFloat(), new FlexibleFloat(), new FlexibleFloat()))
new FlexibleFloat(), new FlexibleFloat(), new FlexibleFloat(), new FlexibleFloat())))
.Button("Property Animation Float", () =>
PropertyAnimationFloat.GenerateElement("New Property Animation Float", Guid.NewGuid(),
new List<string>(), true, this, GetType().FullName, "", new FlexibleFloat()))
CommandManager.ExecuteCreate(() => PropertyAnimationFloat.GenerateElement("New Property Animation Float", Guid.NewGuid(),
new List<string>(), true, this, GetType().FullName, "", new FlexibleFloat())))
.Button("Property Animation Vector3", () =>
PropertyAnimationVector3.GenerateElement("New Property Animation Vector3", Guid.NewGuid(),
CommandManager.ExecuteCreate(() => PropertyAnimationVector3.GenerateElement("New Property Animation Vector3", Guid.NewGuid(),
new List<string>(), true, this, GetType().FullName, "",
new FlexibleFloat(), new FlexibleFloat(), new FlexibleFloat()))
new FlexibleFloat(), new FlexibleFloat(), new FlexibleFloat())))
.Build();
}
#endregion

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using Ichni.Editor;
using Ichni.Editor.Commands;
using Ichni.RhythmGame.Beatmap;
using Ichni.RhythmGame.ThemeBundles.DepartureToMultiverse;
using Sirenix.OdinInspector;
@@ -26,29 +27,29 @@ namespace Ichni.RhythmGame
InspectorBuilder.For(this)
.Section("Generate", sectionOrder: 10)
.Button("Folder", () => ElementFolder.GenerateElement("New Folder", Guid.NewGuid(), new List<string>(), true, this))
.Button("Track", () => Track.GenerateElement("New Track", Guid.NewGuid(), new List<string>(), true, this))
.Button("Camera", () => GameCamera.GenerateElement("New Camera", Guid.NewGuid(), new List<string>(), true, this, GameCamera.CameraViewType.Perspective, 60, 10))
.Button("Cross Track Point", () => CrossTrackPoint.GenerateElement("New Cross Track Point", Guid.NewGuid(), new List<string>(), true, this, new FlexibleInt(), new FlexibleFloat()))
.Button("Folder", () => CommandManager.ExecuteCreate(() => ElementFolder.GenerateElement("New Folder", Guid.NewGuid(), new List<string>(), true, this)))
.Button("Track", () => CommandManager.ExecuteCreate(() => Track.GenerateElement("New Track", Guid.NewGuid(), new List<string>(), true, this)))
.Button("Camera", () => CommandManager.ExecuteCreate(() => GameCamera.GenerateElement("New Camera", Guid.NewGuid(), new List<string>(), true, this, GameCamera.CameraViewType.Perspective, 60, 10)))
.Button("Cross Track Point", () => CommandManager.ExecuteCreate(() => CrossTrackPoint.GenerateElement("New Cross Track Point", Guid.NewGuid(), new List<string>(), true, this, new FlexibleInt(), new FlexibleFloat())))
.Build();
InspectorBuilder.For(this)
.Section("Generate Elements", sectionOrder: 15)
.Preset(InspectorBuilder.TransformPreset)
.Section("Generate Notes", sectionOrder: 20)
.Button("Tap", () => Tap.GenerateElement("New Tap", Guid.NewGuid(), new List<string>(), true, this, 0f))
.Button("Stay", () => Stay.GenerateElement("New Stay", Guid.NewGuid(), new List<string>(), true, this, 0f))
.Button("Hold", () => Hold.GenerateElement("New Hold", Guid.NewGuid(), new List<string>(), true, this, 0f, 1f))
.Button("Flick", () => Flick.GenerateElement("New Flick", Guid.NewGuid(), new List<string>(), true, this, 0f, new List<Vector2>()))
.Button("Tap", () => CommandManager.ExecuteCreate(() => Tap.GenerateElement("New Tap", Guid.NewGuid(), new List<string>(), true, this, 0f)))
.Button("Stay", () => CommandManager.ExecuteCreate(() => Stay.GenerateElement("New Stay", Guid.NewGuid(), new List<string>(), true, this, 0f)))
.Button("Hold", () => CommandManager.ExecuteCreate(() => Hold.GenerateElement("New Hold", Guid.NewGuid(), new List<string>(), true, this, 0f, 1f)))
.Button("Flick", () => CommandManager.ExecuteCreate(() => Flick.GenerateElement("New Flick", Guid.NewGuid(), new List<string>(), true, this, 0f, new List<Vector2>())))
.Section("Generate Environment", sectionOrder: 30)
.Button("Environment Object", () => TemporaryObject.GenerateElement("New Environment Object", Guid.NewGuid(), new List<string>(), true, this))
.Button("Time Effects Collection", () => TimeEffectsCollection.GenerateElement("New Time Effects Collection", Guid.NewGuid(),
new List<string>(), true, this, 0))
.Button("Environment Object", () => CommandManager.ExecuteCreate(() => TemporaryObject.GenerateElement("New Environment Object", Guid.NewGuid(), new List<string>(), true, this)))
.Button("Time Effects Collection", () => CommandManager.ExecuteCreate(() => TimeEffectsCollection.GenerateElement("New Time Effects Collection", Guid.NewGuid(),
new List<string>(), true, this, 0)))
.Button("Particle Emitter", () =>
{
ParticleEmitter.GenerateElement("New Particle Emitter", Guid.NewGuid(), new List<string>(), true,
CommandManager.ExecuteCreate(() => ParticleEmitter.GenerateElement("New Particle Emitter", Guid.NewGuid(), new List<string>(), true,
this, "", "", false, 0, 1, ParticleSystemSimulationSpace.World,
10, 5, 1, 1, true, Vector3.zero);
10, 5, 1, 1, true, Vector3.zero));
})
.Section("Tools", sectionOrder: 40)

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using Ichni.Editor;
using Ichni.Editor.Commands;
using Ichni.RhythmGame.Beatmap;
namespace Ichni.RhythmGame
@@ -25,14 +26,14 @@ namespace Ichni.RhythmGame
.Preset(InspectorBuilder.TransformPreset)
.Section("Generate")
.Button("Field of View", () =>
CameraFieldOfView.GenerateElement("New Field of View", Guid.NewGuid(),
CommandManager.ExecuteCreate(() => CameraFieldOfView.GenerateElement("New Field of View", Guid.NewGuid(),
new List<string>(), true, this, new FlexibleFloat(new List<AnimatedFloat>
{
new AnimatedFloat(0f, 1f, 60f, 60f, AnimationCurveType.Linear)
})))
}))))
.Button("Extension", () =>
GameCameraExtension.GenerateElement("New Extension", Guid.NewGuid(),
new List<string>(), true, this, 1000f))
CommandManager.ExecuteCreate(() => GameCameraExtension.GenerateElement("New Extension", Guid.NewGuid(),
new List<string>(), true, this, 1000f)))
.Build();
}
#endregion

View File

@@ -30,7 +30,7 @@ namespace Ichni.RhythmGame
.OnChanged(() => inspectorMain.SetInspector(this))
.Button("Generate", () =>
{
EditorManager.instance.operationManager.CopyPasteDeleteModule.DeleteElement(this);
EditorManager.instance.operationManager.CopyPasteDeleteModule.DeleteElementRaw(this);
inspectorMain.ClearInspector();
SubstantialObject.GenerateElement(elementName, elementGuid, tags, true,
themeBundleName, objectName, parentElement);

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using Ichni.Editor;
using Ichni.Editor.Commands;
using Ichni.RhythmGame.Beatmap;
using UnityEngine;
@@ -84,9 +85,9 @@ namespace Ichni.RhythmGame
{
if (skyboxSubsetter == null)
{
SkyboxSubsetter.GenerateElement("New Skybox Subsetter", Guid.NewGuid(),
CommandManager.ExecuteCreate(() => SkyboxSubsetter.GenerateElement("New Skybox Subsetter", Guid.NewGuid(),
new List<string>(), true, this,
new List<string>(), new List<string>(), new List<float>(), new List<float>());
new List<string>(), new List<string>(), new List<float>(), new List<float>()));
}
else
{

View File

@@ -2,6 +2,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
using Ichni.Editor;
using Ichni.Editor.Commands;
using Ichni.RhythmGame.Beatmap;
namespace Ichni.RhythmGame
@@ -75,7 +76,7 @@ namespace Ichni.RhythmGame
.Section("Note Visual")
.Button("Generate Note Visual", () =>
{
TemporaryObject.GenerateElement("New Note Visual", Guid.NewGuid(), new List<string>(), true, this);
CommandManager.ExecuteCreate(() => TemporaryObject.GenerateElement("New Note Visual", Guid.NewGuid(), new List<string>(), true, this));
})
.EnabledIf(() => noteVisual == null)
.Build();

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using Ichni.Editor;
using Ichni.Editor.Commands;
using Ichni.RhythmGame.Beatmap;
namespace Ichni.RhythmGame
@@ -38,13 +39,13 @@ namespace Ichni.RhythmGame
public void GenerateBaseColorChange()
{
BaseColorChange.GenerateElement("New Base Color Change", Guid.NewGuid(), new List<string>(), true,
CommandManager.ExecuteCreate(() => BaseColorChange.GenerateElement("New Base Color Change", Guid.NewGuid(), new List<string>(), true,
this,
new FlexibleFloat(new List<AnimatedFloat> { new AnimatedFloat(0f, 0.1f, colorSubmodule.originalBaseColor.r, colorSubmodule.originalBaseColor.r, animationCurveType: AnimationCurveType.Linear) }),
new FlexibleFloat(new List<AnimatedFloat> { new AnimatedFloat(0f, 0.1f, colorSubmodule.originalBaseColor.g, colorSubmodule.originalBaseColor.g, animationCurveType: AnimationCurveType.Linear) }),
new FlexibleFloat(new List<AnimatedFloat> { new AnimatedFloat(0f, 0.1f, colorSubmodule.originalBaseColor.b, colorSubmodule.originalBaseColor.b, animationCurveType: AnimationCurveType.Linear) }),
new FlexibleFloat(new List<AnimatedFloat> { new AnimatedFloat(0f, 0.1f, colorSubmodule.originalBaseColor.a, colorSubmodule.originalBaseColor.a, animationCurveType: AnimationCurveType.Linear) })
);
));
}
#endregion

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using Ichni.Editor;
using Ichni.Editor.Commands;
using Ichni.RhythmGame.Beatmap;
using UnityEngine;
@@ -36,19 +37,19 @@ namespace Ichni.RhythmGame
.Toggle(nameof(MotionAngles), "Motion With Angles")
.Section("Generate")
.Button("Game Camera", () =>
GameCamera.GenerateElement("New Game Camera", Guid.NewGuid(), new List<string>(),
true, this, GameCamera.CameraViewType.Perspective, 60, 10))
CommandManager.ExecuteCreate(() => GameCamera.GenerateElement("New Game Camera", Guid.NewGuid(), new List<string>(),
true, this, GameCamera.CameraViewType.Perspective, 60, 10)))
.Button("Trail", () =>
Trail.GenerateElement("New Trail", Guid.NewGuid(), new List<string>(),
CommandManager.ExecuteCreate(() => Trail.GenerateElement("New Trail", Guid.NewGuid(), new List<string>(),
true, this, 1, true, 1,
AnimationCurve.Constant(0, 1, 1), ColorExtensions.DefaultGradient(), "", ""))
AnimationCurve.Constant(0, 1, 1), ColorExtensions.DefaultGradient(), "", "")))
.Button("Environment Object", () =>
TemporaryObject.GenerateElement("New Environment Object", Guid.NewGuid(), new List<string>(),
true, this))
CommandManager.ExecuteCreate(() => TemporaryObject.GenerateElement("New Environment Object", Guid.NewGuid(), new List<string>(),
true, this)))
.Button("Generate Particle Emitter", () =>
ParticleEmitter.GenerateElement("New Particle Emitter", Guid.NewGuid(), new List<string>(), true,
CommandManager.ExecuteCreate(() => ParticleEmitter.GenerateElement("New Particle Emitter", Guid.NewGuid(), new List<string>(), true,
this, "", "", false, 0, 1, ParticleSystemSimulationSpace.World,
10, 5, 1, 1, true, Vector3.zero))
10, 5, 1, 1, true, Vector3.zero)))
.Build();
}
#endregion

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using Ichni.Editor;
using Ichni.Editor.Commands;
using Ichni.RhythmGame.Beatmap;
using UnityEngine;
@@ -29,16 +30,16 @@ namespace Ichni.RhythmGame
.OnChanged(() => trackPositioner.motion.rotationOffset = motionEulerAngles)
.Section("Generate")
.Button("Generate Trail", () =>
Trail.GenerateElement("New Trail", Guid.NewGuid(), new List<string>(), true,
CommandManager.ExecuteCreate(() => Trail.GenerateElement("New Trail", Guid.NewGuid(), new List<string>(), true,
this, 1, true, 1,
AnimationCurve.Constant(0, 1, 1), ColorExtensions.DefaultGradient(), "", ""))
AnimationCurve.Constant(0, 1, 1), ColorExtensions.DefaultGradient(), "", "")))
.Button("Environment Object", () =>
TemporaryObject.GenerateElement("New Environment Object", Guid.NewGuid(), new List<string>(),
true, this))
CommandManager.ExecuteCreate(() => TemporaryObject.GenerateElement("New Environment Object", Guid.NewGuid(), new List<string>(),
true, this)))
.Button("Generate Particle Emitter", () =>
ParticleEmitter.GenerateElement("New Particle Emitter", Guid.NewGuid(), new List<string>(), true,
CommandManager.ExecuteCreate(() => ParticleEmitter.GenerateElement("New Particle Emitter", Guid.NewGuid(), new List<string>(), true,
this, "", "", false, 0, 1, ParticleSystemSimulationSpace.World,
10, 5, 1, 1, true, Vector3.zero))
10, 5, 1, 1, true, Vector3.zero)))
.Build();
}
#endregion

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using Ichni.Editor;
using Ichni.Editor.Commands;
using Ichni.RhythmGame.Beatmap;
using UnityEngine;
@@ -33,16 +34,16 @@ namespace Ichni.RhythmGame
.Toggle(nameof(MotionAngles), "Motion With Angles")
.Section("Generate")
.Button("Generate Trail", () =>
Trail.GenerateElement("New Trail", Guid.NewGuid(), new List<string>(), true,
CommandManager.ExecuteCreate(() => Trail.GenerateElement("New Trail", Guid.NewGuid(), new List<string>(), true,
this, 1, true, 1,
AnimationCurve.Constant(0, 1, 1), ColorExtensions.DefaultGradient(), "", ""))
AnimationCurve.Constant(0, 1, 1), ColorExtensions.DefaultGradient(), "", "")))
.Button("Environment Object", () =>
TemporaryObject.GenerateElement("New Environment Object", Guid.NewGuid(), new List<string>(),
true, this))
CommandManager.ExecuteCreate(() => TemporaryObject.GenerateElement("New Environment Object", Guid.NewGuid(), new List<string>(),
true, this)))
.Button("Generate Particle Emitter", () =>
ParticleEmitter.GenerateElement("New Particle Emitter", Guid.NewGuid(), new List<string>(), true,
CommandManager.ExecuteCreate(() => ParticleEmitter.GenerateElement("New Particle Emitter", Guid.NewGuid(), new List<string>(), true,
this, "", "", false, 0, 1, ParticleSystemSimulationSpace.World,
10, 5, 1, 1, true, Vector3.zero))
10, 5, 1, 1, true, Vector3.zero)))
.Build();
}
#endregion

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using Ichni.Editor;
using Ichni.Editor.Commands;
using Ichni.RhythmGame.Beatmap;
namespace Ichni.RhythmGame
@@ -27,7 +28,7 @@ namespace Ichni.RhythmGame
.OnChanged(ClosePath)
.Button("Generate Path Node", () =>
{
PathNode.GenerateElement("New Path Node", Guid.NewGuid(), new List<string>(), true, track, true);
CommandManager.ExecuteCreate(() => PathNode.GenerateElement("New Path Node", Guid.NewGuid(), new List<string>(), true, track, true));
})
.Toggle(nameof(isShowingDisplay), "Show Display")
.OnChanged(() => SetDisplay(isShowingDisplay))

View File

@@ -14,8 +14,10 @@ namespace Ichni.RhythmGame
/// </summary>
/// <param name="unitPositionOffset">单位位置整体偏移</param>
/// <param name="unitTimeOffset">单位时间偏移</param>
/// <param name="unitRotationOffset">单位旋转偏移(欧拉角)</param>
/// <param name="unitScaleOffset">单位缩放偏移</param>
/// <param name="iteration">迭代次数即产生几个粘贴的Track</param>
private void QuickCopy(Vector3 unitPositionOffset, float unitTimeOffset, bool includeAnimations = true, int iteration = 1, bool MovingTrack = false)
private void QuickCopy(Vector3 unitPositionOffset, float unitTimeOffset, bool includeAnimations = true, int iteration = 1, bool MovingTrack = false, Vector3 unitRotationOffset = default, Vector3 unitScaleOffset = default)
{
if (iteration <= 0) return;
@@ -23,23 +25,29 @@ namespace Ichni.RhythmGame
cpd.CopyElement(this);
for (int i = 1; i <= iteration; i++)
{
cpd.PasteElement(parentElement);
cpd.PasteElementRaw(this, parentElement);
Track newTrack = cpd.pastedElementList[0] as Track;
Vector3 positionOffset = unitPositionOffset * i;
float timeOffset = unitTimeOffset * i;
Vector3 rotationOffset = unitRotationOffset * i;
Vector3 scaleOffset = unitScaleOffset * i;
//以下对Track的所有有效的Submodule和子GameElement进行偏移 TODO: 需要思考是否有统一时间偏移的方法?
if (MovingTrack)
{
newTrack.transformSubmodule.originalPosition += positionOffset;
newTrack.transformSubmodule.originalEulerAngles += rotationOffset;
newTrack.transformSubmodule.originalScale += scaleOffset;
newTrack.transformSubmodule.Refresh();
}
else
{
//PathNode位置偏移
//PathNode位置/旋转/缩放偏移
newTrack.trackPathSubmodule.pathNodeList.ForEach(pn =>
{
pn.transformSubmodule.originalPosition += positionOffset;
pn.transformSubmodule.originalEulerAngles += rotationOffset;
pn.transformSubmodule.originalScale += scaleOffset;
pn.transformSubmodule.Refresh();
});
}
@@ -161,4 +169,4 @@ namespace Ichni.RhythmGame
trackPathSubmodule.pathNodeList.ForEach(pn => pn.SetPathNodeSphere(isShowing));
}
}
}
}

View File

@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using ichni.RhythmGame;
using Ichni.Editor;
using Ichni.Editor.Commands;
using Ichni.RhythmGame.Beatmap;
using Sirenix.OdinInspector;
using UnityEngine;
@@ -79,41 +80,45 @@ namespace Ichni.RhythmGame
.Section("Generate Elements", sectionOrder: 20)
.Button("Path Node", () =>
{
PathNode.GenerateElement("New Path Node", Guid.NewGuid(), new List<string>(), true, this, true);
CommandManager.ExecuteCreate(() => PathNode.GenerateElement("New Path Node", Guid.NewGuid(), new List<string>(), true, this, true));
})
.EnabledIf(() => trackPathSubmodule != null)
.Button("Track Percent Point", () =>
{
var a = TrackPercentPoint.GenerateElement("New Track Percent Point", Guid.NewGuid(), new List<string>(), true, this, new FlexibleFloat());
if (trackTimeSubmodule != null && trackTimeSubmodule is TrackTimeSubmoduleMovable trackTimeSubmoduleMovable)
a.trackPercent.Add(
new AnimatedFloat(trackTimeSubmoduleMovable.trackStartTime, trackTimeSubmoduleMovable.trackEndTime, 0, 1, AnimationCurveType.Linear));
CommandManager.ExecuteCreate(() =>
{
var a = TrackPercentPoint.GenerateElement("New Track Percent Point", Guid.NewGuid(), new List<string>(), true, this, new FlexibleFloat());
if (trackTimeSubmodule != null && trackTimeSubmodule is TrackTimeSubmoduleMovable trackTimeSubmoduleMovable)
a.trackPercent.Add(
new AnimatedFloat(trackTimeSubmoduleMovable.trackStartTime, trackTimeSubmoduleMovable.trackEndTime, 0, 1, AnimationCurveType.Linear));
return a;
});
})
.Button("Track Head Point", () =>
{
TrackHeadPoint.GenerateElement("New Track Head Point", Guid.NewGuid(), new List<string>(), true, this, false, Vector3.zero);
CommandManager.ExecuteCreate(() => TrackHeadPoint.GenerateElement("New Track Head Point", Guid.NewGuid(), new List<string>(), true, this, false, Vector3.zero));
})
.EnabledIf(() => trackTimeSubmodule is TrackTimeSubmoduleMovable)
.Button("Tap", () => Tap.GenerateElement("New Tap", Guid.NewGuid(), new List<string>(), true, this, 0f))
.Button("Stay", () => Stay.GenerateElement("New Stay", Guid.NewGuid(), new List<string>(), true, this, 0f))
.Button("Hold", () => Hold.GenerateElement("New Hold", Guid.NewGuid(), new List<string>(), true, this, 0f, 1f))
.Button("Flick", () => Flick.GenerateElement("New Flick", Guid.NewGuid(), new List<string>(), true, this, 0f, new List<Vector2>()))
.Button("Tap", () => CommandManager.ExecuteCreate(() => Tap.GenerateElement("New Tap", Guid.NewGuid(), new List<string>(), true, this, 0f)))
.Button("Stay", () => CommandManager.ExecuteCreate(() => Stay.GenerateElement("New Stay", Guid.NewGuid(), new List<string>(), true, this, 0f)))
.Button("Hold", () => CommandManager.ExecuteCreate(() => Hold.GenerateElement("New Hold", Guid.NewGuid(), new List<string>(), true, this, 0f, 1f)))
.Button("Flick", () => CommandManager.ExecuteCreate(() => Flick.GenerateElement("New Flick", Guid.NewGuid(), new List<string>(), true, this, 0f, new List<Vector2>())))
.Button("Particle Tracker", () =>
{
ParticleTracker.GenerateElement("New Particle Tracker", Guid.NewGuid(), new List<string>(), true, this,
string.Empty, string.Empty, false, 0, 1, false, 10, Vector3.right, 10, 5, true, Vector3.zero);
CommandManager.ExecuteCreate(() => ParticleTracker.GenerateElement("New Particle Tracker", Guid.NewGuid(), new List<string>(), true, this,
string.Empty, string.Empty, false, 0, 1, false, 10, Vector3.right, 10, 5, true, Vector3.zero));
})
.Button("Object Tracker", () =>
{
ObjectTracker.GenerateElement("New Object Tracker", Guid.NewGuid(), new List<string>(), true, this,
CommandManager.ExecuteCreate(() => ObjectTracker.GenerateElement("New Object Tracker", Guid.NewGuid(), new List<string>(), true, this,
string.Empty, string.Empty, 10, Vector2.zero, Vector2.zero, string.Empty,
false, Vector3.zero, Vector3.zero, string.Empty,
false, Vector3.zero, Vector3.zero, string.Empty);
false, Vector3.zero, Vector3.zero, string.Empty));
})
.Button("Track Global Color Change", () =>
{
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));
CommandManager.ExecuteCreate(() => 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)));
})
.Build();
@@ -126,22 +131,44 @@ namespace Ichni.RhythmGame
{
IHaveInspection qcWindow = inspectorMain.GenerateSecondaryWindow(this, elementName + "'s Quick Copy");
var qcContainer = qcWindow.GenerateContainer();
var qcSubcontainer = qcContainer.GenerateSubcontainer(3);
var xField = qcWindow.GenerateInputField(qcSubcontainer, "X offset", "0");
var yField = qcWindow.GenerateInputField(qcSubcontainer, "Y offset", "0");
var zField = qcWindow.GenerateInputField(qcSubcontainer, "Z offset", "0");
var timeField = qcWindow.GenerateInputField(qcSubcontainer, "Time offset", "0");
var iterationField = qcWindow.GenerateInputField(qcSubcontainer, "Iteration", "0");
var includeAnimationToggle = qcWindow.GenerateToggle(null, qcSubcontainer, "Include Animation", string.Empty);
var movingTrackToggle = qcWindow.GenerateToggle(null, qcSubcontainer, "Moving Track or PathNode", string.Empty);
qcWindow.GenerateButton(this, qcSubcontainer, "Copy", () =>
// 位置偏移
var posSub = qcContainer.GenerateSubcontainer(3);
var xField = qcWindow.GenerateInputField(posSub, "X offset", "0");
var yField = qcWindow.GenerateInputField(posSub, "Y offset", "0");
var zField = qcWindow.GenerateInputField(posSub, "Z offset", "0");
// 旋转偏移(欧拉角)
var rotSub = qcContainer.GenerateSubcontainer(3);
var rotXField = qcWindow.GenerateInputField(rotSub, "Rot X", "0");
var rotYField = qcWindow.GenerateInputField(rotSub, "Rot Y", "0");
var rotZField = qcWindow.GenerateInputField(rotSub, "Rot Z", "0");
// 缩放偏移
var scaleSub = qcContainer.GenerateSubcontainer(3);
var scaleXField = qcWindow.GenerateInputField(scaleSub, "Scale X", "0");
var scaleYField = qcWindow.GenerateInputField(scaleSub, "Scale Y", "0");
var scaleZField = qcWindow.GenerateInputField(scaleSub, "Scale Z", "0");
// 时间 & 迭代
var timeSub = qcContainer.GenerateSubcontainer(3);
var timeField = qcWindow.GenerateInputField(timeSub, "Time offset", "0");
var iterationField = qcWindow.GenerateInputField(timeSub, "Iteration", "1");
// 选项 & 按钮
var toggleSub = qcContainer.GenerateSubcontainer(3);
var includeAnimationToggle = qcWindow.GenerateToggle(null, toggleSub, "Include Animation", string.Empty);
var movingTrackToggle = qcWindow.GenerateToggle(null, toggleSub, "Move Track", string.Empty);
qcWindow.GenerateButton(this, toggleSub, "Copy", () =>
{
Vector3 positionOffset = new Vector3(xField.GetValue<float>(), yField.GetValue<float>(), zField.GetValue<float>());
Vector3 rotationOffset = new Vector3(rotXField.GetValue<float>(), rotYField.GetValue<float>(), rotZField.GetValue<float>());
Vector3 scaleOffset = new Vector3(scaleXField.GetValue<float>(), scaleYField.GetValue<float>(), scaleZField.GetValue<float>());
float timeOffset = timeField.GetValue<float>();
int iteration = iterationField.GetValue<int>();
bool includeAnimation = includeAnimationToggle.toggle.isOn;
bool movingTrack = movingTrackToggle.toggle.isOn;
this.QuickCopy(positionOffset, timeOffset, includeAnimation, iteration, movingTrack);
this.QuickCopy(positionOffset, timeOffset, includeAnimation, iteration, movingTrack, rotationOffset, scaleOffset);
});
})
.Button("Whole Track Move", () =>
@@ -198,7 +225,7 @@ namespace Ichni.RhythmGame
.Span(3)
.Button("Fast Note Tracker", () =>
{
FastNoteTracker.GenerateElement("Fast Note Tracker", Guid.NewGuid(), new List<string>(), true, this);
CommandManager.ExecuteCreate(() => FastNoteTracker.GenerateElement("Fast Note Tracker", Guid.NewGuid(), new List<string>(), true, this));
})
.Span(3)
.Build();
@@ -225,7 +252,7 @@ namespace Ichni.RhythmGame
return notes;
}
[Button("Check Notes")]
public void checkNotes()
{
@@ -252,7 +279,7 @@ namespace Ichni.RhythmGame
}
}
}
[Button("Rebuild")]
public void Rebuild()
{

View File

@@ -1,8 +1,9 @@
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Ichni.RhythmGame;
using Ichni.RhythmGame.Beatmap;
using System.Collections.Generic;
using System.Linq;
using Ichni.Editor.Commands;
using Ichni.RhythmGame;
using Ichni.RhythmGame.Beatmap;
using UnityEngine;
using UnityEngine.InputSystem;
@@ -126,9 +127,9 @@ namespace Ichni.Editor
copiedElement = gameElement;
}
public void PasteElement(GameElement parentElement)
{
if (parentElement == null)
public void PasteElement(GameElement parentElement)
{
if (parentElement == null)
{
LogWindow.Log("No parent element selected to paste.", Color.red);
return;
@@ -137,44 +138,73 @@ namespace Ichni.Editor
if (copiedElement == null)
{
LogWindow.Log("No element copied.");
return;
}
LogWindow.Log("Pasted element: " + copiedElement.elementName + " to " + parentElement.elementName);
pastedElementList = new List<GameElement>();
AffiliatedPaste(copiedElement, parentElement);
// 粘贴完成后,对所有新生成的元素执行 AfterInitialize 和 Refresh
// 与 EditorManager.LoadProject 的加载后流程对齐,确保 Manager 注册等关键步骤不遗漏。
return;
}
CommandManager.ExecuteCommand(new PasteElementCommand(this, copiedElement, parentElement));
}
public GameElement PasteElementRaw(GameElement sourceElement, GameElement parentElement)
{
if (sourceElement == null || parentElement == null) return null;
LogWindow.Log("Pasted element: " + sourceElement.elementName + " to " + parentElement.elementName);
pastedElementList = new List<GameElement>();
AffiliatedPaste(sourceElement, parentElement);
// 粘贴完成后,对所有新生成的元素执行 AfterInitialize 和 Refresh
// 与 EditorManager.LoadProject 的加载后流程对齐,确保 Manager 注册等关键步骤不遗漏。
foreach (GameElement pasted in pastedElementList)
{
if (pasted == null) continue;
pasted.AfterInitialize();
pasted.Refresh();
}
}
public void DeleteElement(GameElement gameElement)
pasted.AfterInitialize();
pasted.Refresh();
}
return pastedElementList.FirstOrDefault();
}
public void DeleteElement(GameElement gameElement)
{
if (gameElement == null)
{
LogWindow.Log("No element selected to delete.", Color.red);
return;
}
LogWindow.Log("Deleted element: " + gameElement.elementName + " and all its children.");
if (gameElement.parentElement != null)
{
gameElement.parentElement.childElementList.Remove(gameElement); //从父物体的子物体列表中移除避免报null
gameElement.parentElement.connectedTab.childTabList.Remove(gameElement.connectedTab);
gameElement.parentElement.connectedTab.SetStatus();
}
EditorManager.instance.operationManager.RemoveSelectElement(gameElement);
gameElement.Delete();
EditorManager.instance.uiManager.inspector.ClearInspector();
}
return;
}
CommandManager.ExecuteCommand(new DeleteElementCommand(gameElement));
}
public void DeleteElementRaw(GameElement gameElement, bool writeLog = true)
{
if (gameElement == null) return;
var deletedElements = gameElement.GetAllGameElementsFromThis();
var deletedGuids = deletedElements.Select(element => element.elementGuid).ToList();
var deletedTabs = deletedElements
.Select(element => element.connectedTab)
.Where(tab => tab != null)
.ToList();
if (writeLog)
LogWindow.Log("Deleted element: " + gameElement.elementName + " and all its children.");
if (gameElement.parentElement != null)
{
gameElement.parentElement.childElementList.Remove(gameElement); //从父物体的子物体列表中移除避免报null
if (gameElement.parentElement.connectedTab != null)
{
gameElement.parentElement.connectedTab.childTabList.Remove(gameElement.connectedTab);
gameElement.parentElement.connectedTab.SetStatus();
}
}
EditorManager.instance.operationManager.RemoveSelectElement(gameElement);
gameElement.Delete();
deletedGuids.ForEach(guid => GameElement_BM.identifier.Remove(guid));
deletedTabs.ForEach(tab => EditorManager.instance.uiManager.hierarchy.tabList.Remove(tab));
EditorManager.instance.uiManager.inspector.ClearInspector();
}
/// <summary>
/// 使用递归的方式复制粘贴物体及其所有子物体

View File

@@ -230,9 +230,15 @@ namespace Ichni
public class BeatmapClipManager
{
private string clipFolder => Application.streamingAssetsPath + "/Clips";
private string GetClipPath(string clipName) => clipFolder + "/" + clipName + ".json";
public void SaveClip(string clipName)
{
LogWindow.Log("Start Saving Clip...");
clipName = clipName?.Trim();
if (!ValidateClipName(clipName)) return;
if (EditorManager.instance.operationManager.currentSelectedElements.Count != 1) // TODO: 后续适应多选
{
@@ -256,8 +262,11 @@ namespace Ichni
public void LoadClip(string clipName)
{
LogWindow.Log("Start Loading Clip...");
clipName = clipName?.Trim();
if (!ES3.FileExists(Application.streamingAssetsPath + "/Clips/" + clipName + ".json"))
if (!ValidateClipName(clipName)) return;
if (!ES3.FileExists(GetClipPath(clipName)))
{
LogWindow.Log("Clip not found", Color.red);
return;
@@ -278,9 +287,10 @@ namespace Ichni
}
Debug.Log(selectedElement.elementName + " " + selectedElement.elementGuid);
_LoadClip(selectedElement, clipName);
LogWindow.Log("Load Clip Complete", Color.green);
if (_LoadClip(selectedElement, clipName))
{
LogWindow.Log("Load Clip Complete", Color.green);
}
}
private void _SaveClip(GameElement element, string clipName)
@@ -290,7 +300,8 @@ namespace Ichni
element.GetAllGameElementsFromThis().ForEach(e =>
{
e.SaveBM();
clip.Add(e.matchedBM);
if (e.matchedBM != null)
clip.Add(e.matchedBM);
e.submoduleList.ForEach(s =>
{
s.SaveBM();
@@ -299,47 +310,59 @@ namespace Ichni
});
});
string filePath = Application.streamingAssetsPath + "/Clips/" + clipName + ".json";
Directory.CreateDirectory(clipFolder);
string filePath = GetClipPath(clipName);
ES3.Save("Clip", clip, filePath, ProjectManager.SaveSettings);
}
private void _LoadClip(GameElement target, string clipName)
private bool _LoadClip(GameElement target, string clipName)
{
try
{
string filePath = Application.streamingAssetsPath + "/Clips/" + clipName + ".json";
string filePath = GetClipPath(clipName);
List<BaseElement_BM> clip = ES3.Load<List<BaseElement_BM>>("Clip", filePath, ProjectManager.SaveSettings);
if (clip == null || clip.Count == 0)
{
Debug.LogError("Clip is empty or null");
return;
LogWindow.Log("Clip is empty or null", Color.red);
return false;
}
// 验证第一个元素
if (!(clip[0] is GameElement_BM first))
{
Debug.LogError("First element is not a GameElement_BM");
return;
LogWindow.Log("First element is not a GameElement_BM", Color.red);
return false;
}
// 处理目标对象 - 添加清理机制
target.SaveBM();
if (target.matchedBM is not GameElement_BM targetBM)
{
LogWindow.Log("Load Clip failed: target did not create a valid BM.", Color.red);
return false;
}
bool targetAdded = GameElement_BM.identifier.TryAdd(target.elementGuid, target.matchedBM as GameElement_BM);
if (!targetAdded)
{
Debug.LogWarning("Target element already exists in identifier dictionary");
}
targetBM.matchedElement = target;
List<GameElement> loadedElements = new List<GameElement>();
// 处理第一个元素及其附加元素
ProcessGameElement(first, clip, target.elementGuid);
if (!ProcessGameElement(first, clip, target.elementGuid, loadedElements)) return false;
// 处理后续元素
for (var index = 1; index < clip.Count; index++)
{
if (clip[index] is GameElement_BM gameElement)
{
ProcessGameElement(gameElement, clip, null);
if (!ProcessGameElement(gameElement, clip, null, loadedElements)) return false;
}
else
{
@@ -348,14 +371,28 @@ namespace Ichni
}
}
EditorManager.instance.beatmapContainer.ExecuteLowPriorityActions();
loadedElements.ForEach(element =>
{
if (element == null) return;
element.AfterInitialize();
element.Refresh();
});
return true;
}
catch (Exception ex)
{
Debug.LogError($"Failed to load clip: {ex.Message}");
LogWindow.Log("Failed to load clip: " + ex.Message, Color.red);
return false;
}
}
private void ProcessGameElement(GameElement_BM gameElement, List<BaseElement_BM> clip, Guid? attachToGuid)
private bool ProcessGameElement(
GameElement_BM gameElement,
List<BaseElement_BM> clip,
Guid? attachToGuid,
List<GameElement> loadedElements)
{
List<BaseElement_BM> attachedElements = GameElement_BM.GetAllAttachedBaseElements(gameElement, clip);
@@ -365,7 +402,8 @@ namespace Ichni
if (!elementAdded)
{
Debug.LogError($"Failed to add element with GUID: {gameElement.elementGuid}");
return;
LogWindow.Log("Failed to add clip element: " + gameElement.elementName, Color.red);
return false;
}
// 更新附加元素
@@ -381,7 +419,31 @@ namespace Ichni
}
gameElement.ExecuteBM();
if (gameElement.matchedElement == null)
{
LogWindow.Log("Failed to generate clip element: " + gameElement.elementName, Color.red);
return false;
}
loadedElements.Add(gameElement.matchedElement);
return true;
}
private bool ValidateClipName(string clipName)
{
if (string.IsNullOrWhiteSpace(clipName))
{
LogWindow.Log("Clip name cannot be empty.", Color.red);
return false;
}
if (clipName.IndexOfAny(Path.GetInvalidFileNameChars()) >= 0)
{
LogWindow.Log("Clip name contains invalid characters.", Color.red);
return false;
}
return true;
}
}

View File

@@ -0,0 +1,692 @@
{
"Clip" : {
"__type" : "System.Collections.Generic.List`1[[Ichni.RhythmGame.Beatmap.BaseElement_BM, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]],mscorlib",
"value" : [
{
"__type" : "Ichni.RhythmGame.Beatmap.ElementFolder_BM,Assembly-CSharp",
"elementName" : "p5",
"tags" : [
],
"elementGuid" : {
"value" : "a9b243b4-13cb-45eb-842b-b523ee1f97f7"
},
"attachedElementGuid" : {
"value" : "00000000-0000-0000-0000-000000000000"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TransformSubmodule_BM,Assembly-CSharp",
"originalPosition" : {
"x" : 100,
"y" : 24,
"z" : 6592.9
},
"originalEulerAngles" : {
"x" : 27.9,
"y" : 25,
"z" : 0
},
"originalScale" : {
"x" : 1,
"y" : 1,
"z" : 1
},
"attachedElementGuid" : {
"value" : "a9b243b4-13cb-45eb-842b-b523ee1f97f7"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp",
"isOverridingDuration" : false,
"startTime" : -32767,
"endTime" : 32767,
"attachedElementGuid" : {
"value" : "a9b243b4-13cb-45eb-842b-b523ee1f97f7"
}
},{
"__type" : "Ichni.RhythmGame.ThemeBundles.DepartureToMultiverse.Beatmap.DTMCircleSpinTrails_BM,Assembly-CSharp",
"particleCount" : 12,
"particleLifetime" : 7,
"colorGradient" : {
"colorKeys" : [
{
"color" : {
"r" : 0.4,
"g" : 0,
"b" : 1,
"a" : 1
},
"time" : 1
},{
"color" : {
"r" : 0,
"g" : 0,
"b" : 1,
"a" : 1
},
"time" : 1
}
],
"alphaKeys" : [
{
"alpha" : 1,
"time" : 0
},{
"alpha" : 1,
"time" : 1
}
],
"mode" : 0
},
"orbitalZSpeed" : 0,
"emissionIntensity" : -10,
"isStatic" : false,
"themeBundleName" : "departure_to_multiverse",
"objectName" : "DTM_CircleSpinTrails",
"elementName" : "New Environment Object",
"tags" : [
],
"elementGuid" : {
"value" : "dca41628-256f-48b8-afae-d337c7f9fa4a"
},
"attachedElementGuid" : {
"value" : "a9b243b4-13cb-45eb-842b-b523ee1f97f7"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TransformSubmodule_BM,Assembly-CSharp",
"originalPosition" : {
"x" : 0,
"y" : 120,
"z" : 0
},
"originalEulerAngles" : {
"x" : 0,
"y" : 0,
"z" : 0
},
"originalScale" : {
"x" : 100,
"y" : 100,
"z" : 1
},
"attachedElementGuid" : {
"value" : "dca41628-256f-48b8-afae-d337c7f9fa4a"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp",
"isOverridingDuration" : false,
"startTime" : -32767,
"endTime" : 32767,
"attachedElementGuid" : {
"value" : "dca41628-256f-48b8-afae-d337c7f9fa4a"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.ColorSubmodule_BM,Assembly-CSharp",
"originalBaseColor" : {
"r" : 1,
"g" : 1,
"b" : 1,
"a" : 1
},
"emissionEnabled" : false,
"originalEmissionColor" : {
"r" : 0,
"g" : 0,
"b" : 0,
"a" : 1
},
"originalEmissionIntensity" : 0,
"attachedElementGuid" : {
"value" : "dca41628-256f-48b8-afae-d337c7f9fa4a"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.PropertyAnimationFloat_BM,Assembly-CSharp",
"componentName" : "Ichni.RhythmGame.ThemeBundles.DepartureToMultiverse.DTMCircleSpinTrails",
"propertyName" : "particleLifetime",
"propertyValue" : {
"animatedFloatList" : [
{
"startValue" : 7,
"endValue" : 7,
"startTime" : 0,
"endTime" : 0.3300003,
"animationCurveType" : 0
},{
"startValue" : 7,
"endValue" : 7,
"startTime" : 95.7001,
"endTime" : 96.03009,
"animationCurveType" : 0
}
]
},
"elementName" : "New Property Animation Float",
"tags" : [
],
"elementGuid" : {
"value" : "dcfa7e41-d664-4c12-964d-6b9e6fe3ffa3"
},
"attachedElementGuid" : {
"value" : "dca41628-256f-48b8-afae-d337c7f9fa4a"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp",
"isOverridingDuration" : false,
"startTime" : -32767,
"endTime" : 32767,
"attachedElementGuid" : {
"value" : "dcfa7e41-d664-4c12-964d-6b9e6fe3ffa3"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.PropertyAnimationFloat_BM,Assembly-CSharp",
"componentName" : "Ichni.RhythmGame.ThemeBundles.DepartureToMultiverse.DTMCircleSpinTrails",
"propertyName" : "orbitalZSpeed",
"propertyValue" : {
"animatedFloatList" : [
{
"startValue" : 0,
"endValue" : 0,
"startTime" : 0,
"endTime" : 1,
"animationCurveType" : 0
},{
"startValue" : 5,
"endValue" : 0,
"startTime" : 95.3701,
"endTime" : 96.0301,
"animationCurveType" : 0
},{
"startValue" : 5,
"endValue" : 0,
"startTime" : 96.3601,
"endTime" : 97.0200958,
"animationCurveType" : 0
},{
"startValue" : 5,
"endValue" : 0,
"startTime" : 97.3501,
"endTime" : 98.01009,
"animationCurveType" : 0
},{
"startValue" : 0,
"endValue" : 2,
"startTime" : 98.3401,
"endTime" : 99.3301,
"animationCurveType" : 0
}
]
},
"elementName" : "New Property Animation Float",
"tags" : [
],
"elementGuid" : {
"value" : "b8444120-d9a1-43bf-8956-d4f4f495ede7"
},
"attachedElementGuid" : {
"value" : "dca41628-256f-48b8-afae-d337c7f9fa4a"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp",
"isOverridingDuration" : false,
"startTime" : -32767,
"endTime" : 32767,
"attachedElementGuid" : {
"value" : "b8444120-d9a1-43bf-8956-d4f4f495ede7"
}
},{
"__type" : "Ichni.RhythmGame.ThemeBundles.DepartureToMultiverse.Beatmap.DTMCircleSpinTrails_BM,Assembly-CSharp",
"particleCount" : 12,
"particleLifetime" : 7,
"colorGradient" : {
"colorKeys" : [
{
"color" : {
"r" : 0,
"g" : 1,
"b" : 1,
"a" : 1
},
"time" : 1
},{
"color" : {
"r" : 0,
"g" : 1,
"b" : 1,
"a" : 1
},
"time" : 1
}
],
"alphaKeys" : [
{
"alpha" : 1,
"time" : 0
},{
"alpha" : 1,
"time" : 1
}
],
"mode" : 0
},
"orbitalZSpeed" : 0,
"emissionIntensity" : -100,
"isStatic" : false,
"themeBundleName" : "departure_to_multiverse",
"objectName" : "DTM_CircleSpinTrails",
"elementName" : "New Environment Object",
"tags" : [
],
"elementGuid" : {
"value" : "87c781ae-eb58-413c-82aa-b203b783eb80"
},
"attachedElementGuid" : {
"value" : "a9b243b4-13cb-45eb-842b-b523ee1f97f7"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TransformSubmodule_BM,Assembly-CSharp",
"originalPosition" : {
"x" : 0,
"y" : 120,
"z" : 0
},
"originalEulerAngles" : {
"x" : 0,
"y" : 0,
"z" : 0
},
"originalScale" : {
"x" : 100,
"y" : 100,
"z" : 1
},
"attachedElementGuid" : {
"value" : "87c781ae-eb58-413c-82aa-b203b783eb80"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp",
"isOverridingDuration" : false,
"startTime" : -32767,
"endTime" : 32767,
"attachedElementGuid" : {
"value" : "87c781ae-eb58-413c-82aa-b203b783eb80"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.ColorSubmodule_BM,Assembly-CSharp",
"originalBaseColor" : {
"r" : 1,
"g" : 1,
"b" : 1,
"a" : 1
},
"emissionEnabled" : false,
"originalEmissionColor" : {
"r" : 0,
"g" : 0,
"b" : 0,
"a" : 1
},
"originalEmissionIntensity" : 0,
"attachedElementGuid" : {
"value" : "87c781ae-eb58-413c-82aa-b203b783eb80"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.PropertyAnimationFloat_BM,Assembly-CSharp",
"componentName" : "Ichni.RhythmGame.ThemeBundles.DepartureToMultiverse.DTMCircleSpinTrails",
"propertyName" : "particleLifetime",
"propertyValue" : {
"animatedFloatList" : [
{
"startValue" : 7,
"endValue" : 7,
"startTime" : 0,
"endTime" : 0.3300003,
"animationCurveType" : 0
},{
"startValue" : 7,
"endValue" : 7,
"startTime" : 95.7001,
"endTime" : 96.03009,
"animationCurveType" : 0
}
]
},
"elementName" : "New Property Animation Float",
"tags" : [
],
"elementGuid" : {
"value" : "ccd883ad-d1e1-4f11-bbca-3cc87fabb994"
},
"attachedElementGuid" : {
"value" : "87c781ae-eb58-413c-82aa-b203b783eb80"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp",
"isOverridingDuration" : false,
"startTime" : -32767,
"endTime" : 32767,
"attachedElementGuid" : {
"value" : "ccd883ad-d1e1-4f11-bbca-3cc87fabb994"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.PropertyAnimationFloat_BM,Assembly-CSharp",
"componentName" : "Ichni.RhythmGame.ThemeBundles.DepartureToMultiverse.DTMCircleSpinTrails",
"propertyName" : "orbitalZSpeed",
"propertyValue" : {
"animatedFloatList" : [
{
"startValue" : 0,
"endValue" : 0,
"startTime" : 0,
"endTime" : 1,
"animationCurveType" : 0
},{
"startValue" : 5,
"endValue" : 0,
"startTime" : 95.3701,
"endTime" : 96.0301,
"animationCurveType" : 0
},{
"startValue" : 5,
"endValue" : 0,
"startTime" : 96.3601,
"endTime" : 97.0201,
"animationCurveType" : 0
},{
"startValue" : 5,
"endValue" : 0,
"startTime" : 97.3501,
"endTime" : 98.01009,
"animationCurveType" : 0
},{
"startValue" : 0,
"endValue" : 1.5,
"startTime" : 98.3401,
"endTime" : 99.3301,
"animationCurveType" : 0
}
]
},
"elementName" : "New Property Animation Float",
"tags" : [
],
"elementGuid" : {
"value" : "33182b59-d291-4b17-9eda-b1f26557812c"
},
"attachedElementGuid" : {
"value" : "87c781ae-eb58-413c-82aa-b203b783eb80"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp",
"isOverridingDuration" : false,
"startTime" : -32767,
"endTime" : 32767,
"attachedElementGuid" : {
"value" : "33182b59-d291-4b17-9eda-b1f26557812c"
}
},{
"__type" : "Ichni.RhythmGame.ThemeBundles.DepartureToMultiverse.Beatmap.DTMCircleSpinTrails_BM,Assembly-CSharp",
"particleCount" : 45,
"particleLifetime" : 7,
"colorGradient" : {
"colorKeys" : [
{
"color" : {
"r" : 1,
"g" : 1,
"b" : 1,
"a" : 1
},
"time" : 1
},{
"color" : {
"r" : 1,
"g" : 1,
"b" : 1,
"a" : 1
},
"time" : 1
}
],
"alphaKeys" : [
{
"alpha" : 1,
"time" : 0
},{
"alpha" : 1,
"time" : 1
}
],
"mode" : 0
},
"orbitalZSpeed" : 0,
"emissionIntensity" : -94.8275452,
"isStatic" : false,
"themeBundleName" : "departure_to_multiverse",
"objectName" : "DTM_CircleSpinTrails",
"elementName" : "New Environment Object",
"tags" : [
],
"elementGuid" : {
"value" : "a831833a-becc-495e-876a-2c3d22154de6"
},
"attachedElementGuid" : {
"value" : "a9b243b4-13cb-45eb-842b-b523ee1f97f7"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TransformSubmodule_BM,Assembly-CSharp",
"originalPosition" : {
"x" : 0,
"y" : 120,
"z" : 0
},
"originalEulerAngles" : {
"x" : 0,
"y" : 0,
"z" : 0
},
"originalScale" : {
"x" : 500,
"y" : 500,
"z" : 1
},
"attachedElementGuid" : {
"value" : "a831833a-becc-495e-876a-2c3d22154de6"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp",
"isOverridingDuration" : false,
"startTime" : -32767,
"endTime" : 32767,
"attachedElementGuid" : {
"value" : "a831833a-becc-495e-876a-2c3d22154de6"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.ColorSubmodule_BM,Assembly-CSharp",
"originalBaseColor" : {
"r" : 1,
"g" : 1,
"b" : 1,
"a" : 1
},
"emissionEnabled" : false,
"originalEmissionColor" : {
"r" : 0,
"g" : 0,
"b" : 0,
"a" : 1
},
"originalEmissionIntensity" : 0,
"attachedElementGuid" : {
"value" : "a831833a-becc-495e-876a-2c3d22154de6"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.PropertyAnimationFloat_BM,Assembly-CSharp",
"componentName" : "Ichni.RhythmGame.ThemeBundles.DepartureToMultiverse.DTMCircleSpinTrails",
"propertyName" : "particleLifetime",
"propertyValue" : {
"animatedFloatList" : [
{
"startValue" : 7,
"endValue" : 7,
"startTime" : 0,
"endTime" : 0.3300003,
"animationCurveType" : 0
},{
"startValue" : 7,
"endValue" : 7,
"startTime" : 95.7001,
"endTime" : 96.03009,
"animationCurveType" : 0
}
]
},
"elementName" : "New Property Animation Float",
"tags" : [
],
"elementGuid" : {
"value" : "ce56385d-2285-4507-a467-94ee7ad5a3c5"
},
"attachedElementGuid" : {
"value" : "a831833a-becc-495e-876a-2c3d22154de6"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp",
"isOverridingDuration" : false,
"startTime" : -32767,
"endTime" : 32767,
"attachedElementGuid" : {
"value" : "ce56385d-2285-4507-a467-94ee7ad5a3c5"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.PropertyAnimationFloat_BM,Assembly-CSharp",
"componentName" : "Ichni.RhythmGame.ThemeBundles.DepartureToMultiverse.DTMCircleSpinTrails",
"propertyName" : "orbitalZSpeed",
"propertyValue" : {
"animatedFloatList" : [
{
"startValue" : 0,
"endValue" : 0,
"startTime" : 0,
"endTime" : 1,
"animationCurveType" : 0
},{
"startValue" : 5,
"endValue" : 0,
"startTime" : 95.3701,
"endTime" : 96.0301,
"animationCurveType" : 0
},{
"startValue" : 5,
"endValue" : 0,
"startTime" : 96.3601,
"endTime" : 97.0201,
"animationCurveType" : 0
},{
"startValue" : 5,
"endValue" : 0,
"startTime" : 97.3501,
"endTime" : 98.01009,
"animationCurveType" : 0
},{
"startValue" : 0,
"endValue" : 0.5,
"startTime" : 98.3401,
"endTime" : 99.3301,
"animationCurveType" : 0
}
]
},
"elementName" : "New Property Animation Float",
"tags" : [
],
"elementGuid" : {
"value" : "6b8b26d0-4f89-4164-b5f8-26cfd8a5c822"
},
"attachedElementGuid" : {
"value" : "a831833a-becc-495e-876a-2c3d22154de6"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp",
"isOverridingDuration" : false,
"startTime" : -32767,
"endTime" : 32767,
"attachedElementGuid" : {
"value" : "6b8b26d0-4f89-4164-b5f8-26cfd8a5c822"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.Displacement_BM,Assembly-CSharp",
"positionX" : {
"animatedFloatList" : [
{
"startValue" : 0,
"endValue" : 0,
"startTime" : 0,
"endTime" : 1,
"animationCurveType" : 0
}
]
},
"positionY" : {
"animatedFloatList" : [
{
"startValue" : 0,
"endValue" : 0,
"startTime" : 0,
"endTime" : 1,
"animationCurveType" : 0
}
]
},
"positionZ" : {
"animatedFloatList" : [
{
"startValue" : 0,
"endValue" : 0,
"startTime" : 0,
"endTime" : 1,
"animationCurveType" : 0
},{
"startValue" : 0,
"endValue" : 290,
"startTime" : 98.3401,
"endTime" : 99.33,
"animationCurveType" : 0
},{
"startValue" : 290,
"endValue" : 2315,
"startTime" : 99.33,
"endTime" : 131.01,
"animationCurveType" : 0
}
]
},
"elementName" : "New Displacement",
"tags" : [
],
"elementGuid" : {
"value" : "3130f797-6121-4900-9d5c-cb2f71dc2943"
},
"attachedElementGuid" : {
"value" : "a9b243b4-13cb-45eb-842b-b523ee1f97f7"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp",
"isOverridingDuration" : false,
"startTime" : -32767,
"endTime" : 32767,
"attachedElementGuid" : {
"value" : "3130f797-6121-4900-9d5c-cb2f71dc2943"
}
}
]
}
}

View File

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