Files
Convention-Unity-Demo/Assets/Scripts/Framework/RootObject.cs

128 lines
4.3 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 Convention;
using Convention.WindowsUI.Variant;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
namespace Demo.Game
{
public class RootObject : ScriptableObject
{
[Resources] public BasicAudioSystem audioSystem;
[Content] public GameController RootGameController;
public string SourcePath;
[Content] public UpdateScheduler Scheduler = new UpdateScheduler();
protected override IEnumerator DoSomethingDuringApplyScript()
{
yield return base.DoSomethingDuringApplyScript();
ScriptUpdate(RootGameController.SongOffset, 0.01f, TickType.Reset);
if (RootGameController.IsMain)
{
Keyboard.current.onTextInput += InputCatchChar;
}
}
public override IEnumerator UnloadScript()
{
if (RootGameController.IsMain)
{
Keyboard.current.onTextInput -= InputCatchChar;
}
// 清理调度器
Scheduler?.Clear();
yield return base.UnloadScript();
}
public void EnableScript(string sourcePath, GameController parent)
{
AllScriptableObjectCounter = 0;
if (AllScriptableObjectCounterHierarchyItem == null)
{
AllScriptableObjectCounterHierarchyItem = HierarchyWindow.instance.CreateRootItemEntryWithBinders(typeof(ScriptableObject))[0];
}
SourcePath = sourcePath;
base.EnableScript(null);
RootGameController = parent;
}
[Serializable]
public struct InputCatchEntry
{
public float TimePoint;
public Vector2 Position;
public string InputKey;
}
/// <summary>
/// 这个捕获列表大多数时候只构造一次,等同与<see langword="readonly"/>
/// 但是会在<see cref="SubWorld"/>中被父关卡加载后会被赋值,这是唯一的例外,
/// 在多World项目中会由父世界的<see cref="SubWorld"/>传递给其他加载进来的<see cref="RootObject"/>
/// </summary>
public List<InputCatchEntry> InputCatch = new();
private void InputCatchChar(char ch)
{
if (RootGameController.IsAutoPlay)
return;
if (RootGameController.MainAudio.IsPlaying() == false)
return;
InputCatch.Add(new()
{
TimePoint = CurrentUpdateTickTimePoint,
InputKey = ch.ToString(),
Position = Mouse.current.position.ReadValue()
});
}
private float CurrentUpdateTickTimePoint;
protected override void UpdateTicks(float currentTime, float deltaTime, TickType tickType)
{
if (RootGameController.IsMain)
{
void Foo()
{
if (RootGameController.IsAutoPlay)
return;
if (RootGameController.MainAudio.IsPlaying() == false)
return;
// 更新缓存时间
CurrentUpdateTickTimePoint = currentTime;
// 将距离当前更近的输入调整到更靠前的位置
InputCatch.Sort((x, y) => Mathf.Abs(x.TimePoint - currentTime).CompareTo(y.TimePoint - currentTime));
if (InputCatch.Count > 50)
InputCatch = InputCatch.GetRange(0, 50);
if (tickType == TickType.Start)
{
InputCatch.Clear();
}
}
Foo();
}
// 调用调度器进行扁平化Update仅当有对象注册时
if (Scheduler != null && Scheduler.TotalRegistered > 0)
{
using (Profiler.BeginZone("RootObject.SchedulerUpdate"))
{
Scheduler.DoUpdate(currentTime, deltaTime, tickType);
}
}
else
{
// 旧方式调用base.UpdateTicks()(保持向后兼容)
base.UpdateTicks(currentTime, deltaTime, tickType);
}
}
}
}