1
This commit is contained in:
@@ -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
|
||||
|
||||
Binary file not shown.
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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}
|
||||
|
||||
+1154
-34870
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
|
||||
|
||||
@@ -82,7 +82,10 @@ phoneLogin1.SetActive(false);
|
||||
public override void Show(object args = null)
|
||||
{
|
||||
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
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user