2023-12-26 05:22:51 +00:00
|
|
|
using System;
|
2022-07-10 21:39:14 +00:00
|
|
|
using UnityEngine;
|
|
|
|
using HeavenStudio.Util;
|
|
|
|
|
|
|
|
namespace HeavenStudio.StudioDance
|
|
|
|
{
|
|
|
|
public class Dancer : MonoBehaviour
|
|
|
|
{
|
2023-12-26 05:22:51 +00:00
|
|
|
[SerializeField] ChoreographyInfo debugChoreography;
|
|
|
|
[SerializeField] ChoreographyInfo[] choreographies;
|
2022-07-10 21:39:14 +00:00
|
|
|
private Animator animator;
|
2023-06-10 19:13:29 +00:00
|
|
|
private double currentBeat = 0f;
|
2022-07-10 21:39:14 +00:00
|
|
|
|
|
|
|
private bool isDance = false;
|
|
|
|
|
2023-12-26 05:22:51 +00:00
|
|
|
private ChoreographyInfo currentChoreography;
|
|
|
|
private double totalChoreographyLength = 0f;
|
|
|
|
|
|
|
|
public ChoreographyInfo[] ChoreographyInfos { get => choreographies; }
|
|
|
|
public ChoreographyInfo CurrentChoreography { get => currentChoreography; }
|
|
|
|
|
|
|
|
public void SetChoreography(ChoreographyInfo choreography)
|
|
|
|
{
|
|
|
|
currentChoreography = choreography;
|
|
|
|
totalChoreographyLength = 0f;
|
|
|
|
foreach (var step in choreography.choreographySteps)
|
|
|
|
{
|
|
|
|
totalChoreographyLength += step.beatLength;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void SetChoreography(int index)
|
|
|
|
{
|
|
|
|
if (index < 0 || index >= choreographies.Length) return;
|
|
|
|
var choreography = choreographies[index];
|
|
|
|
currentChoreography = choreography;
|
|
|
|
totalChoreographyLength = 0f;
|
|
|
|
foreach (var step in choreography.choreographySteps)
|
|
|
|
{
|
|
|
|
totalChoreographyLength += step.beatLength;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!Conductor.instance.isPlaying)
|
|
|
|
{
|
|
|
|
animator.Play(currentChoreography.introState);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-07-10 21:39:14 +00:00
|
|
|
private void Start()
|
|
|
|
{
|
|
|
|
animator = GetComponent<Animator>();
|
2023-12-26 05:22:51 +00:00
|
|
|
|
|
|
|
var gm = GameManager.instance;
|
|
|
|
if (gm != null)
|
|
|
|
{
|
|
|
|
gm.onBeatPulse += OnBeatPulse;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (debugChoreography != null)
|
|
|
|
{
|
|
|
|
SetChoreography(debugChoreography);
|
|
|
|
}
|
|
|
|
|
|
|
|
animator.Play(currentChoreography.introState);
|
|
|
|
}
|
|
|
|
|
|
|
|
private void OnBeatPulse(double beat)
|
|
|
|
{
|
|
|
|
currentBeat = beat;
|
2022-07-10 21:39:14 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
private void Update()
|
|
|
|
{
|
|
|
|
var cond = Conductor.instance;
|
2023-12-26 05:22:51 +00:00
|
|
|
if (currentChoreography == null || cond == null) return;
|
|
|
|
if (!cond.isPlaying)
|
2022-07-10 21:39:14 +00:00
|
|
|
{
|
|
|
|
if (!isDance) return;
|
|
|
|
if (currentBeat % 2 != 0)
|
|
|
|
{
|
2023-12-26 05:22:51 +00:00
|
|
|
animator.Play(currentChoreography.poseStateOdd);
|
2022-07-10 21:39:14 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2023-12-26 05:22:51 +00:00
|
|
|
animator.Play(currentChoreography.poseStateEven);
|
2022-07-10 21:39:14 +00:00
|
|
|
}
|
|
|
|
isDance = false;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
isDance = true;
|
|
|
|
|
2023-12-26 05:22:51 +00:00
|
|
|
double choreoBeat = cond.songPositionInBeatsAsDouble % totalChoreographyLength;
|
|
|
|
double cycleStartBeat = Math.Floor(cond.songPositionInBeatsAsDouble / totalChoreographyLength) * totalChoreographyLength;
|
|
|
|
|
|
|
|
double beatSum = 0.0;
|
|
|
|
double stepLength = 0.0;
|
|
|
|
string stepState = "";
|
|
|
|
foreach (ChoreographyInfo.ChoreographyStep s in currentChoreography.choreographySteps)
|
2022-07-10 21:39:14 +00:00
|
|
|
{
|
2023-12-26 05:22:51 +00:00
|
|
|
if (choreoBeat > beatSum && choreoBeat < beatSum + s.beatLength)
|
|
|
|
{
|
|
|
|
stepLength = s.beatLength;
|
|
|
|
stepState = s.stateName;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
beatSum += s.beatLength;
|
2022-07-10 21:39:14 +00:00
|
|
|
}
|
2023-12-26 05:22:51 +00:00
|
|
|
if (stepState is not null or "")
|
2022-07-10 21:39:14 +00:00
|
|
|
{
|
2023-12-26 05:22:51 +00:00
|
|
|
animator.DoScaledAnimation(stepState, cycleStartBeat + beatSum, stepLength);
|
2022-07-10 21:39:14 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|