Files
Liubing\LB 3d8d4d18f3 first commit
先修复一下,错误的场景

删除不必要的钓场资产

修复into场景

update:更新meta文件,修复报错

update:修复资源

修复第一章节建造

修复建造第三章

update:删除多余内容

update:更新README.md

update:还原图标

update:更新README

update:更新配置
2026-04-28 02:17:22 +08:00

274 lines
9.0 KiB
C#

using asap.core;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using GameCore;
// using NetEase;
using PlayFab.Internal;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.ResourceLocations;
using UnityEngine.ResourceManagement.ResourceProviders;
// using YiDun.Protector;
namespace game
{
public class RootCtx : GContext
{
#if !UNITY_EDITOR && AGG
private void Start()
{
Debug.Log("InitSDK - Skipped (tysdk removed)");
}
#endif
protected override async Task SetupAsync()
{
container.Register<IStageService, StageService>().AsSingleton();
//container.Register<IDataService, LubanDataService>().AsSingleton();
container.Register<IObjectSerializer, ObjectSerializer>().AsSingleton();
container.Register<IConfig, Config>().AsSingleton();
await Awaiters.NextFrame;
BetterStreamingAssets.Initialize();
// using remote assets locally if exists
Addressables.InternalIdTransformFunc += DoIdTransform;
UnityEngine.Random.InitState((int)System.DateTime.Now.Ticks);
// Initialize DOTween with the preferences set in DOTween's Utility Panel
DG.Tweening.DOTween.Init();
// Set Tweens capacity accordingly based on DOTween warnings
DG.Tweening.DOTween.SetTweensCapacity(200, 125);
Application.lowMemory += OnLowMemory;
//SceneManager.sceneLoaded += OnSceneLoaded;
Screen.sleepTimeout = SleepTimeout.NeverSleep;
// InitYiDun();
}
// private static void InitYiDun()
// {
// // 开发这模式 就不启用了
// var config = GContext.container.Resolve<IConfig>();
// if (config != null && (config.Get("DEBUG", "0") == "1" || config.Get("GM", "0") == "1"))
// {
// return;
// }
//
//
// var yiDunManager = YiDunProtector.GetManager();
// yiDunManager.InitConfig((out HTProtectConfig config) =>
// {
// config = new HTProtectConfig();
// config.setServerType(GConstant.Yidun_serverType);
// #if UNITY_ANDROID
// if(ChannelManager.IsGooglePlay)
// config.setChannel(GConstant.Yidun_GooglePlayChannel); // 渠道
// else if (ChannelManager.IsRustoreStore)
// config.setChannel(GConstant.Yidun_RustoreChannel); // Rustore
// #elif UNITY_IOS
// config.setChannel(GConstant.Yidun_IOSChannel);
// #endif
// config.setInitThread(true);
// config.setInitThreadCrash(true);
//
// });
// // #endif
//
// yiDunManager.Init(GConstant.YidunProductId, new YiDunHtpCallback((code, message) =>
// {
// Debug.Log($"InitYiDun CallBack :{code} {message}");
// Publish(new YiDunEventData()
// {
// Code = code,
// messages = message
// });
//
// }));
// container.RegisterInstance(yiDunManager);
// // #endif
// }
//void OnSceneLoaded(Scene scene, LoadSceneMode mode)
//{
//GameDebug.Log("[GameEngine]OnSceneLoaded: Name: {0}, Mode: {1}", scene.name, mode);
//SetCamStack();
//}
float _lowMemCleanupTime;
bool _isUnloadingMem;
const float LOW_MEM_CLEANUP_CD = 10f; // in secs
void OnLowMemory()
{
GameDebug.LogWarning("[GameEngine]OnLowMemory: Memory is low!");
// Add a cool-down time to prevent consecutive cleaning up process, which
// will cause a long performance hiccup
if (!_isUnloadingMem &&
Time.realtimeSinceStartup - _lowMemCleanupTime > LOW_MEM_CLEANUP_CD)
{
StartCoroutine(UnloadMemory());
}
}
IEnumerator UnloadMemory(Action back = null)
{
GameDebug.Log("[GameEngine]UnloadMemory: Start cleaning up!");
_isUnloadingMem = true;
System.GC.Collect();
var op = Resources.UnloadUnusedAssets();
while (!op.isDone)
{
yield return null;
}
back?.Invoke();
_lowMemCleanupTime = Time.realtimeSinceStartup;
_isUnloadingMem = false;
GameDebug.Log("[GameEngine]UnloadMemory: Cleaning up is done!");
}
private string customAddressableRemoteURL;
private string originAddressableRemoteURL;
public void ChangeAddressableRemoteUrl(string customUrl, string originUrl)
{
Debug.Log($"[RootCtx::ChangeAddressableRemoteUrl] customUrl: {customUrl}, originUrl: {originUrl}");
customAddressableRemoteURL = customUrl;
originAddressableRemoteURL = originUrl;
Addressables.InternalIdTransformFunc -= DoIdTransform;
Addressables.InternalIdTransformFunc += DoIdTransformUsingCustomURL;
}
private const string Remote_Prefix = "http";
private string DoIdTransformUsingCustomURL(IResourceLocation location)
{
var id = location.InternalId;
if (id.StartsWith(Remote_Prefix))
{
if (location.ResourceType.IsAssignableFrom(typeof(IAssetBundleResource)))
{
var primaryKey = location.PrimaryKey;
if (BetterStreamingAssets.FileExists(primaryKey))
return Path.Combine(Application.streamingAssetsPath, primaryKey);
}
id = id.Replace(originAddressableRemoteURL, customAddressableRemoteURL);
}
return id;
}
private string DoIdTransform(IResourceLocation location)
{
var id = location.InternalId;
if (id.StartsWith(Remote_Prefix))
{
if (location.ResourceType.IsAssignableFrom(typeof(IAssetBundleResource)))
{
var primaryKey = location.PrimaryKey;
if (BetterStreamingAssets.FileExists(primaryKey))
return Path.Combine(Application.streamingAssetsPath, primaryKey);
}
}
return id;
}
public static void ExitGame()
{
PlayerPrefs.Save();
Application.runInBackground = false;
if (Application.platform == RuntimePlatform.Android)
{
// Calling Application.Quit on some devices will cause ANR, so
// directly calling system action instead
try
{
new AndroidJavaClass("java.lang.System").CallStatic("exit", 0);
}
catch (Exception ex)
{
Debug.LogError($"[GameStateMgr]ExitGame: {ex}");
}
}
else
{
Application.Quit();
}
}
public static bool showFPS = false;
public static float fps;
private static float frameCount;
private static float elapse;
private GUIStyle _fpsStyle;
public GUIStyle fpsStyle
{
get
{
if (_fpsStyle == null)
{
int h = Screen.height;
_fpsStyle = new GUIStyle();
_fpsStyle.alignment = TextAnchor.UpperLeft;
_fpsStyle.fontSize = h * 2 / 100;
_fpsStyle.normal.textColor = Color.magenta;
}
return _fpsStyle;
}
}
void OnGUI()
{
frameCount++;
elapse += Time.unscaledDeltaTime;
if (elapse >= 1)
{
fps = frameCount / elapse;
elapse = 0;
frameCount = 0;
}
if (!showFPS) return;
string text = string.Format("FPS: {0:0.}", fps);
int w = Screen.width, h = Screen.height;
Rect rect = new Rect(20, h * 0.4f, w * 0.5f, h * 2 / 100);
GUI.Label(rect, text, fpsStyle);
}
protected override void OnDestroy()
{
Debug.Log("[RootCtx::OnDestroy]");
base.OnDestroy();
Addressables.InternalIdTransformFunc = null;
Application.lowMemory -= OnLowMemory;
root = null;
Ready = false;
IsInited = false;
eventAggregator = new EventAggregator();
container.Dispose();
container = new Container();
}
public static void DestoryRootCtx()
{
if (root != null)
{
GameObject.DestroyImmediate(root.gameObject);
root = null;
}
}
}
}