基础内容-5

主题包;
测试NoteVisual与NoteEffect;
LookAt旋转动画与FlexibleBool
动画杂项
控制台初步
This commit is contained in:
SoulliesOfficial
2025-01-29 23:49:18 -05:00
parent 7520983b20
commit 39b4a5e7ff
102 changed files with 3492 additions and 261 deletions

View File

@@ -3,6 +3,7 @@ using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Sirenix.OdinInspector;
using UniRx;
using UnityEngine;
namespace Ichni.RhythmGame
@@ -31,6 +32,7 @@ namespace Ichni.RhythmGame
//次级模块
public TimeDurationSubmodule timeDurationSubmodule;
public TransformSubmodule transformSubmodule;
public ColorSubmodule colorSubmodule;
/// <summary>
/// 首次初始化
@@ -42,6 +44,7 @@ namespace Ichni.RhythmGame
this.elementGuid = Guid.NewGuid();
//GameManager.beatMapContainer.beatMapElementList.Add(this);
//serialNumber = totalSerialNumber++;
SetTransformObserver();
}
/// <summary>
@@ -77,6 +80,11 @@ namespace Ichni.RhythmGame
public abstract partial class BaseElement
{
private void Start()
{
SetTransformObserver();
}
public virtual void SetTimeDuration()
{
@@ -89,5 +97,60 @@ namespace Ichni.RhythmGame
timeDurationSubmodule?.SetDurationFromChildren(childElementList.Select(x=>x.timeDurationSubmodule).ToList());
}
/// <summary>
/// 设置物体Transform的监听顺序为Scale -> EulerAngles -> Position
/// 如果有一些特殊的物体例如CameraElementFolder需要自定义监听可以重写这个方法
/// </summary>
public virtual void SetTransformObserver()
{
Observable.EveryUpdate().Subscribe(_ =>
{
if (transformSubmodule == null)
{
return;
}
if (transformSubmodule.scaleDirtyMark)
{
Vector3 offset = Vector3.zero;
foreach (Vector3 scaleOffset in transformSubmodule.scaleOffset)
{
offset += scaleOffset;
}
transformSubmodule.currentScale = transformSubmodule.originalScale + offset;
transform.localScale = transformSubmodule.currentScale;
transformSubmodule.scaleDirtyMark = false;
}
if (transformSubmodule.eulerAnglesDirtyMark)
{
Vector3 offset = Vector3.zero;
foreach (Vector3 eulerOffset in transformSubmodule.eulerAnglesOffset)
{
offset += eulerOffset;
}
transformSubmodule.currentEulerAngles = transformSubmodule.originalEulerAngles + offset;
transform.localEulerAngles = transformSubmodule.currentEulerAngles;
transformSubmodule.eulerAnglesDirtyMark = false;
}
if (transformSubmodule.positionDirtyMark)
{
Vector3 offset = Vector3.zero;
foreach (Vector3 posOffset in transformSubmodule.positionOffset)
{
offset += posOffset;
}
transformSubmodule.currentPosition = transformSubmodule.originalPosition + offset;
transform.localPosition = transformSubmodule.currentPosition;
transformSubmodule.positionDirtyMark = false;
}
transformSubmodule.scaleOffset.Clear();
transformSubmodule.eulerAnglesOffset.Clear();
transformSubmodule.positionOffset.Clear();
}).AddTo(gameObject);
}
}
}