diff --git a/.DS_Store b/.DS_Store
index fc6ec49c..0ebab392 100644
Binary files a/.DS_Store and b/.DS_Store differ
diff --git a/Assets/.DS_Store b/Assets/.DS_Store
index 501c8837..1dc2194e 100644
Binary files a/Assets/.DS_Store and b/Assets/.DS_Store differ
diff --git a/Assets/Editor.meta b/Assets/Editor.meta
new file mode 100644
index 00000000..02bc588b
--- /dev/null
+++ b/Assets/Editor.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 392d1d53b7aae498487d4fe9604f15cc
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Editor/AssetBundleComponent.cs b/Assets/Editor/AssetBundleComponent.cs
new file mode 100644
index 00000000..188c4473
--- /dev/null
+++ b/Assets/Editor/AssetBundleComponent.cs
@@ -0,0 +1,62 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using Ichni;
+using UnityEditor;
+using UnityEngine;
+
+///
+/// AssetBundle 打包工具
+///
+public class BuildAssetBundle
+{
+ private static string BuildPrepare()
+ {
+ // 打包AB输出路径
+ string strABOutPAthDir = string.Empty;
+
+ // 获取“StreamingAssets”文件夹路径(不一定这个文件夹,可自定义)
+ strABOutPAthDir = Application.streamingAssetsPath + "/ThemeBundles";
+
+ // 判断文件夹是否存在,不存在则新建
+ if (Directory.Exists(strABOutPAthDir) == false)
+ {
+ Directory.CreateDirectory(strABOutPAthDir);
+ }
+
+ return strABOutPAthDir;
+ }
+
+ private static void GenerateAbstracts(AssetBundleManifest manifest)
+ {
+ List themeBundles = manifest.GetAllAssetBundles().ToList();
+ foreach (string bundle in themeBundles)
+ {
+ string uriAbs = Application.streamingAssetsPath + "/ThemeBundles/" + bundle + ".abs";
+ Debug.Log(uriAbs);
+ if (!ES3.FileExists(uriAbs))
+ {
+ ThemeBundleAbstract abs = new ThemeBundleAbstract(bundle);
+ ES3.Save("ThemeBundleAbstract", abs, uriAbs);
+ }
+ }
+ }
+
+ [MenuItem("AssetBundleTools/BuildToWindows64")]
+ public static void BuildToWindows64()
+ {
+ string uri = BuildPrepare() + "/Windows64";
+ AssetBundleManifest manifestWin64 = BuildPipeline.BuildAssetBundles(uri, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
+ GenerateAbstracts(manifestWin64);
+ }
+
+ [MenuItem("AssetBundleTools/BuildToOSX")]
+ public static void BuildToOSX()
+ {
+ string uri = BuildPrepare() + "/OSX";
+ AssetBundleManifest manifestOSX = BuildPipeline.BuildAssetBundles(uri, BuildAssetBundleOptions.None, BuildTarget.StandaloneOSX);
+ GenerateAbstracts(manifestOSX);
+ }
+}
\ No newline at end of file
diff --git a/Assets/Editor/AssetBundleComponent.cs.meta b/Assets/Editor/AssetBundleComponent.cs.meta
new file mode 100644
index 00000000..cdca955c
--- /dev/null
+++ b/Assets/Editor/AssetBundleComponent.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 8490cfc5a68124e599aee3e07c8f9cfd
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Prefabs/GameElements.meta b/Assets/Prefabs/GameElements.meta
new file mode 100644
index 00000000..8db4087a
--- /dev/null
+++ b/Assets/Prefabs/GameElements.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 17a9645190739456285c104d5a23c342
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Prefabs/ElementFolder.prefab b/Assets/Prefabs/GameElements/ElementFolder.prefab
similarity index 100%
rename from Assets/Prefabs/ElementFolder.prefab
rename to Assets/Prefabs/GameElements/ElementFolder.prefab
diff --git a/Assets/Prefabs/ElementFolder.prefab.meta b/Assets/Prefabs/GameElements/ElementFolder.prefab.meta
similarity index 100%
rename from Assets/Prefabs/ElementFolder.prefab.meta
rename to Assets/Prefabs/GameElements/ElementFolder.prefab.meta
diff --git a/Assets/Prefabs/EmptyObject.prefab b/Assets/Prefabs/GameElements/EmptyObject.prefab
similarity index 100%
rename from Assets/Prefabs/EmptyObject.prefab
rename to Assets/Prefabs/GameElements/EmptyObject.prefab
diff --git a/Assets/Prefabs/EmptyObject.prefab.meta b/Assets/Prefabs/GameElements/EmptyObject.prefab.meta
similarity index 100%
rename from Assets/Prefabs/EmptyObject.prefab.meta
rename to Assets/Prefabs/GameElements/EmptyObject.prefab.meta
diff --git a/Assets/Prefabs/GameElements/GameCamera.prefab b/Assets/Prefabs/GameElements/GameCamera.prefab
new file mode 100644
index 00000000..a858469d
--- /dev/null
+++ b/Assets/Prefabs/GameElements/GameCamera.prefab
@@ -0,0 +1,809 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &10333948111691042
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 5840097170757975722}
+ - component: {fileID: 7025203609509180022}
+ m_Layer: 0
+ m_Name: GameCamera
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &5840097170757975722
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 10333948111691042}
+ serializedVersion: 2
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 373065448631755357}
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &7025203609509180022
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 10333948111691042}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 79d811a12f27f43629797719fcbfc6ae, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ serializationData:
+ SerializedFormat: 2
+ SerializedBytes:
+ ReferencedUnityObjects: []
+ SerializedBytesString:
+ Prefab: {fileID: 0}
+ PrefabModificationsReferencedUnityObjects: []
+ PrefabModifications: []
+ SerializationNodes:
+ - Name: elementGuid
+ Entry: 2
+ Data: 702c793776b444d3ad481072561faaec
+ - Name: timeDurationSubmodule
+ Entry: 7
+ Data: 0|Ichni.RhythmGame.TimeDurationSubmodule, Assembly-CSharp
+ - Name: isOverridingDuration
+ Entry: 5
+ Data: false
+ - Name: startTime
+ Entry: 4
+ Data: 0
+ - Name: endTime
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 8
+ Data:
+ - Name: transformSubmodule
+ Entry: 7
+ Data: 1|Ichni.RhythmGame.TransformSubmodule, Assembly-CSharp
+ - Name: originalPosition
+ Entry: 7
+ Data: UnityEngine.Vector3, UnityEngine.CoreModule
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 8
+ Data:
+ - Name: originalEulerAngles
+ Entry: 7
+ Data: UnityEngine.Vector3, UnityEngine.CoreModule
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 8
+ Data:
+ - Name: originalScale
+ Entry: 7
+ Data: UnityEngine.Vector3, UnityEngine.CoreModule
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 8
+ Data:
+ - Name: positionOffset
+ Entry: 7
+ Data: 2|System.Collections.Generic.List`1[[UnityEngine.Vector3, UnityEngine.CoreModule]],
+ mscorlib
+ - Name:
+ Entry: 12
+ Data: 0
+ - Name:
+ Entry: 13
+ Data:
+ - Name:
+ Entry: 8
+ Data:
+ - Name: eulerAnglesOffset
+ Entry: 7
+ Data: 3|System.Collections.Generic.List`1[[UnityEngine.Vector3, UnityEngine.CoreModule]],
+ mscorlib
+ - Name:
+ Entry: 12
+ Data: 0
+ - Name:
+ Entry: 13
+ Data:
+ - Name:
+ Entry: 8
+ Data:
+ - Name: scaleOffset
+ Entry: 7
+ Data: 4|System.Collections.Generic.List`1[[UnityEngine.Vector3, UnityEngine.CoreModule]],
+ mscorlib
+ - Name:
+ Entry: 12
+ Data: 0
+ - Name:
+ Entry: 13
+ Data:
+ - Name:
+ Entry: 8
+ Data:
+ - Name: currentPosition
+ Entry: 7
+ Data: UnityEngine.Vector3, UnityEngine.CoreModule
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 8
+ Data:
+ - Name: currentEulerAngles
+ Entry: 7
+ Data: UnityEngine.Vector3, UnityEngine.CoreModule
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 8
+ Data:
+ - Name: currentScale
+ Entry: 7
+ Data: UnityEngine.Vector3, UnityEngine.CoreModule
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 8
+ Data:
+ - Name: positionDirtyMark
+ Entry: 5
+ Data: false
+ - Name: eulerAnglesDirtyMark
+ Entry: 5
+ Data: false
+ - Name: scaleDirtyMark
+ Entry: 5
+ Data: false
+ - Name: eulerAnglesOffsetLock
+ Entry: 5
+ Data: false
+ - Name: OnPositionChanged
+ Entry: 6
+ Data:
+ - Name: OnEulerAnglesChanged
+ Entry: 6
+ Data:
+ - Name: OnScaleChanged
+ Entry: 6
+ Data:
+ - Name:
+ Entry: 8
+ Data:
+ - Name: colorSubmodule
+ Entry: 6
+ Data:
+ elementName:
+ serialNumber: 0
+ parentElement: {fileID: 0}
+ childElementList: []
+ camera: {fileID: 1378655914364111770}
+ rotationPoint: {fileID: 373065448631755357}
+ positionPoint: {fileID: 2202765603615894048}
+ cameraTransform: {fileID: 4681825519897212372}
+ cameraViewType: 0
+ perspectiveAngle: 60
+ orthographicSize: 10
+--- !u!1 &261765279725222738
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 373065448631755357}
+ m_Layer: 0
+ m_Name: RotationPoint
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &373065448631755357
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 261765279725222738}
+ serializedVersion: 2
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 2202765603615894048}
+ m_Father: {fileID: 5840097170757975722}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &816955147983443379
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 2202765603615894048}
+ m_Layer: 0
+ m_Name: PositionPoint
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &2202765603615894048
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 816955147983443379}
+ serializedVersion: 2
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 4681825519897212372}
+ m_Father: {fileID: 373065448631755357}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &8526474044217039555
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 4681825519897212372}
+ - component: {fileID: 1378655914364111770}
+ - component: {fileID: 7108567356200093580}
+ - component: {fileID: 2072332804138453357}
+ - component: {fileID: 8132557174609694425}
+ - component: {fileID: 854107432770048664}
+ - component: {fileID: 5126086572364088879}
+ m_Layer: 0
+ m_Name: Main Camera
+ m_TagString: MainCamera
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &4681825519897212372
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8526474044217039555}
+ serializedVersion: 2
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 2202765603615894048}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!20 &1378655914364111770
+Camera:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8526474044217039555}
+ m_Enabled: 1
+ serializedVersion: 2
+ m_ClearFlags: 1
+ m_BackGroundColor: {r: 0, g: 0, b: 0, a: 1}
+ m_projectionMatrixMode: 1
+ m_GateFitMode: 2
+ m_FOVAxisMode: 0
+ m_Iso: 200
+ m_ShutterSpeed: 0.005
+ m_Aperture: 16
+ m_FocusDistance: 10
+ m_FocalLength: 50
+ m_BladeCount: 5
+ m_Curvature: {x: 2, y: 11}
+ m_BarrelClipping: 0.25
+ m_Anamorphism: 0
+ m_SensorSize: {x: 36, y: 24}
+ m_LensShift: {x: 0, y: 0}
+ m_NormalizedViewPortRect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 1
+ height: 1
+ near clip plane: 0.3
+ far clip plane: 1000
+ field of view: 60
+ orthographic: 0
+ orthographic size: 5
+ m_Depth: -1
+ m_CullingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+ m_RenderingPath: -1
+ m_TargetTexture: {fileID: 0}
+ m_TargetDisplay: 0
+ m_TargetEye: 3
+ m_HDR: 1
+ m_AllowMSAA: 1
+ m_AllowDynamicResolution: 0
+ m_ForceIntoRT: 0
+ m_OcclusionCulling: 1
+ m_StereoConvergence: 10
+ m_StereoSeparation: 0.022
+--- !u!81 &7108567356200093580
+AudioListener:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8526474044217039555}
+ m_Enabled: 1
+--- !u!114 &2072332804138453357
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8526474044217039555}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_RenderShadows: 1
+ m_RequiresDepthTextureOption: 2
+ m_RequiresOpaqueTextureOption: 2
+ m_CameraType: 0
+ m_Cameras: []
+ m_RendererIndex: -1
+ m_VolumeLayerMask:
+ serializedVersion: 2
+ m_Bits: 1
+ m_VolumeTrigger: {fileID: 0}
+ m_VolumeFrameworkUpdateModeOption: 2
+ m_RenderPostProcessing: 1
+ m_Antialiasing: 0
+ m_AntialiasingQuality: 2
+ m_StopNaN: 0
+ m_Dithering: 0
+ m_ClearDepth: 1
+ m_AllowXRRendering: 1
+ m_AllowHDROutput: 1
+ m_UseScreenCoordOverride: 0
+ m_ScreenSizeOverride: {x: 0, y: 0, z: 0, w: 0}
+ m_ScreenCoordScaleBias: {x: 0, y: 0, z: 0, w: 0}
+ m_RequiresDepthTexture: 0
+ m_RequiresColorTexture: 0
+ m_Version: 2
+ m_TaaSettings:
+ m_Quality: 3
+ m_FrameInfluence: 0.1
+ m_JitterScale: 1
+ m_MipBias: 0
+ m_VarianceClampScale: 0.9
+ m_ContrastAdaptiveSharpening: 0
+--- !u!114 &8132557174609694425
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8526474044217039555}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 347013242dca7c44fb5001793033ea59, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ UpdateMode: 0
+ PositionActive: 0
+ RotationActive: 0
+ ScaleActive: 0
+ PositionWiggleProperties:
+ WigglePermitted: 1
+ WiggleType: 1
+ UseUnscaledTime: 0
+ TimeMultiplier: 1
+ StartWigglingAutomatically: 1
+ SmoothPingPong: 1
+ UseSpeedCurve: 0
+ SpeedCurve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 0
+ inSlope: 0
+ outSlope: 1
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: 0
+ outWeight: 0
+ - serializedVersion: 3
+ time: 1
+ value: 1
+ inSlope: 1
+ outSlope: 0
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: 0
+ outWeight: 0
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ FrequencyMin: 0
+ FrequencyMax: 1
+ AmplitudeMin: {x: 0, y: 0, z: 0}
+ AmplitudeMax: {x: 1, y: 1, z: 1}
+ RelativeAmplitude: 1
+ UniformValues: 0
+ ForceVectorLength: 0
+ ForcedVectorLength: 1
+ Curve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 0
+ inSlope: 0
+ outSlope: 1
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: 0
+ outWeight: 0
+ - serializedVersion: 3
+ time: 1
+ value: 1
+ inSlope: 1
+ outSlope: 0
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: 0
+ outWeight: 0
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ RemapCurveZeroMin: {x: 0, y: 0, z: 0}
+ RemapCurveZeroMax: {x: 0, y: 0, z: 0}
+ RemapCurveOneMin: {x: 1, y: 1, z: 1}
+ RemapCurveOneMax: {x: 1, y: 1, z: 1}
+ RelativeCurveAmplitude: 1
+ CurvePingPong: 0
+ PauseMin: 0
+ PauseMax: 0
+ LimitedTime: 0
+ LimitedTimeTotal: 0
+ LimitedTimeFalloff:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 1
+ inSlope: 0
+ outSlope: -1
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: 0
+ outWeight: 0
+ - serializedVersion: 3
+ time: 1
+ value: 0
+ inSlope: -1
+ outSlope: 0
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: 0
+ outWeight: 0
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ LimitedTimeResetValue: 1
+ LimitedTimeLeft: 0
+ NoiseFrequencyMin: {x: 0, y: 0, z: 0}
+ NoiseFrequencyMax: {x: 1, y: 1, z: 1}
+ NoiseShiftMin: {x: 0, y: 0, z: 0}
+ NoiseShiftMax: {x: 0, y: 0, z: 0}
+ RotationWiggleProperties:
+ WigglePermitted: 1
+ WiggleType: 1
+ UseUnscaledTime: 0
+ TimeMultiplier: 1
+ StartWigglingAutomatically: 1
+ SmoothPingPong: 1
+ UseSpeedCurve: 0
+ SpeedCurve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 0
+ inSlope: 0
+ outSlope: 1
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: 0
+ outWeight: 0
+ - serializedVersion: 3
+ time: 1
+ value: 1
+ inSlope: 1
+ outSlope: 0
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: 0
+ outWeight: 0
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ FrequencyMin: 0
+ FrequencyMax: 1
+ AmplitudeMin: {x: 0, y: 0, z: 0}
+ AmplitudeMax: {x: 1, y: 1, z: 1}
+ RelativeAmplitude: 1
+ UniformValues: 0
+ ForceVectorLength: 0
+ ForcedVectorLength: 1
+ Curve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 0
+ inSlope: 0
+ outSlope: 1
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: 0
+ outWeight: 0
+ - serializedVersion: 3
+ time: 1
+ value: 1
+ inSlope: 1
+ outSlope: 0
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: 0
+ outWeight: 0
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ RemapCurveZeroMin: {x: 0, y: 0, z: 0}
+ RemapCurveZeroMax: {x: 0, y: 0, z: 0}
+ RemapCurveOneMin: {x: 1, y: 1, z: 1}
+ RemapCurveOneMax: {x: 1, y: 1, z: 1}
+ RelativeCurveAmplitude: 1
+ CurvePingPong: 0
+ PauseMin: 0
+ PauseMax: 0
+ LimitedTime: 0
+ LimitedTimeTotal: 0
+ LimitedTimeFalloff:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 1
+ inSlope: 0
+ outSlope: -1
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: 0
+ outWeight: 0
+ - serializedVersion: 3
+ time: 1
+ value: 0
+ inSlope: -1
+ outSlope: 0
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: 0
+ outWeight: 0
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ LimitedTimeResetValue: 1
+ LimitedTimeLeft: 0
+ NoiseFrequencyMin: {x: 0, y: 0, z: 0}
+ NoiseFrequencyMax: {x: 1, y: 1, z: 1}
+ NoiseShiftMin: {x: 0, y: 0, z: 0}
+ NoiseShiftMax: {x: 0, y: 0, z: 0}
+ ScaleWiggleProperties:
+ WigglePermitted: 1
+ WiggleType: 1
+ UseUnscaledTime: 0
+ TimeMultiplier: 1
+ StartWigglingAutomatically: 1
+ SmoothPingPong: 1
+ UseSpeedCurve: 0
+ SpeedCurve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 0
+ inSlope: 0
+ outSlope: 1
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: 0
+ outWeight: 0
+ - serializedVersion: 3
+ time: 1
+ value: 1
+ inSlope: 1
+ outSlope: 0
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: 0
+ outWeight: 0
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ FrequencyMin: 0
+ FrequencyMax: 1
+ AmplitudeMin: {x: 0, y: 0, z: 0}
+ AmplitudeMax: {x: 1, y: 1, z: 1}
+ RelativeAmplitude: 1
+ UniformValues: 0
+ ForceVectorLength: 0
+ ForcedVectorLength: 1
+ Curve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 0
+ inSlope: 0
+ outSlope: 1
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: 0
+ outWeight: 0
+ - serializedVersion: 3
+ time: 1
+ value: 1
+ inSlope: 1
+ outSlope: 0
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: 0
+ outWeight: 0
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ RemapCurveZeroMin: {x: 0, y: 0, z: 0}
+ RemapCurveZeroMax: {x: 0, y: 0, z: 0}
+ RemapCurveOneMin: {x: 1, y: 1, z: 1}
+ RemapCurveOneMax: {x: 1, y: 1, z: 1}
+ RelativeCurveAmplitude: 1
+ CurvePingPong: 0
+ PauseMin: 0
+ PauseMax: 0
+ LimitedTime: 0
+ LimitedTimeTotal: 0
+ LimitedTimeFalloff:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 1
+ inSlope: 0
+ outSlope: -1
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: 0
+ outWeight: 0
+ - serializedVersion: 3
+ time: 1
+ value: 0
+ inSlope: -1
+ outSlope: 0
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: 0
+ outWeight: 0
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ LimitedTimeResetValue: 1
+ LimitedTimeLeft: 0
+ NoiseFrequencyMin: {x: 0, y: 0, z: 0}
+ NoiseFrequencyMax: {x: 1, y: 1, z: 1}
+ NoiseShiftMin: {x: 0, y: 0, z: 0}
+ NoiseShiftMax: {x: 0, y: 0, z: 0}
+ DebugWiggleDuration: 2
+--- !u!114 &854107432770048664
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8526474044217039555}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 6bf8e915527fa424a8b17dc168fe20eb, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ ChannelMode: 0
+ Channel: 0
+ MMChannelDefinition: {fileID: 0}
+ CooldownBetweenShakes: 0
+--- !u!114 &5126086572364088879
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8526474044217039555}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 531894cbc68d4bf49a71825ad87c3305, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ ChannelMode: 0
+ Channel: 0
+ MMChannelDefinition: {fileID: 0}
+ CooldownBetweenShakes: 0
diff --git a/Assets/Prefabs/GameElements/GameCamera.prefab.meta b/Assets/Prefabs/GameElements/GameCamera.prefab.meta
new file mode 100644
index 00000000..fda2cbd7
--- /dev/null
+++ b/Assets/Prefabs/GameElements/GameCamera.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 5e49956564dfa491cb6aa8fe57c1b2d6
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Prefabs/PathNode.prefab b/Assets/Prefabs/GameElements/PathNode.prefab
similarity index 100%
rename from Assets/Prefabs/PathNode.prefab
rename to Assets/Prefabs/GameElements/PathNode.prefab
diff --git a/Assets/Prefabs/PathNode.prefab.meta b/Assets/Prefabs/GameElements/PathNode.prefab.meta
similarity index 100%
rename from Assets/Prefabs/PathNode.prefab.meta
rename to Assets/Prefabs/GameElements/PathNode.prefab.meta
diff --git a/Assets/Prefabs/Track.prefab b/Assets/Prefabs/GameElements/Track.prefab
similarity index 100%
rename from Assets/Prefabs/Track.prefab
rename to Assets/Prefabs/GameElements/Track.prefab
diff --git a/Assets/Prefabs/Track.prefab.meta b/Assets/Prefabs/GameElements/Track.prefab.meta
similarity index 100%
rename from Assets/Prefabs/Track.prefab.meta
rename to Assets/Prefabs/GameElements/Track.prefab.meta
diff --git a/Assets/Scenes/SampleScene.unity b/Assets/Scenes/SampleScene.unity
index 9f7a7dc2..0684419d 100644
--- a/Assets/Scenes/SampleScene.unity
+++ b/Assets/Scenes/SampleScene.unity
@@ -122,84 +122,248 @@ NavMeshSettings:
debug:
m_Flags: 0
m_NavMeshData: {fileID: 0}
---- !u!1001 &151772093
-PrefabInstance:
+--- !u!1 &293267687
+GameObject:
m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 293267688}
+ - component: {fileID: 293267689}
+ m_Layer: 0
+ m_Name: GameCamera
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &293267688
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 293267687}
serializedVersion: 2
- m_Modification:
- serializedVersion: 3
- m_TransformParent: {fileID: 0}
- m_Modifications:
- - target: {fileID: 2505559936379693214, guid: 46175bea33f87445bbec1389a53da172,
- type: 3}
- propertyPath: managedReferences[6334994104641650688].CameraShakeProperties.Amplitude
- value: 10
- objectReference: {fileID: 0}
- - target: {fileID: 2505559936379693214, guid: 46175bea33f87445bbec1389a53da172,
- type: 3}
- propertyPath: managedReferences[6334994104641650688].CameraShakeProperties.AmplitudeY
- value: 0
- objectReference: {fileID: 0}
- - target: {fileID: 5030288017655597913, guid: 46175bea33f87445bbec1389a53da172,
- type: 3}
- propertyPath: m_Name
- value: CameraShake
- objectReference: {fileID: 0}
- - target: {fileID: 6794014747502131782, guid: 46175bea33f87445bbec1389a53da172,
- type: 3}
- propertyPath: m_LocalPosition.x
- value: 0
- objectReference: {fileID: 0}
- - target: {fileID: 6794014747502131782, guid: 46175bea33f87445bbec1389a53da172,
- type: 3}
- propertyPath: m_LocalPosition.y
- value: 0
- objectReference: {fileID: 0}
- - target: {fileID: 6794014747502131782, guid: 46175bea33f87445bbec1389a53da172,
- type: 3}
- propertyPath: m_LocalPosition.z
- value: 0
- objectReference: {fileID: 0}
- - target: {fileID: 6794014747502131782, guid: 46175bea33f87445bbec1389a53da172,
- type: 3}
- propertyPath: m_LocalRotation.w
- value: 1
- objectReference: {fileID: 0}
- - target: {fileID: 6794014747502131782, guid: 46175bea33f87445bbec1389a53da172,
- type: 3}
- propertyPath: m_LocalRotation.x
- value: 0
- objectReference: {fileID: 0}
- - target: {fileID: 6794014747502131782, guid: 46175bea33f87445bbec1389a53da172,
- type: 3}
- propertyPath: m_LocalRotation.y
- value: 0
- objectReference: {fileID: 0}
- - target: {fileID: 6794014747502131782, guid: 46175bea33f87445bbec1389a53da172,
- type: 3}
- propertyPath: m_LocalRotation.z
- value: 0
- objectReference: {fileID: 0}
- - target: {fileID: 6794014747502131782, guid: 46175bea33f87445bbec1389a53da172,
- type: 3}
- propertyPath: m_LocalEulerAnglesHint.x
- value: 0
- objectReference: {fileID: 0}
- - target: {fileID: 6794014747502131782, guid: 46175bea33f87445bbec1389a53da172,
- type: 3}
- propertyPath: m_LocalEulerAnglesHint.y
- value: 0
- objectReference: {fileID: 0}
- - target: {fileID: 6794014747502131782, guid: 46175bea33f87445bbec1389a53da172,
- type: 3}
- propertyPath: m_LocalEulerAnglesHint.z
- value: 0
- objectReference: {fileID: 0}
- m_RemovedComponents: []
- m_RemovedGameObjects: []
- m_AddedGameObjects: []
- m_AddedComponents: []
- m_SourcePrefab: {fileID: 100100000, guid: 46175bea33f87445bbec1389a53da172, type: 3}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: -5}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 2048155078}
+ m_Father: {fileID: 759707325}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &293267689
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 293267687}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 79d811a12f27f43629797719fcbfc6ae, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ serializationData:
+ SerializedFormat: 2
+ SerializedBytes:
+ ReferencedUnityObjects: []
+ SerializedBytesString:
+ Prefab: {fileID: 0}
+ PrefabModificationsReferencedUnityObjects: []
+ PrefabModifications: []
+ SerializationNodes:
+ - Name: elementGuid
+ Entry: 2
+ Data: 9ce023db680c4db6aca5388c7fea2d83
+ - Name: timeDurationSubmodule
+ Entry: 7
+ Data: 0|Ichni.RhythmGame.TimeDurationSubmodule, Assembly-CSharp
+ - Name: isOverridingDuration
+ Entry: 5
+ Data: false
+ - Name: startTime
+ Entry: 4
+ Data: 0
+ - Name: endTime
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 8
+ Data:
+ - Name: transformSubmodule
+ Entry: 7
+ Data: 1|Ichni.RhythmGame.TransformSubmodule, Assembly-CSharp
+ - Name: originalPosition
+ Entry: 7
+ Data: UnityEngine.Vector3, UnityEngine.CoreModule
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 8
+ Data:
+ - Name: originalEulerAngles
+ Entry: 7
+ Data: UnityEngine.Vector3, UnityEngine.CoreModule
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 8
+ Data:
+ - Name: originalScale
+ Entry: 7
+ Data: UnityEngine.Vector3, UnityEngine.CoreModule
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 8
+ Data:
+ - Name: positionOffset
+ Entry: 7
+ Data: 2|System.Collections.Generic.List`1[[UnityEngine.Vector3, UnityEngine.CoreModule]],
+ mscorlib
+ - Name:
+ Entry: 12
+ Data: 0
+ - Name:
+ Entry: 13
+ Data:
+ - Name:
+ Entry: 8
+ Data:
+ - Name: eulerAnglesOffset
+ Entry: 7
+ Data: 3|System.Collections.Generic.List`1[[UnityEngine.Vector3, UnityEngine.CoreModule]],
+ mscorlib
+ - Name:
+ Entry: 12
+ Data: 0
+ - Name:
+ Entry: 13
+ Data:
+ - Name:
+ Entry: 8
+ Data:
+ - Name: scaleOffset
+ Entry: 7
+ Data: 4|System.Collections.Generic.List`1[[UnityEngine.Vector3, UnityEngine.CoreModule]],
+ mscorlib
+ - Name:
+ Entry: 12
+ Data: 0
+ - Name:
+ Entry: 13
+ Data:
+ - Name:
+ Entry: 8
+ Data:
+ - Name: currentPosition
+ Entry: 7
+ Data: UnityEngine.Vector3, UnityEngine.CoreModule
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 8
+ Data:
+ - Name: currentEulerAngles
+ Entry: 7
+ Data: UnityEngine.Vector3, UnityEngine.CoreModule
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 8
+ Data:
+ - Name: currentScale
+ Entry: 7
+ Data: UnityEngine.Vector3, UnityEngine.CoreModule
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 8
+ Data:
+ - Name: positionDirtyMark
+ Entry: 5
+ Data: false
+ - Name: eulerAnglesDirtyMark
+ Entry: 5
+ Data: false
+ - Name: scaleDirtyMark
+ Entry: 5
+ Data: false
+ - Name: eulerAnglesOffsetLock
+ Entry: 5
+ Data: false
+ - Name: OnPositionChanged
+ Entry: 6
+ Data:
+ - Name: OnEulerAnglesChanged
+ Entry: 6
+ Data:
+ - Name: OnScaleChanged
+ Entry: 6
+ Data:
+ - Name:
+ Entry: 8
+ Data:
+ - Name: colorSubmodule
+ Entry: 6
+ Data:
+ elementName:
+ serialNumber: 0
+ parentElement: {fileID: 0}
+ childElementList: []
+ camera: {fileID: 330585545}
+ rotationPoint: {fileID: 2048155078}
+ positionPoint: {fileID: 719302918}
+ cameraTransform: {fileID: 330585546}
+ cameraViewType: 0
+ perspectiveAngle: 60
+ orthographicSize: 10
--- !u!1 &330585543
GameObject:
m_ObjectHideFlags: 0
@@ -289,12 +453,12 @@ Transform:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 330585543}
serializedVersion: 2
- m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
- m_Father: {fileID: 0}
+ m_Father: {fileID: 719302918}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &330585547
MonoBehaviour:
@@ -819,6 +983,273 @@ MonoBehaviour:
m_LightCookieSize: {x: 1, y: 1}
m_LightCookieOffset: {x: 0, y: 0}
m_SoftShadowQuality: 1
+--- !u!1 &719302917
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 719302918}
+ m_Layer: 0
+ m_Name: PositionPoint
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &719302918
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 719302917}
+ serializedVersion: 2
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 330585546}
+ m_Father: {fileID: 2048155078}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &759707323
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 759707325}
+ - component: {fileID: 759707324}
+ m_Layer: 0
+ m_Name: Folder
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &759707324
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 759707323}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 0892af0ddd15c449d9b1c65248b5dc64, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ serializationData:
+ SerializedFormat: 2
+ SerializedBytes:
+ ReferencedUnityObjects: []
+ SerializedBytesString:
+ Prefab: {fileID: 0}
+ PrefabModificationsReferencedUnityObjects: []
+ PrefabModifications: []
+ SerializationNodes:
+ - Name: elementGuid
+ Entry: 2
+ Data: 00000000000000000000000000000000
+ - Name: timeDurationSubmodule
+ Entry: 7
+ Data: 0|Ichni.RhythmGame.TimeDurationSubmodule, Assembly-CSharp
+ - Name: isOverridingDuration
+ Entry: 5
+ Data: false
+ - Name: startTime
+ Entry: 4
+ Data: 0
+ - Name: endTime
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 8
+ Data:
+ - Name: transformSubmodule
+ Entry: 7
+ Data: 1|Ichni.RhythmGame.TransformSubmodule, Assembly-CSharp
+ - Name: originalPosition
+ Entry: 7
+ Data: UnityEngine.Vector3, UnityEngine.CoreModule
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 8
+ Data:
+ - Name: originalEulerAngles
+ Entry: 7
+ Data: UnityEngine.Vector3, UnityEngine.CoreModule
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 8
+ Data:
+ - Name: originalScale
+ Entry: 7
+ Data: UnityEngine.Vector3, UnityEngine.CoreModule
+ - Name:
+ Entry: 4
+ Data: 1
+ - Name:
+ Entry: 4
+ Data: 1
+ - Name:
+ Entry: 4
+ Data: 1
+ - Name:
+ Entry: 8
+ Data:
+ - Name: positionOffset
+ Entry: 7
+ Data: 2|System.Collections.Generic.List`1[[UnityEngine.Vector3, UnityEngine.CoreModule]],
+ mscorlib
+ - Name:
+ Entry: 12
+ Data: 0
+ - Name:
+ Entry: 13
+ Data:
+ - Name:
+ Entry: 8
+ Data:
+ - Name: eulerAnglesOffset
+ Entry: 7
+ Data: 3|System.Collections.Generic.List`1[[UnityEngine.Vector3, UnityEngine.CoreModule]],
+ mscorlib
+ - Name:
+ Entry: 12
+ Data: 0
+ - Name:
+ Entry: 13
+ Data:
+ - Name:
+ Entry: 8
+ Data:
+ - Name: scaleOffset
+ Entry: 7
+ Data: 4|System.Collections.Generic.List`1[[UnityEngine.Vector3, UnityEngine.CoreModule]],
+ mscorlib
+ - Name:
+ Entry: 12
+ Data: 0
+ - Name:
+ Entry: 13
+ Data:
+ - Name:
+ Entry: 8
+ Data:
+ - Name: currentPosition
+ Entry: 7
+ Data: UnityEngine.Vector3, UnityEngine.CoreModule
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 8
+ Data:
+ - Name: currentEulerAngles
+ Entry: 7
+ Data: UnityEngine.Vector3, UnityEngine.CoreModule
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 4
+ Data: 0
+ - Name:
+ Entry: 8
+ Data:
+ - Name: currentScale
+ Entry: 7
+ Data: UnityEngine.Vector3, UnityEngine.CoreModule
+ - Name:
+ Entry: 4
+ Data: 1
+ - Name:
+ Entry: 4
+ Data: 1
+ - Name:
+ Entry: 4
+ Data: 1
+ - Name:
+ Entry: 8
+ Data:
+ - Name: positionDirtyMark
+ Entry: 5
+ Data: false
+ - Name: eulerAnglesDirtyMark
+ Entry: 5
+ Data: false
+ - Name: scaleDirtyMark
+ Entry: 5
+ Data: false
+ - Name: eulerAnglesOffsetLock
+ Entry: 5
+ Data: false
+ - Name: OnPositionChanged
+ Entry: 6
+ Data:
+ - Name: OnEulerAnglesChanged
+ Entry: 6
+ Data:
+ - Name: OnScaleChanged
+ Entry: 6
+ Data:
+ - Name:
+ Entry: 8
+ Data:
+ - Name: colorSubmodule
+ Entry: 6
+ Data:
+ elementName:
+ serialNumber: 0
+ parentElement: {fileID: 0}
+ childElementList: []
+--- !u!4 &759707325
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 759707323}
+ serializedVersion: 2
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 5}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 293267688}
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &832575517
GameObject:
m_ObjectHideFlags: 0
@@ -1146,6 +1577,8 @@ GameObject:
- component: {fileID: 1197505579}
- component: {fileID: 1197505578}
- component: {fileID: 1197505580}
+ - component: {fileID: 1197505581}
+ - component: {fileID: 1197505582}
m_Layer: 0
m_Name: EditorManager
m_TagString: Untagged
@@ -1257,7 +1690,35 @@ MonoBehaviour:
- Name:
Entry: 8
Data:
---- !u!1 &1754040413
+--- !u!114 &1197505581
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1197505577}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 912c3a32e155f4ca79a4ca1fa1f359e5, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+--- !u!114 &1197505582
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1197505577}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 1d27859adda1341aaa0db8a117d5431c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ themeBundleAbstractList: []
+ selectedThemeBundleList: []
+ loadedThemeBundleList: []
+ waitingBundleAmount: 0
+--- !u!1 &2048155077
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
@@ -1265,110 +1726,35 @@ GameObject:
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- - component: {fileID: 1754040417}
- - component: {fileID: 1754040416}
- - component: {fileID: 1754040415}
- - component: {fileID: 1754040414}
+ - component: {fileID: 2048155078}
m_Layer: 0
- m_Name: Sphere
+ m_Name: RotationPoint
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
---- !u!135 &1754040414
-SphereCollider:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 1754040413}
- m_Material: {fileID: 0}
- m_IncludeLayers:
- serializedVersion: 2
- m_Bits: 0
- m_ExcludeLayers:
- serializedVersion: 2
- m_Bits: 0
- m_LayerOverridePriority: 0
- m_IsTrigger: 0
- m_ProvidesContacts: 0
- m_Enabled: 1
- serializedVersion: 3
- m_Radius: 0.5
- m_Center: {x: 0, y: 0, z: 0}
---- !u!23 &1754040415
-MeshRenderer:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 1754040413}
- m_Enabled: 1
- m_CastShadows: 1
- m_ReceiveShadows: 1
- m_DynamicOccludee: 1
- m_StaticShadowCaster: 0
- m_MotionVectors: 1
- m_LightProbeUsage: 1
- m_ReflectionProbeUsage: 1
- m_RayTracingMode: 2
- m_RayTraceProcedural: 0
- m_RenderingLayerMask: 1
- m_RendererPriority: 0
- m_Materials:
- - {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2}
- m_StaticBatchInfo:
- firstSubMesh: 0
- subMeshCount: 0
- m_StaticBatchRoot: {fileID: 0}
- m_ProbeAnchor: {fileID: 0}
- m_LightProbeVolumeOverride: {fileID: 0}
- m_ScaleInLightmap: 1
- m_ReceiveGI: 1
- m_PreserveUVs: 0
- m_IgnoreNormalsForChartDetection: 0
- m_ImportantGI: 0
- m_StitchLightmapSeams: 1
- m_SelectedEditorRenderState: 3
- m_MinimumChartSize: 4
- m_AutoUVMaxDistance: 0.5
- m_AutoUVMaxAngle: 89
- m_LightmapParameters: {fileID: 0}
- m_SortingLayerID: 0
- m_SortingLayer: 0
- m_SortingOrder: 0
- m_AdditionalVertexStreams: {fileID: 0}
---- !u!33 &1754040416
-MeshFilter:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 1754040413}
- m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0}
---- !u!4 &1754040417
+--- !u!4 &2048155078
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 1754040413}
+ m_GameObject: {fileID: 2048155077}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
- m_LocalPosition: {x: 0, y: 0, z: 5}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
- m_Children: []
- m_Father: {fileID: 0}
+ m_Children:
+ - {fileID: 719302918}
+ m_Father: {fileID: 293267688}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1660057539 &9223372036854775807
SceneRoots:
m_ObjectHideFlags: 0
m_Roots:
- - {fileID: 330585546}
- {fileID: 410087041}
- {fileID: 832575519}
- {fileID: 1197505579}
- - {fileID: 1754040417}
- - {fileID: 151772093}
+ - {fileID: 759707325}
diff --git a/Assets/Scripts/.DS_Store b/Assets/Scripts/.DS_Store
index 0ea3e43f..aff4f18f 100644
Binary files a/Assets/Scripts/.DS_Store and b/Assets/Scripts/.DS_Store differ
diff --git a/Assets/Scripts/Animations/AnimationBase.cs b/Assets/Scripts/Animations/AnimationBase.cs
index 52f896cc..c600d4ed 100644
--- a/Assets/Scripts/Animations/AnimationBase.cs
+++ b/Assets/Scripts/Animations/AnimationBase.cs
@@ -38,6 +38,11 @@ namespace Ichni.RhythmGame
timeDurationSubmodule = new TimeDurationSubmodule(startTimes.Min(), endTimes.Max());
}
+ public virtual void SetTimeDuration(float startTime, float endTime)
+ {
+ timeDurationSubmodule = new TimeDurationSubmodule(startTime, endTime);
+ }
+
protected abstract void UpdateAnimation(float songTime);
protected virtual void Update()
diff --git a/Assets/Scripts/Animations/Color.meta b/Assets/Scripts/Animations/Color.meta
new file mode 100644
index 00000000..763c79bd
--- /dev/null
+++ b/Assets/Scripts/Animations/Color.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: e3418d0d84b6b476db0e552f2e754c7e
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Animations/Color/BaseColorChange.cs b/Assets/Scripts/Animations/Color/BaseColorChange.cs
new file mode 100644
index 00000000..e117c156
--- /dev/null
+++ b/Assets/Scripts/Animations/Color/BaseColorChange.cs
@@ -0,0 +1,62 @@
+using System.Collections;
+using System.Collections.Generic;
+using Lean.Pool;
+using UnityEngine;
+
+namespace Ichni.RhythmGame
+{
+ public class BaseColorChange : AnimationBase
+ {
+ public ColorSubmodule targetColorSubmodule;
+ public FlexibleFloat colorR, colorG, colorB, colorA;
+
+ public static BaseColorChange GenerateElement(string elementName, BaseElement targetObject,
+ FlexibleFloat colorR, FlexibleFloat colorG, FlexibleFloat colorB, FlexibleFloat colorA)
+ {
+ BaseColorChange baseColorChange = LeanPool.Spawn(EditorManager.instance.basePrefabs.emptyObject).AddComponent();
+
+ baseColorChange.NewInitialize(elementName, targetObject);
+ baseColorChange.colorR = colorR;
+ baseColorChange.colorG = colorG;
+ baseColorChange.colorB = colorB;
+ baseColorChange.colorA = colorA;
+ baseColorChange.animationReturnType = FlexibleReturnType.Before;
+
+ if (targetObject.colorSubmodule != null)
+ {
+ baseColorChange.targetColorSubmodule = targetObject.colorSubmodule;
+ }
+ else
+ {
+ throw new System.Exception("Target object does not have a ColorSubmodule");
+ }
+
+ baseColorChange.SetTimeDuration(colorR, colorG, colorB, colorA);
+
+ return baseColorChange;
+ }
+
+ protected override void UpdateAnimation(float songTime)
+ {
+ colorR.UpdateFlexibleFloat(songTime);
+ colorG.UpdateFlexibleFloat(songTime);
+ colorB.UpdateFlexibleFloat(songTime);
+ colorA.UpdateFlexibleFloat(songTime);
+
+ if (colorR.returnType is FlexibleReturnType.MiddleExecuting ||
+ colorG.returnType is FlexibleReturnType.MiddleExecuting ||
+ colorB.returnType is FlexibleReturnType.MiddleExecuting ||
+ colorA.returnType is FlexibleReturnType.MiddleExecuting)
+ {
+ animationReturnType = FlexibleReturnType.MiddleExecuting;
+ Color colorOffset = new Color(colorR.value, colorG.value, colorB.value, colorA.value);
+ targetColorSubmodule.baseColorOffset.Add(colorOffset);
+ targetColorSubmodule.baseColorDirtyMark = true;
+ }
+ else
+ {
+ animationReturnType = FlexibleReturnType.MiddleInterval;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/Scripts/Animations/Color/BaseColorChange.cs.meta b/Assets/Scripts/Animations/Color/BaseColorChange.cs.meta
new file mode 100644
index 00000000..e996d1e4
--- /dev/null
+++ b/Assets/Scripts/Animations/Color/BaseColorChange.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 3dada7ead8505418198027da3d9984bb
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Animations/Color/EmissionColorChange.cs b/Assets/Scripts/Animations/Color/EmissionColorChange.cs
new file mode 100644
index 00000000..6cb1991a
--- /dev/null
+++ b/Assets/Scripts/Animations/Color/EmissionColorChange.cs
@@ -0,0 +1,65 @@
+using System.Collections;
+using System.Collections.Generic;
+using Lean.Pool;
+using UnityEngine;
+
+namespace Ichni.RhythmGame
+{
+ public class EmissionColorChange : AnimationBase
+ {
+ public ColorSubmodule targetColorSubmodule;
+ public FlexibleFloat colorR, colorG, colorB, colorI;
+
+ public static EmissionColorChange GenerateElement(string elementName, BaseElement targetObject,
+ FlexibleFloat colorR, FlexibleFloat colorG, FlexibleFloat colorB, FlexibleFloat colorI)
+ {
+ EmissionColorChange baseColorChange = LeanPool.Spawn(EditorManager.instance.basePrefabs.emptyObject).AddComponent();
+
+ baseColorChange.NewInitialize(elementName, targetObject);
+ baseColorChange.colorR = colorR;
+ baseColorChange.colorG = colorG;
+ baseColorChange.colorB = colorB;
+ baseColorChange.colorI = colorI;
+ baseColorChange.animationReturnType = FlexibleReturnType.Before;
+
+ if (targetObject.colorSubmodule != null)
+ {
+ baseColorChange.targetColorSubmodule = targetObject.colorSubmodule;
+ }
+ else
+ {
+ throw new System.Exception("Target object does not have a ColorSubmodule");
+ }
+
+ baseColorChange.SetTimeDuration(colorR, colorG, colorB, colorI);
+
+ return baseColorChange;
+ }
+
+ protected override void UpdateAnimation(float songTime)
+ {
+ colorR.UpdateFlexibleFloat(songTime);
+ colorG.UpdateFlexibleFloat(songTime);
+ colorB.UpdateFlexibleFloat(songTime);
+ colorI.UpdateFlexibleFloat(songTime);
+
+ if (colorR.returnType is FlexibleReturnType.MiddleExecuting ||
+ colorG.returnType is FlexibleReturnType.MiddleExecuting ||
+ colorB.returnType is FlexibleReturnType.MiddleExecuting ||
+ colorI.returnType is FlexibleReturnType.MiddleExecuting)
+ {
+ animationReturnType = FlexibleReturnType.MiddleExecuting;
+ Color colorOffset = new Color(colorR.value, colorG.value, colorB.value);
+ float intensityOffset = colorI.value;
+
+ targetColorSubmodule.emissionColorOffset.Add(colorOffset);
+ targetColorSubmodule.emissionIntensityOffset.Add(intensityOffset);
+ targetColorSubmodule.emissionColorDirtyMark = true;
+ }
+ else
+ {
+ animationReturnType = FlexibleReturnType.MiddleInterval;
+ }
+ }
+ }
+}
diff --git a/Assets/Scripts/Animations/Color/EmissionColorChange.cs.meta b/Assets/Scripts/Animations/Color/EmissionColorChange.cs.meta
new file mode 100644
index 00000000..06ae6193
--- /dev/null
+++ b/Assets/Scripts/Animations/Color/EmissionColorChange.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: ed8c4bbcff6cc433dae44740d8f01b84
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Animations/Track.meta b/Assets/Scripts/Animations/Track.meta
new file mode 100644
index 00000000..8eee5ae4
--- /dev/null
+++ b/Assets/Scripts/Animations/Track.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 17936224adc4a4e3497f05188aeb115f
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Animations/Track/TrackTotalTimeChange.cs b/Assets/Scripts/Animations/Track/TrackTotalTimeChange.cs
new file mode 100644
index 00000000..b5196e01
--- /dev/null
+++ b/Assets/Scripts/Animations/Track/TrackTotalTimeChange.cs
@@ -0,0 +1,43 @@
+using System.Collections;
+using System.Collections.Generic;
+using Lean.Pool;
+using UnityEngine;
+
+namespace Ichni.RhythmGame
+{
+ public class TrackTotalTimeChange : AnimationBase
+ {
+ public FlexibleFloat totalTime;
+ public TrackTimeSubmoduleStatic targetTrackTimeSubmoduleStatic;
+
+ public static TrackTotalTimeChange GenerateElement(string elementName, Track targetTrack, FlexibleFloat totalTime)
+ {
+ TrackTotalTimeChange trackTotalTimeChange = LeanPool.Spawn(EditorManager.instance.basePrefabs.emptyObject).AddComponent();
+ trackTotalTimeChange.NewInitialize(elementName, targetTrack);
+
+ if (targetTrack.trackTimeSubmodule is TrackTimeSubmoduleStatic submoduleStatic)
+ {
+ trackTotalTimeChange.targetTrackTimeSubmoduleStatic = submoduleStatic;
+ }
+ else
+ {
+ throw new System.Exception("Target object does not have a TrackTimeSubmoduleStatic");
+ }
+
+ trackTotalTimeChange.totalTime = totalTime;
+ trackTotalTimeChange.animationReturnType = FlexibleReturnType.Before;
+ trackTotalTimeChange.SetTimeDuration(totalTime);
+ return trackTotalTimeChange;
+ }
+
+ protected override void UpdateAnimation(float songTime)
+ {
+ totalTime.UpdateFlexibleFloat(songTime);
+
+ if (totalTime.returnType == FlexibleReturnType.MiddleExecuting)
+ {
+ targetTrackTimeSubmoduleStatic.trackTotalTime = totalTime.value;
+ }
+ }
+ }
+}
diff --git a/Assets/Scripts/Animations/Track/TrackTotalTimeChange.cs.meta b/Assets/Scripts/Animations/Track/TrackTotalTimeChange.cs.meta
new file mode 100644
index 00000000..e8201399
--- /dev/null
+++ b/Assets/Scripts/Animations/Track/TrackTotalTimeChange.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 2eec4a2a4ac744e0ca183d59c465c4e2
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Animations/Transform/Displacement.cs b/Assets/Scripts/Animations/Transform/Displacement.cs
index b1b8f903..261f1f25 100644
--- a/Assets/Scripts/Animations/Transform/Displacement.cs
+++ b/Assets/Scripts/Animations/Transform/Displacement.cs
@@ -41,6 +41,11 @@ namespace Ichni.RhythmGame
return displacement;
}
+ private void Start()
+ {
+ targetTransformSubmodule = targetObject.transformSubmodule;
+ }
+
protected override void UpdateAnimation(float songTime)
{
positionX.UpdateFlexibleFloat(songTime);
@@ -56,6 +61,10 @@ namespace Ichni.RhythmGame
targetTransformSubmodule.positionOffset.Add(currentPosition);
targetTransformSubmodule.positionDirtyMark = true;
}
+ else
+ {
+ animationReturnType = FlexibleReturnType.MiddleInterval;
+ }
//本体使用,用于判断动画是否结束
// else if (positionX.returnType is FlexibleReturnType.After or FlexibleReturnType.None &&
diff --git a/Assets/Scripts/Animations/Transform/LookAt.cs b/Assets/Scripts/Animations/Transform/LookAt.cs
new file mode 100644
index 00000000..fad10cc7
--- /dev/null
+++ b/Assets/Scripts/Animations/Transform/LookAt.cs
@@ -0,0 +1,71 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using Lean.Pool;
+using UnityEngine;
+using UnityEngine.Serialization;
+
+namespace Ichni.RhythmGame
+{
+ ///
+ /// 将物体的z轴指向目标物体,注意,LookAt的启用期间,物体的旋转将被锁定
+ ///
+ public class LookAt : AnimationBase
+ {
+ public TransformSubmodule targetTransformSubmodule;
+ public BaseElement lookAtObject;
+ public FlexibleBool enabling;
+
+ public static LookAt GenerateElement(string elementName, BaseElement targetObject,
+ BaseElement lookAtTarget, FlexibleBool enabling)
+ {
+ LookAt swirl = LeanPool.Spawn(EditorManager.instance.basePrefabs.emptyObject).AddComponent();
+
+ swirl.NewInitialize(elementName, targetObject);
+
+ swirl.lookAtObject = lookAtTarget;
+ swirl.enabling = enabling;
+ swirl.animationReturnType = FlexibleReturnType.Before;
+
+ if (targetObject.transformSubmodule != null)
+ {
+ swirl.targetTransformSubmodule = targetObject.transformSubmodule;
+ }
+ else
+ {
+ throw new System.Exception("Target object does not have a TransformSubmodule");
+ }
+
+ swirl.SetTimeDuration(-999, 999); //TODO: 换为(-delay, songLength)
+
+ return swirl;
+ }
+
+ private void Start()
+ {
+ targetTransformSubmodule = targetObject.transformSubmodule;
+ }
+
+ protected override void UpdateAnimation(float songTime)
+ {
+ enabling.UpdateFlexibleBool(songTime);
+ if (enabling.value)
+ {
+ animationReturnType = FlexibleReturnType.MiddleExecuting;
+ Vector3 lookingDirection =
+ (lookAtObject.transform.position - targetObject.transform.position).normalized;
+
+ Vector3 eulerAnglesOffset = Quaternion.LookRotation(lookingDirection).eulerAngles;
+
+ targetTransformSubmodule.eulerAnglesOffsetLock = true;
+
+ targetTransformSubmodule.currentEulerAngles = eulerAnglesOffset;
+ }
+ else
+ {
+ animationReturnType = FlexibleReturnType.MiddleInterval;
+ targetTransformSubmodule.eulerAnglesOffsetLock = false;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/Scripts/Animations/Transform/LookAt.cs.meta b/Assets/Scripts/Animations/Transform/LookAt.cs.meta
new file mode 100644
index 00000000..7891fcee
--- /dev/null
+++ b/Assets/Scripts/Animations/Transform/LookAt.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: c02ee9e15cdc048c5909a61377382530
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Animations/Transform/Scale.cs b/Assets/Scripts/Animations/Transform/Scale.cs
index 179061cd..42e1e8e2 100644
--- a/Assets/Scripts/Animations/Transform/Scale.cs
+++ b/Assets/Scripts/Animations/Transform/Scale.cs
@@ -49,6 +49,10 @@ namespace Ichni.RhythmGame
Vector3 currentScale = new Vector3(scaleX.value, scaleY.value, scaleZ.value);
targetTransformSubmodule.scaleOffset.Add(currentScale);
targetTransformSubmodule.scaleDirtyMark = true;
+ }
+ else
+ {
+ animationReturnType = FlexibleReturnType.MiddleInterval;
}
}
}
diff --git a/Assets/Scripts/Animations/Transform/Swirl.cs b/Assets/Scripts/Animations/Transform/Swirl.cs
index 5f64796a..906eda37 100644
--- a/Assets/Scripts/Animations/Transform/Swirl.cs
+++ b/Assets/Scripts/Animations/Transform/Swirl.cs
@@ -51,6 +51,10 @@ namespace Ichni.RhythmGame
targetTransformSubmodule.eulerAnglesOffset.Add(currentEulerAngles);
targetTransformSubmodule.eulerAnglesDirtyMark = true;
}
+ else
+ {
+ animationReturnType = FlexibleReturnType.MiddleInterval;
+ }
}
}
}
\ No newline at end of file
diff --git a/Assets/Scripts/Base/.DS_Store b/Assets/Scripts/Base/.DS_Store
new file mode 100644
index 00000000..b61292d7
Binary files /dev/null and b/Assets/Scripts/Base/.DS_Store differ
diff --git a/Assets/Scripts/Base/BaseElement.cs b/Assets/Scripts/Base/BaseElement.cs
index 6400ca02..765c0b91 100644
--- a/Assets/Scripts/Base/BaseElement.cs
+++ b/Assets/Scripts/Base/BaseElement.cs
@@ -3,6 +3,7 @@ using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Sirenix.OdinInspector;
+using UniRx;
using UnityEngine;
namespace Ichni.RhythmGame
@@ -31,6 +32,7 @@ namespace Ichni.RhythmGame
//次级模块
public TimeDurationSubmodule timeDurationSubmodule;
public TransformSubmodule transformSubmodule;
+ public ColorSubmodule colorSubmodule;
///
/// 首次初始化
@@ -42,6 +44,7 @@ namespace Ichni.RhythmGame
this.elementGuid = Guid.NewGuid();
//GameManager.beatMapContainer.beatMapElementList.Add(this);
//serialNumber = totalSerialNumber++;
+ SetTransformObserver();
}
///
@@ -77,6 +80,11 @@ namespace Ichni.RhythmGame
public abstract partial class BaseElement
{
+ private void Start()
+ {
+ SetTransformObserver();
+ }
+
public virtual void SetTimeDuration()
{
@@ -89,5 +97,60 @@ namespace Ichni.RhythmGame
timeDurationSubmodule?.SetDurationFromChildren(childElementList.Select(x=>x.timeDurationSubmodule).ToList());
}
+
+ ///
+ /// 设置物体Transform的监听,顺序为Scale -> EulerAngles -> Position
+ /// 如果有一些特殊的物体(例如Camera,ElementFolder),需要自定义监听,可以重写这个方法
+ ///
+ public virtual void SetTransformObserver()
+ {
+ Observable.EveryUpdate().Subscribe(_ =>
+ {
+ if (transformSubmodule == null)
+ {
+ return;
+ }
+
+ if (transformSubmodule.scaleDirtyMark)
+ {
+ Vector3 offset = Vector3.zero;
+ foreach (Vector3 scaleOffset in transformSubmodule.scaleOffset)
+ {
+ offset += scaleOffset;
+ }
+ transformSubmodule.currentScale = transformSubmodule.originalScale + offset;
+ transform.localScale = transformSubmodule.currentScale;
+ transformSubmodule.scaleDirtyMark = false;
+ }
+
+ if (transformSubmodule.eulerAnglesDirtyMark)
+ {
+ Vector3 offset = Vector3.zero;
+ foreach (Vector3 eulerOffset in transformSubmodule.eulerAnglesOffset)
+ {
+ offset += eulerOffset;
+ }
+ transformSubmodule.currentEulerAngles = transformSubmodule.originalEulerAngles + offset;
+ transform.localEulerAngles = transformSubmodule.currentEulerAngles;
+ transformSubmodule.eulerAnglesDirtyMark = false;
+ }
+
+ if (transformSubmodule.positionDirtyMark)
+ {
+ Vector3 offset = Vector3.zero;
+ foreach (Vector3 posOffset in transformSubmodule.positionOffset)
+ {
+ offset += posOffset;
+ }
+ transformSubmodule.currentPosition = transformSubmodule.originalPosition + offset;
+ transform.localPosition = transformSubmodule.currentPosition;
+ transformSubmodule.positionDirtyMark = false;
+ }
+
+ transformSubmodule.scaleOffset.Clear();
+ transformSubmodule.eulerAnglesOffset.Clear();
+ transformSubmodule.positionOffset.Clear();
+ }).AddTo(gameObject);
+ }
}
}
\ No newline at end of file
diff --git a/Assets/Scripts/Base/FlexibleTypes/FlexibleBool.cs b/Assets/Scripts/Base/FlexibleTypes/FlexibleBool.cs
new file mode 100644
index 00000000..1e8e3c53
--- /dev/null
+++ b/Assets/Scripts/Base/FlexibleTypes/FlexibleBool.cs
@@ -0,0 +1,70 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace Ichni
+{
+ [System.Serializable]
+ public class AnimatedBool
+ {
+ public bool value; //bool值
+ public float time; //当前时间
+
+ public AnimatedBool(bool value, float time)
+ {
+ this.value = value;
+ this.time = time;
+ }
+ }
+
+ [System.Serializable]
+ public class FlexibleBool
+ {
+ public bool value;
+ public List animations;
+
+ public FlexibleBool()
+ {
+ animations = new List();
+ }
+
+ public FlexibleBool(List anim)
+ {
+ this.animations = anim;
+ }
+
+ public void Add(AnimatedBool animatedBool)
+ {
+ animations.Add(animatedBool);
+ }
+
+ ///
+ /// 在动画脚本的Update中更新Bool Value
+ ///
+ ///
+ public FlexibleReturnType UpdateFlexibleBool(float nowTime)
+ {
+ AnimatedBool nowAnimatedBool = GetAnimatedBool(nowTime); //获取当前时间点对应的AnimatedBool
+ value = nowAnimatedBool.value; //更新value
+ return FlexibleReturnType.MiddleExecuting;
+ }
+
+ ///
+ /// 获取songTime对应的AnimatedBool的时间段
+ ///
+ ///
+ /// 返回距离当前时间最近的前一个AnimatedBool
+ AnimatedBool GetAnimatedBool(float nowTime)
+ {
+ for (int i = 0; i < animations.Count; i++)
+ {
+ if (nowTime >= animations[i].time)
+ {
+ return animations[i];
+ }
+ }
+
+ return new AnimatedBool(false, 0);
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/Scripts/Base/FlexibleTypes/FlexibleBool.cs.meta b/Assets/Scripts/Base/FlexibleTypes/FlexibleBool.cs.meta
new file mode 100644
index 00000000..541019e4
--- /dev/null
+++ b/Assets/Scripts/Base/FlexibleTypes/FlexibleBool.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 43cce55e6aac440e9b664e917adc2f74
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Base/GeneralSubmodules/ColorSubmodule.cs b/Assets/Scripts/Base/GeneralSubmodules/ColorSubmodule.cs
index 04cf32c9..ce609f4a 100644
--- a/Assets/Scripts/Base/GeneralSubmodules/ColorSubmodule.cs
+++ b/Assets/Scripts/Base/GeneralSubmodules/ColorSubmodule.cs
@@ -22,6 +22,11 @@ namespace Ichni.RhythmGame
public bool baseColorDirtyMark;
public bool emissionColorDirtyMark;
+ public ColorSubmodule()
+ {
+
+ }
+
public ColorSubmodule(Color originalBaseColor)
{
this.originalBaseColor = originalBaseColor;
diff --git a/Assets/Scripts/Base/GeneralSubmodules/TransformSubmodule.cs b/Assets/Scripts/Base/GeneralSubmodules/TransformSubmodule.cs
index bf3d6f24..7b3565d8 100644
--- a/Assets/Scripts/Base/GeneralSubmodules/TransformSubmodule.cs
+++ b/Assets/Scripts/Base/GeneralSubmodules/TransformSubmodule.cs
@@ -26,25 +26,53 @@ namespace Ichni.RhythmGame
public bool positionDirtyMark;
public bool eulerAnglesDirtyMark;
public bool scaleDirtyMark;
+
+ public bool eulerAnglesOffsetLock;
public UnityAction OnPositionChanged;
public UnityAction OnEulerAnglesChanged;
public UnityAction OnScaleChanged;
+ public TransformSubmodule()
+ {
+ this.originalPosition = Vector3.zero;
+ this.originalEulerAngles = Vector3.zero;
+ this.originalScale = Vector3.one;
+
+ positionOffset = new List();
+ eulerAnglesOffset = new List();
+ scaleOffset = new List();
+
+ currentPosition = Vector3.zero;
+ currentEulerAngles = Vector3.zero;
+ currentScale = Vector3.one;
+
+ positionDirtyMark = false;
+ eulerAnglesDirtyMark = false;
+ scaleDirtyMark = false;
+
+ eulerAnglesOffsetLock = false;
+ }
+
public TransformSubmodule(Vector3 originalPosition, Vector3 originalEulerAngles, Vector3 originalScale)
{
this.originalPosition = originalPosition;
this.originalEulerAngles = originalEulerAngles;
this.originalScale = originalScale;
+
positionOffset = new List();
eulerAnglesOffset = new List();
scaleOffset = new List();
+
currentPosition = originalPosition;
currentEulerAngles = originalEulerAngles;
currentScale = originalScale;
+
positionDirtyMark = false;
eulerAnglesDirtyMark = false;
scaleDirtyMark = false;
+
+ eulerAnglesOffsetLock = false;
}
public void SetObserver(BaseElement target)
diff --git a/Assets/Scripts/Base/Manager/BasePrefabsCollection.cs b/Assets/Scripts/Base/Manager/BasePrefabsCollection.cs
index a1167e05..64e0fda2 100644
--- a/Assets/Scripts/Base/Manager/BasePrefabsCollection.cs
+++ b/Assets/Scripts/Base/Manager/BasePrefabsCollection.cs
@@ -9,6 +9,7 @@ public class BasePrefabsCollection : SerializedScriptableObject
[Title("基础预制体")]
public GameObject emptyObject;
public GameObject elementFolder;
+ public GameObject gameCamera;
[Title("Track相关")]
public GameObject track;
diff --git a/Assets/Scripts/Base/Manager/EditorManager.cs b/Assets/Scripts/Base/Manager/EditorManager.cs
index 0897a6b6..31eb362d 100644
--- a/Assets/Scripts/Base/Manager/EditorManager.cs
+++ b/Assets/Scripts/Base/Manager/EditorManager.cs
@@ -34,6 +34,11 @@ namespace Ichni
t0.AfterInitialize();
}
+
+ private void Update()
+ {
+ songModule.songTime += Time.deltaTime;
+ }
}
public class SongModule
diff --git a/Assets/Scripts/Base/Manager/ThemeBundleManager.cs b/Assets/Scripts/Base/Manager/ThemeBundleManager.cs
index 05e981f6..5bfa8b13 100644
--- a/Assets/Scripts/Base/Manager/ThemeBundleManager.cs
+++ b/Assets/Scripts/Base/Manager/ThemeBundleManager.cs
@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.Networking;
+using UnityEngine.Serialization;
namespace Ichni
{
@@ -123,20 +124,23 @@ namespace Ichni
[System.Serializable]
public class ThemeBundleAbstract
{
- public string themeBundleName;
+ public string fileName;
+ public string displayName;
+ public string description;
public List tags;
-
public string iconPath;
public ThemeBundleAbstract()
{
}
- public ThemeBundleAbstract(string themeBundleName, List tags, string iconPath)
+ public ThemeBundleAbstract(string fileName)
{
- this.themeBundleName = themeBundleName;
- this.tags = tags;
- this.iconPath = iconPath;
+ this.fileName = fileName;
+ this.displayName = fileName;
+ this.description = "Default Description";
+ this.tags = new List();
+ this.iconPath = "Icons/Default.png";
}
public Texture2D GetIcon()
diff --git a/Assets/Scripts/Console.meta b/Assets/Scripts/Console.meta
new file mode 100644
index 00000000..c9544beb
--- /dev/null
+++ b/Assets/Scripts/Console.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 3e7fc3c136a914933bc2a6d75b13e7d1
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Console/EditorConsole.cs b/Assets/Scripts/Console/EditorConsole.cs
new file mode 100644
index 00000000..f2433757
--- /dev/null
+++ b/Assets/Scripts/Console/EditorConsole.cs
@@ -0,0 +1,31 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using DynamicExpresso;
+
+namespace Ichni.Editor
+{
+ public partial class EditorConsole : MonoBehaviour
+ {
+ public Interpreter functionInterpreter;
+
+ private void Start()
+ {
+ SetUpFunctions();
+
+ //Test
+ functionInterpreter.Eval("Log(\"Hello World!\")");
+ }
+ }
+
+ public partial class EditorConsole
+ {
+ private void SetUpFunctions()
+ {
+ functionInterpreter = new Interpreter();
+
+ functionInterpreter.SetFunction("Log", (System.Action