feat: 更新音效系统与Android混淆配置

1.  新增Sonic等6种音效类型替换原有音效枚举
2.  移除音效多语言配置直接使用枚举名显示
3.  修复工厂重置与页面返回的加载弹窗逻辑
4.  优化蓝牙连接时的UI数据覆盖问题
5.  启用自定义Proguard规则保护蓝牙与文件选择插件
This commit is contained in:
“虞渠成” 2026-07-03 16:09:54 +08:00
parent 85df7e39dc
commit f52b2a6b29
9 changed files with 266 additions and 119 deletions

View File

@ -0,0 +1,5 @@
# 保留 Unity Bluetooth LE 插件类(通过 AndroidJavaClass 反射调用R8 无法检测到使用)
-keep class com.shatalmic.unityandroidbluetoothlelib.** { *; }
# 保留 FilePicker 插件类(通过 AndroidJavaClass 反射调用R8 无法检测到使用)
-keep class com.unity.filepicker.** { *; }

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: d5f703e295166774fafe7ad65dd67c9d
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -11,7 +11,6 @@ GameObject:
- component: {fileID: 4786212675994554498}
- component: {fileID: 8318397439137567051}
- component: {fileID: 5676474280039337618}
- component: {fileID: 4248423808421178093}
m_Layer: 5
m_Name: Text (Legacy)
m_TagString: Untagged
@ -79,20 +78,7 @@ MonoBehaviour:
m_HorizontalOverflow: 0
m_VerticalOverflow: 0
m_LineSpacing: 1
m_Text: Hello
--- !u!114 &4248423808421178093
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4192673911870018}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 89f1d49b50a31514787b4e268b1c73bb, type: 3}
m_Name:
m_EditorClassIdentifier:
textKey: 100183
m_Text: Arc
--- !u!1 &306765244734699581
GameObject:
m_ObjectHideFlags: 0
@ -197,7 +183,6 @@ GameObject:
- component: {fileID: 6429828516758610706}
- component: {fileID: 7660135154929714612}
- component: {fileID: 1918055120032442058}
- component: {fileID: 3554390466595939383}
m_Layer: 5
m_Name: Text (Legacy)
m_TagString: Untagged
@ -265,20 +250,7 @@ MonoBehaviour:
m_HorizontalOverflow: 0
m_VerticalOverflow: 0
m_LineSpacing: 1
m_Text: Goodbye
--- !u!114 &3554390466595939383
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 457407246350743563}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 89f1d49b50a31514787b4e268b1c73bb, type: 3}
m_Name:
m_EditorClassIdentifier:
textKey: 100184
m_Text: Hardlight
--- !u!1 &629627766403464918
GameObject:
m_ObjectHideFlags: 0
@ -411,7 +383,6 @@ GameObject:
- component: {fileID: 8573800598189694494}
- component: {fileID: 4432461300801424837}
- component: {fileID: 3897388656227690151}
- component: {fileID: 4689027556535122234}
m_Layer: 5
m_Name: Text (Legacy)
m_TagString: Untagged
@ -479,20 +450,7 @@ MonoBehaviour:
m_HorizontalOverflow: 0
m_VerticalOverflow: 0
m_LineSpacing: 1
m_Text: Hello
--- !u!114 &4689027556535122234
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 669998971470161161}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 89f1d49b50a31514787b4e268b1c73bb, type: 3}
m_Name:
m_EditorClassIdentifier:
textKey: 100185
m_Text: Ion
--- !u!1 &777788460132094667
GameObject:
m_ObjectHideFlags: 0
@ -1961,6 +1919,127 @@ MonoBehaviour:
m_OnClick:
m_PersistentCalls:
m_Calls: []
--- !u!1 &2834650518746682641
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3969476368030556583}
- component: {fileID: 3358997220216945587}
- component: {fileID: 6111907762562912606}
- component: {fileID: 985684051599768521}
m_Layer: 5
m_Name: 5
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &3969476368030556583
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2834650518746682641}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 4957582966547559762}
m_Father: {fileID: 2081490233171610012}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: -560}
m_SizeDelta: {x: -60, y: 80}
m_Pivot: {x: 0.5, y: 1}
--- !u!222 &3358997220216945587
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2834650518746682641}
m_CullTransparentMesh: 1
--- !u!114 &6111907762562912606
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2834650518746682641}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 0}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 21300000, guid: 13e0eb0cb15f1924d90153431b39bc2a, type: 3}
m_Type: 0
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!114 &985684051599768521
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2834650518746682641}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Navigation:
m_Mode: 3
m_WrapAround: 0
m_SelectOnUp: {fileID: 0}
m_SelectOnDown: {fileID: 0}
m_SelectOnLeft: {fileID: 0}
m_SelectOnRight: {fileID: 0}
m_Transition: 1
m_Colors:
m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
m_ColorMultiplier: 1
m_FadeDuration: 0.1
m_SpriteState:
m_HighlightedSprite: {fileID: 0}
m_PressedSprite: {fileID: 0}
m_SelectedSprite: {fileID: 0}
m_DisabledSprite: {fileID: 0}
m_AnimationTriggers:
m_NormalTrigger: Normal
m_HighlightedTrigger: Highlighted
m_PressedTrigger: Pressed
m_SelectedTrigger: Selected
m_DisabledTrigger: Disabled
m_Interactable: 1
m_TargetGraphic: {fileID: 6111907762562912606}
m_OnClick:
m_PersistentCalls:
m_Calls: []
--- !u!1 &3080589279257668571
GameObject:
m_ObjectHideFlags: 0
@ -2490,7 +2569,6 @@ GameObject:
- component: {fileID: 182923072947694601}
- component: {fileID: 8629691201413271309}
- component: {fileID: 4158084090901835048}
- component: {fileID: 2438917980612067562}
m_Layer: 5
m_Name: Text (Legacy)
m_TagString: Untagged
@ -2558,20 +2636,7 @@ MonoBehaviour:
m_HorizontalOverflow: 0
m_VerticalOverflow: 0
m_LineSpacing: 1
m_Text: Hello
--- !u!114 &2438917980612067562
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3441044964715230807}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 89f1d49b50a31514787b4e268b1c73bb, type: 3}
m_Name:
m_EditorClassIdentifier:
textKey: 100187
m_Text: Quantum
--- !u!1 &3443392837279164566
GameObject:
m_ObjectHideFlags: 0
@ -3031,6 +3096,7 @@ MonoBehaviour:
- {fileID: 618963599968714376}
- {fileID: 4417822950724485663}
- {fileID: 7103060359534593317}
- {fileID: 985684051599768521}
confirmBtn: {fileID: 3720356942245563436}
cancelBtn: {fileID: 6862151831119729504}
--- !u!1 &4126862431282601540
@ -5541,6 +5607,7 @@ RectTransform:
- {fileID: 8559410118621773077}
- {fileID: 1851864943904775615}
- {fileID: 526391051047360187}
- {fileID: 3969476368030556583}
- {fileID: 4778062111862750175}
- {fileID: 858675025676737603}
m_Father: {fileID: 7174140159888755812}
@ -5548,7 +5615,7 @@ RectTransform:
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 12, y: 785}
m_SizeDelta: {x: 12, y: 875}
m_Pivot: {x: 0.5, y: 0}
--- !u!222 &6811716250680681758
CanvasRenderer:
@ -5939,6 +6006,85 @@ MonoBehaviour:
m_VerticalOverflow: 0
m_LineSpacing: 1
m_Text: 0
--- !u!1 &8505393087765356365
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4957582966547559762}
- component: {fileID: 3342040580630088133}
- component: {fileID: 2589844457269652038}
m_Layer: 5
m_Name: Text (Legacy)
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &4957582966547559762
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8505393087765356365}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 3969476368030556583}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &3342040580630088133
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8505393087765356365}
m_CullTransparentMesh: 1
--- !u!114 &2589844457269652038
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8505393087765356365}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_FontData:
m_Font: {fileID: 12800000, guid: f4c31d68e7cd3454685bb4c132a52f58, type: 3}
m_FontSize: 30
m_FontStyle: 0
m_BestFit: 0
m_MinSize: 3
m_MaxSize: 40
m_Alignment: 4
m_AlignByGeometry: 0
m_RichText: 1
m_HorizontalOverflow: 0
m_VerticalOverflow: 0
m_LineSpacing: 1
m_Text: Sonic
--- !u!1 &8572327038564860220
GameObject:
m_ObjectHideFlags: 0
@ -5950,7 +6096,6 @@ GameObject:
- component: {fileID: 5169587443665871409}
- component: {fileID: 2382350194557616285}
- component: {fileID: 160637896610745996}
- component: {fileID: 276033722142287802}
m_Layer: 5
m_Name: Text (Legacy)
m_TagString: Untagged
@ -6018,20 +6163,7 @@ MonoBehaviour:
m_HorizontalOverflow: 0
m_VerticalOverflow: 0
m_LineSpacing: 1
m_Text: Hello
--- !u!114 &276033722142287802
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8572327038564860220}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 89f1d49b50a31514787b4e268b1c73bb, type: 3}
m_Name:
m_EditorClassIdentifier:
textKey: 100186
m_Text: Plasma
--- !u!1 &8589595913971389064
GameObject:
m_ObjectHideFlags: 0

View File

@ -1163,11 +1163,12 @@ namespace Kill.Bluetooth.Protocol
/// </summary>
public enum SoundEffectType : byte
{
Hello = 0x00, // Hello音效
Goodbye = 0x01, // Goodbye音效
Test = 0x02, // Test音效
BIU = 0x03, // BIU音效
Main = 0x04 // Main音效
Arc = 0x00, // Arc音效
Hardlight = 0x01, // Hardlight音效
Ion = 0x02, // Ion音效
Plasma = 0x03, // Plasma音效
Quantum = 0x04, // Quantum音效
Sonic = 0x05, // Sonic音效
}
/// <summary>
@ -1230,11 +1231,12 @@ namespace Kill.Bluetooth.Protocol
{
return SoundType switch
{
SoundEffectType.Hello => "Hello",
SoundEffectType.Goodbye => "Goodbye",
SoundEffectType.Test => "Test",
SoundEffectType.BIU => "BIU",
SoundEffectType.Main => "Main",
SoundEffectType.Arc => "Arc",
SoundEffectType.Hardlight => "Hardlight",
SoundEffectType.Ion => "Ion",
SoundEffectType.Plasma => "Plasma",
SoundEffectType.Quantum => "Quantum",
SoundEffectType.Sonic => "Sonic",
_ => "未知"
};
}

View File

@ -2517,12 +2517,13 @@ namespace Kill.UI.Pages
string typeValue = trimmed.Substring(typeIndex + 3, endIndex - typeIndex - 3).Trim();
control.SoundType = typeValue switch
{
"Hello" or "0" => SoundEffectType.Hello,
"Goodbye" or "1" => SoundEffectType.Goodbye,
"Test" or "2" => SoundEffectType.Test,
"BIU" or "3" => SoundEffectType.BIU,
"Main" or "4" => SoundEffectType.Main,
_ => SoundEffectType.Main
"Arc" or "0" => SoundEffectType.Arc,
"Hardlight" or "1" => SoundEffectType.Hardlight,
"Ion" or "2" => SoundEffectType.Ion,
"Plasma" or "3" => SoundEffectType.Plasma,
"Quantum" or "4" => SoundEffectType.Quantum,
"Sonic" or "5" => SoundEffectType.Sonic,
_ => SoundEffectType.Arc
};
}

View File

@ -431,8 +431,8 @@ namespace Kill.UI.Pages
bool success = await HomePageCtrl.Instance.SendBleCommandByWifiAsync(BLEConstants.CMD_FACTORY_RESET, new byte[] { 0x01 });
if (success)
{
LoadingUI.Hide();
ResetDeviceAsync();
LoadingUI.Hide();
}
else
{
@ -452,6 +452,7 @@ namespace Kill.UI.Pages
BluetoothManager.Instance.ChangeAimMac("");
BluetoothManager.Instance.Disconnect();
ResetDeviceAsync();
LoadingUI.Hide();
}
else
{
@ -544,8 +545,9 @@ namespace Kill.UI.Pages
}
public IEnumerator BackToHomePage()
{
LoadingUI.Show();
yield return new WaitForSeconds(2);
LoadingUI.Hide();
LoadingUI.ForceHide();
UIManager.Instance.OpenMainPage(UIManager.PageName.homePage);
}

View File

@ -27,17 +27,14 @@ namespace Kill.UI.Pages
private List<string> videoLengthKeyList = new List<string> { "100180", "100181", "100182" };
private List<string> videoLengthStrList = new List<string>();
private List<byte> videoLengthValueList = new List<byte> { 0x03, 0x05, 0x0A };
// 音效类型选项
private List<string> soundEffectKeyList = new List<string> { "100183", "100184", "100185", "100186", "100187" };
private List<string> soundEffectStrList = new List<string>();
private List<SoundEffectType> soundEffectValueList = new List<SoundEffectType>
{
SoundEffectType.Hello,
SoundEffectType.Goodbye,
SoundEffectType.Test,
SoundEffectType.BIU,
SoundEffectType.Main
SoundEffectType.Arc,
SoundEffectType.Hardlight,
SoundEffectType.Ion,
SoundEffectType.Plasma,
SoundEffectType.Quantum,
SoundEffectType.Sonic
};
private MultimediaControl multimediaSetting;
@ -63,12 +60,6 @@ namespace Kill.UI.Pages
{
videoLengthStrList.Add(LanguageManager.Instance.GetLanguage(key));
}
soundEffectStrList.Clear();
foreach (var key in soundEffectKeyList)
{
soundEffectStrList.Add(LanguageManager.Instance.GetLanguage(key));
}
}
/// <summary>
@ -143,7 +134,7 @@ namespace Kill.UI.Pages
VideoRecordEnable = config?.video_record_enable ?? false,
RecordDuration = config?.record_duration ?? 0x05,
SoundEnable = config?.sound_enable ?? true,
SoundType = DeviceConfig.ParseServerEnum(config?.sound_type, SoundEffectType.Hello),
SoundType = DeviceConfig.ParseServerEnum(config?.sound_type, SoundEffectType.Arc),
Volume = config?.volume ?? 10
};
UpdateUI();
@ -178,11 +169,9 @@ namespace Kill.UI.Pages
}
// 更新音效类型显示
int soundEffectIndex = GetSoundEffectIndexFromValue(multimediaSetting.SoundType);
if (soundEffectValueText != null && soundEffectIndex >= 0 && soundEffectIndex < soundEffectStrList.Count)
{
soundEffectValueText.text = soundEffectStrList[soundEffectIndex];
}
soundEffectValueText.text = multimediaSetting.SoundType.ToString();
// 更新音量滑块
volumeSlider.value = multimediaSetting.Volume;

View File

@ -800,6 +800,9 @@ namespace Kill.UI.Pages
normalPage.SetActive(false);
selectedDevice = null;
selectDeviceButton.gameObject.SetActive(false);
DataManager.Instance.OwnedDevices=new List<Managers.DeviceInfo>();
DataManager.Instance.SharedDevices=new List<Managers.DeviceInfo>();
DataManager.Instance.selectedDevice=null;
return;
}
else
@ -876,9 +879,13 @@ namespace Kill.UI.Pages
deviceCtrl?.InitDeviceControl(false);
await DataManager.Instance.GetDeviceConfig(selectedDevice.ble_mac);
await DataManager.Instance.GetScheduleTasks(selectedDevice.ble_mac);
scheduleSettingButton.interactable = true;
moreSettingButton.interactable = true;
InitDeviceUIFromConfig();
// await 期间蓝牙可能已连接,避免用 WiFi 数据覆盖 BLE 数据
if (!hasBluetooth)
{
scheduleSettingButton.interactable = true;
moreSettingButton.interactable = true;
InitDeviceUIFromConfig();
}
}
else
{
@ -1618,6 +1625,8 @@ namespace Kill.UI.Pages
if (stopPolling) break;
ScheduleUIUpdate(() =>
{
// await 期间蓝牙可能已连接,避免用 WiFi 数据覆盖 BLE 数据
if (hasBluetooth) return;
scheduleSettingButton.interactable = true;
moreSettingButton.interactable = true;
deviceState?.UpdateDeviceState(hasBluetooth, hasWifi);

View File

@ -271,7 +271,7 @@ PlayerSettings:
useCustomBaseGradleTemplate: 0
useCustomGradlePropertiesTemplate: 1
useCustomGradleSettingsTemplate: 1
useCustomProguardFile: 0
useCustomProguardFile: 1
AndroidTargetArchitectures: 2
AndroidTargetDevices: 1
AndroidSplashScreenScale: 0