Files
ichni_Official/Assets/Scripts/Game/GameElements/Track/TrackSubmodules/TrackRendererSubmodule/TrackRendererSubmodule.cs
SoulliesOfficial 1bc9af280b 同步
2026-04-03 10:53:11 -04:00

94 lines
3.1 KiB
C#

using System;
using Dreamteck.Splines;
using Ichni.RhythmGame.Beatmap;
using UnityEngine;
namespace Ichni.RhythmGame
{
public abstract class TrackRendererSubmodule : TrackSubmodule
{
#region [] Fields
public MeshGenerator meshGenerator;
public MeshRenderer meshRenderer;
public Material renderMaterial;
public string materialThemeBundleName;
public string materialName;
public bool enableEmission;
public float emissionIntensity;
public bool zWrite;
public Vector2 uvScale;
public Vector2 uvOffset;
#endregion
#region [] Initialization & Defense
public TrackRendererSubmodule(Track track, bool enableEmission, float emissionIntensity, bool zWrite,
Vector2 uvScale, Vector2 uvOffset) : base(track)
{
this.enableEmission = enableEmission;
this.emissionIntensity = emissionIntensity;
this.materialThemeBundleName = String.Empty;
this.materialName = String.Empty;
this.zWrite = zWrite;
this.uvScale = uvScale;
this.uvOffset = uvOffset;
if (!HaveSameSubmodule)
{
this.track.trackRendererSubmodule = this;
}
}
#endregion
#region [] Material & Mesh Control
public void ApplyMaterial(string materialThemeBundleName, string materialName)
{
this.materialThemeBundleName = materialThemeBundleName;
this.materialName = materialName;
Material mat = ThemeBundleManager.instance.GetObject<Material>(materialThemeBundleName, materialName);
if(mat != null)
{
renderMaterial = mat;
meshRenderer.material = renderMaterial;
}
meshRenderer.InitializeShader();
}
public override void Refresh()
{
SetEnableZWrite();
SetEnableEmission();
SetEmissionIntensity();
SetUV();
}
protected void SetMesh()
{
if (track.trackTimeSubmodule is TrackTimeSubmoduleMovable trackTimeSubmoduleMovable)
{
meshGenerator.clipFrom = trackTimeSubmoduleMovable.tailPercent;
meshGenerator.clipTo = trackTimeSubmoduleMovable.headPercent;
}
else
{
meshGenerator.clipFrom = 0;
meshGenerator.clipTo = 1;
}
}
protected void SetEnableEmission() => meshRenderer.material.SetInt("_Emission", enableEmission ? 1 : 0);
protected void SetEnableZWrite() => meshRenderer.material.SetInt("_ZWrite", zWrite ? 1 : 0);
protected void SetEmissionIntensity() => meshRenderer.material.SetColor("_EmissionColor", Color.white * Mathf.Pow(2, emissionIntensity));
protected void SetUV()
{
if (meshGenerator != null)
{
meshGenerator.uvScale = uvScale;
meshGenerator.uvOffset = uvOffset;
}
}
#endregion
}
}