Files
ichni_Creator_Studio/Assets/Scripts/GameElements/Notes/NoteBase.cs
SoulliesOfficial 39b4a5e7ff 基础内容-5
主题包;
测试NoteVisual与NoteEffect;
LookAt旋转动画与FlexibleBool
动画杂项
控制台初步
2025-01-29 23:49:18 -05:00

135 lines
4.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections;
using System.Collections.Generic;
using Dreamteck.Splines;
using Sirenix.OdinInspector;
using UnityEngine;
namespace Ichni.RhythmGame
{
public abstract class NoteBase : BaseElement
{
[Title("Basic Info")]
public float exactJudgeTime;
[Title("Track Info")]
public bool isOnTrack;
public Track track;
public SplinePositioner trackPositioner;
[Title("NoteVisual")]
public NoteVisualBase noteVisual;
[Title("NoteEffect")]
[Tooltip("生成Note时的特效")]
public EffectSubmodule generateEffects;
[Tooltip("Note被判定时的特效不包括Miss")]
public EffectSubmodule generalJudgeEffects;
[Tooltip("Note被Perfect判定时的特效")]
public EffectSubmodule perfectJudgeEffects;
[Tooltip("Note被Good判定时的特效")]
public EffectSubmodule goodJudgeEffects;
[Tooltip("Note被Bad判定时的特效")]
public EffectSubmodule badJudgeEffects;
[Tooltip("Note未被判定时的特效即Miss")]
public EffectSubmodule missJudgeEffects;
[Title("Judge Info")]
public NoteJudgeSubmodule noteJudgeSubmodule;
[Title("In-Game Info")]
public Vector2 noteScreenPosition;
public bool isJudged;
/// <summary>
/// 在MovableTrack上更新Note的位置注意HoldNote需要重写这个方法
/// </summary>
public virtual void UpdateNoteInMovableTrack()
{
trackPositioner.SetPercent((track.trackTimeSubmodule as TrackTimeSubmoduleMovable).GetTrackPercent(exactJudgeTime));
}
/// <summary>
/// 在StaticTrack上更新Note的位置注意HoldNote需要重写这个方法
/// </summary>
public virtual void UpdateNoteInStaticTrack()
{
float songTime = EditorManager.instance.songModule.songTime;
TrackTimeSubmoduleStatic trackTimeSubmoduleStatic = track.trackTimeSubmodule as TrackTimeSubmoduleStatic;
float startMove = exactJudgeTime - trackTimeSubmoduleStatic.trackTotalTime;
float percent = AnimationCurveEvaluator.Evaluate(trackTimeSubmoduleStatic.animationCurveType, (songTime - startMove) / trackTimeSubmoduleStatic.trackTotalTime);
percent = Mathf.Max(percent, 0);
percent = Mathf.Min(percent, 1);
trackPositioner.SetPercent(1 - percent);
}
public override void AfterInitialize()
{
generateEffects.effectList.ForEach(e => e.Recover());
generalJudgeEffects.effectList.ForEach(e => e.Recover());
perfectJudgeEffects.effectList.ForEach(e => e.Recover());
goodJudgeEffects.effectList.ForEach(e => e.Recover());
badJudgeEffects.effectList.ForEach(e => e.Recover());
missJudgeEffects.effectList.ForEach(e => e.Recover());
}
private void Update()
{
if (isOnTrack)
{
if (track.trackTimeSubmodule is TrackTimeSubmoduleStatic)
{
UpdateNoteInStaticTrack();
}
}
float songTime = EditorManager.instance.songModule.songTime;
if (isJudged && songTime < exactJudgeTime)
{
isJudged = false;
}
if (!isJudged && songTime >= exactJudgeTime)
{
if (!isJudged)
{
AudioSource.PlayClipAtPoint(EditorManager.instance.basePrefabs.tapNoteSound, Camera.main.transform.position, 1f);
isJudged = true;
}
}
foreach (var effect in generateEffects.effectList)
{
effect.UpdateEffect();
}
foreach (var effect in perfectJudgeEffects.effectList)
{
effect.UpdateEffect();
}
}
public void ExecuteStartJudge()
{
}
public void UpdateNoteInTrack()
{
if (isOnTrack && track.trackTimeSubmodule != null)
{
if (track.trackTimeSubmodule is TrackTimeSubmoduleMovable)
{
UpdateNoteInMovableTrack();
}
else if (track.trackTimeSubmodule is TrackTimeSubmoduleStatic)
{
UpdateNoteInStaticTrack();
}
}
}
}
}