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

View File

@@ -1,5 +1,6 @@
using System.Collections; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Ichni.RhythmGame;
using UnityEngine; using UnityEngine;
namespace Ichni.Editor.Commands namespace Ichni.Editor.Commands
@@ -14,6 +15,8 @@ namespace Ichni.Editor.Commands
/// </summary> /// </summary>
public static void ExecuteCommand(ICommand command) public static void ExecuteCommand(ICommand command)
{ {
if (command == null) return;
if (undoStack.Count > 0) if (undoStack.Count > 0)
{ {
var topCommand = undoStack.Peek(); var topCommand = undoStack.Peek();
@@ -28,7 +31,14 @@ namespace Ichni.Editor.Commands
// 新操作彻底切断原本可能存在的重做未来 // 新操作彻底切断原本可能存在的重做未来
command.Execute(); command.Execute();
undoStack.Push(command); 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() 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.Collections.Generic;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using Ichni.Editor.Commands;
using Ichni.RhythmGame; using Ichni.RhythmGame;
using Lean.Pool; using Lean.Pool;
using UnityEngine; using UnityEngine;
@@ -784,29 +785,29 @@ namespace Ichni.Editor
builder builder
.Button("Displacement", () => .Button("Displacement", () =>
Displacement.GenerateElement("New Displacement", Guid.NewGuid(), CommandManager.ExecuteCreate(() => Displacement.GenerateElement("New Displacement", Guid.NewGuid(),
new List<string>(), true, gameElement, 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", () => .Button("Swirl", () =>
Swirl.GenerateElement("New Swirl", Guid.NewGuid(), CommandManager.ExecuteCreate(() => Swirl.GenerateElement("New Swirl", Guid.NewGuid(),
new List<string>(), true, gameElement, 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", () => .Button("Scale", () =>
Scale.GenerateElement("New Scale", Guid.NewGuid(), CommandManager.ExecuteCreate(() => Scale.GenerateElement("New Scale", Guid.NewGuid(),
new List<string>(), true, gameElement, 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", () => .Button("Look At", () =>
LookAt.GenerateElement("New Look At", Guid.NewGuid(), CommandManager.ExecuteCreate(() => LookAt.GenerateElement("New Look At", Guid.NewGuid(),
new List<string>(), true, gameElement, null, new FlexibleBool())) new List<string>(), true, gameElement, null, new FlexibleBool())))
.Button("Displacement Tracker", () => .Button("Displacement Tracker", () =>
DisplacementTracker.GenerateElement("New Displacement Tracker", Guid.NewGuid(), CommandManager.ExecuteCreate(() => DisplacementTracker.GenerateElement("New Displacement Tracker", Guid.NewGuid(),
new List<string>(), true, gameElement, null, 0f)) new List<string>(), true, gameElement, null, 0f)))
.Button("Swirl Tracker", () => .Button("Swirl Tracker", () =>
SwirlTracker.GenerateElement("New Swirl Tracker", Guid.NewGuid(), CommandManager.ExecuteCreate(() => SwirlTracker.GenerateElement("New Swirl Tracker", Guid.NewGuid(),
new List<string>(), true, gameElement, null, 0f)) new List<string>(), true, gameElement, null, 0f)))
.Button("Scale Tracker", () => .Button("Scale Tracker", () =>
ScaleTracker.GenerateElement("New Scale Tracker", Guid.NewGuid(), CommandManager.ExecuteCreate(() => ScaleTracker.GenerateElement("New Scale Tracker", Guid.NewGuid(),
new List<string>(), true, gameElement, null, 0f)); new List<string>(), true, gameElement, null, 0f)));
} }
// ════════════════════════════════════════════════════════ // ════════════════════════════════════════════════════════

View File

@@ -4,6 +4,7 @@ using System.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
using DG.Tweening; using DG.Tweening;
using Lean.Pool; using Lean.Pool;
using Ichni.Editor.Commands;
using Ichni.RhythmGame; using Ichni.RhythmGame;
using Unity.VisualScripting; using Unity.VisualScripting;
using UnityEngine; using UnityEngine;
@@ -24,7 +25,8 @@ namespace Ichni.Editor
tabList = new List<HierarchyTab>(); tabList = new List<HierarchyTab>();
addFolderButton.onClick.AddListener(() => 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); expandButtom.onClick.AddListener(Expand);
rectTransform = this.GetComponent<RectTransform>(); rectTransform = this.GetComponent<RectTransform>();
@@ -201,4 +203,4 @@ namespace Ichni.Editor
upLoadElement = null; upLoadElement = null;
} }
} }
} }

View File

@@ -176,13 +176,7 @@ namespace Ichni.Editor
private void GenerateSaveClipWindow() private void GenerateSaveClipWindow()
{ {
GameElement currentElement = EditorManager.instance.operationManager.currentSelectedElements[0]; if (!TryGetSingleSelectedElementForClip(out GameElement currentElement)) return;
if (currentElement == null)
{
LogWindow.Log("No Game Element selected.", Color.red);
return;
}
if (clipManagementWindow != null) if (clipManagementWindow != null)
{ {
@@ -208,15 +202,7 @@ namespace Ichni.Editor
private void GenerateLoadClipWindow() private void GenerateLoadClipWindow()
{ {
GameElement currentElement = EditorManager.instance.operationManager.currentSelectedElements[0]; if (!TryGetSingleSelectedElementForClip(out GameElement currentElement)) return;
if (currentElement == null)
{
LogWindow.Log("No Game Element selected.", Color.red);
return;
}
GameElement loadTarget = currentElement == EditorManager.instance ? null : currentElement.parentElement;
if (clipManagementWindow != null) 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() private void GenerateMergeWindow()
{ {
GeneralSecondaryWindow mergeWindow = Instantiate(EditorManager.instance.basePrefabs.generalSecondaryWindow, GeneralSecondaryWindow mergeWindow = Instantiate(EditorManager.instance.basePrefabs.generalSecondaryWindow,

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Ichni.Editor; using Ichni.Editor;
using Ichni.Editor.Commands;
using Ichni.RhythmGame.Beatmap; using Ichni.RhythmGame.Beatmap;
using UnityEngine; using UnityEngine;
@@ -84,9 +85,9 @@ namespace Ichni.RhythmGame
{ {
if (skyboxSubsetter == null) 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>(), 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 else
{ {

View File

@@ -2,6 +2,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using Ichni.Editor; using Ichni.Editor;
using Ichni.Editor.Commands;
using Ichni.RhythmGame.Beatmap; using Ichni.RhythmGame.Beatmap;
namespace Ichni.RhythmGame namespace Ichni.RhythmGame
@@ -75,7 +76,7 @@ namespace Ichni.RhythmGame
.Section("Note Visual") .Section("Note Visual")
.Button("Generate 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) .EnabledIf(() => noteVisual == null)
.Build(); .Build();

View File

@@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Ichni.Editor; using Ichni.Editor;
using Ichni.Editor.Commands;
using Ichni.RhythmGame.Beatmap; using Ichni.RhythmGame.Beatmap;
namespace Ichni.RhythmGame namespace Ichni.RhythmGame
@@ -38,13 +39,13 @@ namespace Ichni.RhythmGame
public void GenerateBaseColorChange() 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, 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.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.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.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) }) new FlexibleFloat(new List<AnimatedFloat> { new AnimatedFloat(0f, 0.1f, colorSubmodule.originalBaseColor.a, colorSubmodule.originalBaseColor.a, animationCurveType: AnimationCurveType.Linear) })
); ));
} }
#endregion #endregion

View File

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

View File

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

View File

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

View File

@@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Ichni.Editor; using Ichni.Editor;
using Ichni.Editor.Commands;
using Ichni.RhythmGame.Beatmap; using Ichni.RhythmGame.Beatmap;
namespace Ichni.RhythmGame namespace Ichni.RhythmGame
@@ -27,7 +28,7 @@ namespace Ichni.RhythmGame
.OnChanged(ClosePath) .OnChanged(ClosePath)
.Button("Generate Path Node", () => .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") .Toggle(nameof(isShowingDisplay), "Show Display")
.OnChanged(() => SetDisplay(isShowingDisplay)) .OnChanged(() => SetDisplay(isShowingDisplay))

View File

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

View File

@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using ichni.RhythmGame; using ichni.RhythmGame;
using Ichni.Editor; using Ichni.Editor;
using Ichni.Editor.Commands;
using Ichni.RhythmGame.Beatmap; using Ichni.RhythmGame.Beatmap;
using Sirenix.OdinInspector; using Sirenix.OdinInspector;
using UnityEngine; using UnityEngine;
@@ -79,41 +80,45 @@ namespace Ichni.RhythmGame
.Section("Generate Elements", sectionOrder: 20) .Section("Generate Elements", sectionOrder: 20)
.Button("Path Node", () => .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) .EnabledIf(() => trackPathSubmodule != null)
.Button("Track Percent Point", () => .Button("Track Percent Point", () =>
{ {
var a = TrackPercentPoint.GenerateElement("New Track Percent Point", Guid.NewGuid(), new List<string>(), true, this, new FlexibleFloat()); CommandManager.ExecuteCreate(() =>
if (trackTimeSubmodule != null && trackTimeSubmodule is TrackTimeSubmoduleMovable trackTimeSubmoduleMovable) {
a.trackPercent.Add( var a = TrackPercentPoint.GenerateElement("New Track Percent Point", Guid.NewGuid(), new List<string>(), true, this, new FlexibleFloat());
new AnimatedFloat(trackTimeSubmoduleMovable.trackStartTime, trackTimeSubmoduleMovable.trackEndTime, 0, 1, AnimationCurveType.Linear)); 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", () => .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) .EnabledIf(() => trackTimeSubmodule is TrackTimeSubmoduleMovable)
.Button("Tap", () => Tap.GenerateElement("New Tap", Guid.NewGuid(), new List<string>(), true, this, 0f)) .Button("Tap", () => CommandManager.ExecuteCreate(() => 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("Stay", () => CommandManager.ExecuteCreate(() => 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("Hold", () => CommandManager.ExecuteCreate(() => 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("Flick", () => CommandManager.ExecuteCreate(() => Flick.GenerateElement("New Flick", Guid.NewGuid(), new List<string>(), true, this, 0f, new List<Vector2>())))
.Button("Particle Tracker", () => .Button("Particle Tracker", () =>
{ {
ParticleTracker.GenerateElement("New Particle Tracker", Guid.NewGuid(), new List<string>(), true, this, 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); string.Empty, string.Empty, false, 0, 1, false, 10, Vector3.right, 10, 5, true, Vector3.zero));
}) })
.Button("Object Tracker", () => .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, 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); false, Vector3.zero, Vector3.zero, string.Empty));
}) })
.Button("Track Global Color Change", () => .Button("Track Global Color Change", () =>
{ {
TrackGlobalColorChange.GenerateElement("New Track Global Color Change", Guid.NewGuid(), new List<string>(), true, this, 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)); new FlexibleFloat(true), new FlexibleFloat(true), new FlexibleFloat(true), new FlexibleFloat(true)));
}) })
.Build(); .Build();
@@ -126,22 +131,44 @@ namespace Ichni.RhythmGame
{ {
IHaveInspection qcWindow = inspectorMain.GenerateSecondaryWindow(this, elementName + "'s Quick Copy"); IHaveInspection qcWindow = inspectorMain.GenerateSecondaryWindow(this, elementName + "'s Quick Copy");
var qcContainer = qcWindow.GenerateContainer(); 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 posSub = qcContainer.GenerateSubcontainer(3);
var zField = qcWindow.GenerateInputField(qcSubcontainer, "Z offset", "0"); var xField = qcWindow.GenerateInputField(posSub, "X offset", "0");
var timeField = qcWindow.GenerateInputField(qcSubcontainer, "Time offset", "0"); var yField = qcWindow.GenerateInputField(posSub, "Y offset", "0");
var iterationField = qcWindow.GenerateInputField(qcSubcontainer, "Iteration", "0"); var zField = qcWindow.GenerateInputField(posSub, "Z offset", "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 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 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>(); float timeOffset = timeField.GetValue<float>();
int iteration = iterationField.GetValue<int>(); int iteration = iterationField.GetValue<int>();
bool includeAnimation = includeAnimationToggle.toggle.isOn; bool includeAnimation = includeAnimationToggle.toggle.isOn;
bool movingTrack = movingTrackToggle.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", () => .Button("Whole Track Move", () =>
@@ -198,7 +225,7 @@ namespace Ichni.RhythmGame
.Span(3) .Span(3)
.Button("Fast Note Tracker", () => .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) .Span(3)
.Build(); .Build();
@@ -225,7 +252,7 @@ namespace Ichni.RhythmGame
return notes; return notes;
} }
[Button("Check Notes")] [Button("Check Notes")]
public void checkNotes() public void checkNotes()
{ {
@@ -252,7 +279,7 @@ namespace Ichni.RhythmGame
} }
} }
} }
[Button("Rebuild")] [Button("Rebuild")]
public void Rebuild() public void Rebuild()
{ {

View File

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

View File

@@ -230,9 +230,15 @@ namespace Ichni
public class BeatmapClipManager public class BeatmapClipManager
{ {
private string clipFolder => Application.streamingAssetsPath + "/Clips";
private string GetClipPath(string clipName) => clipFolder + "/" + clipName + ".json";
public void SaveClip(string clipName) public void SaveClip(string clipName)
{ {
LogWindow.Log("Start Saving Clip..."); LogWindow.Log("Start Saving Clip...");
clipName = clipName?.Trim();
if (!ValidateClipName(clipName)) return;
if (EditorManager.instance.operationManager.currentSelectedElements.Count != 1) // TODO: 后续适应多选 if (EditorManager.instance.operationManager.currentSelectedElements.Count != 1) // TODO: 后续适应多选
{ {
@@ -256,8 +262,11 @@ namespace Ichni
public void LoadClip(string clipName) public void LoadClip(string clipName)
{ {
LogWindow.Log("Start Loading Clip..."); 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); LogWindow.Log("Clip not found", Color.red);
return; return;
@@ -278,9 +287,10 @@ namespace Ichni
} }
Debug.Log(selectedElement.elementName + " " + selectedElement.elementGuid); Debug.Log(selectedElement.elementName + " " + selectedElement.elementGuid);
_LoadClip(selectedElement, clipName); if (_LoadClip(selectedElement, clipName))
{
LogWindow.Log("Load Clip Complete", Color.green); LogWindow.Log("Load Clip Complete", Color.green);
}
} }
private void _SaveClip(GameElement element, string clipName) private void _SaveClip(GameElement element, string clipName)
@@ -290,7 +300,8 @@ namespace Ichni
element.GetAllGameElementsFromThis().ForEach(e => element.GetAllGameElementsFromThis().ForEach(e =>
{ {
e.SaveBM(); e.SaveBM();
clip.Add(e.matchedBM); if (e.matchedBM != null)
clip.Add(e.matchedBM);
e.submoduleList.ForEach(s => e.submoduleList.ForEach(s =>
{ {
s.SaveBM(); 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); ES3.Save("Clip", clip, filePath, ProjectManager.SaveSettings);
} }
private void _LoadClip(GameElement target, string clipName) private bool _LoadClip(GameElement target, string clipName)
{ {
try 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); List<BaseElement_BM> clip = ES3.Load<List<BaseElement_BM>>("Clip", filePath, ProjectManager.SaveSettings);
if (clip == null || clip.Count == 0) if (clip == null || clip.Count == 0)
{ {
Debug.LogError("Clip is empty or null"); 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)) if (!(clip[0] is GameElement_BM first))
{ {
Debug.LogError("First element is not a GameElement_BM"); 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(); 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); bool targetAdded = GameElement_BM.identifier.TryAdd(target.elementGuid, target.matchedBM as GameElement_BM);
if (!targetAdded) if (!targetAdded)
{ {
Debug.LogWarning("Target element already exists in identifier dictionary"); 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++) for (var index = 1; index < clip.Count; index++)
{ {
if (clip[index] is GameElement_BM gameElement) if (clip[index] is GameElement_BM gameElement)
{ {
ProcessGameElement(gameElement, clip, null); if (!ProcessGameElement(gameElement, clip, null, loadedElements)) return false;
} }
else 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) catch (Exception ex)
{ {
Debug.LogError($"Failed to load clip: {ex.Message}"); 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); List<BaseElement_BM> attachedElements = GameElement_BM.GetAllAttachedBaseElements(gameElement, clip);
@@ -365,7 +402,8 @@ namespace Ichni
if (!elementAdded) if (!elementAdded)
{ {
Debug.LogError($"Failed to add element with GUID: {gameElement.elementGuid}"); 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(); 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: