This commit is contained in:
2026-10-20 23:36:47 +08:00
parent bee2d42356
commit 4b63ceb3a5
30 changed files with 1646 additions and 35087 deletions
@@ -41,6 +41,11 @@ MonoBehaviour:
m_ReadOnly: 0
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 19aab719d005628448bd0ac1931120bc
m_Address: Assets/MyGame/aa/UI/DefaultPanel/LoadPanel/LoadBG.renderTexture
m_ReadOnly: 0
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 3ff18466016e86542b372582f348d0d6
m_Address: Assets/MyGame/aa/Game/ZhanShen/Game/display_FishEntry_6004.prefab
m_ReadOnly: 0
@@ -731,7 +731,7 @@ public class AOTGenericReferences : UnityEngine.MonoBehaviour
// System.Void System.Runtime.CompilerServices.AsyncTaskMethodBuilder.AwaitUnsafeOnCompleted<System.Runtime.CompilerServices.TaskAwaiter,FishResourcesData.<LoadFishAssetsData>d__20>(System.Runtime.CompilerServices.TaskAwaiter&,FishResourcesData.<LoadFishAssetsData>d__20&)
// System.Void System.Runtime.CompilerServices.AsyncTaskMethodBuilder.AwaitUnsafeOnCompleted<System.Runtime.CompilerServices.TaskAwaiter,FishResourcesData.<LoadFishAssetsDataCore>d__21>(System.Runtime.CompilerServices.TaskAwaiter&,FishResourcesData.<LoadFishAssetsDataCore>d__21&)
// System.Void System.Runtime.CompilerServices.AsyncTaskMethodBuilder.AwaitUnsafeOnCompleted<System.Runtime.CompilerServices.TaskAwaiter,GameMainPanel_FishBase.<HideBarDelayed>d__182>(System.Runtime.CompilerServices.TaskAwaiter&,GameMainPanel_FishBase.<HideBarDelayed>d__182&)
// System.Void System.Runtime.CompilerServices.AsyncTaskMethodBuilder.AwaitUnsafeOnCompleted<System.Runtime.CompilerServices.TaskAwaiter,GameManager.<InItLoad>d__45>(System.Runtime.CompilerServices.TaskAwaiter&,GameManager.<InItLoad>d__45&)
// System.Void System.Runtime.CompilerServices.AsyncTaskMethodBuilder.AwaitUnsafeOnCompleted<System.Runtime.CompilerServices.TaskAwaiter,GameManager.<InItLoad>d__55>(System.Runtime.CompilerServices.TaskAwaiter&,GameManager.<InItLoad>d__55&)
// System.Void System.Runtime.CompilerServices.AsyncTaskMethodBuilder.AwaitUnsafeOnCompleted<System.Runtime.CompilerServices.TaskAwaiter,MonsterMoveLine.<LoadBezier>d__5>(System.Runtime.CompilerServices.TaskAwaiter&,MonsterMoveLine.<LoadBezier>d__5&)
// System.Void System.Runtime.CompilerServices.AsyncTaskMethodBuilder.AwaitUnsafeOnCompleted<System.Runtime.CompilerServices.TaskAwaiter,MonsterMoveLine.<LoadBezierTxtAsync>d__12>(System.Runtime.CompilerServices.TaskAwaiter&,MonsterMoveLine.<LoadBezierTxtAsync>d__12&)
// System.Void System.Runtime.CompilerServices.AsyncTaskMethodBuilder.AwaitUnsafeOnCompleted<System.Runtime.CompilerServices.TaskAwaiter,MonsterMoveLine.<LoadBezierTxtAsyncCore>d__13>(System.Runtime.CompilerServices.TaskAwaiter&,MonsterMoveLine.<LoadBezierTxtAsyncCore>d__13&)
@@ -751,7 +751,7 @@ public class AOTGenericReferences : UnityEngine.MonoBehaviour
// System.Void System.Runtime.CompilerServices.AsyncTaskMethodBuilder<System.Threading.Tasks.VoidTaskResult>.AwaitUnsafeOnCompleted<System.Runtime.CompilerServices.TaskAwaiter,FishResourcesData.<LoadFishAssetsData>d__20>(System.Runtime.CompilerServices.TaskAwaiter&,FishResourcesData.<LoadFishAssetsData>d__20&)
// System.Void System.Runtime.CompilerServices.AsyncTaskMethodBuilder<System.Threading.Tasks.VoidTaskResult>.AwaitUnsafeOnCompleted<System.Runtime.CompilerServices.TaskAwaiter,FishResourcesData.<LoadFishAssetsDataCore>d__21>(System.Runtime.CompilerServices.TaskAwaiter&,FishResourcesData.<LoadFishAssetsDataCore>d__21&)
// System.Void System.Runtime.CompilerServices.AsyncTaskMethodBuilder<System.Threading.Tasks.VoidTaskResult>.AwaitUnsafeOnCompleted<System.Runtime.CompilerServices.TaskAwaiter,GameMainPanel_FishBase.<HideBarDelayed>d__182>(System.Runtime.CompilerServices.TaskAwaiter&,GameMainPanel_FishBase.<HideBarDelayed>d__182&)
// System.Void System.Runtime.CompilerServices.AsyncTaskMethodBuilder<System.Threading.Tasks.VoidTaskResult>.AwaitUnsafeOnCompleted<System.Runtime.CompilerServices.TaskAwaiter,GameManager.<InItLoad>d__45>(System.Runtime.CompilerServices.TaskAwaiter&,GameManager.<InItLoad>d__45&)
// System.Void System.Runtime.CompilerServices.AsyncTaskMethodBuilder<System.Threading.Tasks.VoidTaskResult>.AwaitUnsafeOnCompleted<System.Runtime.CompilerServices.TaskAwaiter,GameManager.<InItLoad>d__55>(System.Runtime.CompilerServices.TaskAwaiter&,GameManager.<InItLoad>d__55&)
// System.Void System.Runtime.CompilerServices.AsyncTaskMethodBuilder<System.Threading.Tasks.VoidTaskResult>.AwaitUnsafeOnCompleted<System.Runtime.CompilerServices.TaskAwaiter,MonsterMoveLine.<LoadBezier>d__5>(System.Runtime.CompilerServices.TaskAwaiter&,MonsterMoveLine.<LoadBezier>d__5&)
// System.Void System.Runtime.CompilerServices.AsyncTaskMethodBuilder<System.Threading.Tasks.VoidTaskResult>.AwaitUnsafeOnCompleted<System.Runtime.CompilerServices.TaskAwaiter,MonsterMoveLine.<LoadBezierTxtAsync>d__12>(System.Runtime.CompilerServices.TaskAwaiter&,MonsterMoveLine.<LoadBezierTxtAsync>d__12&)
// System.Void System.Runtime.CompilerServices.AsyncTaskMethodBuilder<System.Threading.Tasks.VoidTaskResult>.AwaitUnsafeOnCompleted<System.Runtime.CompilerServices.TaskAwaiter,MonsterMoveLine.<LoadBezierTxtAsyncCore>d__13>(System.Runtime.CompilerServices.TaskAwaiter&,MonsterMoveLine.<LoadBezierTxtAsyncCore>d__13&)
@@ -778,7 +778,7 @@ public class AOTGenericReferences : UnityEngine.MonoBehaviour
// System.Void System.Runtime.CompilerServices.AsyncTaskMethodBuilder.Start<FishResourcesData.<LoadFishAssetsDataCore>d__21>(FishResourcesData.<LoadFishAssetsDataCore>d__21&)
// System.Void System.Runtime.CompilerServices.AsyncTaskMethodBuilder.Start<GameMainPanel_FishBase.<HideBarDelayed>d__182>(GameMainPanel_FishBase.<HideBarDelayed>d__182&)
// System.Void System.Runtime.CompilerServices.AsyncTaskMethodBuilder.Start<GameMainPanel_FishBase.<LoadBulletClip>d__176>(GameMainPanel_FishBase.<LoadBulletClip>d__176&)
// System.Void System.Runtime.CompilerServices.AsyncTaskMethodBuilder.Start<GameManager.<InItLoad>d__45>(GameManager.<InItLoad>d__45&)
// System.Void System.Runtime.CompilerServices.AsyncTaskMethodBuilder.Start<GameManager.<InItLoad>d__55>(GameManager.<InItLoad>d__55&)
// System.Void System.Runtime.CompilerServices.AsyncTaskMethodBuilder.Start<MonsterMoveLine.<LoadBezier>d__5>(MonsterMoveLine.<LoadBezier>d__5&)
// System.Void System.Runtime.CompilerServices.AsyncTaskMethodBuilder.Start<MonsterMoveLine.<LoadBezierTxtAsync>d__12>(MonsterMoveLine.<LoadBezierTxtAsync>d__12&)
// System.Void System.Runtime.CompilerServices.AsyncTaskMethodBuilder.Start<MonsterMoveLine.<LoadBezierTxtAsyncCore>d__13>(MonsterMoveLine.<LoadBezierTxtAsyncCore>d__13&)
@@ -851,6 +851,7 @@ public class AOTGenericReferences : UnityEngine.MonoBehaviour
// object[] UnityEngine.GameObject.GetComponents<object>()
// object[] UnityEngine.GameObject.GetComponentsInChildren<object>(bool)
// bool UnityEngine.GameObject.TryGetComponent<object>(object&)
// object UnityEngine.Object.FindFirstObjectByType<object>()
// object[] UnityEngine.Object.FindObjectsOfType<object>()
// object UnityEngine.Object.Instantiate<object>(object)
// object UnityEngine.Object.Instantiate<object>(object,UnityEngine.Transform)
+8
View File
@@ -156,6 +156,7 @@
<type fullname="Unity.Jobs.IJob" preserve="all" />
<type fullname="UnityEngine.AddComponentMenu" preserve="all" />
<type fullname="UnityEngine.Application" preserve="all" />
<type fullname="UnityEngine.Application/LogCallback" preserve="all" />
<type fullname="UnityEngine.AsyncOperation" preserve="all" />
<type fullname="UnityEngine.Behaviour" preserve="all" />
<type fullname="UnityEngine.Bounds" preserve="all" />
@@ -180,6 +181,7 @@
<type fullname="UnityEngine.HideInInspector" preserve="all" />
<type fullname="UnityEngine.LayerMask" preserve="all" />
<type fullname="UnityEngine.LineRenderer" preserve="all" />
<type fullname="UnityEngine.LogType" preserve="all" />
<type fullname="UnityEngine.Material" preserve="all" />
<type fullname="UnityEngine.Mathf" preserve="all" />
<type fullname="UnityEngine.MeshRenderer" preserve="all" />
@@ -205,6 +207,8 @@
<type fullname="UnityEngine.RequireComponent" preserve="all" />
<type fullname="UnityEngine.ResourceRequest" preserve="all" />
<type fullname="UnityEngine.Resources" preserve="all" />
<type fullname="UnityEngine.RuntimeInitializeLoadType" preserve="all" />
<type fullname="UnityEngine.RuntimeInitializeOnLoadMethodAttribute" preserve="all" />
<type fullname="UnityEngine.SceneManagement.LoadSceneMode" preserve="all" />
<type fullname="UnityEngine.SceneManagement.Scene" preserve="all" />
<type fullname="UnityEngine.SceneManagement.SceneManager" preserve="all" />
@@ -385,9 +389,13 @@
<type fullname="System.IAsyncResult" preserve="all" />
<type fullname="System.IDisposable" preserve="all" />
<type fullname="System.IFormatProvider" preserve="all" />
<type fullname="System.IO.Directory" preserve="all" />
<type fullname="System.IO.DirectoryInfo" preserve="all" />
<type fullname="System.IO.Path" preserve="all" />
<type fullname="System.IO.StreamWriter" preserve="all" />
<type fullname="System.IO.StringReader" preserve="all" />
<type fullname="System.IO.TextReader" preserve="all" />
<type fullname="System.IO.TextWriter" preserve="all" />
<type fullname="System.Int32" preserve="all" />
<type fullname="System.Int64" preserve="all" />
<type fullname="System.Linq.Enumerable" preserve="all" />
@@ -0,0 +1,92 @@
using System.IO;
using HybridCLR;
using UnityEditor;
using UnityEditor.Build;
using UnityEditor.Build.Reporting;
using UnityEngine;
/// <summary>
/// 打包后把这次构建裁剪出来的 AOT 补充元数据 dll 刷进 StreamingAssets/HybridCLR/AOT。
///
/// 为什么要它:运行时 Launcher 会去 StreamingAssets/HybridCLR/AOT 读这些 dll 做"补充元数据"
/// (HybridCLR 的 LoadMetadataForAOTAssembly)。它们是构建过程裁剪出来的,HybridCLR 不会自动
/// 替你放进 StreamingAssets —— 漏了这一步,一旦改到 AOT 代码(GameFramework / Launcher /
/// Assembly-CSharp 这类),就会出现类型/函数缺失甚至黑屏。
///
/// 同步范围:只刷新 StreamingAssets/HybridCLR/AOT 里**已经存在**的那些 *.dll.bytes
/// (用它的文件名去裁剪产物目录里找同名 dll)。所以要在元数据列表里增减程序集,
/// 只需在 StreamingAssets/HybridCLR/AOT 下增删对应的 *.dll.bytes 文件即可。
///
/// ⚠ 时序:AOT dll 是"这次构建"才产出的,所以这一步只能在构建结束(Postprocess)后执行,
/// 也就是说这次构建用的仍是上一次同步的结果,**下一次构建**才会带上最新元数据。
/// 所以:改了 AOT 代码 → 连续打两次包(或打完第一次后手动再打一次)。
///
/// 想临时关掉自动同步,把 AutoSyncOnBuild 改成 false;也可以手动执行菜单
/// Tools/刷新AOT元数据到StreamingAssets。
/// </summary>
public class AOTMetadataStreamingAssetsSync : IPostprocessBuildWithReport
{
/// <summary>打包后是否自动同步 AOT 补充元数据</summary>
private const bool AutoSyncOnBuild = true;
/// <summary>运行时读取补充元数据的目录(相对项目根)</summary>
private const string StreamingAOTDir = "Assets/StreamingAssets/HybridCLR/AOT";
private const string BytesSuffix = ".bytes";
public int callbackOrder => 0;
public void OnPostprocessBuild(BuildReport report)
{
if (!AutoSyncOnBuild) return;
Sync(report.summary.platform);
}
[MenuItem("Tools/刷新AOT元数据到StreamingAssets")]
public static void SyncActive()
{
Sync(EditorUserBuildSettings.activeBuildTarget);
EditorUtility.DisplayDialog("AOT 元数据",
"已把最新的 AOT 补充元数据刷进 StreamingAssets/HybridCLR/AOT", "好");
}
/// <summary>按 StreamingAssets 里现有的 *.dll.bytes,从本次构建的裁剪产物目录刷新同名 dll。</summary>
private static void Sync(BuildTarget target)
{
string srcDir = SettingsUtil.GetAssembliesPostIl2CppStripDir(target);
if (!Directory.Exists(srcDir))
{
Debug.LogWarning($"[AOTMeta] 找不到裁剪后的 AOT dll 目录: {srcDir}(还没构建过?)");
return;
}
if (!Directory.Exists(StreamingAOTDir))
{
Debug.LogWarning($"[AOTMeta] 目录不存在: {StreamingAOTDir}");
return;
}
int copied = 0;
foreach (var dst in Directory.GetFiles(StreamingAOTDir))
{
if (!dst.EndsWith(".dll" + BytesSuffix)) continue;
// 磁盘文件形如 "GameFramework.dll.bytes" → 源文件名 "GameFramework.dll"
string dllName = Path.GetFileName(dst);
dllName = dllName.Substring(0, dllName.Length - BytesSuffix.Length);
string src = Path.Combine(srcDir, dllName);
if (!File.Exists(src))
{
Debug.LogWarning($"[AOTMeta] 裁剪产物里没有 {dllName},跳过({src})");
continue;
}
File.Copy(src, dst, true);
copied++;
}
AssetDatabase.Refresh();
Debug.Log($"[AOTMeta] 已同步 {copied} 个 AOT 补充元数据 dll 到 {StreamingAOTDir}(下次打包生效)");
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: f9e9682645efeab40883af0247069890
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -4,6 +4,7 @@
"references": [
"GameFramework",
"Game.Hotfix",
"HybridCLR.Editor",
"CameraShake",
"spine-unity",
"Coffee.UIParticle",
@@ -0,0 +1,78 @@
using System.IO;
using HybridCLR;
using HybridCLR.Commands;
using UnityEditor;
using UnityEditor.Build;
using UnityEditor.Build.Reporting;
using UnityEngine;
/// <summary>
/// 打包前自动把最新编译出的热更 dll 刷进 StreamingAssets/HybridCLR/Hotfix。
///
/// 为什么需要它:
/// HybridCLR 的 CompileDll / GenerateAll 只把热更 dll 编译到
/// Library/HybridCLR/HotUpdateDlls/{平台},**不会**替你放进 StreamingAssets。
/// 而运行时 Launcher 是从 StreamingAssets/HybridCLR/Hotfix/*.dll.bytes 读 dll 的,
/// 所以少了这一步,打出来的包跑的还是上一次的旧热更代码
/// (现象:改了热更代码、也跑过 Generate/All,但打包出来行为没变)。
///
/// 用法:默认每次打包自动执行,无需手动操作。
/// 想临时关掉,把 AutoSyncOnBuild 改成 false 即可;
/// 也可以手动执行菜单 Tools/刷新热更Dll到StreamingAssets。
/// </summary>
public class HotDllStreamingAssetsSync : IPreprocessBuildWithReport
{
/// <summary>打包前是否自动同步热更 dll</summary>
private const bool AutoSyncOnBuild = true;
/// <summary>运行时读取热更 dll 的目录(相对项目根)</summary>
private const string StreamingHotfixDir = "Assets/StreamingAssets/HybridCLR/Hotfix";
public int callbackOrder => 0;
public void OnPreprocessBuild(BuildReport report)
{
if (!AutoSyncOnBuild) return;
Sync(report.summary.platform);
}
[MenuItem("Tools/刷新热更Dll到StreamingAssets")]
public static void SyncActive()
{
Sync(EditorUserBuildSettings.activeBuildTarget);
EditorUtility.DisplayDialog("热更 dll",
"已把最新热更 dll 刷进 StreamingAssets/HybridCLR/Hotfix", "好");
}
/// <summary>按目标平台重新编译热更 dll,再以 .dll.bytes 命名覆盖到 StreamingAssets。</summary>
private static void Sync(BuildTarget target)
{
// 用目标平台重新编译(输出到 Library/HybridCLR/HotUpdateDlls/{target})
CompileDllCommand.CompileDll(target);
string srcDir = SettingsUtil.GetHotUpdateDllsOutputDirByTarget(target);
Directory.CreateDirectory(StreamingHotfixDir);
bool allOk = true;
// 列表直接取 HybridCLRSettings 的配置(形如 "Game.Hotfix.dll"),不再手写死
foreach (var dllFile in SettingsUtil.HotUpdateAssemblyFilesExcludePreserved)
{
string src = Path.Combine(srcDir, dllFile);
if (!File.Exists(src))
{
Debug.LogError($"[HotDll] 找不到热更 dll 编译产物: {src}");
allOk = false;
continue;
}
string dst = Path.Combine(StreamingHotfixDir, dllFile + ".bytes");
File.Copy(src, dst, true);
Debug.Log($"[HotDll] 已同步热更 dll: {src} ==> {dst}");
}
if (!allOk)
throw new BuildFailedException("[HotDll] 热更 dll 同步失败,请先执行 HybridCLR > CompileDll 看报错");
AssetDatabase.Refresh();
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: ca61c14f3ce82594eabf8b13d352c249
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -8,6 +8,7 @@ using System.Net;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.UI;
using TMPro;
using UnityEngine.Video;
//ui面板枚举 这里要求分类 Main *00 *00-*99 整数为主界面尾数为子界面
public enum UIPanel
{
@@ -137,6 +138,12 @@ public class UIManager : MonoSingleton<UIManager>
private readonly Dictionary<UIPanel, AsyncOperationHandle<GameObject>> handleCache = new Dictionary<UIPanel, AsyncOperationHandle<GameObject>>();
public GameObject loadPanel;
// ⭐ 常驻过场视频播放器:挂在场景常驻的 Manager 物体上(不属于任何 Addressables 面板),
// 随场景同步存在、启动即播、全程存活,投影到共享 RenderTexture(LoadBG)。
// 加载界面与登录界面都只显示这张 RT,所以用的是同一个播放器、同一进度,不会因
// 登录界面 AA 包还没加载出来而黑屏,也不会出现衔接时的进度偏差。
public VideoPlayer loadVideoPlayer;
// ==================== 加载中界面(obj_JiaZaiZhong) ====================
// ⭐ 资源加载超过 jiaZaiZhongDelay(默认 0.1 秒)还没结束才显示"加载中"界面,避免快速加载闪一下。
// 支持多段加载并发(引用计数):所有 BeginLoading 都配对 EndLoading 后才隐藏。
@@ -199,15 +206,45 @@ public class UIManager : MonoSingleton<UIManager>
_loadingShown = true;
}
// ⭐ 常驻过场视频是否已由 PlayOnAwake 起播过:首次进入不重头播,之后每次显示登录界面都从头重播
private bool _loadVideoFirstShow = true;
/// <summary>
/// 登录界面显示时调用(UILoginPanel.Show):首次由 PlayOnAwake 起播,之后每次显示都从头重播。
/// ⭐ 不用 Play() 接着播:登出时视频已在主页被 Stop 过,且要从第一帧开始才和首次进入一致。
/// </summary>
public void PlayLoginVideo()
{
if (loadVideoPlayer == null) return;
if (_loadVideoFirstShow)
{
_loadVideoFirstShow = false;
if (!loadVideoPlayer.isPlaying) loadVideoPlayer.Play();
return;
}
loadVideoPlayer.Stop(); // Stop 会把播放位置归 0 并释放音频,再播即从第一帧开始
loadVideoPlayer.Play();
}
/// <summary>彻底停止常驻过场视频(进入主页后调用,避免视频一直有声音 / 一直解码)</summary>
public void StopLoadVideo()
{
if (loadVideoPlayer == null) return;
loadVideoPlayer.Stop();
}
/// <summary>
/// 显示过场/加载面板(视频版)。
/// 过场视频不再由加载面板自己播放:LoginPanel 根节点的 VideoPlayer 会把视频投影到
/// 过场视频不再由加载面板自己播放:场景常驻的 loadVideoPlayer 会把视频投影到
/// 共享 RenderTexture(LoadBG),加载面板只是显示这张 RT,所以加载界面与登录界面
/// 用的是同一个 VideoPlayer、同一进度,衔接时不会出现偏差。
/// </summary>
public ILoadingPanel ShowLoadPanel(Action action=null)
{
ShowAsync(UIPanel.LoginPanel);
// 首次进入正常由常驻播放器的 PlayOnAwake 起播;这里只做兜底:没播就起播(不重头播)
if (loadVideoPlayer != null && !loadVideoPlayer.isPlaying)
loadVideoPlayer.Play();
GameObject load = Instantiate(loadPanel, uiRoot);
var loadScript = load.GetComponent<ILoadingPanel>();
@@ -228,6 +265,9 @@ public class UIManager : MonoSingleton<UIManager>
protected override void Awake()
{
base.Awake();
// ⭐ 兜底:若面板上没手动挂引用,就取常驻物体(Manager)上的常驻过场视频播放器
if (loadVideoPlayer == null)
loadVideoPlayer = GetComponent<VideoPlayer>();
foreach (var entry in config.panels)
{
if (!addressMap.ContainsKey(entry.type))
@@ -696,6 +736,9 @@ public class UIManager : MonoSingleton<UIManager>
/// </summary>
public void ReleaseLoginUI()
{
// ⭐ 过场视频是常驻播放器,登录界面销毁后要主动停掉,避免大厅/游戏里一直解码视频
StopLoadVideo();
var toRelease = new List<UIPanel>();
foreach (var kv in panels)
if (IsLoginPanel(kv.Key)) toRelease.Add(kv.Key);
@@ -921,6 +964,7 @@ public class UIManager : MonoSingleton<UIManager>
/// </summary>
public void ReleaseAll()
{
StopLoadVideo();
CloseAll();
foreach (var kv in handleCache)
+137 -1
View File
@@ -583,7 +583,7 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 22400762, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3}
propertyPath: m_AnchoredPosition.y
value: -0.000019073486
value: -0.0000038146973
objectReference: {fileID: 0}
- target: {fileID: 22426080, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3}
propertyPath: m_AnchorMax.x
@@ -3855,6 +3855,8 @@ GameObject:
- component: {fileID: 2075409202}
- component: {fileID: 2075409203}
- component: {fileID: 2075409204}
- component: {fileID: 2075409205}
- component: {fileID: 2075409206}
m_Layer: 0
m_Name: Manager
m_TagString: Untagged
@@ -3880,6 +3882,7 @@ MonoBehaviour:
type: 3}
loadPanel: {fileID: 2258378551980177528, guid: 953c7fd5628fa1d418bac4e4aa6c8ea4,
type: 3}
loadVideoPlayer: {fileID: 2075409205}
jiaZaiZhongDelay: 0.1
BoardPanelParefab: {fileID: 2654078965480511721, guid: aff715af8514eca42972496e4c2232c3,
type: 3}
@@ -4350,6 +4353,139 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
audioMixer: {fileID: 24100000, guid: ca43f9a7549657a49a2978e97c7a621a, type: 2}
--- !u!328 &2075409205
VideoPlayer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2075409194}
m_Enabled: 1
m_VideoClip: {fileID: 32900000, guid: 029dc73b392ceec4fbde610235b81a08, type: 3}
m_TargetCameraAlpha: 1
m_TargetCamera3DLayout: 0
m_TargetCamera: {fileID: 0}
m_TargetTexture: {fileID: 8400000, guid: 19aab719d005628448bd0ac1931120bc, type: 2}
m_TimeReference: 0
m_TargetMaterialRenderer: {fileID: 0}
m_TargetMaterialProperty: <noninit>
m_RenderMode: 2
m_AspectRatio: 5
m_DataSource: 0
m_TimeUpdateMode: 2
m_PlaybackSpeed: 1
m_AudioOutputMode: 1
m_TargetAudioSources:
- {fileID: 2075409206}
m_DirectAudioVolumes:
- 1
m_Url:
m_EnabledAudioTracks: 01
m_DirectAudioMutes: 00
m_ControlledAudioTrackCount: 1
m_PlayOnAwake: 1
m_SkipOnDrop: 1
m_Looping: 1
m_WaitForFirstFrame: 1
m_FrameReadyEventEnabled: 0
m_VideoShaders: []
--- !u!82 &2075409206
AudioSource:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2075409194}
m_Enabled: 1
serializedVersion: 4
OutputAudioMixerGroup: {fileID: 458904080387459688, guid: ca43f9a7549657a49a2978e97c7a621a,
type: 2}
m_audioClip: {fileID: 0}
m_PlayOnAwake: 1
m_Volume: 1
m_Pitch: 1
Loop: 0
Mute: 0
Spatialize: 0
SpatializePostEffects: 0
Priority: 128
DopplerLevel: 1
MinDistance: 1
MaxDistance: 500
Pan2D: 0
rolloffMode: 0
BypassEffects: 0
BypassListenerEffects: 0
BypassReverbZones: 0
rolloffCustomCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 1
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 1
value: 0
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
panLevelCustomCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
spreadCustomCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
reverbZoneMixCustomCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 1
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
--- !u!1001 &3569938244496052059
PrefabInstance:
m_ObjectHideFlags: 0
+1 -1
View File
@@ -658,7 +658,7 @@ public class GameManager : MonoSingleton<GameManager>
UIManager.Instance.CloseAll();
// ⭐ 登出流程完成,立即恢复重连开关(不依赖 ShowAsync 回调,避免 UI 异常导致永不重置)
WebSocketManager.Instance.isLoggingOut = false;
// 切换到登录界面
// 切换到登录界面(⭐ 过场视频由 UILoginPanel.Show 里从头重播,避免面板出来前只有声音没画面)
UIManager.Instance.ShowAsync(UIPanel.LoginPanel, null, (panel) =>
{
onDone?.Invoke();
@@ -98,14 +98,20 @@ public class SitPosData : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
[Header("翅膀")]
[Tooltip("翅膀实例化的父节点")]
public Transform wingParent;
[Tooltip("翅膀渲染相机:有翅膀显示时开启,卸下/无翅膀时关闭")]
public Camera cam_Wing;
[Header("战神")]
[Tooltip("战神实例化的父节点")]
public Transform zhanShenParent;
[Tooltip("战神渲染相机:战神显示时开启,清除/无战神时关闭")]
public Camera cam_ZS;
[Tooltip("当前装备的战神编号(0=无战神)。炮台/战神显示二选一:有战神时 turretParent 隐藏")]
public int currentZhanShenNumber;
[Header("特殊鱼炮台")]
[Tooltip("特殊鱼炮台实例化的父节点")]
public Transform tSYPTParent;
[Tooltip("特殊鱼炮台渲染相机:钻头/激光炮台使用中开启,结束后关闭")]
public Camera cam_TSYPT;
[Tooltip("特殊鱼炮台(钻头)是否正在使用:true=期间禁用普通开火,点击只发射钻头")]
public bool isDrillActive;
[Tooltip("激光锁定:true=激光发射期间炮台锁定方向,SetRotation 不生效(原方向打到爆奖结束)")]
@@ -293,6 +299,12 @@ public class SitPosData : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
diamondNum_UGUI.gameObject.SetActive(false);
}
// ⭐ 三路渲染相机初始关闭:翅膀/战神/特殊鱼炮台各自"用时开、不用时关",
// 避免空相机每帧渲染(RawImage 上是底色)白耗性能。
SetCameraActive(cam_Wing, false);
SetCameraActive(cam_ZS, false);
SetCameraActive(cam_TSYPT, false);
// XJMH 模式:炮台是座位自带子对象,不需要从资源加载,只做初始化
// (整理炮台列表 + 激活默认炮台 = 列表索引 0)
if (turretControlMode == TurretControlMode.XJMH)
@@ -500,6 +512,8 @@ public class SitPosData : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
}
// 座位禁用时清理战神激光(世界空间对象,不随座位隐藏)
DestroyZhanShenLaser();
// ⭐ 注意:相机是座位的子节点,座位整体隐藏时相机自然不渲染,这里无需额外关闭;
// 重新激活后由各自的加载/恢复流程按需打开。
// 散射起点父对象藏起来(子对象保留,下次出场/换战神时重建)
if (JGFXLeftParent != null)
JGFXLeftParent.gameObject.SetActive(false);
@@ -1809,14 +1823,42 @@ public class SitPosData : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
instance.SetActive(!isDrillActive);
if (isDrillActive) _pendingShowWing = instance;
// ⭐ 有翅膀显示 → 打开翅膀渲染相机(特殊炮台占用中暂不显示,等恢复时再开)
SetCameraActive(cam_Wing, !isDrillActive);
Debug.Log($"[SitPosData] 翅膀已加载: #{turretNumber}{(isDrillActive ? "(特殊炮台使用中,暂缓显示)" : "")}");
}
// ==================== 渲染相机开关(翅膀/战神/特殊鱼炮台) ====================
/// <summary>
/// 开/关指定渲染相机(null 安全)。
/// 只切 Camera.enabled,不动 GameObject 激活状态——相机节点上可能还挂着父节点/其他组件,
/// 直接 SetActive(false) 会连带关掉整个子树。
/// </summary>
public static void SetCameraActive(Camera cam, bool on)
{
if (cam != null && cam.enabled != on)
cam.enabled = on;
}
/// <summary>特殊鱼炮台(钻头/激光)渲染相机开关:生成炮台时开、销毁后关</summary>
public void SetTSYPTCameraActive(bool on) => SetCameraActive(cam_TSYPT, on);
/// <summary>战神渲染相机开关:战神显示时开、隐藏/清除时关</summary>
public void SetZSCameraActive(bool on) => SetCameraActive(cam_ZS, on);
/// <summary>翅膀渲染相机开关:翅膀显示时开、卸下/隐藏时关</summary>
public void SetWingCameraActive(bool on) => SetCameraActive(cam_Wing, on);
/// <summary>卸下翅膀:清空 wingParent 下的翅膀模型(保留预设的 Camera,它是用来渲染翅膀到 RawImage 的)。</summary>
public void ClearWing()
{
if (turretControlMode == TurretControlMode.XJMH) return;
// 没有翅膀模型了 → 关掉翅膀渲染相机
SetCameraActive(cam_Wing, false);
for (int i = wingParent.childCount - 1; i >= 0; i--)
{
var child = wingParent.GetChild(i);
@@ -1893,6 +1935,8 @@ public class SitPosData : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
GameObject instance = Instantiate(prefab, zhanShenParent, false);
// ⭐ 特殊鱼炮台(钻头/激光)使用中:只切换不显示,等爆奖流程结束由 RestoreTurretVisual 恢复显示
instance.SetActive(!isDrillActive);
// ⭐ 战神显示 → 打开战神渲染相机(特殊炮台占用中暂不显示,恢复时再开)
SetCameraActive(cam_ZS, !isDrillActive);
// 绑定状态机入口:战神接管开火/待机动画(PlayFire 约定,见 TurretData.PlayWarGodAnimator)
// 同时缓存 TurretData:开火时优先用战神的子弹预制体(bulletPrefab/bulletPrefab_Two)
@@ -1969,6 +2013,8 @@ public class SitPosData : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
}
currentZhanShen = null;
currentZhanShenData = null;
// 没有战神了 → 关掉战神渲染相机
SetCameraActive(cam_ZS, false);
// 战神清了激光也没了
DestroyZhanShenLaser();
// 散射起点球也清掉(下次出场/换战神时重建)
@@ -1991,6 +2037,8 @@ public class SitPosData : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
{
_pendingShowWing.SetActive(true);
_pendingShowWing = null;
// 翅膀重新显示 → 恢复翅膀渲染相机
SetCameraActive(cam_Wing, true);
}
if (currentZhanShen != null)
@@ -1999,10 +2047,14 @@ public class SitPosData : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
if (turretParent != null)
turretParent.gameObject.SetActive(false);
currentZhanShen.SetActive(true);
// 战神重新显示 → 恢复战神渲染相机
SetCameraActive(cam_ZS, true);
}
else if (turretParent != null)
{
turretParent.gameObject.SetActive(true);
// 无战神 → 战神相机保持关闭
SetCameraActive(cam_ZS, false);
}
// 动画归位:先 None 再 Idle,强制重进 Idle(避免 Attack 定格)
@@ -62,6 +62,8 @@ public class TSYPaoTaiController : MonoBehaviour
{
_paoTai = Instantiate(paoTaiPrefab, _sit.tSYPTParent, false);
_paoTai.transform.localPosition = Vector3.zero; // 其余值不改(相机渲染)
// ⭐ 特殊鱼炮台生成 → 打开它的渲染相机(销毁后关闭)
_sit.SetTSYPTCameraActive(true);
}
_sit.isDrillActive = true;
@@ -84,6 +86,8 @@ public class TSYPaoTaiController : MonoBehaviour
// ===== 4. 立刻恢复普通炮台:爆奖与炮台无关 =====
_sit.isDrillActive = false;
if (_paoTai != null) Destroy(_paoTai);
// ⭐ 特殊鱼炮台已销毁 → 关闭它的渲染相机
_sit.SetTSYPTCameraActive(false);
if (_normalTurret != null) _normalTurret.SetActive(true);
// ⭐ 爆奖隐藏炮台丢了动画状态,强制 None→Idle 归位(仿 FlyTurretData.RestoreIdleAnim),
// 否则自动开炮 ChangeState(Attack) 被同状态短路 → 动画定格
@@ -118,6 +122,8 @@ public class TSYPaoTaiController : MonoBehaviour
if (_sit != null) _sit.isDrillActive = false;
if (_paoTai != null) Destroy(_paoTai);
// ⭐ 特殊鱼炮台已销毁 → 关闭它的渲染相机
if (_sit != null) _sit.SetTSYPTCameraActive(false);
if (_normalTurret != null) _normalTurret.SetActive(true);
// ⭐ 兜底停止同样强制归位(OnStateChange 为空事件时 ?.Invoke 天然安全)
if (_sit != null)
@@ -203,11 +203,15 @@ public class ZuanTouXie_DieEvent : DieEffect_TSY
_sit.currentZhanShen.SetActive(false);
if (_sit.turretParent != null)
_sit.turretParent.gameObject.SetActive(false);
// ⭐ 战神被特殊炮台覆盖隐藏 → 关掉战神渲染相机(RestoreTurretVisual 恢复显示时重新打开)
_sit.SetZSCameraActive(false);
if (paoTaiPrefab != null && _sit.tSYPTParent != null)
{
_paoTai = Instantiate(paoTaiPrefab, _sit.tSYPTParent, false);
_paoTai.transform.localPosition = Vector3.zero; // 其余值不改(相机渲染)
// ⭐ 特殊鱼炮台生成 → 打开它的渲染相机(销毁后关闭)
_sit.SetTSYPTCameraActive(true);
}
_sit.isDrillActive = true;
@@ -301,6 +305,8 @@ public class ZuanTouXie_DieEvent : DieEffect_TSY
{
if (_sit != null) _sit.isDrillActive = false;
if (_paoTai != null) Destroy(_paoTai);
// ⭐ 特殊鱼炮台已销毁 → 关闭它的渲染相机
_sit?.SetTSYPTCameraActive(false);
_sit?.RestoreTurretVisual();
}
@@ -453,6 +459,8 @@ public class ZuanTouXie_DieEvent : DieEffect_TSY
if (_sit != null)
{
_sit.isDrillActive = false;
// ⭐ 特殊鱼炮台已销毁 → 关闭它的渲染相机(显示由 RestoreTurretVisual 按当前装备恢复)
_sit.SetTSYPTCameraActive(false);
_sit.RestoreTurretVisual();
}
if (_paoTai != null) Destroy(_paoTai);
@@ -11,11 +11,11 @@ public class LoadingPanel : MonoBehaviour, ILoadingPanel
public Action actionEnd;
public float fadeTime = 1.3f;
/// <summary>过场视频显示的 RawImage(LoadPanel 预制体子节点 0),显示 LoginPanel VideoPlayer 投影的共享 RenderTexture</summary>
/// <summary>过场视频显示的 RawImage(LoadPanel 预制体子节点 0),显示常驻 VideoPlayer 投影的共享 RenderTexture</summary>
private RawImage videoImage;
/// <summary>LoginPanel 根节点上播放过场视频的 VideoPlayer(加载面板只是显示它的输出,不自己播放)</summary>
private VideoPlayer loginVideo;
/// <summary>常驻过场视频播放器(UIManager.loadVideoPlayer,挂在场景常驻 Manager 物体上;加载面板只是显示它的输出,不自己播放)</summary>
private VideoPlayer loadVideo;
private void Awake()
{
@@ -41,15 +41,15 @@ public class LoadingPanel : MonoBehaviour, ILoadingPanel
// 登录成功 UILoginPanel.Succeed() 的 ShowAsync(HomeMainPanel) 命中缓存秒开,
// 不再出现"登录成功后进大厅白等"。
StartCoroutine(PreloadHomeMainRoutine());
StartCoroutine(BindLoginVideoRoutine());
StartCoroutine(BindLoadVideoRoutine());
}
/// <summary>播放过程中预载大厅主面板(避免大包解压和视频启动抢主线程)</summary>
private IEnumerator PreloadHomeMainRoutine()
{
// 1) 等共享过场视频(LoginPanel 根节点 VideoPlayer)真正起播(最多等 5 秒兜底,防止视频未播时死等)
// 1) 等常驻过场视频真正起播(最多等 5 秒兜底,防止视频未播时死等)
float waited = 0f;
while ((loginVideo == null || !loginVideo.isPlaying) && waited < 5f)
while ((loadVideo == null || !loadVideo.isPlaying) && waited < 5f)
{
waited += Time.deltaTime;
yield return null;
@@ -63,35 +63,33 @@ public class LoadingPanel : MonoBehaviour, ILoadingPanel
}
/// <summary>
/// 过场视频由 LoginPanel 根节点的 VideoPlayer 播放并投影到共享 RenderTexture,
/// 常驻过场视频由 UIManager.loadVideoPlayer 播放并投影到共享 RenderTexture,
/// 这里等它就绪后监听 loopPointReached:视频第一遍循环播放完毕时隐藏跳过按钮。
/// (面板销毁时协程终止;OnDestroy 里也会解除监听)
/// </summary>
private IEnumerator BindLoginVideoRoutine()
private IEnumerator BindLoadVideoRoutine()
{
while (loginVideo == null)
while (loadVideo == null)
{
yield return null;
if (UIManager.Instance == null) continue;
var login = UIManager.Instance.Get<UIBase>(UIPanel.LoginPanel);
if (login == null) continue;
loginVideo = login.GetComponent<VideoPlayer>();
loadVideo = UIManager.Instance.loadVideoPlayer;
}
loginVideo.loopPointReached += OnFirstLoopPointReached;
loadVideo.loopPointReached += OnFirstLoopPointReached;
}
/// <summary>视频第一遍播完:隐藏跳过按钮并解除监听</summary>
private void OnFirstLoopPointReached(VideoPlayer vp)
{
vp.loopPointReached -= OnFirstLoopPointReached;
loginVideo = null;
loadVideo = null;
HideSkipButton();
}
private void OnDestroy()
{
if (loginVideo != null)
loginVideo.loopPointReached -= OnFirstLoopPointReached;
if (loadVideo != null)
loadVideo.loopPointReached -= OnFirstLoopPointReached;
}
private void HideSkipButton()
Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

@@ -1,153 +0,0 @@
fileFormatVersion: 2
guid: c0cdb1c166eeea94b8dd67c4d64929e9
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 3
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: WebGL
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: iPhone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 38 KiB

@@ -94,7 +94,7 @@ TextureImporter:
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: Android
buildTarget: iPhone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
@@ -120,7 +120,7 @@ TextureImporter:
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: iPhone
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
Binary file not shown.

Before

Width:  |  Height:  |  Size: 148 KiB

After

Width:  |  Height:  |  Size: 151 KiB

@@ -94,7 +94,7 @@ TextureImporter:
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: Android
buildTarget: iPhone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
@@ -120,7 +120,7 @@ TextureImporter:
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: iPhone
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
+3
View File
@@ -6086,9 +6086,12 @@ MonoBehaviour:
tMP_TurretConsumeNum: {fileID: 6996998917093333593}
turretConsumeNum_UGUI: {fileID: 0}
wingParent: {fileID: 5982321734877658021}
cam_Wing: {fileID: 3474185499508581916}
zhanShenParent: {fileID: 3297566421429981692}
cam_ZS: {fileID: 6602789974901403781}
currentZhanShenNumber: 0
tSYPTParent: {fileID: 2724832172110457149}
cam_TSYPT: {fileID: 5925412083069679843}
isDrillActive: 0
isLaserLocked: 0
turretParent: {fileID: 5516422369603436267}
File diff suppressed because it is too large Load Diff
@@ -1109,7 +1109,6 @@ GameObject:
m_Component:
- component: {fileID: 1757802389424026021}
- component: {fileID: 7618136032869811654}
- component: {fileID: 5723835308432911354}
m_Layer: 5
m_Name: LoginPanel
m_TagString: Untagged
@@ -1164,42 +1163,6 @@ MonoBehaviour:
loginParent: {fileID: 823316465834655317}
WXLogin: {fileID: 2180513923416259210}
btn_ServicePanel: {fileID: 1679042159541900254}
--- !u!328 &5723835308432911354
VideoPlayer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6216245946385704259}
m_Enabled: 1
m_VideoClip: {fileID: 32900000, guid: 029dc73b392ceec4fbde610235b81a08, type: 3}
m_TargetCameraAlpha: 1
m_TargetCamera3DLayout: 0
m_TargetCamera: {fileID: 0}
m_TargetTexture: {fileID: 8400000, guid: 19aab719d005628448bd0ac1931120bc, type: 2}
m_TimeReference: 0
m_TargetMaterialRenderer: {fileID: 0}
m_TargetMaterialProperty: <noninit>
m_RenderMode: 2
m_AspectRatio: 5
m_DataSource: 0
m_TimeUpdateMode: 2
m_PlaybackSpeed: 1
m_AudioOutputMode: 2
m_TargetAudioSources:
- {fileID: 0}
m_DirectAudioVolumes:
- 1
m_Url:
m_EnabledAudioTracks: 01
m_DirectAudioMutes: 00
m_ControlledAudioTrackCount: 1
m_PlayOnAwake: 1
m_SkipOnDrop: 1
m_Looping: 1
m_WaitForFirstFrame: 1
m_FrameReadyEventEnabled: 0
m_VideoShaders: []
--- !u!1 &6256436603004493382
GameObject:
m_ObjectHideFlags: 0
@@ -83,6 +83,9 @@ phoneLogin1.SetActive(false);
{
base.Show(args);
// ⭐ 常驻过场视频:首次由 PlayOnAwake 起播,之后每次显示登录界面都从头重播
// (进主页时已被 UIManager.ReleaseLoginUI 停掉,避免一直有声音)
UIManager.Instance.PlayLoginVideo();
if (loadingParent.activeSelf)
{
@@ -264,6 +264,10 @@ Shader "Fishing3D/Fish/Opaque Bump Gold" {
#pragma fragment ShadowPassFragment
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
// Shadows.hlsl 里用到了 LerpWhiteTo,它定义在 core 包的 CommonMaterial.hlsl 中。
// URP 自带的 Lit 是先 include 了 LitInput.hlsl(里面含 CommonMaterial.hlsl)才没问题,
// 这个自定义 shader 缺这一步,编译就会报 "undeclared identifier 'LerpWhiteTo'",这里补上。
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/CommonMaterial.hlsl"
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl"
struct Attributes
@@ -268,6 +268,10 @@ Shader "Fishing3D/Fish/Opaque Light Gold" {
#pragma fragment ShadowPassFragment
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
// Shadows.hlsl 里用到了 LerpWhiteTo,它定义在 core 包的 CommonMaterial.hlsl 中。
// URP 自带的 Lit 是先 include 了 LitInput.hlsl(里面含 CommonMaterial.hlsl)才没问题,
// 这个自定义 shader 缺这一步,编译就会报 "undeclared identifier 'LerpWhiteTo'",这里补上。
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/CommonMaterial.hlsl"
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl"
struct Attributes