public void SetupArcTapConnection() { if (Arc == null || (Arc.EndTiming - Arc.Timing) == 0) { return; } List <ArcTap> taps = ArcTapNoteManager.Instance.Taps; ArcTap[] sameTimeTapNotes = taps.Where((s) => Mathf.Abs(s.Timing - Timing) <= 1).ToArray(); foreach (ArcTap t in sameTimeTapNotes) { LineRenderer l = UnityEngine.Object.Instantiate(ArcArcManager.Instance.ConnectionPrefab, t.transform).GetComponent <LineRenderer>(); float p = 1f * (Timing - Arc.Timing) / (Arc.EndTiming - Arc.Timing); Vector3 pos = new Vector3(ArcAlgorithm.ArcXToWorld(ArcAlgorithm.X(Arc.XStart, Arc.XEnd, p, Arc.LineType)), ArcAlgorithm.ArcYToWorld(ArcAlgorithm.Y(Arc.YStart, Arc.YEnd, p, Arc.LineType)) - 0.5f) - new Vector3(ArcArcManager.Instance.Lanes[t.Track - 1], 0); l.SetPosition(1, new Vector3(pos.x, 0, pos.y)); l.startColor = l.endColor = ArcArcManager.Instance.ConnectionColor; l.startColor = l.endColor = new Color(l.endColor.r, l.endColor.g, l.endColor.b, t.Alpha * 0.8f); l.enabled = t.Enable; l.transform.localPosition = new Vector3(); if (t.ConnectionLines.ContainsKey(this)) { UnityEngine.Object.Destroy(t.ConnectionLines[this].gameObject); t.ConnectionLines.Remove(this); } t.ConnectionLines.Add(this, l); } }
public override void Check(ArcChart chart) { List <(ArcArcTap, float, float)> ats = new List <(ArcArcTap, float, float)>(); foreach (var arc in chart.Arcs) { foreach (var at in arc.ArcTaps) { float t = 1f * (at.Timing - arc.Timing) / (arc.EndTiming - arc.Timing); float x = ArcAlgorithm.X(arc.XStart, arc.XEnd, t, arc.LineType); float y = ArcAlgorithm.Y(arc.YStart, arc.YEnd, t, arc.LineType); ats.Add((at, x, y)); } } for (int i = 0; i < ats.Count - 1; ++i) { for (int k = i + 1; k < ats.Count; ++k) { if (ats[i].Item2 == ats[k].Item2 && ats[i].Item3 == ats[k].Item3 && ats[i].Item1.Timing == ats[k].Item1.Timing) { Faults.Add(ats[i].Item1); } } } Faults = Faults.Distinct().ToList(); }
private void UpdateArcTapCursor() { if (selectedArc != null && selectedArc.Instance == null) { selectedArc = null; if (Mode == ClickToCreateMode.ArcTap) { Mode = ClickToCreateMode.Idle; } return; } if (Mode != ClickToCreateMode.ArcTap || selectedArc == null) { AdeCursorManager.Instance.EnableArcTapCursor = false; AdeCursorManager.Instance.EnableVerticalPanel = false; return; } Vector3 pos = AdeCursorManager.Instance.AttachedHorizontalPoint; int timing = ArcTimingManager.Instance.CalculateTimingByPosition(-pos.z * 1000) - ArcAudioManager.Instance.AudioOffset; canAddArcTap = selectedArc.Timing <= timing && selectedArc.EndTiming >= timing; AdeCursorManager.Instance.EnableArcTapCursor = canAddArcTap; AdeCursorManager.Instance.EnableVerticalPanel = canAddArcTap; if (!canAddArcTap) { return; } ArcTimingManager timingManager = ArcTimingManager.Instance; float t = 1f * (timing - selectedArc.Timing) / (selectedArc.EndTiming - selectedArc.Timing); Vector2 gizmo = new Vector3(ArcAlgorithm.ArcXToWorld(ArcAlgorithm.X(selectedArc.XStart, selectedArc.XEnd, t, selectedArc.LineType)), ArcAlgorithm.ArcYToWorld(ArcAlgorithm.Y(selectedArc.YStart, selectedArc.YEnd, t, selectedArc.LineType)) - 0.5f); AdeCursorManager.Instance.ArcTapCursorPosition = gizmo; }
public void Relocate() { ArcTimingManager timingManager = ArcTimingManager.Instance; int offset = ArcAudioManager.Instance.AudioOffset; float t = 1f * (Timing - Arc.Timing) / (Arc.EndTiming - Arc.Timing); LocalPosition = new Vector3(ArcAlgorithm.ArcXToWorld(ArcAlgorithm.X(Arc.XStart, Arc.XEnd, t, Arc.LineType)), ArcAlgorithm.ArcYToWorld(ArcAlgorithm.Y(Arc.YStart, Arc.YEnd, t, Arc.LineType)) - 0.5f, -timingManager.CalculatePositionByTimingAndStart(Arc.Timing + offset, Timing + offset) / 1000f - 0.6f); SetupArcTapConnection(); }
public void Instantiate(ArcArc arc) { Arc = arc; Instance = UnityEngine.Object.Instantiate(ArcArcManager.Instance.ArcTapPrefab, arc.transform); ArcTimingManager timingManager = ArcTimingManager.Instance; int offset = ArcAudioManager.Instance.AudioOffset; float t = 1f * (Timing - arc.Timing) / (arc.EndTiming - arc.Timing); LocalPosition = new Vector3(ArcAlgorithm.ArcXToWorld(ArcAlgorithm.X(arc.XStart, arc.XEnd, t, arc.LineType)), ArcAlgorithm.ArcYToWorld(ArcAlgorithm.Y(arc.YStart, arc.YEnd, t, arc.LineType)) - 0.5f, -timingManager.CalculatePositionByTimingAndStart(arc.Timing + offset, Timing + offset) / 1000f - 0.6f); SetupArcTapConnection(); }
public void AddArcTap(ArcArcTap arctap) { if (arctap.Timing > EndTiming || arctap.Timing < Timing) { throw new ArgumentOutOfRangeException("ArcTap 时间不在 Arc 范围内"); } ArcTimingManager timingManager = ArcTimingManager.Instance; int offset = ArcAudioManager.Instance.AudioOffset; arctap.Instantiate(this); float t = 1f * (arctap.Timing - Timing) / (EndTiming - Timing); arctap.LocalPosition = new Vector3(ArcAlgorithm.ArcXToWorld(ArcAlgorithm.X(XStart, XEnd, t, LineType)), ArcAlgorithm.ArcYToWorld(ArcAlgorithm.Y(YStart, YEnd, t, LineType)) - 0.5f, -timingManager.CalculatePositionByTimingAndStart(Timing + offset, arctap.Timing + offset) / 1000f - 0.6f); ArcTaps.Add(arctap); }
private void UpdateInfo() { EnableInfo = EnableVertical || EnableHorizontal; string content = string.Empty; if (!EnableInfo) { return; } content += $"音乐时间: {AttachedTiming + ArcAudioManager.Instance.AudioOffset}\n"; content += $"谱面时间: {AttachedTiming}"; if (EnableVertical) { Vector3 pos = AttachedVerticalPoint; content += $"\n坐标: ({ArcAlgorithm.WorldXToArc(pos.x).ToString("f2")},{ArcAlgorithm.WorldYToArc(pos.y).ToString("f2")})"; } if (AdeClickToCreate.Instance.Enable && AdeClickToCreate.Instance.Mode != ClickToCreateMode.Idle) { content += $"\n点立得: {AdeClickToCreate.Instance.Mode.ToString()}"; if (AdeClickToCreate.Instance.Mode == ClickToCreateMode.Arc) { content += $"\n{AdeClickToCreate.Instance.CurrentArcColor}/{AdeClickToCreate.Instance.CurrentArcIsVoid}/{AdeClickToCreate.Instance.CurrentArcType}"; } } if (rangeSelectPosition != null) { content += $"\n段落选择起点: {rangeSelectPosition}"; } if (SelectedNotes.Count == 1 && SelectedNotes[0] is ArcArc) { ArcArc arc = SelectedNotes[0] as ArcArc; float p = (AttachedTiming - arc.Timing) / (arc.EndTiming - arc.Timing); if (p >= 0 && p <= 1) { float x = ArcAlgorithm.X(arc.XStart, arc.XEnd, p, arc.LineType); float y = ArcAlgorithm.Y(arc.YStart, arc.YEnd, p, arc.LineType); content += $"\nArc: {(p * 100).ToString("f2")}%, {x.ToString("f2")}, {y.ToString("f2")}"; } } InfoText.text = content; }