实现bake的自动化,但是autoorient的重建还是需要一些优化

Signed-off-by: TRAfoer <lhf190@outlook.com>
This commit is contained in:
2026-01-24 20:56:43 +08:00
parent de4e399d78
commit 77726bcb6c
29 changed files with 728515 additions and 10750 deletions

View File

@@ -938,6 +938,30 @@ namespace Ichni.Editor
UnityEditorInternal.InternalEditorUtility.RepaintAllViews();
#endif
}
public static void TrybakeAllMesh()
{
EditorManager.instance.beatmapContainer.gameElementList.OfType<Track>().ToList().ForEach(
track =>
{
if (track.trackTimeSubmodule is TrackTimeSubmoduleMovable ||
track.trackRendererSubmodule is TrackRendererSubmoduleAutoOrient ||
track.childElementList.OfType<Scale>().Count() > 0 ||
(track.trackPathSubmodule.pathNodeList.Any(o => o.childElementList.OfType<AnimationBase>().Count() == 0) == false))
{
Debug.LogWarning("TrackRendererSubmodule.getMeshFromGenerator: Track has animation, cannot get mesh.");
}
else
{
track.Refresh();
track.trackRendererSubmodule?.meshGenerator.Bake(true, false);
track.Refresh();
}
}
);
}
/// <summary>
/// 添加 Tag Matcher 到 TagManager

View File

@@ -72,7 +72,11 @@ public class consoleOnMono : MonoBehaviour
newTrack, float.Parse(parts[4]), float.Parse(parts[5]), float.Parse(parts[6]), (AnimationCurveType)int.Parse(parts[7])
);
newTrack.trackRendererSubmodule = new TrackRendererSubmoduleAutoOrient(newTrack, false, 0, false, new Vector2(0, 0), new Vector2(1, 1));
bool isClosed = parts[9] == "1";
if (newTrack.trackPathSubmodule != null)
{
newTrack.trackPathSubmodule.isClosed = isClosed;
}
tracks.Add(tId, newTrack); // 先加入字典,方便后续 PN 指令查找
}
break;
@@ -82,14 +86,15 @@ public class consoleOnMono : MonoBehaviour
string targetTrackId = parts[1];
Track targetTrack = tracks[targetTrackId];
Vector3 pos = new Vector3(float.Parse(parts[2]), float.Parse(parts[3]), float.Parse(parts[4]));
Color nodeColor = new Color(float.Parse(parts[5]), float.Parse(parts[6]), float.Parse(parts[7]), 1.0f);
// 生成节点并挂载到轨道
var node = PathNode.GenerateElement(pos.ToString(), Guid.NewGuid(), new List<string>(), true, targetTrack, true);
node.transformSubmodule.originalPosition = pos;
node.transformSubmodule.originalScale = new Vector3(0.1f, 0.1f, 0.1f);
node.colorSubmodule.originalBaseColor = nodeColor;
// 标记轨道需要刷新(可选:为了性能可以等所有 PN 完后再统一 Refresh
targetTrack.Refresh();
}
break;
case "SW": // 应用旋转 (旧版相机取反)
@@ -137,6 +142,9 @@ new List<AnimatedFloat> { new(startTime, endTime, startRot.x, endRot.x, (Animati
}
}
text.text = "Completed!";
foreach (var i in rootFolder.GetAllGameElementsFromThis())
{
i.Refresh();
}
}
}

View File

@@ -0,0 +1,35 @@
using System;
using System.Collections;
using System.Collections.Generic;
using Ichni.Editor;
using Ichni.RhythmGame.Beatmap;
using Lean.Pool;
using UnityEngine;
namespace Ichni.RhythmGame
{
public class FixedTrackMesh : GameElement, IHaveTransformSubmodule
{
public TransformSubmodule transformSubmodule { get; set; }
public MeshFilter meshFilter;
public MeshRenderer meshRenderer;
public Mesh mesh
{
get => _mesh;
set
{
_mesh = value;
if (meshFilter != null)
{
meshFilter.mesh = _mesh;
}
}
}
private Mesh _mesh;
// public static override void GenerateElement(string elementName, Guid id, List<string> tags,
// bool isFirstGenerated, string themeBundleName, string objectName, GameElement parentElement)
// {
// }
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 50968938d462f564b837d5631210cd62
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Dreamteck.Splines;
using Ichni.Editor;
using Ichni.RhythmGame.Beatmap;
@@ -61,11 +62,30 @@ namespace Ichni.RhythmGame
public override void Refresh()
{
SetEnableZWrite();
SetEnableEmission();
SetEmissionIntensity();
// 使用 MaterialPropertyBlock 替代直接操作 material
var block = new MaterialPropertyBlock();
meshRenderer.GetPropertyBlock(block);
// ZWrite
block.SetFloat("_ZWrite", zWrite ? 1f : 0f);
// Emission
if (enableEmission)
{
meshRenderer.material.EnableKeyword("_EMISSION_ON");
block.SetColor("_EmissionColor", Color.white * Mathf.Pow(2, emissionIntensity));
}
else
{
meshRenderer.material.DisableKeyword("_EMISSION_ON");
block.SetColor("_EmissionColor", Color.black);
}
// UV仍然直接设置到 meshGenerator
SetUV();
meshRenderer.SetPropertyBlock(block);
if (track.trackTimeSubmodule is TrackTimeSubmoduleMovable trackTimeSubmoduleMovable)
{
meshGenerator.clipFrom = trackTimeSubmoduleMovable.tailPercent;
@@ -97,7 +117,7 @@ namespace Ichni.RhythmGame
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
Inspector inspectorMain = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Track Renderer " + submoduleName[submoduleNameIndex]);
var container = inspector.GenerateContainer("Track Renderer " + submoduleName[submoduleNameIndex] + (meshGenerator.baked ? " (Baked)" : ""));
var zWriteSettings = container.GenerateSubcontainer(3);
var zWriteToggle =
@@ -149,6 +169,7 @@ namespace Ichni.RhythmGame
protected void SetEnableEmission()
{
// 仅保留关键字控制,具体颜色由 Refresh 的 property block 控制
if (enableEmission)
{
meshRenderer.material.EnableKeyword("_EMISSION_ON");
@@ -161,12 +182,32 @@ namespace Ichni.RhythmGame
protected void SetEnableZWrite()
{
meshRenderer.material.SetInt("_ZWrite", zWrite ? 1 : 0);
var block = new MaterialPropertyBlock();
meshRenderer.GetPropertyBlock(block);
// ZWrite
block.SetFloat("_ZWrite", zWrite ? 1f : 0f);
meshRenderer.SetPropertyBlock(block);
}
protected void SetEmissionIntensity()
{
meshRenderer.material.SetColor("_EmissionColor", Color.white * Mathf.Pow(2, emissionIntensity));
var block = new MaterialPropertyBlock();
meshRenderer.GetPropertyBlock(block);
// Emission
if (enableEmission)
{
meshRenderer.material.EnableKeyword("_EMISSION_ON");
block.SetColor("_EmissionColor", Color.white * Mathf.Pow(2, emissionIntensity));
}
else
{
meshRenderer.material.DisableKeyword("_EMISSION_ON");
block.SetColor("_EmissionColor", Color.black);
}
meshRenderer.SetPropertyBlock(block);
}
protected void SetUV()