17600099689 1 жил өмнө
parent
commit
bbef0fbdb5

+ 19 - 36
Assets/BowArrow/Scenes/Entry.unity

@@ -38,7 +38,6 @@ RenderSettings:
   m_ReflectionIntensity: 1
   m_CustomReflection: {fileID: 0}
   m_Sun: {fileID: 0}
-  m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1}
   m_UseRadianceAmbientProbe: 0
 --- !u!157 &3
 LightmapSettings:
@@ -104,7 +103,7 @@ NavMeshSettings:
   serializedVersion: 2
   m_ObjectHideFlags: 0
   m_BuildSettings:
-    serializedVersion: 3
+    serializedVersion: 2
     agentTypeID: 0
     agentRadius: 0.5
     agentHeight: 2
@@ -117,7 +116,7 @@ NavMeshSettings:
     cellSize: 0.16666667
     manualTileSize: 0
     tileSize: 256
-    buildHeightMesh: 0
+    accuratePlacement: 0
     maxJobWorkers: 0
     preserveTilesOutsideBounds: 0
     debug:
@@ -154,6 +153,7 @@ RectTransform:
   m_ConstrainProportionsScale: 0
   m_Children: []
   m_Father: {fileID: 2060474346}
+  m_RootOrder: 0
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0.5, y: 0.5}
   m_AnchorMax: {x: 0.5, y: 0.5}
@@ -223,13 +223,13 @@ Transform:
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 29910636}
-  serializedVersion: 2
   m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
   m_LocalPosition: {x: -0.057893097, y: 1.1184957, z: -0.16152763}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children: []
   m_Father: {fileID: 0}
+  m_RootOrder: 2
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
 --- !u!81 &29910638
 AudioListener:
@@ -253,17 +253,9 @@ Camera:
   m_projectionMatrixMode: 1
   m_GateFitMode: 2
   m_FOVAxisMode: 0
-  m_Iso: 200
-  m_ShutterSpeed: 0.005
-  m_Aperture: 16
-  m_FocusDistance: 10
-  m_FocalLength: 50
-  m_BladeCount: 5
-  m_Curvature: {x: 2, y: 11}
-  m_BarrelClipping: 0.25
-  m_Anamorphism: 0
   m_SensorSize: {x: 36, y: 24}
   m_LensShift: {x: 0, y: 0}
+  m_FocalLength: 50
   m_NormalizedViewPortRect:
     serializedVersion: 2
     x: 0
@@ -394,13 +386,13 @@ Transform:
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 215518762}
-  serializedVersion: 2
   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: 0}
+  m_RootOrder: 7
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
 --- !u!1 &374260570
 GameObject:
@@ -462,13 +454,13 @@ Transform:
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 374260570}
-  serializedVersion: 2
   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: 0}
+  m_RootOrder: 8
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
 --- !u!1 &529306299
 GameObject:
@@ -495,13 +487,13 @@ Transform:
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 529306299}
-  serializedVersion: 2
   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: 0}
+  m_RootOrder: 6
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
 --- !u!114 &529306302
 MonoBehaviour:
@@ -578,6 +570,7 @@ MonoBehaviour:
   m_Script: {fileID: 11500000, guid: efc3104cde73afd438d8e713622b33a1, type: 3}
   m_Name: 
   m_EditorClassIdentifier: 
+  testMode: 1
 --- !u!1 &730210588
 GameObject:
   m_ObjectHideFlags: 0
@@ -610,6 +603,7 @@ RectTransform:
   m_ConstrainProportionsScale: 0
   m_Children: []
   m_Father: {fileID: 1652728298}
+  m_RootOrder: 1
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0.5, y: 0.5}
   m_AnchorMax: {x: 0.5, y: 0.5}
@@ -751,7 +745,6 @@ Canvas:
   m_SortingBucketNormalizedSize: 0
   m_VertexColorAlwaysGammaSpace: 0
   m_AdditionalShaderChannelsFlag: 25
-  m_UpdateRectTransformForStandalone: 0
   m_SortingLayerID: 0
   m_SortingOrder: 1
   m_TargetDisplay: 0
@@ -769,6 +762,7 @@ RectTransform:
   m_Children:
   - {fileID: 1693457930}
   m_Father: {fileID: 0}
+  m_RootOrder: 4
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0, y: 0}
   m_AnchorMax: {x: 0, y: 0}
@@ -800,13 +794,13 @@ Transform:
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 1066112267}
-  serializedVersion: 2
   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: 0}
+  m_RootOrder: 5
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
 --- !u!114 &1066112269
 MonoBehaviour:
@@ -923,13 +917,13 @@ Transform:
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 1069332778}
-  serializedVersion: 2
   m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
   m_LocalPosition: {x: 1937.027, y: 167.17522, z: 6.3610854}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children: []
   m_Father: {fileID: 0}
+  m_RootOrder: 1
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
 --- !u!1 &1422346461
 GameObject:
@@ -955,13 +949,13 @@ Transform:
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 1422346461}
-  serializedVersion: 2
   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: 0}
+  m_RootOrder: 9
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
 --- !u!114 &1422346463
 MonoBehaviour:
@@ -1054,7 +1048,6 @@ Canvas:
   m_SortingBucketNormalizedSize: 0
   m_VertexColorAlwaysGammaSpace: 0
   m_AdditionalShaderChannelsFlag: 0
-  m_UpdateRectTransformForStandalone: 0
   m_SortingLayerID: 0
   m_SortingOrder: 0
   m_TargetDisplay: 0
@@ -1073,6 +1066,7 @@ RectTransform:
   - {fileID: 2060474346}
   - {fileID: 730210589}
   m_Father: {fileID: 0}
+  m_RootOrder: 3
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0, y: 0}
   m_AnchorMax: {x: 0, y: 0}
@@ -1110,6 +1104,7 @@ RectTransform:
   m_ConstrainProportionsScale: 0
   m_Children: []
   m_Father: {fileID: 968268859}
+  m_RootOrder: 0
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0.5, y: 0.5}
   m_AnchorMax: {x: 0.5, y: 0.5}
@@ -1178,13 +1173,13 @@ Transform:
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 1842207388}
-  serializedVersion: 2
   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: 0}
+  m_RootOrder: 0
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
 --- !u!114 &1842207390
 MonoBehaviour:
@@ -1231,6 +1226,7 @@ RectTransform:
   - {fileID: 2284110}
   - {fileID: 2146457995}
   m_Father: {fileID: 1652728298}
+  m_RootOrder: 0
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0.5, y: 0.5}
   m_AnchorMax: {x: 0.5, y: 0.5}
@@ -1306,6 +1302,7 @@ RectTransform:
   m_ConstrainProportionsScale: 0
   m_Children: []
   m_Father: {fileID: 2060474346}
+  m_RootOrder: 1
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0.5, y: 0.5}
   m_AnchorMax: {x: 0.5, y: 0.5}
@@ -1350,17 +1347,3 @@ CanvasRenderer:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 2146457994}
   m_CullTransparentMesh: 0
---- !u!1660057539 &9223372036854775807
-SceneRoots:
-  m_ObjectHideFlags: 0
-  m_Roots:
-  - {fileID: 1842207389}
-  - {fileID: 1422346462}
-  - {fileID: 29910637}
-  - {fileID: 1652728298}
-  - {fileID: 968268859}
-  - {fileID: 1069332780}
-  - {fileID: 374260573}
-  - {fileID: 1066112268}
-  - {fileID: 529306300}
-  - {fileID: 215518766}

+ 41 - 8
Assets/BowArrow/Scripts/ArrowSerialPort.cs

@@ -8,11 +8,11 @@ public class ArrowSerialPort : MonoBehaviour
     private SerialPortUtilityPro.OpenSystem openMode = SerialPortUtilityPro.OpenSystem.PCI;
     private int baudrate = 115200;
     private string PortName = "/dev/ttyS1";
-    private static bool _isInit = false;
+    private static Dictionary<string, int> _isInit = new();
     public bool testMode = false;
     private void Awake()
     {
-        if (!_isInit)
+        if (!_isInit.TryGetValue(gameObject.name, out int instanceID) && instanceID == 0)
         {
             DontDestroyOnLoad(gameObject);
             Init();
@@ -26,7 +26,7 @@ public class ArrowSerialPort : MonoBehaviour
     
     private void Init()
     {
-        _isInit = true;
+        _isInit[gameObject.name] = GetInstanceID();
         serialPortUtility = gameObject.GetComponent<SerialPortUtilityPro>();
         serialPortUtility.OpenMethod = openMode;
         serialPortUtility.DeviceName = PortName;
@@ -43,11 +43,15 @@ public class ArrowSerialPort : MonoBehaviour
         }
 #endif
     }
-    
+
     private void OnDestroy()
     {
-        LOG($"{PortName} 串口关闭");
-        serialPortUtility.Close();
+        if (_isInit.TryGetValue(gameObject.name, out var instanceID) && instanceID == GetInstanceID())
+        {
+            LOG($"{PortName} 串口关闭");
+            serialPortUtility.Close();
+            _isInit.Remove(gameObject.name);
+        }
     }
     
     /// <summary>
@@ -70,7 +74,7 @@ public class ArrowSerialPort : MonoBehaviour
     /// <param name="bytes"></param>
     private void PhraseData(byte[] bytes)
     {
-        Debug.Log($"{PortName} 收到串口信息!");
+        LOG($"{PortName} 收到串口信息!");
         if (bytes[0] == 0xAA)
         {
             var cmdID = bytes[1];
@@ -115,6 +119,19 @@ public class ArrowSerialPort : MonoBehaviour
     private void OnDeviceInfoBack(byte[] bytes)
     {
         Debug.Log($"{PortName} 收到设备信息响应!");
+        var check = bytes[1] + bytes[2] + bytes[3] + bytes[4];//校验:命令+长度+数据内容
+        if(check != bytes[5])
+        {
+            LOG("OnDeviceInfoBack 数据校验错误!");
+        }
+        //0x01 HOUYI Pro
+        //0x02 ARTEMIS Pro
+        //0x03 Pistol 1
+        var deviceType = bytes[3];//设备类型
+        //0x01 移动手机
+        //0x02 PC电脑
+        //0x03 VR设备
+        var systemType = bytes[4];//系统类型
     }
     
     /// <summary>
@@ -123,6 +140,16 @@ public class ArrowSerialPort : MonoBehaviour
     private void OnDeviceShoot(byte[] bytes)
     {
         Debug.Log($"{PortName} 收到设备射击消息!");
+
+        var check = bytes[1] + bytes[2] + bytes[3] + bytes[4];//校验:命令+长度+数据内容
+        if (check != bytes[5])
+        {
+            LOG("OnDeviceShoot 数据校验错误!");
+        }
+
+        var time1 = bytes[3];
+        var time2 = bytes[4];
+
     }
 
     /// <summary>
@@ -132,7 +159,13 @@ public class ArrowSerialPort : MonoBehaviour
     private void OnDeviceButton(byte[] bytes)
     {
         Debug.Log($"{PortName} 收到设备按键消息!");
-        var buttonType = bytes[3];//按键类型
+        var check = bytes[1] + bytes[2] + bytes[3];//校验:命令+长度+数据内容
+        if (check != bytes[4])
+        {
+            LOG("OnDeviceButton 数据校验错误!");
+        }
+
+        var clickType = bytes[3];//按键类型
         // 0x01 开机键 - 短按
         // 0x02 开机键 - 长按(1.5 秒)
         // 0x03 开机键 - 双击

+ 5 - 0
Assets/BowArrow/Scripts/Manager/LoginMgr/LoginMgr.cs

@@ -199,6 +199,11 @@ public class UserSettings
     //b端 每一局的设置
     public int PerRoundCoin = 2; //投币
     public int PerRoundSeconds = 1200;//时间
+    public int TotalCoinsNum = 0;//总投币数
+    public int ChangeTicket = 0;//多少分兑换一张票
+    public int TotalTicketNum = 0;//总出票数量
+    public int NeedCoin = 1;//是否需要投币
+    public int GiveTicket = 0;//是否出票
 
     //设备校准引导-是否已经完成
     public bool deviceCalibrateGuideFinish = false;

+ 236 - 17
Assets/BowArrow/Scripts/SerialPortExample.cs

@@ -3,8 +3,56 @@ using System;
 using System.Collections;
 using System.Collections.Generic;
 using System.IO;
+using Unity.VisualScripting;
 using UnityEngine;
 
+public class SerialPortHelper:MonoBehaviour
+{
+    public static SerialPortExample[] SerialPortExampleGroup;
+    private static ArrowSerialPort arrowPort;
+
+    private static SerialPortHelper _ins;
+
+    public static SerialPortHelper ins
+    {
+        get
+        {
+            if (_ins == null)
+            {
+                var go = new GameObject("SerialPortHelper");
+                _ins = go.AddComponent<SerialPortHelper>();
+                DontDestroyOnLoad(go);
+                SerialPortExampleGroup = FindObjectsOfType<SerialPortExample>();
+            }
+            return _ins;
+        }
+    }
+
+    /// <summary>
+    /// 获取串口实例(0串口和8串口)
+    /// </summary>
+    public SerialPortExample GetPort(int port)
+    {
+        if (port == 0 || port == 8)
+        {
+            foreach (var item in SerialPortExampleGroup)
+            {
+                if (item.name.Contains("com0"))
+                    return item;
+            }
+        }
+        return null;
+    }
+
+    /// <summary>
+    /// 获取串口实例(1串口)
+    /// </summary>
+    public ArrowSerialPort GetPort()
+    {
+        return arrowPort;
+    }
+}
+
 public class SerialPortExample : MonoBehaviour
 {
     public int baudrate = 115200;
@@ -26,20 +74,25 @@ public class SerialPortExample : MonoBehaviour
     bool urlBack = false;
     byte dataIndex = 1;
 
-    private static bool _isInit = false;
+    private static Dictionary<string, int> _isInit = new();
     
     private void Awake()
     {
-        if (!_isInit)
+        if (!_isInit.TryGetValue(gameObject.name, out int instanceID) && instanceID == 0)
         {
             DontDestroyOnLoad(gameObject);
             Init();
         }
     }
-    
+
+    private void LOG(string msg)
+    {
+        Debug.Log($"<color=#00FF00>{msg}</color>");
+    }
+
     private void Init()
     {
-        _isInit = true;
+        _isInit[gameObject.name] = GetInstanceID();
         serialPortUtility = gameObject.GetComponent<SerialPortUtilityPro>();
         serialPortUtility.OpenMethod = openMode;
         serialPortUtility.DeviceName = PortName;
@@ -51,7 +104,12 @@ public class SerialPortExample : MonoBehaviour
         //serialPortUtility.Write(datas);
 
         if (PortName.Contains("/dev/ttyS0"))
+        {
+            //拉取二维码
             RequestUrl(dataIndex);
+            //拉取后台数据
+            ReqSettingData();
+        }
     }
 
     void Update()
@@ -149,6 +207,142 @@ public class SerialPortExample : MonoBehaviour
             StandaloneAPI.InsertCoint(bytes[6]);
     }
 
+    /// <summary>
+    /// 请求后台数据
+    /// </summary>
+    public void ReqSettingData()
+    {
+        //数据包开始------->(1个字节)->AA
+        //命令------------->(1个字节)->08(取值范围->00到FF)
+        //数据长度--------->(1个字节)->05(取值范围->00到FF)
+        //校验------------->(1个字节)->0D(取值范围->00到FF)(校验 = 命令 ^ 数据长度)
+        //数据包结束------->(1个字节)->55
+        //例如:AA 08 05 0D 55
+        List<byte> request = new List<byte>();
+        request.Add(0xAA);
+        request.Add(0x08);//命令
+        request.Add(0x05);//数据长度
+        byte temp = (byte)(request[1] ^ request[2]);
+        request.Add(temp);//校验 (校验 = 命令 ^ 数据长度)
+        request.Add(0x55);//结束
+        serialPortUtility.Write(request.ToArray());
+        LOG($"请求后台数据!");
+    }
+
+    /// <summary>
+    /// 后台数据消息回复
+    /// </summary>
+    /// <param name="bytes"></param>
+    private void OnSettingDataBack(byte[] bytes) //AA 08 14 03 00 64 00 64 00 00 00 01 00 00 00 01 01 01 1F 55
+    {
+        //数据包开始-------------------------- > (1个字节)->AA
+        //命令--------------------------------->(1个字节)->08(取值范围->00到FF)
+        //数据长度---------------------------- > (1个字节)->14(取值范围->00到FF)
+
+        //多少币玩一局游戏(1 - 10)------------ > (1个字节)->03(取值范围->00到FF)
+        var coinPreGame = bytes[3];
+        UserSettings.ins.PerRoundCoin = coinPreGame;
+        //一局游戏玩多长时间(1 - 1200)------->(2个字节)->00 64(取值范围->00 00到FF FF)
+        var time1 = bytes[4];
+        var time2 = bytes[5];
+        int time = (time1 << 8) | time2;
+        UserSettings.ins.PerRoundSeconds = time;
+        //多少分兑换一张彩票(1 - 10000)------ > (2个字节)->00 64(取值范围->00 00到FF FF)
+        var changeTicket1 = bytes[6];
+        var changeTicket2 = bytes[7];
+        int changeTicket = (changeTicket1 << 8) | changeTicket2;
+        UserSettings.ins.ChangeTicket = changeTicket;
+        //累计投币数(0 - 4294967295)-------- > (4个字节)->00 00 00 01(取值范围->00 00 00 00到FF FF FF FF)
+        var totalCoinNum1 = bytes[8];
+        var totalCoinNum2 = bytes[9];
+        var totalCoinNum3 = bytes[10];
+        var totalCoinNum4 = bytes[11];
+        UserSettings.ins.TotalCoinsNum = (totalCoinNum1 << 24) | (totalCoinNum2 << 16) | (totalCoinNum3 << 8) | totalCoinNum4;
+        //累计出彩票数(0 - 4294967295)------ > (4个字节)->00 00 00 01(取值范围->00 00 00 00到FF FF FF FF)
+        var totalTicketNum1 = bytes[12];
+        var totalTicketNum2 = bytes[13];
+        var totalTicketNum3 = bytes[14];
+        var totalTicketNum4 = bytes[15];
+        UserSettings.ins.TotalTicketNum = (totalTicketNum1 << 24) | (totalTicketNum2 << 16) | (totalTicketNum3 << 8) | totalTicketNum4;
+        //是否需要投币(0 - 1)----------------->(1个字节)->01(取值范围->00到FF)
+        UserSettings.ins.NeedCoin = bytes[16];
+        //是否出彩票(0 - 1)------------------->(1个字节)->01(取值范围->00到FF)
+        UserSettings.ins.GiveTicket = bytes[17];
+        //校验-------------------------------- > (1个字节)->1F(取值范围->00到FF)(校验 = 命令 ^ 数据长度 ^ ......^是否出彩票)
+        byte temp = 0;
+        for (int i = 1; i < bytes.Length - 2; i++)
+        {
+            temp ^= bytes[i];
+        }
+        //数据包结束------------------------->(1个字节)->55
+        LOG($"收到后台数据--->coinPreGame:{coinPreGame}   time={time}   校验结果={bytes[18] == temp}  temp={temp} bytes[18]={bytes[18]} !");
+    }
+
+    /// <summary>
+    /// 请求保存后台数据
+    /// </summary>
+    public void ReqSavingSettingData() //AA 07 14 03 00 64 00 65 00 00 00 01 00 00 00 02 01 01 12 55
+    {
+        List<byte> request = new List<byte>();
+        //数据包开始-------------------------- > (1个字节)->AA
+        request.Add(0xAA);
+        //命令--------------------------------->(1个字节)->07(取值范围->00到FF)
+        request.Add(0x07);
+        //数据长度---------------------------- > (1个字节)->14(取值范围->00到FF)
+        request.Add(0x14);
+        //多少币玩一局游戏(1 - 10)------------ > (1个字节)->03(取值范围->00到FF)
+        request.Add((byte)UserSettings.ins.PerRoundCoin);
+        //一局游戏玩多长时间(1 - 1200)------->(2个字节)->00 64(取值范围->00 00到FF FF)
+        int time = UserSettings.ins.PerRoundSeconds;
+        request.Add((byte)(time >> 8));
+        request.Add((byte)(time));
+        //多少分兑换一张彩票(1 - 10000)------ > (2个字节)->00 64(取值范围->00 00到FF FF)
+        int changeTicket = UserSettings.ins.ChangeTicket;
+        request.Add((byte)(changeTicket >> 8));
+        request.Add((byte)(changeTicket));
+        //累计投币数(0 - 4294967295)-------- > (4个字节)->00 00 00 01(取值范围->00 00 00 00到FF FF FF FF)
+        int totalCoins = UserSettings.ins.TotalCoinsNum;
+        request.Add((byte)(totalCoins >> 24));
+        request.Add((byte)(totalCoins >> 16));
+        request.Add((byte)(totalCoins >> 8));
+        request.Add((byte)(totalCoins));
+        //累计出彩票数(0 - 4294967295)------ > (4个字节)->00 00 00 01(取值范围->00 00 00 00到FF FF FF FF)
+        int totalTicketNum = UserSettings.ins.TotalTicketNum;
+        request.Add((byte)(totalTicketNum >> 24));
+        request.Add((byte)(totalTicketNum >> 16));
+        request.Add((byte)(totalTicketNum >> 8));
+        request.Add((byte)(totalTicketNum));
+        //是否需要投币(0 - 1)----------------->(1个字节)->01(取值范围->00到FF)
+        request.Add((byte)UserSettings.ins.NeedCoin);
+        //是否出彩票(0 - 1)------------------->(1个字节)->01(取值范围->00到FF)
+        request.Add((byte)UserSettings.ins.GiveTicket);
+        //校验-------------------------------- > (1个字节)->12(取值范围->00到FF)(校验 = 命令 ^ 数据长度 ^ ......^是否出彩票)
+        byte temp = 0;
+        for (int i = 2; i < request.Count; i++)
+        {
+            temp ^= request[i];
+        }
+        request.Add(temp);
+        //数据包结束------------------------->(1个字节)->55
+        request.Add(0x55);//结束
+        serialPortUtility.Write(request.ToArray());
+        LOG($"请求保存后台数据!");
+    }
+
+    /// <summary>
+    /// 保存后台数据回复
+    /// </summary>
+    private void OnSaveSettingDataBack(byte[] bytes)//AA 07 05 02 55
+    {
+        //--> 回复(保存后台数据)的命令
+        //数据包开始------->(1个字节)->AA
+        //命令------------->(1个字节)->07(取值范围->00到FF)
+        //数据长度--------->(1个字节)->05(取值范围->00到FF)
+        //校验------------->(1个字节)->02(取值范围->00到FF)(校验 = 命令 ^ 数据长度)
+        //数据包结束------->(1个字节)->55
+        LOG($"保存后台数据回复!");
+    }
+
     /// <summary>
     /// 串口读取二进制流数据
     /// </summary>
@@ -156,16 +350,25 @@ public class SerialPortExample : MonoBehaviour
     public void ReadStreamingBinary(object data)
     {
         var bin = data as byte[];
-
-        PrintFrame(bin);   
+        PrintFrame(bin);
     }
 
-    void PrintFrame(byte[] bytes)
+    public void PrintFrame(byte[] bytes)
     {
+        string logStr = "";
+        for (int i = 0; i < bytes.Length; i++)
+        {
+            logStr += $"i={bytes[i]}-";
+        }
+        Debug.Log($"{PortName} 接收到的串口命令:{logStr}");
+
         if (bytes[0] == 0xAA)
         {
             if (bytes[1] == 0x55)//旧
             {
+                if (!PortName.Contains("/dev/ttyS8"))
+                    return;
+
                 if (bytes[4] == 0xA6)//投币
                 {
                     Debug.Log("旧版投币数量:" + bytes[4]);
@@ -178,8 +381,8 @@ public class SerialPortExample : MonoBehaviour
             }
             else
             {
-                //Debug.Log("bytes[1]命令:" + bytes[1] + "bytes[2]命令:" + bytes[2]);
-                Debug.Log("接收到的串口命令:" + bytes[0] + bytes[1] + bytes[2] + bytes[3] + bytes[4] + bytes[5]);
+                if (!PortName.Contains("/dev/ttyS0"))
+                    return;
                 //0x04:为按键是否按下的命令
                 if (bytes[1] == 0x04)//退出
                 {
@@ -191,24 +394,39 @@ public class SerialPortExample : MonoBehaviour
                         SendMessage(bytes, 3);
                         return;
                     }
-                    else if(bytes[3] == 0x00)
+                    else if (bytes[3] == 0x00)
                     {
                         Debug.Log("松开按键");
                         SendMessage(bytes, 3);
                         return;
                     }
                 }
-                else if (bytes[1] == 01)//投币
+                else if (bytes[1] == 0x01)//投币
                 {
                     Debug.Log("确认投币命令");
                     StandaloneAPI.InsertCoint(bytes[3]);
                     SendMessage(bytes, 3);
                 }
-                
+                else if (bytes[1] == 0x0F)//进入设置  AA 0F 05 0A 55
+                    OpenSetUp();
+                else if(bytes[1] == 0x07)//回复保存后台数据  AA 07 05 02 55
+                    OnSaveSettingDataBack(bytes);
+                else if (bytes[1] == 0x08)//回复读后台数据  AA 08 14 03 00 64 00 64 00 00 00 01 00 00 00 01 01 01 1F 55
+                    OnSettingDataBack(bytes);
             }
         }
     }
 
+    /// <summary>
+    /// 打开设置
+    /// </summary>
+    private void OpenSetUp()
+    {
+        AudioMgr.ins.PlayBtn();
+        GameObject settingsViewObj = ViewManager2.getGameObjectAndShowView(ViewManager2.Path_SettingsView);
+        settingsViewObj.GetComponent<SmartBow.SettingsView>().ShowBoxSound(true);
+    }
+
     /// <summary>
     /// 请求二维码链接
     /// </summary>
@@ -261,11 +479,8 @@ public class SerialPortExample : MonoBehaviour
     void OnUrlResponse(byte[] bytes)
     {
         urlBack = true;
-        Debug.Log("开始解析二维码数组");
         int frameLength = bytes[2];
-        Debug.Log("帧长度" + frameLength);
         frameLength = frameLength - 3;
-        Debug.Log("解析后的数据长度:" + frameLength);
         List<byte> datas = new List<byte>();
         var startPos = 5;
         for (int i = startPos; i < frameLength + startPos; i++)
@@ -301,7 +516,11 @@ public class SerialPortExample : MonoBehaviour
     }
     private void OnDestroy()
     {
-        Debug.Log("串口程序被销毁");
-        serialPortUtility.Close();
+        if (_isInit.TryGetValue(gameObject.name, out var instanceID) && instanceID == GetInstanceID())
+        {
+            LOG($"{PortName} 串口程序被销毁");
+            serialPortUtility.Close();
+            _isInit.Remove(gameObject.name);
+        }
     }
 }

+ 37 - 6
Assets/BowArrow/Scripts/SerialPortTest.cs

@@ -1,5 +1,6 @@
 using System;
 using System.Collections.Generic;
+using System.Data;
 using TMPro;
 using Unity.VisualScripting;
 using UnityEngine;
@@ -10,8 +11,11 @@ public class SerialPortTest : MonoBehaviour
     public Button SendButton;
     public TMP_InputField InputField;
     private ArrowSerialPort targetPort;
-    private void Awake()
+    public TMP_InputField PortInputField;
+    public SerialPortExample[] SerialPortExampleGroup;
+    private void OnEnable()
     {
+        PortInputField.text = "1";
         InputField.text = string.Empty;
         SendButton.onClick.AddListener(OnSendPortData);
         DontDestroyOnLoad(this);
@@ -20,14 +24,41 @@ public class SerialPortTest : MonoBehaviour
 
     private void OnSendPortData()
     {
+        SerialPortExampleGroup = FindObjectsOfType<SerialPortExample>();
+        var portIndex = int.Parse(PortInputField.text);
         var msg = InputField.text;
-        var datasStr = msg.ToCharArray();
         List<byte> data = new List<byte>();
-        for (int i = 0; i < datasStr.Length; i += 5)
+        var strs = msg.Split(' ');
+        for (int i = 0; i < strs.Length; i++)
         {
-            var dataStr = $"{datasStr[i]}{datasStr[i + 1]}{datasStr[i + 2]}{datasStr[i + 3]}";
-            data.Add(Convert.ToByte(dataStr, 16));
+            data.Add(Convert.ToByte(strs[i], 16));
+        }
+
+        switch (portIndex)
+        {
+            case 1://弓箭串口
+                targetPort.TestRead(data.ToArray());
+                break;
+            case 0://投币盒子
+                foreach (var item in SerialPortExampleGroup)
+                {
+                    if (item.name.Contains("com0"))
+                    {
+                        item.PrintFrame(data.ToArray());
+                        break;
+                    }
+                }
+                break;
+            case 8://投币机
+                foreach (var item in SerialPortExampleGroup)
+                {
+                    if (item.name.Contains("com8"))
+                    {
+
+                        break;
+                    }
+                }
+                break;
         }
-        targetPort.TestRead(data.ToArray());
     }
 }

+ 1 - 1
Assets/BowArrow/Scripts/Standalone/StandaloneAPI.cs

@@ -151,7 +151,7 @@ public class StandaloneAPI
     /// </summary>
     public static void InsertCoinForAddTime()
     {
-        AddGameTimeCountDown(3 * 60);
+        AddGameTimeCountDown(UserSettings.ins.PerRoundSeconds);
         Debug.Log("UserSettings.ins.PerRoundCoin:" + UserSettings.ins.PerRoundCoin);
         Debug.Log("UserSettings.ins.PerRoundSeconds:"+ UserSettings.ins.PerRoundSeconds);
     }

+ 530 - 1
Assets/Resources/SerialPortTest.prefab

@@ -31,6 +31,7 @@ RectTransform:
   m_ConstrainProportionsScale: 0
   m_Children: []
   m_Father: {fileID: 2338248401413254186}
+  m_RootOrder: 0
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0, y: 0}
   m_AnchorMax: {x: 1, y: 1}
@@ -134,6 +135,59 @@ MonoBehaviour:
   m_hasFontAssetChanged: 0
   m_baseMaterial: {fileID: 0}
   m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!1 &2120304761798423666
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1478133726038032971}
+  - component: {fileID: 3223766014972124189}
+  m_Layer: 5
+  m_Name: Text Area
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1478133726038032971
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2120304761798423666}
+  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: 8150410074473413581}
+  - {fileID: 1070026055138576337}
+  m_Father: {fileID: 6904239112059849585}
+  m_RootOrder: 0
+  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.5}
+  m_SizeDelta: {x: -20, y: -13}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &3223766014972124189
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2120304761798423666}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 3312d7739989d2b4e91e6319e9a96d76, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Padding: {x: -8, y: -5, z: -8, w: -5}
+  m_Softness: {x: 0, y: 0}
 --- !u!1 &2157663990648648323
 GameObject:
   m_ObjectHideFlags: 0
@@ -165,6 +219,7 @@ RectTransform:
   m_ConstrainProportionsScale: 0
   m_Children: []
   m_Father: {fileID: 3519274116872003859}
+  m_RootOrder: 1
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0, y: 0}
   m_AnchorMax: {x: 1, y: 1}
@@ -300,6 +355,7 @@ RectTransform:
   m_ConstrainProportionsScale: 0
   m_Children: []
   m_Father: {fileID: 3519274116872003859}
+  m_RootOrder: 0
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0, y: 0}
   m_AnchorMax: {x: 1, y: 1}
@@ -423,6 +479,162 @@ MonoBehaviour:
   m_FlexibleWidth: -1
   m_FlexibleHeight: -1
   m_LayoutPriority: 1
+--- !u!1 &5690706914323052423
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 8150410074473413581}
+  - component: {fileID: 3108313767655756171}
+  - component: {fileID: 2452340927197199947}
+  - component: {fileID: 3833918229521518837}
+  m_Layer: 5
+  m_Name: Placeholder
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &8150410074473413581
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5690706914323052423}
+  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: 1478133726038032971}
+  m_RootOrder: 0
+  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 &3108313767655756171
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5690706914323052423}
+  m_CullTransparentMesh: 1
+--- !u!114 &2452340927197199947
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5690706914323052423}
+  m_Enabled: 0
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, 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_text: Enter text...
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 2147483648
+  m_fontColor: {r: 0, g: 0, b: 0, a: 0.5}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 30
+  m_fontSizeBase: 30
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 1
+  m_VerticalAlignment: 512
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 0
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 1
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 0
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 0, y: 0, z: 0, w: 0}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!114 &3833918229521518837
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5690706914323052423}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_IgnoreLayout: 1
+  m_MinWidth: -1
+  m_MinHeight: -1
+  m_PreferredWidth: -1
+  m_PreferredHeight: -1
+  m_FlexibleWidth: -1
+  m_FlexibleHeight: -1
+  m_LayoutPriority: 1
 --- !u!1 &5932676652627969554
 GameObject:
   m_ObjectHideFlags: 0
@@ -457,7 +669,9 @@ RectTransform:
   m_Children:
   - {fileID: 2338248401413254186}
   - {fileID: 7217073299663235196}
+  - {fileID: 6904239112059849585}
   m_Father: {fileID: 0}
+  m_RootOrder: 0
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0, y: 0}
   m_AnchorMax: {x: 0, y: 0}
@@ -483,7 +697,6 @@ Canvas:
   m_SortingBucketNormalizedSize: 0
   m_VertexColorAlwaysGammaSpace: 0
   m_AdditionalShaderChannelsFlag: 25
-  m_UpdateRectTransformForStandalone: 0
   m_SortingLayerID: 0
   m_SortingOrder: 2
   m_TargetDisplay: 0
@@ -541,6 +754,184 @@ MonoBehaviour:
   m_EditorClassIdentifier: 
   SendButton: {fileID: 4843553104443839269}
   InputField: {fileID: 6915645915798116970}
+  PortInputField: {fileID: 4033450757502539702}
+  SerialPortExampleGroup: []
+--- !u!1 &7310788629971779615
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 6904239112059849585}
+  - component: {fileID: 3029512088558485079}
+  - component: {fileID: 5767369991421111552}
+  - component: {fileID: 4033450757502539702}
+  m_Layer: 5
+  m_Name: PortInputField
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &6904239112059849585
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7310788629971779615}
+  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: 1478133726038032971}
+  m_Father: {fileID: 7928921207822231941}
+  m_RootOrder: 2
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 0, y: 0}
+  m_AnchoredPosition: {x: 1231.4001, y: 0}
+  m_SizeDelta: {x: 124.4, y: 80.2622}
+  m_Pivot: {x: 0, y: 0}
+--- !u!222 &3029512088558485079
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7310788629971779615}
+  m_CullTransparentMesh: 1
+--- !u!114 &5767369991421111552
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7310788629971779615}
+  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: 1}
+  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: 10911, guid: 0000000000000000f000000000000000, type: 0}
+  m_Type: 1
+  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 &4033450757502539702
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7310788629971779615}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 2da0c512f12947e489f739169773d7ca, 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: 5767369991421111552}
+  m_TextViewport: {fileID: 1478133726038032971}
+  m_TextComponent: {fileID: 6354714539238138860}
+  m_Placeholder: {fileID: 2452340927197199947}
+  m_VerticalScrollbar: {fileID: 0}
+  m_VerticalScrollbarEventHandler: {fileID: 0}
+  m_LayoutGroup: {fileID: 0}
+  m_ScrollSensitivity: 1
+  m_ContentType: 0
+  m_InputType: 0
+  m_AsteriskChar: 42
+  m_KeyboardType: 0
+  m_LineType: 0
+  m_HideMobileInput: 0
+  m_HideSoftKeyboard: 0
+  m_CharacterValidation: 0
+  m_RegexValue: 
+  m_GlobalPointSize: 14
+  m_CharacterLimit: 0
+  m_OnEndEdit:
+    m_PersistentCalls:
+      m_Calls: []
+  m_OnSubmit:
+    m_PersistentCalls:
+      m_Calls: []
+  m_OnSelect:
+    m_PersistentCalls:
+      m_Calls: []
+  m_OnDeselect:
+    m_PersistentCalls:
+      m_Calls: []
+  m_OnTextSelection:
+    m_PersistentCalls:
+      m_Calls: []
+  m_OnEndTextSelection:
+    m_PersistentCalls:
+      m_Calls: []
+  m_OnValueChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_OnTouchScreenKeyboardStatusChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+  m_CustomCaretColor: 0
+  m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412}
+  m_Text: 0X11
+  m_CaretBlinkRate: 0.85
+  m_CaretWidth: 1
+  m_ReadOnly: 0
+  m_RichText: 1
+  m_GlobalFontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_OnFocusSelectAll: 1
+  m_ResetOnDeActivation: 1
+  m_RestoreOriginalTextOnEscape: 1
+  m_isRichTextEditingAllowed: 0
+  m_LineLimit: 0
+  m_InputValidator: {fileID: 0}
 --- !u!1 &7465758819038862746
 GameObject:
   m_ObjectHideFlags: 0
@@ -574,6 +965,7 @@ RectTransform:
   m_Children:
   - {fileID: 3519274116872003859}
   m_Father: {fileID: 7928921207822231941}
+  m_RootOrder: 1
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 1, y: 0}
   m_AnchorMax: {x: 1, y: 0}
@@ -748,6 +1140,7 @@ RectTransform:
   - {fileID: 6667233905272176481}
   - {fileID: 1440626118419061704}
   m_Father: {fileID: 7217073299663235196}
+  m_RootOrder: 0
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0, y: 0}
   m_AnchorMax: {x: 1, y: 1}
@@ -801,6 +1194,7 @@ RectTransform:
   m_Children:
   - {fileID: 8752828828607409088}
   m_Father: {fileID: 7928921207822231941}
+  m_RootOrder: 0
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0, y: 0}
   m_AnchorMax: {x: 0, y: 0}
@@ -889,3 +1283,138 @@ MonoBehaviour:
   m_OnClick:
     m_PersistentCalls:
       m_Calls: []
+--- !u!1 &8743514539871212193
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1070026055138576337}
+  - component: {fileID: 7261053212693896910}
+  - component: {fileID: 6354714539238138860}
+  m_Layer: 5
+  m_Name: Text
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1070026055138576337
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8743514539871212193}
+  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: 1478133726038032971}
+  m_RootOrder: 1
+  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 &7261053212693896910
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8743514539871212193}
+  m_CullTransparentMesh: 1
+--- !u!114 &6354714539238138860
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8743514539871212193}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, 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_text: "0X11\u200B"
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4281479730
+  m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 24
+  m_fontSizeBase: 24
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 2
+  m_VerticalAlignment: 512
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 0
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 1
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 0
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 0, y: 0, z: 0, w: 0}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}

+ 24 - 24
Assets/SmartBow/Resources/SmartBow/Prefabs/Views/Home/SettingsView.prefab

@@ -331,9 +331,9 @@ RectTransform:
   m_Father: {fileID: 3047476253341387442}
   m_RootOrder: 0
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
-  m_AnchorMin: {x: 0, y: 1}
-  m_AnchorMax: {x: 0, y: 1}
-  m_AnchoredPosition: {x: 379.6887, y: -63.466175}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 0, y: 0}
+  m_AnchoredPosition: {x: 0, y: 0}
   m_SizeDelta: {x: 564.3, y: 126}
   m_Pivot: {x: 0.5, y: 0.5}
 --- !u!222 &4609678533821600724
@@ -8471,7 +8471,7 @@ RectTransform:
   m_AnchorMin: {x: 0, y: 1}
   m_AnchorMax: {x: 1, y: 1}
   m_AnchoredPosition: {x: 0, y: 0}
-  m_SizeDelta: {x: 0, y: 153}
+  m_SizeDelta: {x: 0, y: 151.65}
   m_Pivot: {x: 0.5, y: 1}
 --- !u!222 &3494904712485274978
 CanvasRenderer:
@@ -16510,7 +16510,7 @@ RectTransform:
   m_AnchorMin: {x: 0, y: 1}
   m_AnchorMax: {x: 0, y: 1}
   m_AnchoredPosition: {x: 756, y: -50}
-  m_SizeDelta: {x: 1312, y: 33}
+  m_SizeDelta: {x: 1312, y: 31.65}
   m_Pivot: {x: 0.5, y: 1}
 --- !u!222 &3494904713695596684
 CanvasRenderer:
@@ -16884,7 +16884,7 @@ RectTransform:
   m_AnchorMin: {x: 0, y: 1}
   m_AnchorMax: {x: 1, y: 1}
   m_AnchoredPosition: {x: 0, y: 0}
-  m_SizeDelta: {x: 0, y: 585}
+  m_SizeDelta: {x: 0, y: 0}
   m_Pivot: {x: 0.5, y: 1}
 --- !u!114 &7486349491440914305
 MonoBehaviour:
@@ -18618,10 +18618,10 @@ RectTransform:
   m_Father: {fileID: 2068041804890104721}
   m_RootOrder: 1
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
-  m_AnchorMin: {x: 0, y: 1}
-  m_AnchorMax: {x: 0, y: 1}
-  m_AnchoredPosition: {x: 846, y: -485}
-  m_SizeDelta: {x: 1512, y: 200}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 0, y: 0}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 0, y: 200}
   m_Pivot: {x: 0.5, y: 0.5}
 --- !u!222 &8074530355704201956
 CanvasRenderer:
@@ -19079,9 +19079,9 @@ RectTransform:
   m_Father: {fileID: 8348090661077414091}
   m_RootOrder: 1
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
-  m_AnchorMin: {x: 0, y: 1}
-  m_AnchorMax: {x: 0, y: 1}
-  m_AnchoredPosition: {x: 807.16895, y: -63.466175}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 0, y: 0}
+  m_AnchoredPosition: {x: 0, y: 0}
   m_SizeDelta: {x: 169, y: 93}
   m_Pivot: {x: 0.5, y: 0.5}
 --- !u!222 &1906502662456550895
@@ -20788,7 +20788,7 @@ GameObject:
   m_Icon: {fileID: 0}
   m_NavMeshLayer: 0
   m_StaticEditorFlags: 0
-  m_IsActive: 0
+  m_IsActive: 1
 --- !u!224 &3719453061328803819
 RectTransform:
   m_ObjectHideFlags: 0
@@ -22034,9 +22034,9 @@ RectTransform:
   m_Father: {fileID: 3047476253341387442}
   m_RootOrder: 1
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
-  m_AnchorMin: {x: 0, y: 1}
-  m_AnchorMax: {x: 0, y: 1}
-  m_AnchoredPosition: {x: 807.16895, y: -63.466175}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 0, y: 0}
+  m_AnchoredPosition: {x: 0, y: 0}
   m_SizeDelta: {x: 169, y: 93}
   m_Pivot: {x: 0.5, y: 0.5}
 --- !u!222 &4605077425023017203
@@ -22483,9 +22483,9 @@ RectTransform:
   m_Father: {fileID: 8348090661077414091}
   m_RootOrder: 0
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
-  m_AnchorMin: {x: 0, y: 1}
-  m_AnchorMax: {x: 0, y: 1}
-  m_AnchoredPosition: {x: 379.68796, y: -63.466175}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 0, y: 0}
+  m_AnchoredPosition: {x: 0, y: 0}
   m_SizeDelta: {x: 564.3, y: 126}
   m_Pivot: {x: 0.5, y: 0.5}
 --- !u!222 &7464201164501116995
@@ -22837,10 +22837,10 @@ RectTransform:
   m_Father: {fileID: 2068041804890104721}
   m_RootOrder: 0
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
-  m_AnchorMin: {x: 0, y: 1}
-  m_AnchorMax: {x: 0, y: 1}
-  m_AnchoredPosition: {x: 846, y: -250}
-  m_SizeDelta: {x: 1512, y: 200}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 0, y: 0}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 0, y: 200}
   m_Pivot: {x: 0.5, y: 0.5}
 --- !u!222 &2452418291181881784
 CanvasRenderer:

+ 2 - 0
Assets/SmartBow/Scripts/Views/SettingsViewParts/BoxBackStageManagement.cs

@@ -38,6 +38,7 @@ public class BoxBackStageManagement : MonoBehaviour
     {
         string vStr = v.ToString("#0");
         inputCoin.text = vStr; //+ TextAutoLanguage2.GetTextByKey("UnitCoin")
+        SerialPortHelper.ins.GetPort(0)?.ReqSavingSettingData();
     }
     void InitInputSeconds()
     {
@@ -68,5 +69,6 @@ public class BoxBackStageManagement : MonoBehaviour
     {
         string vStr = v.ToString("#0");
         inputSeconds.text = vStr; //+ TextAutoLanguage2.GetTextByKey("UnitSeconds")
+        SerialPortHelper.ins.GetPort(0)?.ReqSavingSettingData();
     }
 }