养成基本完毕,新UI,修bug,装备初步,

This commit is contained in:
2026-03-23 22:37:14 +08:00
parent 49e45ac464
commit dd205b6cb4
2349 changed files with 261722 additions and 283 deletions
@@ -0,0 +1,136 @@
using UnityEngine;
using UnityEngine.UI;
[RequireComponent(typeof(Graphic))]
public class UIDissolveController : MonoBehaviour
{
public Material materialTemplate;
[Range(0f, 1f)]
public float dissolveAmount = 1f;
public float dissolveSpeed = 1f;
public bool isDissolving;
[ColorUsage(true, true)]
public Color dissolveOutColor = Color.magenta;
[ColorUsage(true, true)]
public Color dissolveInColor = Color.white;
private Graphic graphic;
private Material runtimeMaterial;
private static readonly int DissolveAmountId = Shader.PropertyToID("_DissolveAmount");
private static readonly int DissolveColorId = Shader.PropertyToID("_DissolveColor");
private void Awake()
{
graphic = GetComponent<Graphic>();
EnsureRuntimeMaterial();
ApplyProperties();
}
private void OnEnable()
{
EnsureRuntimeMaterial();
ApplyProperties();
}
private void OnDestroy()
{
if (runtimeMaterial != null)
{
if (graphic != null && graphic.material == runtimeMaterial)
{
graphic.material = null;
}
Destroy(runtimeMaterial);
}
}
private void Update()
{
if (runtimeMaterial == null)
{
return;
}
if (isDissolving)
{
dissolveAmount = Mathf.Max(0f, dissolveAmount - Time.deltaTime * dissolveSpeed);
runtimeMaterial.SetColor(DissolveColorId, dissolveOutColor);
}
else
{
dissolveAmount = Mathf.Min(1f, dissolveAmount + Time.deltaTime * dissolveSpeed);
runtimeMaterial.SetColor(DissolveColorId, dissolveInColor);
}
runtimeMaterial.SetFloat(DissolveAmountId, dissolveAmount);
}
public void SetDissolveAmount(float value)
{
dissolveAmount = Mathf.Clamp01(value);
ApplyProperties();
}
public void DissolveOut()
{
isDissolving = true;
ApplyProperties();
}
public void DissolveIn()
{
isDissolving = false;
ApplyProperties();
}
private void EnsureRuntimeMaterial()
{
if (graphic == null)
{
graphic = GetComponent<Graphic>();
}
if (graphic == null)
{
return;
}
Material source = materialTemplate != null
? materialTemplate
: (graphic.material != null ? graphic.material : graphic.defaultMaterial);
if (source == null)
{
return;
}
if (runtimeMaterial != null && runtimeMaterial.shader == source.shader)
{
if (graphic.material != runtimeMaterial)
{
graphic.material = runtimeMaterial;
}
return;
}
if (runtimeMaterial != null)
{
Destroy(runtimeMaterial);
}
runtimeMaterial = new Material(source);
runtimeMaterial.name = source.name + " (UI Runtime)";
graphic.material = runtimeMaterial;
}
private void ApplyProperties()
{
if (runtimeMaterial == null)
{
return;
}
runtimeMaterial.SetFloat(DissolveAmountId, dissolveAmount);
runtimeMaterial.SetColor(DissolveColorId, isDissolving ? dissolveOutColor : dissolveInColor);
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 388ec4cc3fd215b4e90fee32fe447435
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 7957eba252a23804193c33bc35022d08
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,203 @@
Shader "UI/Glowy Dissolve"
{
Properties
{
[PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
_Color ("Tint", Color) = (1,1,1,1)
_StencilComp ("Stencil Comparison", Float) = 8
_Stencil ("Stencil ID", Float) = 0
_StencilOp ("Stencil Operation", Float) = 0
_StencilWriteMask ("Stencil Write Mask", Float) = 255
_StencilReadMask ("Stencil Read Mask", Float) = 255
_ColorMask ("Color Mask", Float) = 15
[Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip ("Use Alpha Clip", Float) = 0
_DissolveAmount ("Dissolve Amount", Range(0, 1)) = 1
_Direction ("Direction", Range(0, 1)) = 0
[HDR] _DissolveColor ("Dissolve Color", Color) = (2,0,6,1)
_DissolveColorOpacity ("Dissolve Color Opacity", Range(0, 1)) = 0.8
_EdgeWidth ("Edge Width", Range(0.001, 0.5)) = 0.08
_BlockCountX ("Block Count X", Range(1, 256)) = 40
_BlockCountY ("Block Count Y", Range(1, 256)) = 14
_GlowIntensity ("Glow Intensity", Range(0, 8)) = 1.5
_GlitchJitter ("Glitch Jitter", Range(0, 0.5)) = 0.12
_GlitchStripeIntensity ("Glitch Stripe Intensity", Range(0, 1)) = 0.2
_GlitchRgbSplit ("Glitch RGB Split", Range(0, 0.1)) = 0.015
}
SubShader
{
Tags
{
"Queue"="Transparent"
"IgnoreProjector"="True"
"RenderType"="Transparent"
"PreviewType"="Plane"
"CanUseSpriteAtlas"="True"
}
Stencil
{
Ref [_Stencil]
ReadMask [_StencilReadMask]
WriteMask [_StencilWriteMask]
Comp [_StencilComp]
Pass [_StencilOp]
}
Cull Off
Lighting Off
ZWrite Off
ZTest [unity_GUIZTestMode]
Blend One OneMinusSrcAlpha
ColorMask [_ColorMask]
Pass
{
Name "Default"
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma target 3.0
#include "UnityCG.cginc"
#include "UnityUI.cginc"
#pragma multi_compile_local _ UNITY_UI_CLIP_RECT
#pragma multi_compile_local _ UNITY_UI_ALPHACLIP
struct appdata_t
{
float4 vertex : POSITION;
float4 color : COLOR;
float2 texcoord : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct v2f
{
float4 vertex : SV_POSITION;
fixed4 color : COLOR;
float2 texcoord : TEXCOORD0;
float4 worldPosition : TEXCOORD1;
float4 mask : TEXCOORD2;
float2 localPos : TEXCOORD3;
UNITY_VERTEX_OUTPUT_STEREO
};
sampler2D _MainTex;
fixed4 _Color;
fixed4 _TextureSampleAdd;
float4 _ClipRect;
float4 _MainTex_ST;
float _UIMaskSoftnessX;
float _UIMaskSoftnessY;
float _DissolveAmount;
float _Direction;
float4 _DissolveColor;
float _DissolveColorOpacity;
float _EdgeWidth;
float _BlockCountX;
float _BlockCountY;
float _GlowIntensity;
float _GlitchJitter;
float _GlitchStripeIntensity;
float _GlitchRgbSplit;
float Hash21(float2 p)
{
p = frac(p * float2(123.34, 345.45));
p += dot(p, p + 34.345);
return frac(p.x * p.y);
}
float Noise2D(float2 uv)
{
float2 i = floor(uv);
float2 f = frac(uv);
float a = Hash21(i);
float b = Hash21(i + float2(1, 0));
float c = Hash21(i + float2(0, 1));
float d = Hash21(i + float2(1, 1));
float2 u = f * f * (3.0 - 2.0 * f);
return lerp(lerp(a, b, u.x), lerp(c, d, u.x), u.y);
}
v2f vert(appdata_t v)
{
v2f OUT;
UNITY_SETUP_INSTANCE_ID(v);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT);
float4 vPosition = UnityObjectToClipPos(v.vertex);
OUT.worldPosition = v.vertex;
OUT.vertex = vPosition;
OUT.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
OUT.localPos = v.vertex.xy;
float2 pixelSize = vPosition.w;
pixelSize /= float2(1, 1) * abs(mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy));
float4 clampedRect = clamp(_ClipRect, -2e10, 2e10);
OUT.mask = float4(
v.vertex.xy * 2 - clampedRect.xy - clampedRect.zw,
0.25 / (0.25 * half2(_UIMaskSoftnessX, _UIMaskSoftnessY) + abs(pixelSize.xy))
);
OUT.color = v.color * _Color;
return OUT;
}
fixed4 frag(v2f IN) : SV_Target
{
float dir = step(0.5, _Direction);
float2 directedUv = float2(lerp(IN.texcoord.x, 1.0 - IN.texcoord.x, dir), IN.texcoord.y);
float2 blockCoord = floor(directedUv * float2(max(1.0, _BlockCountX), max(1.0, _BlockCountY)));
float blockNoise = Hash21(blockCoord);
float rowNoise = Hash21(float2(floor(directedUv.y * max(1.0, _BlockCountY)), floor(_DissolveAmount * 64.0)));
float stripeNoise = Hash21(float2(floor(directedUv.y * max(2.0, _BlockCountY * 0.5)), 17.0));
float front = saturate(_DissolveAmount + (blockNoise - 0.5) * _GlitchJitter);
float bandWidth = max(_EdgeWidth, 0.001);
float edgeBand = saturate(1.0 - abs(directedUv.x - front) / bandWidth);
float stripeOffset = (stripeNoise - 0.5) * _GlitchStripeIntensity * edgeBand;
float2 glitchOffset = float2(((rowNoise - 0.5) * _GlitchJitter * 0.35 + stripeOffset) * edgeBand, 0.0);
float2 sampleUv = IN.texcoord + glitchOffset;
fixed4 baseTex;
baseTex.r = tex2D(_MainTex, sampleUv + float2(_GlitchRgbSplit * edgeBand, 0)).r;
baseTex.g = tex2D(_MainTex, sampleUv).g;
baseTex.b = tex2D(_MainTex, sampleUv - float2(_GlitchRgbSplit * edgeBand, 0)).b;
baseTex.a = tex2D(_MainTex, sampleUv).a;
baseTex += _TextureSampleAdd;
fixed4 color = baseTex * IN.color;
float visible = step(directedUv.x, front);
float edge = smoothstep(front - bandWidth, front, directedUv.x) * visible;
float glowMask = edge * _DissolveColorOpacity;
color.a *= visible;
color.rgb = lerp(color.rgb, _DissolveColor.rgb * _GlowIntensity, glowMask);
#ifdef UNITY_UI_CLIP_RECT
half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(IN.mask.xy)) * IN.mask.zw);
color.a *= m.x * m.y;
#endif
#ifdef UNITY_UI_ALPHACLIP
clip(color.a - 0.001);
#endif
color.rgb *= color.a;
return color;
}
ENDCG
}
}
}
@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: 34e07e2b8017ff642a00f89a5485a325
ShaderImporter:
externalObjects: {}
defaultTextures: []
nonModifiableTextures: []
userData:
assetBundleName:
assetBundleVariant: