diff --git a/Assets/AddressableAssetsData/link.xml b/Assets/AddressableAssetsData/link.xml new file mode 100644 index 000000000..45cee415c --- /dev/null +++ b/Assets/AddressableAssetsData/link.xml @@ -0,0 +1,533 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Assets/AddressableAssetsData/link.xml.meta b/Assets/AddressableAssetsData/link.xml.meta new file mode 100644 index 000000000..95a7269cb --- /dev/null +++ b/Assets/AddressableAssetsData/link.xml.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 87ea248de149a8d40b85e0ce5f5eeec4 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Android.meta b/Assets/Plugins/Android.meta new file mode 100644 index 000000000..79468770b --- /dev/null +++ b/Assets/Plugins/Android.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5787028af33957444b4aea4357c524b1 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Android/AndroidManifest.xml b/Assets/Plugins/Android/AndroidManifest.xml new file mode 100644 index 000000000..437975198 --- /dev/null +++ b/Assets/Plugins/Android/AndroidManifest.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + diff --git a/Assets/Plugins/Android/AndroidManifest.xml.meta b/Assets/Plugins/Android/AndroidManifest.xml.meta new file mode 100644 index 000000000..cb4415275 --- /dev/null +++ b/Assets/Plugins/Android/AndroidManifest.xml.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 860427fcd71d6a040b50ba7917f92945 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Android/com.unity3d.player.meta b/Assets/Plugins/Android/com.unity3d.player.meta new file mode 100644 index 000000000..b5c4fa690 --- /dev/null +++ b/Assets/Plugins/Android/com.unity3d.player.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8edde11ad1819424491779752df543f5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Android/com.unity3d.player/PrivacyActivity.java b/Assets/Plugins/Android/com.unity3d.player/PrivacyActivity.java new file mode 100644 index 000000000..264c0260f --- /dev/null +++ b/Assets/Plugins/Android/com.unity3d.player/PrivacyActivity.java @@ -0,0 +1,92 @@ +package com.unity3d.player; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.webkit.WebView; + +public class PrivacyActivity extends Activity implements DialogInterface.OnClickListener { + // 隐私协议内容 + final String privacyContext = "" + + "

提示

" + + "欢迎使用本游戏!在使用前,请您充分阅读并理解:
" + + + "我们收集的信息:
" + + "• 设备信息:Android ID、IMEI、Mac地址、设备型号、系统版本
" + + "• 应用信息:应用安装列表
" + + "• 传感器信息:触屏、重力、加速度传感器(用于横竖屏适配)

" + + + "收集目的:
" + + "• 保障游戏正常运行、数据统计、和性能优化

" + + + "信息保护:
" + + "• 我们不会将您的个人信息出售给第三方,仅在法律要求或为提供服务所必需时才会共享。

" + + + "您的权利:
" + + "• 您有权拒绝我们收集信息,但可能导致游戏无法正常运行。

" + + ""; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + // 如果已经同意过隐私协议则直接进入Unity Activity + if (GetPrivacyAccept()) { + EnterUnityActivity(); + return; + } + // 弹出隐私协议对话框 + ShowPrivacyDialog(); + } + + // 显示隐私协议对话框 + private void ShowPrivacyDialog() { + WebView webView = new WebView(this); + webView.loadData(privacyContext, "text/html", "utf-8"); + AlertDialog.Builder privacyDialog = new AlertDialog.Builder(this); + privacyDialog.setCancelable(false); + privacyDialog.setView(webView); + privacyDialog.setTitle("提示"); + privacyDialog.setNegativeButton("拒绝", this); + privacyDialog.setPositiveButton("同意", this); + privacyDialog.create().show(); + } + + @Override + public void onClick(DialogInterface dialogInterface, int i) { + switch (i) { + case AlertDialog.BUTTON_POSITIVE:// 点击同意按钮 + SetPrivacyAccept(true); + EnterUnityActivity(); // 启动Unity Activity + break; + case AlertDialog.BUTTON_NEGATIVE:// 点击拒绝按钮,直接退出App + finish(); + break; + } + } + + // 启动Unity Activity + private void EnterUnityActivity() { + Intent unityAct = new Intent(); + unityAct.setClassName(this, "com.unity3d.player.UnityPlayerActivity"); + this.startActivity(unityAct); + // 启动Unity Activity后,finish掉PrivacyActivity,避免退出时返回到这里 + this.finish(); + } + + // 本地存储保存同意隐私协议状态 + private void SetPrivacyAccept(boolean accepted) { + SharedPreferences.Editor prefs = this.getSharedPreferences("PlayerPrefs", MODE_PRIVATE).edit(); + prefs.putBoolean("PrivacyAcceptedKey", accepted); + prefs.apply(); + } + + // 获取是否已经同意过 + private boolean GetPrivacyAccept() { + SharedPreferences prefs = this.getSharedPreferences("PlayerPrefs", MODE_PRIVATE); + return prefs.getBoolean("PrivacyAcceptedKey", false); + } +} diff --git a/Assets/Plugins/Android/com.unity3d.player/PrivacyActivity.java.meta b/Assets/Plugins/Android/com.unity3d.player/PrivacyActivity.java.meta new file mode 100644 index 000000000..d0412be57 --- /dev/null +++ b/Assets/Plugins/Android/com.unity3d.player/PrivacyActivity.java.meta @@ -0,0 +1,32 @@ +fileFormatVersion: 2 +guid: a2ba60f5c0dfb104397ea08d4c2f6f46 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scenes/Instantiate.unity b/Assets/Scenes/Instantiate.unity index b4655ad88..1b855e7da 100644 --- a/Assets/Scenes/Instantiate.unity +++ b/Assets/Scenes/Instantiate.unity @@ -123,50 +123,6 @@ NavMeshSettings: debug: m_Flags: 0 m_NavMeshData: {fileID: 0} ---- !u!1 &382250819 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 382250820} - - component: {fileID: 382250821} - m_Layer: 0 - m_Name: LogKit - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &382250820 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 382250819} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 1.7888997, y: -0.41116002, z: -0.009318121} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &382250821 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 382250819} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 647335bd723dab94ea97b993d03af61e, type: 3} - m_Name: - m_EditorClassIdentifier: --- !u!1 &1008334127 GameObject: m_ObjectHideFlags: 0 @@ -221,4 +177,3 @@ SceneRoots: m_ObjectHideFlags: 0 m_Roots: - {fileID: 1008334128} - - {fileID: 382250820} diff --git a/Assets/Scripts/Framework/LogKit/LogKit.cs b/Assets/Scripts/Framework/LogKit/LogKit.cs index 7fc7f5166..4a38cc780 100644 --- a/Assets/Scripts/Framework/LogKit/LogKit.cs +++ b/Assets/Scripts/Framework/LogKit/LogKit.cs @@ -1,11 +1,10 @@ using System; -using System.IO; using UnityEngine; using AibisDream.Utility; namespace AibisDream.Kit { - internal class LogKit : MonoBehaviour + internal static class LogKit { /// /// 文件名称格式 @@ -23,30 +22,41 @@ namespace AibisDream.Kit /// private static string LogContent => Time + ": {0}\n{1}"; - private FileLogger _fileLogger; + private static FileLogger _fileLogger; + private static bool _isInitialized; private static string Time => DateTime.Now.ToString("[HH:mm:ss.fffd]"); - private void Awake() + [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)] + private static void Initialize() { #if !UNITY_EDITOR - DontDestroyOnLoad(gameObject); + if (_isInitialized) + return; + _fileLogger = new FileLogger(LogFileName, ConstRef.LogFilePath, SaveDays); LogMessage($"Ver.{Application.version}", "", LogType.Log); Application.logMessageReceivedThreaded += LogMessage; + Application.quitting += Shutdown; + _isInitialized = true; #endif } - private void LogMessage(string condition, string stackTrace, LogType type) + private static void LogMessage(string condition, string stackTrace, LogType type) { _fileLogger?.Write(string.Format(LogContent, condition, stackTrace)); } - private void OnDestroy() + private static void Shutdown() { + if (!_isInitialized) + return; + + Application.logMessageReceivedThreaded -= LogMessage; + Application.quitting -= Shutdown; _fileLogger?.OnDestroy(); _fileLogger = null; - Application.logMessageReceivedThreaded -= LogMessage; + _isInitialized = false; } } } \ No newline at end of file diff --git a/Assets/Scripts/Game Loop/SettingLoader.cs b/Assets/Scripts/Game Loop/SettingLoader.cs index 4730355e4..b7dd1ecde 100644 --- a/Assets/Scripts/Game Loop/SettingLoader.cs +++ b/Assets/Scripts/Game Loop/SettingLoader.cs @@ -5,6 +5,7 @@ using AibisDream.Kit; using AibisDream.UI; using UnityEngine; using System.IO; +using AibisDream.Utility; namespace AibisDream { @@ -13,12 +14,15 @@ namespace AibisDream /// public class SettingLoader { - private static readonly string SettingPath = Path.Combine(Application.streamingAssetsPath, "Config", "setting.json"); + private static readonly string SettingPath = Path.Combine(Application.persistentDataPath, "AllOurBrokenParts", "Config", "setting.json"); + private static readonly string SettingDefaultPath = Path.Combine(Application.streamingAssetsPath, "Config", "setting.json"); private readonly ConfigContainer _container; private SettingLoader() { + // 初始化设置文件(如果不存在) + InitSettingFile(); // 读取数据 _container = new ConfigContainer(SettingPath); LoadAllSetting(); @@ -31,6 +35,44 @@ namespace AibisDream _container.OnWrite -= OnSettingChanged; } + private void InitSettingFile() + { + // 如果文件存在,则直接返回 + if (File.Exists(SettingPath)) + { + return; + } + + // 如果文件不存在,则复制默认设置并根据系统语言设置初始语言值 + var defaultSetting = JsonUtil.ReadJObject(SettingDefaultPath); + + // 根据当前系统语言设置初始语言值 + string systemLanguage = GetLanguageBySystemLanguage(); + defaultSetting["Language"] = systemLanguage; + + // 保存设置文件 + JsonUtil.SaveJObject(defaultSetting, SettingPath); + } + + /// + /// 根据系统语言获取对应的语言代码 + /// + /// 语言代码:zh-Hans、en、ja-JP,默认返回 en + private string GetLanguageBySystemLanguage() + { + SystemLanguage systemLang = Application.systemLanguage; + + return systemLang switch + { + SystemLanguage.Chinese => "zh-Hans", + SystemLanguage.ChineseSimplified => "zh-Hans", + SystemLanguage.ChineseTraditional => "zh-Hans", + SystemLanguage.Japanese => "ja-JP", + SystemLanguage.English => "en", + _ => "en", + }; + } + private void LoadAllSetting() { var settingConfig = _container.ReadAll(); diff --git a/Assets/StreamingAssets/Config/setting.json b/Assets/StreamingAssets/Config/setting.json index de13c7911..b55efb261 100644 --- a/Assets/StreamingAssets/Config/setting.json +++ b/Assets/StreamingAssets/Config/setting.json @@ -1,4 +1,5 @@ { + "Version": "Ver.0.3", "Volume": "0.20", "Language": "zh-Hans", "WindowMode": "Windowed", diff --git a/ProjectSettings/EditorBuildSettings.asset b/ProjectSettings/EditorBuildSettings.asset index d12fc3cbc..0651decfd 100644 --- a/ProjectSettings/EditorBuildSettings.asset +++ b/ProjectSettings/EditorBuildSettings.asset @@ -6,8 +6,8 @@ EditorBuildSettings: serializedVersion: 2 m_Scenes: - enabled: 1 - path: Assets/Scenes/Instantiate.unity - guid: 314fe706818e1334abececa8eca15a16 + path: Assets/Scenes/Persistence.unity + guid: 8c9cfa26abfee488c85f1582747f6a02 m_configObjects: com.unity.addressableassets: {fileID: 11400000, guid: 9f2d4043ffd19614f9cf906f9dd868b8, type: 2} com.unity.localization.settings: {fileID: 11400000, guid: 0fb2bc2476953fc43a74f0ab8879077c, type: 2} diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index 7093c6e23..d0500fa9e 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -134,7 +134,7 @@ PlayerSettings: vulkanEnableLateAcquireNextImage: 0 vulkanEnableCommandBufferRecycling: 1 loadStoreDebugModeEnabled: 0 - bundleVersion: 0.3.3.16-20251218-203908 + bundleVersion: 0.3.3.25-20251219-181200 preloadedAssets: - {fileID: 11400000, guid: 0fb2bc2476953fc43a74f0ab8879077c, type: 2} metroInputSource: 0 @@ -246,7 +246,7 @@ PlayerSettings: clonedFromGUID: c19f32bac17ee4170b3bf8a6a0333fb9 templatePackageId: com.unity.template.universal-2d@2.1.2 templateDefaultScene: Assets/Scenes/SampleScene.unity - useCustomMainManifest: 0 + useCustomMainManifest: 1 useCustomLauncherManifest: 0 useCustomMainGradleTemplate: 0 useCustomLauncherGradleManifest: 0