| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 | 
							- using UnityEngine;
 
- namespace SmartBowSDK
 
- {
 
-     /// <summary>
 
-     /// 射箭检测器
 
-     /// </summary>
 
-     public class ShootChecker_SDK : MonoBehaviour
 
-     {
 
-         public SmartBowHelper smartBowHelper;
 
-         /// <summary>
 
-         /// 游戏里箭的速度
 
-         /// </summary>
 
-         public float gameArrowSpeed = 0;
 
-         /// <summary>
 
-         /// 游戏里箭的重量
 
-         /// </summary>
 
-         public float gameArrowWeight = 20;
 
-         /// <summary>
 
-         /// 现实里箭的重量
 
-         /// </summary>
 
-         public float solidArrowWeight = 75;
 
-         /// <summary>
 
-         /// 上一次的射击数据ID
 
-         /// </summary>
 
-         private int _lastShootID = -1;
 
-         /// <summary>
 
-         /// 当收到红外数据时
 
-         /// </summary>
 
-         /// <param name="bytes"></param>
 
-         public void OnInfraredDataReceived(byte[] bytes)
 
-         {
 
-             //序号
 
-             int id = bytes[1];
 
-             if (id == _lastShootID) return; //因为硬件为了避免丢包,会连续发几条相同射击通知过来
 
-             _lastShootID = id;
 
-             //时区1耗时
 
-             float time1 = bytes[2] * 0.1f;
 
-             //时区2耗时
 
-             float time2 = bytes[3] * 0.1f;
 
-             //时区耗时总和
 
-             float totalTime = time1 + time2;
 
-             //校验和
 
-             int sumCheck = (bytes[0] + bytes[1] + bytes[2] + bytes[3]) & 0xff;
 
-             //校验和比较结果
 
-             bool sumCheckRes = sumCheck == bytes[4];
 
-             //实体箭速度
 
-             float solidArrowSpeed = 0.05f / (totalTime / 1000f);
 
-             //通过动能定理求箭的速度(实体箭质量*实体箭速度^2=游戏中箭的质量*游戏中箭的速度^2)
 
-             gameArrowSpeed = Mathf.Sqrt(solidArrowSpeed * solidArrowSpeed * solidArrowWeight / gameArrowWeight);
 
-             //打印
 
-             string logInfo = $"序号{id},时区1:{time1}毫秒,时区2:{time2}毫秒,校验:{sumCheckRes},实体箭速度:{solidArrowSpeed}m/s,游戏箭速度:{gameArrowSpeed}m/s";
 
-             SmartBowLogger.Log(this, logInfo);
 
-             //收到正确的射箭数据,就回复硬件,否则n毫秒后硬件会认为丢包而进行重传
 
-             if (sumCheckRes) smartBowHelper.bluetoothAim.ReplyInfraredShoot();
 
-             //通知九轴算法,因为射箭抖动会使算法计算的姿态角产生误差
 
-             smartBowHelper.aimHandler.NotifyAxisOnShot();
 
-             smartBowHelper.InvokeOnShooting(gameArrowSpeed);
 
-         }
 
-         /// <summary>
 
-         /// 回去枪指令
 
-         /// </summary>
 
-         /// <param name="bytes"></param>
 
-         public void ReplyGun(byte[] bytes)
 
-         {
 
-             byte[] response = BluetoothDecryptor.GetResponse(bytes);
 
-             smartBowHelper.bluetoothAim.ReplyByte(response);
 
-         }
 
-         /// <summary>
 
-         /// 枪的弹夹状态
 
-         /// 0x00 弹夹分离,0x01 上弹夹
 
-         /// </summary>
 
-         /// <param name="bytes"></param>
 
-         public void UpdateTheMagazine(byte[] bytes)
 
-         {
 
-             Debug.Log("切换弹夹后:" + System.BitConverter.ToString(bytes));
 
-             if (bytes[1] == 0x00 )
 
-             {
 
-                 smartBowHelper.InvokeOnBleDevice(BluetoothDeviceType.Pistol1, BluetoothDeviceStatus.MagazineSeparation);
 
-             }
 
-             else if(bytes[1] == 0x01) {
 
-                 smartBowHelper.InvokeOnBleDevice(BluetoothDeviceType.Pistol1, BluetoothDeviceStatus.MagazineLoading);
 
-             }
 
-         }
 
-     }
 
- }
 
 
  |