展前冒死重构

This commit is contained in:
FloatGaming
2026-07-24 04:43:13 +08:00
parent d09597472b
commit 4eb70b0ac9
61 changed files with 74951 additions and 328 deletions
@@ -1,55 +1,55 @@
using UnityEngine;
/// <summary>
/// 根据屏幕宽高比,对 gameplay 相机做"适当微调":叠加一点 X 旋转(俯角)与 Z 距离增量
/// 目的:不同分辨率下让轨道透视观感更协调(如超宽屏略微拉远/调俯角),与 contain 式 FOV 适配互补。
/// 根据屏幕宽高比,对 gameplay 相机做分辨率适配,让宽屏下轨道观感更接近设计(16:9)
///
/// 安全性(核心):**绝不直接写相机 transform**。所有微调通过 effectEventController.SetResolutionCameraAdjust
/// 施加到"漂移 pivot"(顶层基准节点),并由该方法同步漂移基准 z——因此与相机漂移、SmoothShake 抖动、
/// 技能偏移、冲刺特效等所有"写相机位姿"的业务逻辑完全不冲突(它们叠加在 pivot 之下或相机自身)。
/// 需求(用户指定):越宽的屏幕(21:9/32:9)轨道越缩在中间、显细,左右与 UI 空出大黑缝。
/// 解决方案:宽屏时把相机从设计基准(z=-8, X=-40°)逐步插值到"z 更高 + X 更朝水平"的目标位姿,
/// 让轨道透视放大、铺满视野,同时保持判定线距离/视距/业务逻辑不变(音符/判定用世界坐标,不受相机缩放影响)。
///
/// 用一个 bool(enableTuning)开关。关闭时把增量清零(恢复设计基准),行为与未加此脚本一致。
/// 增量相对"设计基准"计算,不累积;16:9 时增量为 0(与原设计逐像素一致)。
/// 操作对象:**直接改相机本体(Main Camera 子物体)自身的 local z 高度与 local X 旋转**
/// 不动其父/祖父 pivot(drift/skill pivot)。通过 effectEventController.SetResolutionCameraSelf 施加,
/// 由该方法处理与 SmoothShake(写相机 local)、冲刺(写相机 local z)的共享——空闲时写入持久生效,
/// 抖动/冲刺触发时会以当前 local 重新捕获基准。不碰任何 UI:UI 贴边逻辑独立,本脚本只改相机位姿。
///
/// 用一个 bool(enableTuning)开关。关闭时恢复设计基准(与未加此脚本逐像素一致)。
/// 16:9 及更窄(平板 1.6、竖屏)保持设计基准不动;宽屏线性插值;21:9 及更宽夹在最大偏移(用户指定的上限)。
/// </summary>
[DisallowMultipleComponent]
public sealed class CameraResolutionTuner : MonoBehaviour
{
[Tooltip("是否启用按分辨率微调相机(X旋转/Z)。关闭则恢复设计基准。")]
[Tooltip("是否启用按分辨率微调相机。关闭则恢复设计基准。")]
public bool enableTuning = true;
[Tooltip("设计基准宽高比。16:9 = 1.7778。此比例下增量为 0。")]
[Tooltip("设计基准宽高比。16:9 = 1.7778。此比例及更窄时无微调。")]
public float designAspect = 16f / 9f;
[Header("宽屏(aspect > 设计)微调")]
[Tooltip("每偏离设计宽高比 1.0,额外叠加的 X 旋转角度(正=更俯视)。建议很小。")]
public float widePerAspectRotX = 3f;
[Tooltip("每偏离设计宽高比 1.0,额外叠加的 Z 距离(负=相机后退拉远)。")]
public float widePerAspectZ = -1.0f;
[Tooltip("宽屏微调的绝对上限,避免极端超宽屏过度。")]
public float wideMaxRotX = 6f;
public float wideMaxZ = -2.0f;
[Tooltip("最大偏移的宽高比上限。21:9 = 2.3333。达到或超过此比例时夹在最大偏移。")]
public float maxOffsetAspect = 21f / 9f;
[Header("窄屏(aspect < 设计)微调")]
[Tooltip("每偏离设计宽高比 1.0,额外叠加的 X 旋转角度。")]
public float narrowPerAspectRotX = 0f;
[Tooltip("每偏离设计宽高比 1.0,额外叠加的 Z 距离。")]
public float narrowPerAspectZ = 0f;
public float narrowMaxRotX = 4f;
public float narrowMaxZ = 2.0f;
[Header("21:9 时相机本体(Main Camera)的目标 local 位姿(最大偏移)")]
[Tooltip("21:9 时相机本体的目标 local Z 高度。用户指定 2.5(相机自身 z=2.5)。")]
public float targetCameraZ = 2.5f;
[Tooltip("21:9 时相机本体的目标 local X 旋转角度。用户指定 5(相机自身 X=5°)。")]
public float targetCameraRotX = 5f;
private float _lastAspect = -1f;
private bool _lastEnabled;
private bool _applied; // 上次 Apply 是否成功写入相机(相机/单例未就绪时为 false,下一帧重试)
private void OnEnable()
{
_lastAspect = -1f;
_applied = false;
Apply();
}
private void Update()
{
float aspect = (float)Screen.width / Mathf.Max(1, Screen.height);
if (Mathf.Abs(aspect - _lastAspect) > 0.0001f || enableTuning != _lastEnabled)
// 宽高比/开关变化,或此前尚未成功写入(相机/单例未就绪),则重试。
if (!_applied || Mathf.Abs(aspect - _lastAspect) > 0.0001f || enableTuning != _lastEnabled)
{
Apply();
}
@@ -58,7 +58,7 @@ public sealed class CameraResolutionTuner : MonoBehaviour
private void Apply()
{
var eff = effectEventController.Instance;
if (eff == null) return;
if (eff == null) { _applied = false; return; }
float aspect = (float)Screen.width / Mathf.Max(1, Screen.height);
_lastAspect = aspect;
@@ -66,26 +66,30 @@ public sealed class CameraResolutionTuner : MonoBehaviour
if (!enableTuning)
{
eff.SetResolutionCameraAdjust(0f, 0f); // 恢复设计基准
// 关闭:t=0 → 相机本体回到 local 设计基准(运行时为 0/identity)。
_applied = eff.SetResolutionCameraSelf(0f, targetCameraRotX, targetCameraZ);
return;
}
float rotX = 0f;
float z = 0f;
// 16:9 及更窄:t=0(无微调,与设计逐像素一致)。
// 16:9 ~ 21:9:线性插值 t ∈ [0,1]。
// 21:9 及更宽:t=1(夹在最大偏移上限)。
float t = 0f;
if (aspect > designAspect)
{
float dev = aspect - designAspect; // 宽屏偏离量
rotX = Mathf.Clamp(widePerAspectRotX * dev, Mathf.Min(0f, wideMaxRotX), Mathf.Max(0f, wideMaxRotX));
z = Mathf.Clamp(widePerAspectZ * dev, Mathf.Min(0f, wideMaxZ), Mathf.Max(0f, wideMaxZ));
if (aspect >= maxOffsetAspect)
{
t = 1f; // 超宽屏:夹在最大偏移
}
else
{
// 插值区间:designAspect(16:9≈1.778) → maxOffsetAspect(21:9≈2.333)
t = (aspect - designAspect) / Mathf.Max(0.0001f, maxOffsetAspect - designAspect);
t = Mathf.Clamp01(t);
}
}
else if (aspect < designAspect)
{
float dev = designAspect - aspect; // 窄屏偏离量
rotX = Mathf.Clamp(narrowPerAspectRotX * dev, Mathf.Min(0f, narrowMaxRotX), Mathf.Max(0f, narrowMaxRotX));
z = Mathf.Clamp(narrowPerAspectZ * dev, Mathf.Min(0f, narrowMaxZ), Mathf.Max(0f, narrowMaxZ));
}
// 16:9rotX=z=0,无微调。
// aspect <= designAspectt=0(无微调)。
eff.SetResolutionCameraAdjust(rotX, z);
_applied = eff.SetResolutionCameraSelf(t, targetCameraRotX, targetCameraZ);
}
}