实现bake的自动化,但是autoorient的重建还是需要一些优化
Signed-off-by: TRAfoer <lhf190@outlook.com>
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
// {
|
||||
|
||||
// }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 50968938d462f564b837d5631210cd62
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user