diff --git a/Assets/Prefabs/BasePrefabsCollection.asset b/Assets/Prefabs/BasePrefabsCollection.asset index 1073ccd8..a95477cd 100644 --- a/Assets/Prefabs/BasePrefabsCollection.asset +++ b/Assets/Prefabs/BasePrefabsCollection.asset @@ -25,10 +25,21 @@ MonoBehaviour: type: 3} elementFolder: {fileID: 5524510864018492689, guid: 5a9a2433580c2451b8200185cb45f867, type: 3} + gameCamera: {fileID: 0} track: {fileID: 8828428123186639208, guid: 20234a708961745eeafa459c79524348, type: 3} pathNode: {fileID: 7248180033186031075, guid: 609cdf441cd2f4c78a430e7df78a40f4, type: 3} defaultTrackMaterial: {fileID: 2100000, guid: 2424431729f1047c4b42f971c2cdd2b6, type: 2} + tapNote: {fileID: 8182686472733940155, guid: 9b2da5f6faa9c4d2abe557fc8f79f806, type: 3} + stayNote: {fileID: 0} + holdNote: {fileID: 0} + flickNote: {fileID: 0} + tapNoteSound: {fileID: 0} + stayNoteSound: {fileID: 0} + holdNoteStartSound: {fileID: 0} + holdNoteLoopSound: {fileID: 0} + holdNoteEndSound: {fileID: 0} + flickNoteSound: {fileID: 0} bloomShake: {fileID: 845605030242152257, guid: 1ea739ef6f1bf4e87835b0f554587451, type: 3} diff --git a/Assets/Prefabs/GameElements/Tap.prefab b/Assets/Prefabs/GameElements/Tap.prefab new file mode 100644 index 00000000..5708e652 --- /dev/null +++ b/Assets/Prefabs/GameElements/Tap.prefab @@ -0,0 +1,99 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &8182686472733940155 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3154956539503596607} + - component: {fileID: 1476474925599486088} + m_Layer: 0 + m_Name: Tap + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &3154956539503596607 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8182686472733940155} + 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: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1476474925599486088 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8182686472733940155} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6b1bd7cbcd49b4f0b805e902cd7c3025, 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: 6 + Data: + - Name: transformSubmodule + Entry: 6 + Data: + - Name: colorSubmodule + Entry: 6 + Data: + - Name: generateEffects + Entry: 6 + Data: + - Name: generalJudgeEffects + Entry: 6 + Data: + - Name: perfectJudgeEffects + Entry: 6 + Data: + - Name: goodJudgeEffects + Entry: 6 + Data: + - Name: badJudgeEffects + Entry: 6 + Data: + - Name: missJudgeEffects + Entry: 6 + Data: + - Name: noteJudgeSubmodule + Entry: 6 + Data: + elementName: + serialNumber: 0 + parentElement: {fileID: 0} + childElementList: [] + exactJudgeTime: 0 + isOnTrack: 0 + track: {fileID: 0} + trackPositioner: {fileID: 0} + noteVisual: {fileID: 0} + noteScreenPosition: {x: 0, y: 0} + isJudged: 0 diff --git a/Assets/Prefabs/GameElements/Tap.prefab.meta b/Assets/Prefabs/GameElements/Tap.prefab.meta new file mode 100644 index 00000000..0af32441 --- /dev/null +++ b/Assets/Prefabs/GameElements/Tap.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 9b2da5f6faa9c4d2abe557fc8f79f806 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scenes/SampleScene.unity b/Assets/Scenes/SampleScene.unity index 0684419d..43896a49 100644 --- a/Assets/Scenes/SampleScene.unity +++ b/Assets/Scenes/SampleScene.unity @@ -182,6 +182,9 @@ MonoBehaviour: - Name: timeDurationSubmodule Entry: 7 Data: 0|Ichni.RhythmGame.TimeDurationSubmodule, Assembly-CSharp + - Name: attachedElement + Entry: 6 + Data: - Name: isOverridingDuration Entry: 5 Data: false @@ -197,6 +200,9 @@ MonoBehaviour: - Name: transformSubmodule Entry: 7 Data: 1|Ichni.RhythmGame.TransformSubmodule, Assembly-CSharp + - Name: attachedElement + Entry: 6 + Data: - Name: originalPosition Entry: 7 Data: UnityEngine.Vector3, UnityEngine.CoreModule @@ -1059,6 +1065,9 @@ MonoBehaviour: - Name: timeDurationSubmodule Entry: 7 Data: 0|Ichni.RhythmGame.TimeDurationSubmodule, Assembly-CSharp + - Name: attachedElement + Entry: 6 + Data: - Name: isOverridingDuration Entry: 5 Data: false @@ -1074,6 +1083,9 @@ MonoBehaviour: - Name: transformSubmodule Entry: 7 Data: 1|Ichni.RhythmGame.TransformSubmodule, Assembly-CSharp + - Name: attachedElement + Entry: 6 + Data: - Name: originalPosition Entry: 7 Data: UnityEngine.Vector3, UnityEngine.CoreModule @@ -1612,7 +1624,7 @@ MonoBehaviour: Data: 0|Ichni.SongModule, Assembly-CSharp - Name: songTime Entry: 4 - Data: 1 + Data: 0 - Name: songBeat Entry: 4 Data: 0 @@ -1620,6 +1632,7 @@ MonoBehaviour: Entry: 8 Data: basePrefabs: {fileID: 11400000, guid: 266f4a39c512c46eea7e44336e4fc600, type: 2} + elementList: [] --- !u!4 &1197505579 Transform: m_ObjectHideFlags: 0 @@ -1675,6 +1688,9 @@ MonoBehaviour: - Name: effectSubmodule Entry: 7 Data: 2|Ichni.RhythmGame.EffectSubmodule, Assembly-CSharp + - Name: attachedElement + Entry: 6 + Data: - Name: effectList Entry: 6 Data: diff --git a/Assets/Scripts/Animations/AnimationBase.cs b/Assets/Scripts/Animations/AnimationBase.cs index c600d4ed..940e534b 100644 --- a/Assets/Scripts/Animations/AnimationBase.cs +++ b/Assets/Scripts/Animations/AnimationBase.cs @@ -14,7 +14,7 @@ namespace Ichni.RhythmGame public void NewInitialize(string elementName, BaseElement targetObject) { - base.NewInitialize(elementName); + base.Initialize(elementName); this.targetObject = targetObject; SetParent(this.targetObject); } @@ -35,12 +35,12 @@ namespace Ichni.RhythmGame } } - timeDurationSubmodule = new TimeDurationSubmodule(startTimes.Min(), endTimes.Max()); + timeDurationSubmodule = new TimeDurationSubmodule(this, startTimes.Min(), endTimes.Max()); } public virtual void SetTimeDuration(float startTime, float endTime) { - timeDurationSubmodule = new TimeDurationSubmodule(startTime, endTime); + timeDurationSubmodule = new TimeDurationSubmodule(this, startTime, endTime); } protected abstract void UpdateAnimation(float songTime); diff --git a/Assets/Scripts/Animations/Color/BaseColorChange.cs b/Assets/Scripts/Animations/Color/BaseColorChange.cs index e117c156..4c950bd7 100644 --- a/Assets/Scripts/Animations/Color/BaseColorChange.cs +++ b/Assets/Scripts/Animations/Color/BaseColorChange.cs @@ -13,7 +13,7 @@ namespace Ichni.RhythmGame 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 baseColorChange = Instantiate(EditorManager.instance.basePrefabs.emptyObject).AddComponent(); baseColorChange.NewInitialize(elementName, targetObject); baseColorChange.colorR = colorR; diff --git a/Assets/Scripts/Animations/Color/EmissionColorChange.cs b/Assets/Scripts/Animations/Color/EmissionColorChange.cs index 6cb1991a..d1173394 100644 --- a/Assets/Scripts/Animations/Color/EmissionColorChange.cs +++ b/Assets/Scripts/Animations/Color/EmissionColorChange.cs @@ -13,7 +13,7 @@ namespace Ichni.RhythmGame 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(); + EmissionColorChange baseColorChange = Instantiate(EditorManager.instance.basePrefabs.emptyObject).AddComponent(); baseColorChange.NewInitialize(elementName, targetObject); baseColorChange.colorR = colorR; diff --git a/Assets/Scripts/Animations/Track/TrackTotalTimeChange.cs b/Assets/Scripts/Animations/Track/TrackTotalTimeChange.cs index b5196e01..7803b6eb 100644 --- a/Assets/Scripts/Animations/Track/TrackTotalTimeChange.cs +++ b/Assets/Scripts/Animations/Track/TrackTotalTimeChange.cs @@ -12,7 +12,7 @@ namespace Ichni.RhythmGame public static TrackTotalTimeChange GenerateElement(string elementName, Track targetTrack, FlexibleFloat totalTime) { - TrackTotalTimeChange trackTotalTimeChange = LeanPool.Spawn(EditorManager.instance.basePrefabs.emptyObject).AddComponent(); + TrackTotalTimeChange trackTotalTimeChange = Instantiate(EditorManager.instance.basePrefabs.emptyObject).AddComponent(); trackTotalTimeChange.NewInitialize(elementName, targetTrack); if (targetTrack.trackTimeSubmodule is TrackTimeSubmoduleStatic submoduleStatic) diff --git a/Assets/Scripts/Animations/Transform/Displacement.cs b/Assets/Scripts/Animations/Transform/Displacement.cs index 261f1f25..59aab96a 100644 --- a/Assets/Scripts/Animations/Transform/Displacement.cs +++ b/Assets/Scripts/Animations/Transform/Displacement.cs @@ -18,7 +18,7 @@ namespace Ichni.RhythmGame public static Displacement GenerateElement(string elementName, BaseElement targetObject, FlexibleFloat positionX, FlexibleFloat positionY, FlexibleFloat positionZ) { - Displacement displacement = LeanPool.Spawn(EditorManager.instance.basePrefabs.emptyObject).AddComponent(); + Displacement displacement = Instantiate(EditorManager.instance.basePrefabs.emptyObject).AddComponent(); displacement.NewInitialize(elementName, targetObject); diff --git a/Assets/Scripts/Animations/Transform/LookAt.cs b/Assets/Scripts/Animations/Transform/LookAt.cs index fad10cc7..5ee0075e 100644 --- a/Assets/Scripts/Animations/Transform/LookAt.cs +++ b/Assets/Scripts/Animations/Transform/LookAt.cs @@ -19,7 +19,7 @@ namespace Ichni.RhythmGame public static LookAt GenerateElement(string elementName, BaseElement targetObject, BaseElement lookAtTarget, FlexibleBool enabling) { - LookAt swirl = LeanPool.Spawn(EditorManager.instance.basePrefabs.emptyObject).AddComponent(); + LookAt swirl = Instantiate(EditorManager.instance.basePrefabs.emptyObject).AddComponent(); swirl.NewInitialize(elementName, targetObject); diff --git a/Assets/Scripts/Animations/Transform/Scale.cs b/Assets/Scripts/Animations/Transform/Scale.cs index 42e1e8e2..08be57a2 100644 --- a/Assets/Scripts/Animations/Transform/Scale.cs +++ b/Assets/Scripts/Animations/Transform/Scale.cs @@ -12,7 +12,7 @@ namespace Ichni.RhythmGame public static Scale GenerateElement(string elementName, BaseElement targetObject, FlexibleFloat scaleX, FlexibleFloat scaleY, FlexibleFloat scaleZ) { - Scale scale = Lean.Pool.LeanPool.Spawn(EditorManager.instance.basePrefabs.emptyObject).AddComponent(); + Scale scale = Instantiate(EditorManager.instance.basePrefabs.emptyObject).AddComponent(); scale.NewInitialize(elementName, targetObject); diff --git a/Assets/Scripts/Animations/Transform/Swirl.cs b/Assets/Scripts/Animations/Transform/Swirl.cs index 906eda37..3ce086f2 100644 --- a/Assets/Scripts/Animations/Transform/Swirl.cs +++ b/Assets/Scripts/Animations/Transform/Swirl.cs @@ -13,7 +13,7 @@ namespace Ichni.RhythmGame public static Swirl GenerateElement(string elementName, BaseElement targetObject, FlexibleFloat eulerAngleX, FlexibleFloat eulerAngleY, FlexibleFloat eulerAngleZ) { - Swirl swirl = LeanPool.Spawn(EditorManager.instance.basePrefabs.emptyObject).AddComponent(); + Swirl swirl = Instantiate(EditorManager.instance.basePrefabs.emptyObject).AddComponent(); swirl.NewInitialize(elementName, targetObject); diff --git a/Assets/Scripts/Base/BaseElement.cs b/Assets/Scripts/Base/BaseElement.cs index 765c0b91..4fb7bbe6 100644 --- a/Assets/Scripts/Base/BaseElement.cs +++ b/Assets/Scripts/Base/BaseElement.cs @@ -20,6 +20,9 @@ namespace Ichni.RhythmGame //标识 GUID public Guid elementGuid; + //标签 + public List tags; + //存档 //public BaseElement_BM matchedBM; @@ -38,13 +41,14 @@ namespace Ichni.RhythmGame /// 首次初始化 /// /// 物体名 - public virtual void NewInitialize(string name) + public virtual void Initialize(string name) { this.elementName = name; this.elementGuid = Guid.NewGuid(); + EditorManager.instance.elementList.Add(this); //GameManager.beatMapContainer.beatMapElementList.Add(this); //serialNumber = totalSerialNumber++; - SetTransformObserver(); + //SetTransformObserver(); } /// @@ -63,6 +67,14 @@ namespace Ichni.RhythmGame } + /// + /// 当物体被删除时执行的方法 + /// + public virtual void OnDelete() + { + + } + /// /// 设置父物体 /// @@ -76,6 +88,23 @@ namespace Ichni.RhythmGame transform.SetParent(parentElement.transform); } } + + public virtual void Delete() + { + if (this.childElementList != null) + { + for (int i = 0; i < childElementList.Count; i++) + { + childElementList[i].Delete(); //删除子GameElement、 + } + } + + OnDelete(); + + EditorManager.instance.elementList.Remove(this); //从保存列表中剔除 + this.parentElement.childElementList.Remove(this); + Destroy(gameObject); //销毁 + } } public abstract partial class BaseElement diff --git a/Assets/Scripts/Base/GeneralSubmodules/ColorSubmodule.cs b/Assets/Scripts/Base/GeneralSubmodules/ColorSubmodule.cs index ce609f4a..b92de51a 100644 --- a/Assets/Scripts/Base/GeneralSubmodules/ColorSubmodule.cs +++ b/Assets/Scripts/Base/GeneralSubmodules/ColorSubmodule.cs @@ -10,45 +10,62 @@ namespace Ichni.RhythmGame public bool emissionEnabled; public Color originalEmissionColor; public float originalEmissionIntensity; - + public List baseColorOffset = new List(); public List emissionColorOffset = new List(); public List emissionIntensityOffset = new List(); - + public Color currentBaseColor; public Color currentEmissionColor; public float currentEmissionIntensity; public bool baseColorDirtyMark; public bool emissionColorDirtyMark; - - public ColorSubmodule() + + public ColorSubmodule(BaseElement attachedElement) : base(attachedElement) { - + this.originalBaseColor = Color.white; + this.emissionEnabled = false; + this.originalEmissionColor = Color.black; + this.originalEmissionIntensity = 0; + + this.currentBaseColor = Color.white; + this.currentEmissionColor = Color.black; + this.currentEmissionIntensity = 0; + + this.baseColorDirtyMark = false; + this.emissionColorDirtyMark = false; } - - public ColorSubmodule(Color originalBaseColor) + + public ColorSubmodule(BaseElement attachedElement, Color originalBaseColor) : base(attachedElement) { this.originalBaseColor = originalBaseColor; this.emissionEnabled = false; this.originalEmissionColor = Color.black; this.originalEmissionIntensity = 0; - + this.currentBaseColor = originalBaseColor; this.currentEmissionColor = Color.black; this.currentEmissionIntensity = 0; + + this.baseColorDirtyMark = false; + this.emissionColorDirtyMark = false; } - - public ColorSubmodule(Color originalBaseColor, bool emissionEnabled, Color originalEmissionColor, float originalEmissionIntensity) + + public ColorSubmodule(BaseElement attachedElement, Color originalBaseColor, bool emissionEnabled, + Color originalEmissionColor, float originalEmissionIntensity) : base(attachedElement) { this.originalBaseColor = originalBaseColor; this.emissionEnabled = emissionEnabled; this.originalEmissionColor = originalEmissionColor; this.originalEmissionIntensity = originalEmissionIntensity; - + this.currentBaseColor = originalBaseColor; this.currentEmissionColor = originalEmissionColor; this.currentEmissionIntensity = originalEmissionIntensity; + + this.baseColorDirtyMark = false; + this.emissionColorDirtyMark = false; } } } \ No newline at end of file diff --git a/Assets/Scripts/Base/GeneralSubmodules/EffectSubmodule.cs b/Assets/Scripts/Base/GeneralSubmodules/EffectSubmodule.cs index 6e980d42..1ee96325 100644 --- a/Assets/Scripts/Base/GeneralSubmodules/EffectSubmodule.cs +++ b/Assets/Scripts/Base/GeneralSubmodules/EffectSubmodule.cs @@ -7,6 +7,11 @@ namespace Ichni.RhythmGame public class EffectSubmodule : SubmoduleBase { public List effectList; + + public EffectSubmodule(BaseElement attachedElement) : base(attachedElement) + { + effectList = new List(); + } } public abstract class EffectBase diff --git a/Assets/Scripts/Base/GeneralSubmodules/SubmoduleBase.cs b/Assets/Scripts/Base/GeneralSubmodules/SubmoduleBase.cs index f318edf5..8bf8042c 100644 --- a/Assets/Scripts/Base/GeneralSubmodules/SubmoduleBase.cs +++ b/Assets/Scripts/Base/GeneralSubmodules/SubmoduleBase.cs @@ -6,6 +6,13 @@ namespace Ichni.RhythmGame { public abstract class SubmoduleBase { + public BaseElement attachedElement; + + public SubmoduleBase(BaseElement attachedElement) + { + this.attachedElement = attachedElement; + } + public virtual void InitialRefresh() { diff --git a/Assets/Scripts/Base/GeneralSubmodules/TimeDurationSubmodule.cs b/Assets/Scripts/Base/GeneralSubmodules/TimeDurationSubmodule.cs index de9a5e48..102825b1 100644 --- a/Assets/Scripts/Base/GeneralSubmodules/TimeDurationSubmodule.cs +++ b/Assets/Scripts/Base/GeneralSubmodules/TimeDurationSubmodule.cs @@ -11,14 +11,14 @@ namespace Ichni.RhythmGame public bool isOverridingDuration; //是否手动设置了时间区间,开启时,子物体的时间区间将被忽略 public float startTime, endTime; //起止时间 - public TimeDurationSubmodule() + public TimeDurationSubmodule(BaseElement attachedElement) : base(attachedElement) { isOverridingDuration = false; - startTime = 0; - endTime = 0; + startTime = -999;//TODO: 换为-delay + endTime = 999;//TODO: 换为songLength } - public TimeDurationSubmodule(float startTime, float endTime) + public TimeDurationSubmodule(BaseElement attachedElement, float startTime, float endTime) : base(attachedElement) { this.isOverridingDuration = false; this.startTime = startTime; diff --git a/Assets/Scripts/Base/GeneralSubmodules/TransformSubmodule.cs b/Assets/Scripts/Base/GeneralSubmodules/TransformSubmodule.cs index 7b3565d8..c1aac24a 100644 --- a/Assets/Scripts/Base/GeneralSubmodules/TransformSubmodule.cs +++ b/Assets/Scripts/Base/GeneralSubmodules/TransformSubmodule.cs @@ -14,83 +14,70 @@ namespace Ichni.RhythmGame public Vector3 originalPosition; public Vector3 originalEulerAngles; public Vector3 originalScale; - + public List positionOffset; public List eulerAnglesOffset; public List scaleOffset; - + public Vector3 currentPosition; public Vector3 currentEulerAngles; public Vector3 currentScale; - + public bool positionDirtyMark; public bool eulerAnglesDirtyMark; public bool scaleDirtyMark; public bool eulerAnglesOffsetLock; - + public UnityAction OnPositionChanged; public UnityAction OnEulerAnglesChanged; public UnityAction OnScaleChanged; - public TransformSubmodule() + public TransformSubmodule(BaseElement attachedElement) : base(attachedElement) { 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; + + attachedElement.SetTransformObserver(); } - public TransformSubmodule(Vector3 originalPosition, Vector3 originalEulerAngles, Vector3 originalScale) + public TransformSubmodule(BaseElement attachedElement, + Vector3 originalPosition, Vector3 originalEulerAngles, Vector3 originalScale) : base(attachedElement) { 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) - { - Observable.EveryUpdate().Subscribe(_ => - { - if (positionDirtyMark) - { - Vector3 offset = Vector3.zero; - foreach (var positionOffset in positionOffset) - { - offset += positionOffset; - } - currentPosition = originalPosition + offset; - positionDirtyMark = false; - } - positionOffset.Clear(); - }).AddTo(target); + + attachedElement.SetTransformObserver(); } } } \ No newline at end of file diff --git a/Assets/Scripts/Base/Manager/EditorManager.cs b/Assets/Scripts/Base/Manager/EditorManager.cs index 31eb362d..b36938db 100644 --- a/Assets/Scripts/Base/Manager/EditorManager.cs +++ b/Assets/Scripts/Base/Manager/EditorManager.cs @@ -2,6 +2,7 @@ using System; using System.Collections; using System.Collections.Generic; using Ichni.RhythmGame; +using Ichni.RhythmGame.ThemeBundles.Basic; using Sirenix.OdinInspector; using UnityEngine; @@ -13,6 +14,8 @@ namespace Ichni public SongModule songModule; public BasePrefabsCollection basePrefabs; + + public List elementList = new List(); private void Awake() { @@ -22,17 +25,20 @@ namespace Ichni private void Start() { var f0 = ElementFolder.GenerateElement("Folder", null); + var dis0 = Displacement.GenerateElement("Displacement-0", f0, + new FlexibleFloat(), + new FlexibleFloat(new List(){new (0,2,0,2, AnimationCurveType.Linear)}), + new FlexibleFloat()); var t0 = Track.GenerateElement("Track", f0, Vector3.left * 5f); - t0.trackPathSubmodule = new TrackPathSubmodule(); - t0.trackTimeSubmodule = new TrackTimeSubmoduleMovable(); - t0.trackRendererSubmodule = new TrackRendererSubmoduleAutoOrient(); - (t0.trackPathSubmodule).NewInitialize(t0, false, Track.TrackSpaceType.Linear, Track.TrackSamplingType.TimeDistributed); - (t0.trackTimeSubmodule as TrackTimeSubmoduleMovable).NewInitialize(t0, 0, 1, 1, AnimationCurveType.Linear); - (t0.trackRendererSubmodule as TrackRendererSubmoduleAutoOrient).NewInitialize(t0); - var p0 = PathNode.GeneratePathNode("PathNode-0", t0, 0, Vector3.zero, Vector3.forward, 1, Color.white); - var p1 = PathNode.GeneratePathNode("PathNode-1", t0, 1, Vector3.one * 10f, Vector3.left, 0, Color.red); - - t0.AfterInitialize(); + t0.trackPathSubmodule = new TrackPathSubmodule(t0, Track.TrackSpaceType.Linear, Track.TrackSamplingType.TimeDistributed, false); + t0.trackTimeSubmodule = new TrackTimeSubmoduleMovable(t0, 0, 2, 1, AnimationCurveType.Linear); + t0.trackRendererSubmodule = new TrackRendererSubmoduleAutoOrient(t0); + var p0 = PathNode.GenerateElement("PathNode-0", t0, 0, new Vector3(-5,5,10), Vector3.forward, 1, Color.white); + var p1 = PathNode.GenerateElement("PathNode-1", t0, 1, new Vector3(5,-5,10), Vector3.forward, 0, Color.red); + var n0 = Tap.GenerateElement("Note-0", 1f, t0); + var n0v = BasicNoteVisual.GenerateElement("Note-0-V", "basic", "BasicNoteTap3D", Vector3.zero, Vector3.zero, Vector3.one, n0); + + elementList.ForEach(e => e.AfterInitialize()); } private void Update() diff --git a/Assets/Scripts/Base/Manager/ThemeBundleManager.cs b/Assets/Scripts/Base/Manager/ThemeBundleManager.cs index 5bfa8b13..ddec957b 100644 --- a/Assets/Scripts/Base/Manager/ThemeBundleManager.cs +++ b/Assets/Scripts/Base/Manager/ThemeBundleManager.cs @@ -20,20 +20,16 @@ namespace Ichni private void Awake() { instance = this; - } - - private void Start() - { + loadedThemeBundleList = new List(); AssetBundle.UnloadAllAssetBundles(true); LoadAllThemeBundlesAbstract(); - //DontDestroyOnLoad(gameObject); - - LoadThemeBundle("fundamental"); + LoadThemeBundle("basic"); } + public T GetObject(string themeBundleName, string objectName) where T : class { return loadedThemeBundleList.Find(bundle => bundle.themeBundleName == themeBundleName)?.GetObject(objectName); diff --git a/Assets/Scripts/GameElements/ElementFolder.cs b/Assets/Scripts/GameElements/ElementFolder.cs index 7d8c5c30..ef7839a2 100644 --- a/Assets/Scripts/GameElements/ElementFolder.cs +++ b/Assets/Scripts/GameElements/ElementFolder.cs @@ -10,12 +10,16 @@ namespace Ichni.RhythmGame { public static ElementFolder GenerateElement(string name, BaseElement parentElement) { - ElementFolder elementFolder = LeanPool.Spawn(EditorManager.instance.basePrefabs.elementFolder).GetComponent(); + ElementFolder elementFolder = Instantiate(EditorManager.instance.basePrefabs.elementFolder).GetComponent(); - elementFolder.NewInitialize(name); + elementFolder.Initialize(name); elementFolder.SetParent(parentElement); - elementFolder.transformSubmodule = new TransformSubmodule(Vector3.zero, Vector3.zero, Vector3.one); + + elementFolder.transformSubmodule = new TransformSubmodule(elementFolder); + elementFolder.timeDurationSubmodule = new TimeDurationSubmodule(elementFolder); //elementFolder.GenerateTab(parentElement); + + elementFolder.SetTransformObserver(); return elementFolder; } diff --git a/Assets/Scripts/GameElements/EnvironmentObjects/EnvironmentObject.cs b/Assets/Scripts/GameElements/EnvironmentObjects/EnvironmentObject.cs index 6f8c7107..53ab5416 100644 --- a/Assets/Scripts/GameElements/EnvironmentObjects/EnvironmentObject.cs +++ b/Assets/Scripts/GameElements/EnvironmentObjects/EnvironmentObject.cs @@ -14,8 +14,8 @@ namespace Ichni.RhythmGame bool isStatic, bool isFirstGenerated = true) { EnvironmentObject themeBundleObject = ThemeBundleManager.instance.GetObject(themeBundleName, objectName); - EnvironmentObject environmentObject = LeanPool.Spawn(themeBundleObject, parent.transform).GetComponent(); - environmentObject.NewInitialize(elementName); + EnvironmentObject environmentObject = Instantiate(themeBundleObject, parent.transform).GetComponent(); + environmentObject.Initialize(elementName); environmentObject.isStatic = isStatic; return environmentObject; } diff --git a/Assets/Scripts/GameElements/GameCamera/GameCamera.cs b/Assets/Scripts/GameElements/GameCamera/GameCamera.cs index 124ba416..7ae7d93e 100644 --- a/Assets/Scripts/GameElements/GameCamera/GameCamera.cs +++ b/Assets/Scripts/GameElements/GameCamera/GameCamera.cs @@ -24,15 +24,15 @@ namespace Ichni.RhythmGame CameraViewType cameraViewType, float perspectiveAngle, float orthographicSize, Vector3 initialPosition, Vector3 initialEulerAngles) { - GameCamera gameCamera = LeanPool.Spawn(EditorManager.instance.basePrefabs.gameCamera).GetComponent(); + GameCamera gameCamera = Instantiate(EditorManager.instance.basePrefabs.gameCamera).GetComponent(); - gameCamera.NewInitialize(elementName); + gameCamera.Initialize(elementName); gameCamera.parentElement = parentElement; gameCamera.cameraViewType = cameraViewType; gameCamera.camera.orthographic = cameraViewType == CameraViewType.Orthographic; gameCamera.perspectiveAngle = perspectiveAngle; gameCamera.orthographicSize = orthographicSize; - gameCamera.transformSubmodule = new TransformSubmodule(initialPosition, initialEulerAngles, Vector3.one); + gameCamera.transformSubmodule = new TransformSubmodule(gameCamera, initialPosition, initialEulerAngles, Vector3.one); gameCamera.cameraTransform = gameCamera.transform; gameCamera.SetParent(parentElement); diff --git a/Assets/Scripts/GameElements/GeneralEffects/BloomShake.cs b/Assets/Scripts/GameElements/GeneralEffects/BloomShake.cs index 73298048..eb8e1a0f 100644 --- a/Assets/Scripts/GameElements/GeneralEffects/BloomShake.cs +++ b/Assets/Scripts/GameElements/GeneralEffects/BloomShake.cs @@ -5,7 +5,6 @@ using Lean.Pool; using MoreMountains.Feedbacks; using MoreMountains.FeedbacksForThirdParty; using Sirenix.OdinInspector; -using UnityEngine; namespace Ichni.RhythmGame { diff --git a/Assets/Scripts/GameElements/Notes/Flick.cs b/Assets/Scripts/GameElements/Notes/Flick.cs index 49c40ed5..21a3128b 100644 --- a/Assets/Scripts/GameElements/Notes/Flick.cs +++ b/Assets/Scripts/GameElements/Notes/Flick.cs @@ -1,6 +1,8 @@ using System.Collections; using System.Collections.Generic; +using Dreamteck.Splines; using Lean.Pool; +using Unity.VisualScripting; using UnityEngine; namespace Ichni.RhythmGame @@ -10,9 +12,12 @@ namespace Ichni.RhythmGame public List availableFlickDirections; public static Flick GenerateElement(string elementName, float exactJudgeTime, BaseElement attach, List directions) { - Flick flick = LeanPool.Spawn(EditorManager.instance.basePrefabs.tapNote, attach.transform).GetComponent(); - flick.NewInitialize(elementName, exactJudgeTime); + Flick flick = Instantiate(EditorManager.instance.basePrefabs.tapNote, attach.transform).GetComponent(); + flick.Initialize(elementName); + flick.exactJudgeTime = exactJudgeTime; flick.availableFlickDirections = directions; + flick.transformSubmodule = new TransformSubmodule(flick); + flick.timeDurationSubmodule = new TimeDurationSubmodule(flick); flick.SetParent(attach); if (attach.TryGetComponent(out Track track)) @@ -20,6 +25,7 @@ namespace Ichni.RhythmGame if (track.trackTimeSubmodule != null) { flick.track = track; + flick.trackPositioner = flick.AddComponent(); flick.trackPositioner.spline = track.trackPathSubmodule.path; flick.isOnTrack = true; flick.UpdateNoteInTrack(); @@ -31,18 +37,11 @@ namespace Ichni.RhythmGame } else { - + flick.track = null; + flick.isOnTrack = false; } return flick; } - - public void NewInitialize(string elementName, float exactJudgeTime) - { - base.NewInitialize(elementName); - this.exactJudgeTime = exactJudgeTime; - this.track = null; - this.isOnTrack = false; - } } } \ No newline at end of file diff --git a/Assets/Scripts/GameElements/Notes/JudgeSubmodules/NoteJudgeSubmodule.cs b/Assets/Scripts/GameElements/Notes/JudgeSubmodules/NoteJudgeSubmodule.cs index af9ab8c6..581ba12b 100644 --- a/Assets/Scripts/GameElements/Notes/JudgeSubmodules/NoteJudgeSubmodule.cs +++ b/Assets/Scripts/GameElements/Notes/JudgeSubmodules/NoteJudgeSubmodule.cs @@ -6,7 +6,10 @@ namespace Ichni.RhythmGame { public class NoteJudgeSubmodule : SubmoduleBase { - + public NoteJudgeSubmodule(BaseElement attachedElement) : base(attachedElement) + { + + } } public class NoteJudgeUnit diff --git a/Assets/Scripts/GameElements/Notes/NoteBase.cs b/Assets/Scripts/GameElements/Notes/NoteBase.cs index a3d7caff..0ab99f3a 100644 --- a/Assets/Scripts/GameElements/Notes/NoteBase.cs +++ b/Assets/Scripts/GameElements/Notes/NoteBase.cs @@ -40,7 +40,19 @@ namespace Ichni.RhythmGame [Title("In-Game Info")] public Vector2 noteScreenPosition; public bool isJudged; - + + public override void Initialize(string name) + { + base.Initialize(name); + generateEffects = new EffectSubmodule(this); + generalJudgeEffects = new EffectSubmodule(this); + perfectJudgeEffects = new EffectSubmodule(this); + goodJudgeEffects = new EffectSubmodule(this); + badJudgeEffects = new EffectSubmodule(this); + missJudgeEffects = new EffectSubmodule(this); + noteJudgeSubmodule = new NoteJudgeSubmodule(this); + } + /// /// 在MovableTrack上更新Note的位置,注意HoldNote需要重写这个方法 /// @@ -97,7 +109,7 @@ namespace Ichni.RhythmGame { if (!isJudged) { - AudioSource.PlayClipAtPoint(EditorManager.instance.basePrefabs.tapNoteSound, Camera.main.transform.position, 1f); + //AudioSource.PlayClipAtPoint(EditorManager.instance.basePrefabs.tapNoteSound, Camera.main.transform.position, 1f); isJudged = true; } } diff --git a/Assets/Scripts/GameElements/Notes/NoteVisual/NoteVisualBase.cs b/Assets/Scripts/GameElements/Notes/NoteVisual/NoteVisualBase.cs index 2e6ccd1c..eda11174 100644 --- a/Assets/Scripts/GameElements/Notes/NoteVisual/NoteVisualBase.cs +++ b/Assets/Scripts/GameElements/Notes/NoteVisual/NoteVisualBase.cs @@ -16,7 +16,7 @@ namespace Ichni.RhythmGame public void NewInitialize(NoteBase note) { - base.NewInitialize(note.elementName + " Note Visual"); + base.Initialize(note.elementName + " Note Visual"); this.note = note; } } diff --git a/Assets/Scripts/GameElements/Notes/Stay.cs b/Assets/Scripts/GameElements/Notes/Stay.cs index 7a39c2a7..9e0388c0 100644 --- a/Assets/Scripts/GameElements/Notes/Stay.cs +++ b/Assets/Scripts/GameElements/Notes/Stay.cs @@ -1,6 +1,8 @@ using System.Collections; using System.Collections.Generic; +using Dreamteck.Splines; using Lean.Pool; +using Unity.VisualScripting; using UnityEngine; namespace Ichni.RhythmGame @@ -9,8 +11,11 @@ namespace Ichni.RhythmGame { public static Stay GenerateElement(string elementName, float exactJudgeTime, BaseElement attach) { - Stay stay = LeanPool.Spawn(EditorManager.instance.basePrefabs.tapNote, attach.transform).GetComponent(); - stay.NewInitialize(elementName, exactJudgeTime); + Stay stay = Instantiate(EditorManager.instance.basePrefabs.tapNote, attach.transform).GetComponent(); + stay.Initialize(elementName); + stay.exactJudgeTime = exactJudgeTime; + stay.transformSubmodule = new TransformSubmodule(stay); + stay.timeDurationSubmodule = new TimeDurationSubmodule(stay); stay.SetParent(attach); if (attach.TryGetComponent(out Track track)) @@ -18,6 +23,7 @@ namespace Ichni.RhythmGame if (track.trackTimeSubmodule != null) { stay.track = track; + stay.trackPositioner = stay.AddComponent(); stay.trackPositioner.spline = track.trackPathSubmodule.path; stay.isOnTrack = true; stay.UpdateNoteInTrack(); @@ -29,18 +35,11 @@ namespace Ichni.RhythmGame } else { - + stay.track = null; + stay.isOnTrack = false; } return stay; } - - public void NewInitialize(string elementName, float exactJudgeTime) - { - base.NewInitialize(elementName); - this.exactJudgeTime = exactJudgeTime; - this.track = null; - this.isOnTrack = false; - } } } \ No newline at end of file diff --git a/Assets/Scripts/GameElements/Notes/Tap.cs b/Assets/Scripts/GameElements/Notes/Tap.cs index 97beadfe..c4c6fe83 100644 --- a/Assets/Scripts/GameElements/Notes/Tap.cs +++ b/Assets/Scripts/GameElements/Notes/Tap.cs @@ -1,6 +1,8 @@ using System.Collections; using System.Collections.Generic; +using Dreamteck.Splines; using Lean.Pool; +using Unity.VisualScripting; using UnityEngine; namespace Ichni.RhythmGame @@ -9,8 +11,11 @@ namespace Ichni.RhythmGame { public static Tap GenerateElement(string elementName, float exactJudgeTime, BaseElement attach) { - Tap tap = LeanPool.Spawn(EditorManager.instance.basePrefabs.tapNote, attach.transform).GetComponent(); - tap.NewInitialize(elementName, exactJudgeTime); + Tap tap = Instantiate(EditorManager.instance.basePrefabs.tapNote, attach.transform).GetComponent(); + tap.Initialize(elementName); + tap.exactJudgeTime = exactJudgeTime; + tap.transformSubmodule = new TransformSubmodule(tap); + tap.timeDurationSubmodule = new TimeDurationSubmodule(tap); tap.SetParent(attach); if (attach.TryGetComponent(out Track track)) @@ -18,6 +23,7 @@ namespace Ichni.RhythmGame if (track.trackTimeSubmodule != null) { tap.track = track; + tap.trackPositioner = tap.AddComponent(); tap.trackPositioner.spline = track.trackPathSubmodule.path; tap.isOnTrack = true; tap.UpdateNoteInTrack(); @@ -29,18 +35,11 @@ namespace Ichni.RhythmGame } else { - + tap.track = null; + tap.isOnTrack = false; } return tap; } - - public void NewInitialize(string elementName, float exactJudgeTime) - { - base.NewInitialize(elementName); - this.exactJudgeTime = exactJudgeTime; - this.track = null; - this.isOnTrack = false; - } } } \ No newline at end of file diff --git a/Assets/Scripts/GameElements/SubstantialObject.cs b/Assets/Scripts/GameElements/SubstantialObject.cs index 8024fee1..d8051193 100644 --- a/Assets/Scripts/GameElements/SubstantialObject.cs +++ b/Assets/Scripts/GameElements/SubstantialObject.cs @@ -14,8 +14,13 @@ namespace Ichni.RhythmGame bool isFirstGenerated = true) { GameObject themeBundleObject = ThemeBundleManager.instance.GetObject(themeBundleName, objectName); - SubstantialObject substantialObject = LeanPool.Spawn(themeBundleObject, parent.transform).GetComponent(); - substantialObject.NewInitialize(elementName); + SubstantialObject substantialObject = Instantiate(themeBundleObject, parent.transform).GetComponent(); + substantialObject.Initialize(elementName); + + substantialObject.transformSubmodule = new TransformSubmodule(substantialObject, position, eulerAngles, scale); + substantialObject.timeDurationSubmodule = new TimeDurationSubmodule(substantialObject); + substantialObject.colorSubmodule = new ColorSubmodule(substantialObject); + substantialObject.SetParent(parent); return substantialObject; } diff --git a/Assets/Scripts/GameElements/Track/PathNode.cs b/Assets/Scripts/GameElements/Track/PathNode.cs index 06501e0c..bdfb5124 100644 --- a/Assets/Scripts/GameElements/Track/PathNode.cs +++ b/Assets/Scripts/GameElements/Track/PathNode.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using Dreamteck.Splines; using Ichni; using Lean.Pool; +using Sirenix.OdinInspector; using UnityEngine; namespace Ichni.RhythmGame @@ -12,34 +13,30 @@ namespace Ichni.RhythmGame public ColorSubmodule colorSubmodule; public Track track; - public int index; + + public int index => track.trackPathSubmodule.pathNodeList.IndexOf(this); + public SplinePoint node; - public static PathNode GeneratePathNode(string elementName, Track track, int index, Vector3 nodePosition, + public static PathNode GenerateElement(string elementName, Track track, int index, Vector3 nodePosition, Vector3 nodeNormal, float nodeSize, Color nodeColor) { - PathNode pathNode = LeanPool.Spawn(EditorManager.instance.basePrefabs.pathNode, track.transform).GetComponent(); + PathNode pathNode = Instantiate(EditorManager.instance.basePrefabs.pathNode, track.transform).GetComponent(); - pathNode.NewInitialize(elementName, track, index, nodePosition, nodeNormal, nodeSize, nodeColor); + pathNode.Initialize(elementName); + pathNode.track = track; + //pathNode.index = index; + + pathNode.transformSubmodule = new TransformSubmodule(pathNode, nodePosition, Quaternion.LookRotation(nodeNormal, Vector3.up).eulerAngles, Vector3.one * nodeSize); + pathNode.timeDurationSubmodule = new TimeDurationSubmodule(pathNode); + pathNode.colorSubmodule = new ColorSubmodule(pathNode, nodeColor); track.trackPathSubmodule.pathNodeList.Add(pathNode); pathNode.SetParent(track); + return pathNode; } - - public void NewInitialize(string elementName, Track track, int index, Vector3 nodePosition, - Vector3 nodeNormal, float nodeSize, Color nodeColor) - { - base.NewInitialize(elementName); - this.track = track; - this.index = index; - this.transformSubmodule = new TransformSubmodule(nodePosition, Quaternion.LookRotation(nodeNormal, Vector3.up).eulerAngles, Vector3.one * nodeSize); - this.colorSubmodule = new ColorSubmodule(nodeColor); - - Refresh(); - } - public override void AfterInitialize() { Refresh(); diff --git a/Assets/Scripts/GameElements/Track/Track.cs b/Assets/Scripts/GameElements/Track/Track.cs index ef620107..2f71f013 100644 --- a/Assets/Scripts/GameElements/Track/Track.cs +++ b/Assets/Scripts/GameElements/Track/Track.cs @@ -14,30 +14,23 @@ namespace Ichni.RhythmGame public static Track GenerateElement(string elementName, BaseElement parent, Vector3 position) { - if (parent == null) - { - throw new System.Exception("Parent is null"); - } + Track track = Instantiate(EditorManager.instance.basePrefabs.track, parent.transform).GetComponent(); - Track track = LeanPool.Spawn(EditorManager.instance.basePrefabs.track, parent.transform).GetComponent(); - - track.NewInitialize(elementName, position); + track.Initialize(elementName); track.SetParent(parent); + + track.transformSubmodule = new TransformSubmodule(track, position, Vector3.zero, Vector3.one); + track.timeDurationSubmodule = new TimeDurationSubmodule(track); + + track.trackPathSubmodule = null; + track.trackTimeSubmodule = null; + track.trackRendererSubmodule = null; + + track.SetTransformObserver(); return track; } - private void NewInitialize(string elementName, Vector3 position) - { - base.NewInitialize(elementName); - timeDurationSubmodule = new TimeDurationSubmodule(); - transformSubmodule = new TransformSubmodule(position, Vector3.zero, Vector3.one); - trackPathSubmodule = null; - trackTimeSubmodule = null; - trackRendererSubmodule = null; - Refresh(); - } - public override void AfterInitialize() { @@ -56,7 +49,7 @@ namespace Ichni.RhythmGame { public override void Refresh() { - transform.localPosition = transformSubmodule.currentPosition; + } } diff --git a/Assets/Scripts/GameElements/Track/TrackPoints/TrackHeadPoint.cs b/Assets/Scripts/GameElements/Track/TrackPoints/TrackHeadPoint.cs index a0655f3f..4e934e10 100644 --- a/Assets/Scripts/GameElements/Track/TrackPoints/TrackHeadPoint.cs +++ b/Assets/Scripts/GameElements/Track/TrackPoints/TrackHeadPoint.cs @@ -14,7 +14,7 @@ namespace Ichni.RhythmGame public static TrackHeadPoint GenerateElement(string elementName, Track track) { - TrackHeadPoint head = LeanPool.Spawn(EditorManager.instance.basePrefabs.emptyObject, track.transform).AddComponent(); + TrackHeadPoint head = Instantiate(EditorManager.instance.basePrefabs.emptyObject, track.transform).AddComponent(); head.NewInitialize(elementName, track); head.SetParent(track); @@ -23,7 +23,7 @@ namespace Ichni.RhythmGame private void NewInitialize(string elementName, Track track) { - base.NewInitialize(elementName); + base.Initialize(elementName); this.track = track; this.trackPositioner = gameObject.AddComponent(); this.trackPositioner.spline = track.trackPathSubmodule.path; diff --git a/Assets/Scripts/GameElements/Track/TrackPoints/TrackPercentPoint.cs b/Assets/Scripts/GameElements/Track/TrackPoints/TrackPercentPoint.cs index e7aa6431..d6f17aec 100644 --- a/Assets/Scripts/GameElements/Track/TrackPoints/TrackPercentPoint.cs +++ b/Assets/Scripts/GameElements/Track/TrackPoints/TrackPercentPoint.cs @@ -21,7 +21,7 @@ namespace Ichni.RhythmGame public static TrackPercentPoint GenerateElement(string elementName, Track track, FlexibleFloat trackPercent) { - TrackPercentPoint point = LeanPool.Spawn(EditorManager.instance.basePrefabs.emptyObject, track.transform).AddComponent(); + TrackPercentPoint point = Instantiate(EditorManager.instance.basePrefabs.emptyObject, track.transform).AddComponent(); point.NewInitialize(elementName, track, trackPercent); point.SetParent(track); @@ -33,7 +33,7 @@ namespace Ichni.RhythmGame private void NewInitialize(string elementName, Track track, FlexibleFloat trackPercent) { - base.NewInitialize(elementName); + base.Initialize(elementName); this.track = track; this.trackPositioner = gameObject.AddComponent(); this.trackPositioner.spline = track.trackPathSubmodule.path; diff --git a/Assets/Scripts/GameElements/Track/TrackSubmodules/TrackPathSubmodule.cs b/Assets/Scripts/GameElements/Track/TrackSubmodules/TrackPathSubmodule.cs index 7796297a..34edf9e7 100644 --- a/Assets/Scripts/GameElements/Track/TrackSubmodules/TrackPathSubmodule.cs +++ b/Assets/Scripts/GameElements/Track/TrackSubmodules/TrackPathSubmodule.cs @@ -15,10 +15,8 @@ namespace Ichni.RhythmGame public Track.TrackSamplingType trackSamplingType; public bool isClosed; - public void NewInitialize(Track track, bool isClosed, Track.TrackSpaceType trackSpaceType, - Track.TrackSamplingType trackSamplingType) + public TrackPathSubmodule(Track track, Track.TrackSpaceType trackSpaceType, Track.TrackSamplingType trackSamplingType, bool isClosed) : base(track) { - this.track = track; this.path = track.AddComponent(); track.trackPathSubmodule = this; this.pathNodeList = new List(); @@ -26,7 +24,8 @@ namespace Ichni.RhythmGame this.trackSamplingType = trackSamplingType; this.isClosed = isClosed; - SetUpSplineComputer(trackSpaceType, trackSamplingType); + SetUpSplineComputer(this.trackSpaceType, this.trackSamplingType); + //闭合路径在PathNode生成时执行,在初始化的情况下,PathNode数量为0,不会执行闭合操作 } } @@ -59,13 +58,6 @@ namespace Ichni.RhythmGame path.type = (Spline.Type)spaceType; } - public void AddPathNode(PathNode point) - { - path.SetPoint(pathNodeList.Count, point.node, SplineComputer.Space.Local); - - pathNodeList.Add(point); - } - public void SetPathNode(PathNode point) { path.SetPoint(point.index, point.node, SplineComputer.Space.Local); diff --git a/Assets/Scripts/GameElements/Track/TrackSubmodules/TrackRendererSubmodule.cs b/Assets/Scripts/GameElements/Track/TrackSubmodules/TrackRendererSubmodule.cs index 697d94d7..afe4ec7a 100644 --- a/Assets/Scripts/GameElements/Track/TrackSubmodules/TrackRendererSubmodule.cs +++ b/Assets/Scripts/GameElements/Track/TrackSubmodules/TrackRendererSubmodule.cs @@ -11,16 +11,20 @@ namespace Ichni.RhythmGame public MeshGenerator meshGenerator; public MeshRenderer meshRenderer; public Material renderMaterial; + + public TrackRendererSubmodule(Track track) : base(track) + { + this.track = track; + this.track.trackRendererSubmodule = this; + } } public class TrackRendererSubmoduleAutoOrient : TrackRendererSubmodule { public SplineRenderer splineRenderer; - public void NewInitialize(Track track, Material material = null) + public TrackRendererSubmoduleAutoOrient(Track track, Material material = null) : base(track) { - this.track = track; - this.track.trackRendererSubmodule = this; this.splineRenderer = track.AddComponent(); this.meshRenderer = splineRenderer.GetComponent(); this.meshGenerator = splineRenderer; diff --git a/Assets/Scripts/GameElements/Track/TrackSubmodules/TrackSubmodule.cs b/Assets/Scripts/GameElements/Track/TrackSubmodules/TrackSubmodule.cs index 88c5a7e1..eb4a1f1d 100644 --- a/Assets/Scripts/GameElements/Track/TrackSubmodules/TrackSubmodule.cs +++ b/Assets/Scripts/GameElements/Track/TrackSubmodules/TrackSubmodule.cs @@ -8,5 +8,11 @@ namespace Ichni.RhythmGame { public Track track; public bool isUpdating; + + public TrackSubmodule(Track track) : base(track) + { + this.track = track; + isUpdating = false; + } } } \ No newline at end of file diff --git a/Assets/Scripts/GameElements/Track/TrackSubmodules/TrackTimeSubmodule.cs b/Assets/Scripts/GameElements/Track/TrackSubmodules/TrackTimeSubmodule.cs index f50cb566..bb9efbb1 100644 --- a/Assets/Scripts/GameElements/Track/TrackSubmodules/TrackTimeSubmodule.cs +++ b/Assets/Scripts/GameElements/Track/TrackSubmodules/TrackTimeSubmodule.cs @@ -7,6 +7,12 @@ namespace Ichni.RhythmGame public class TrackTimeSubmodule : TrackSubmodule { public float headPercent, tailPercent; + + public TrackTimeSubmodule(Track track) : base(track) + { + this.track = track; + this.track.trackTimeSubmodule = this; + } } public class TrackTimeSubmoduleMovable : TrackTimeSubmodule @@ -16,17 +22,17 @@ namespace Ichni.RhythmGame public float trackTotalTime; public float visibleTrackTimeLength; public AnimationCurveType animationCurveType; - - public void NewInitialize(Track track, float trackStartTime, float trackEndTime, - float visibleTrackTimeLength, AnimationCurveType animationCurveType) + + public TrackTimeSubmoduleMovable(Track track, float trackStartTime, float trackEndTime, + float visibleTrackTimeLength, AnimationCurveType animationCurveType) : base(track) { - this.track = track; this.track.trackTimeSubmodule = this; this.trackStartTime = trackStartTime; this.trackEndTime = trackEndTime; this.trackTotalTime = trackEndTime - trackStartTime; this.visibleTrackTimeLength = visibleTrackTimeLength; this.animationCurveType = animationCurveType; + track.timeDurationSubmodule.startTime = trackStartTime; track.timeDurationSubmodule.endTime = trackEndTime + visibleTrackTimeLength; } @@ -57,16 +63,15 @@ namespace Ichni.RhythmGame public float trackTotalTime; public AnimationCurveType animationCurveType; - public void NewInitialize(Track track, float trackTotalTime, AnimationCurveType animationCurveType) + public TrackTimeSubmoduleStatic(Track track, float trackTotalTime, AnimationCurveType animationCurveType) : base(track) { - this.track = track; - this.track.trackTimeSubmodule = this; this.trackTotalTime = trackTotalTime; this.animationCurveType = animationCurveType; this.headPercent = 0; this.tailPercent = 1; - track.timeDurationSubmodule.startTime = 0; - track.timeDurationSubmodule.endTime = 0; + + track.timeDurationSubmodule.startTime = -999; + track.timeDurationSubmodule.endTime = 999; //timeDurationSubmodule 根据下辖Note的时间来设置 } } diff --git a/Assets/StreamingAssets/ThemeBundles/OSX/OSX b/Assets/StreamingAssets/ThemeBundles/OSX/OSX index 89991e71..d2c1c067 100644 Binary files a/Assets/StreamingAssets/ThemeBundles/OSX/OSX and b/Assets/StreamingAssets/ThemeBundles/OSX/OSX differ diff --git a/Assets/StreamingAssets/ThemeBundles/OSX/OSX.manifest b/Assets/StreamingAssets/ThemeBundles/OSX/OSX.manifest index 383bdfcb..6e6b2d5f 100644 --- a/Assets/StreamingAssets/ThemeBundles/OSX/OSX.manifest +++ b/Assets/StreamingAssets/ThemeBundles/OSX/OSX.manifest @@ -1,5 +1,5 @@ ManifestFileVersion: 0 -CRC: 3929595412 +CRC: 2320234516 AssetBundleManifest: AssetBundleInfos: Info_0: diff --git a/Assets/StreamingAssets/ThemeBundles/OSX/basic b/Assets/StreamingAssets/ThemeBundles/OSX/basic index 786d5d34..eaf8ff5f 100644 Binary files a/Assets/StreamingAssets/ThemeBundles/OSX/basic and b/Assets/StreamingAssets/ThemeBundles/OSX/basic differ diff --git a/Assets/StreamingAssets/ThemeBundles/OSX/basic.manifest b/Assets/StreamingAssets/ThemeBundles/OSX/basic.manifest index 375f7e2b..7f175f73 100644 --- a/Assets/StreamingAssets/ThemeBundles/OSX/basic.manifest +++ b/Assets/StreamingAssets/ThemeBundles/OSX/basic.manifest @@ -1,15 +1,15 @@ ManifestFileVersion: 0 -CRC: 3692374476 +CRC: 3644372668 Hashes: AssetFileHash: serializedVersion: 2 - Hash: d3fff661e0cc14bfbc3d0521f65d26e7 + Hash: 110d4740b29ef7da3aa800ad69f39ffe TypeTreeHash: serializedVersion: 2 Hash: 0b29093cb0b98a6a3edca231f6a05b16 IncrementalBuildHash: serializedVersion: 2 - Hash: d3fff661e0cc14bfbc3d0521f65d26e7 + Hash: 110d4740b29ef7da3aa800ad69f39ffe HashAppended: 0 ClassTypes: - Class: 1 diff --git a/Assets/ThemeBundles/Basic/Prefabs/BasicNoteTap3D.prefab b/Assets/ThemeBundles/Basic/Prefabs/BasicNoteTap3D.prefab index 0ebbbb89..076d6a4e 100644 --- a/Assets/ThemeBundles/Basic/Prefabs/BasicNoteTap3D.prefab +++ b/Assets/ThemeBundles/Basic/Prefabs/BasicNoteTap3D.prefab @@ -193,7 +193,7 @@ Transform: m_GameObject: {fileID: 8969796646526822168} serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 1, y: 1, z: 5} + m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: @@ -228,6 +228,9 @@ MonoBehaviour: - Name: timeDurationSubmodule Entry: 7 Data: 0|Ichni.RhythmGame.TimeDurationSubmodule, Assembly-CSharp + - Name: attachedElement + Entry: 6 + Data: - Name: isOverridingDuration Entry: 5 Data: false @@ -243,6 +246,9 @@ MonoBehaviour: - Name: transformSubmodule Entry: 7 Data: 1|Ichni.RhythmGame.TransformSubmodule, Assembly-CSharp + - Name: attachedElement + Entry: 6 + Data: - Name: originalPosition Entry: 7 Data: UnityEngine.Vector3, UnityEngine.CoreModule @@ -399,6 +405,9 @@ MonoBehaviour: - Name: colorSubmodule Entry: 7 Data: 5|Ichni.RhythmGame.ColorSubmodule, Assembly-CSharp + - Name: attachedElement + Entry: 6 + Data: - Name: originalBaseColor Entry: 7 Data: UnityEngine.Color, UnityEngine.CoreModule diff --git a/Assets/ThemeBundles/Basic/Scripts/NoteVisual/BasicNoteGenerateExpand.cs b/Assets/ThemeBundles/Basic/Scripts/NoteVisual/BasicNoteGenerateExpand.cs index 3cddeefd..9b9b1073 100644 --- a/Assets/ThemeBundles/Basic/Scripts/NoteVisual/BasicNoteGenerateExpand.cs +++ b/Assets/ThemeBundles/Basic/Scripts/NoteVisual/BasicNoteGenerateExpand.cs @@ -1,18 +1,56 @@ using System.Collections; using System.Collections.Generic; +using DG.Tweening; +using Ichni.RhythmGame; using UnityEngine; -public class BasicNoteGenerateExpand : MonoBehaviour +namespace Ichni.RhythmGame.ThemeBundles.Basic { - // Start is called before the first frame update - void Start() + public class BasicNoteGenerateExpand : NoteEffectBase { - - } + public float generateTime; - // Update is called once per frame - void Update() - { - + public BasicNoteGenerateExpand(NoteBase note) + { + this.note = note; + this.generateTime = 1f; + this.effectTime = 0.1f; + this.noteVisual = note.noteVisual.GetComponent(); + } + + public override void Recover() + { + noteVisual.noteMain.SetActive(false); + noteVisual.noteMain.transform.localScale = Vector3.zero; + } + + public override void Adjust() + { + noteVisual.noteMain.SetActive(true); + noteVisual.noteMain.transform.DOScale(Vector3.one, 0.1f).SetEase(Ease.OutBack); + } + + public override EffectState CheckEffectState() + { + float songTime = EditorManager.instance.songModule.songTime; + + if (songTime < note.exactJudgeTime - generateTime) + { + return EffectState.Before; + } + + if (songTime >= note.exactJudgeTime - generateTime && + songTime <= note.exactJudgeTime - generateTime + effectTime) + { + return EffectState.Middle; + } + + if (songTime > note.exactJudgeTime - generateTime + effectTime) + { + return EffectState.After; + } + + return EffectState.Error; + } } -} +} \ No newline at end of file diff --git a/Assets/ThemeBundles/Basic/Scripts/NoteVisual/BasicNotePerfectBurst.cs b/Assets/ThemeBundles/Basic/Scripts/NoteVisual/BasicNotePerfectBurst.cs index 4de3162a..cfa1f1ce 100644 --- a/Assets/ThemeBundles/Basic/Scripts/NoteVisual/BasicNotePerfectBurst.cs +++ b/Assets/ThemeBundles/Basic/Scripts/NoteVisual/BasicNotePerfectBurst.cs @@ -9,7 +9,7 @@ namespace Ichni.RhythmGame.ThemeBundles.Basic { private GameObject effectRing; - public void Initialize(NoteBase note) + public BasicNotePerfectBurst(NoteBase note) { this.note = note; this.noteVisual = note.noteVisual.GetComponent(); @@ -31,5 +31,28 @@ namespace Ichni.RhythmGame.ThemeBundles.Basic effectRing.GetComponent().DOFade(0, 0.1f).SetEase(Ease.OutBack).OnComplete(() => effectRing.SetActive(false)); noteVisual.noteMain.SetActive(false); } + + public override EffectState CheckEffectState() + { + float songTime = EditorManager.instance.songModule.songTime; + + if (songTime < note.exactJudgeTime ) + { + return EffectState.Before; + } + + if (songTime >= note.exactJudgeTime && + songTime <= note.exactJudgeTime + effectTime) + { + return EffectState.Middle; + } + + if (songTime > note.exactJudgeTime + effectTime) + { + return EffectState.After; + } + + return EffectState.Error; + } } } \ No newline at end of file diff --git a/Assets/ThemeBundles/Basic/Scripts/NoteVisual/BasicNoteVisual.cs b/Assets/ThemeBundles/Basic/Scripts/NoteVisual/BasicNoteVisual.cs index c7403698..b5dac991 100644 --- a/Assets/ThemeBundles/Basic/Scripts/NoteVisual/BasicNoteVisual.cs +++ b/Assets/ThemeBundles/Basic/Scripts/NoteVisual/BasicNoteVisual.cs @@ -1,11 +1,32 @@ using System.Collections; using System.Collections.Generic; +using Lean.Pool; using UnityEngine; namespace Ichni.RhythmGame.ThemeBundles.Basic { public class BasicNoteVisual : NoteVisualBase { - + public new static BasicNoteVisual GenerateElement(string elementName, string themeBundleName, + string objectName, Vector3 position, Vector3 eulerAngles, Vector3 scale, BaseElement parent, + bool isFirstGenerated = true) + { + BasicNoteVisual noteVisual = SubstantialObject + .GenerateElement(elementName, themeBundleName, objectName, position, eulerAngles, scale, parent, isFirstGenerated) + .GetComponent(); + + NoteBase note = parent as NoteBase; + if(note == null) throw new System.Exception("NoteVisual只能生成在Note下。"); + noteVisual.note = note; + note.noteVisual = noteVisual; + + if (isFirstGenerated) + { + note.generateEffects.effectList.Add(new BasicNoteGenerateExpand(noteVisual.note)); + note.perfectJudgeEffects.effectList.Add(new BasicNotePerfectBurst(noteVisual.note)); + } + + return noteVisual; + } } } \ No newline at end of file