From afa2e251dfacf7d5889d18e151bb96f4874e1acc Mon Sep 17 00:00:00 2001
From: Ding Yuntian <1491671119@qq.com>
Date: Fri, 19 Dec 2025 18:36:22 +0800
Subject: [PATCH] =?UTF-8?q?=E5=AE=89=E5=8D=93=E7=89=88=E9=97=AE=E9=A2=98?=
=?UTF-8?q?=E4=BF=AE=E5=A4=8D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Assets/AddressableAssetsData/link.xml | 533 ++++++++++++++++++
Assets/AddressableAssetsData/link.xml.meta | 7 +
Assets/Plugins/Android.meta | 8 +
Assets/Plugins/Android/AndroidManifest.xml | 18 +
.../Plugins/Android/AndroidManifest.xml.meta | 7 +
.../Plugins/Android/com.unity3d.player.meta | 8 +
.../com.unity3d.player/PrivacyActivity.java | 92 +++
.../PrivacyActivity.java.meta | 32 ++
Assets/Scenes/Instantiate.unity | 45 --
Assets/Scripts/Framework/LogKit/LogKit.cs | 26 +-
Assets/Scripts/Game Loop/SettingLoader.cs | 44 +-
Assets/StreamingAssets/Config/setting.json | 1 +
ProjectSettings/EditorBuildSettings.asset | 4 +-
ProjectSettings/ProjectSettings.asset | 4 +-
14 files changed, 771 insertions(+), 58 deletions(-)
create mode 100644 Assets/AddressableAssetsData/link.xml
create mode 100644 Assets/AddressableAssetsData/link.xml.meta
create mode 100644 Assets/Plugins/Android.meta
create mode 100644 Assets/Plugins/Android/AndroidManifest.xml
create mode 100644 Assets/Plugins/Android/AndroidManifest.xml.meta
create mode 100644 Assets/Plugins/Android/com.unity3d.player.meta
create mode 100644 Assets/Plugins/Android/com.unity3d.player/PrivacyActivity.java
create mode 100644 Assets/Plugins/Android/com.unity3d.player/PrivacyActivity.java.meta
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