using System; using UnityEngine; using System.Collections; using System.Collections.Generic; using UnityEngine.UI; public enum AimDeviceType { NONE = -1, HOUYIPRO = 3, //枪械类 Gun = 4, ARTEMISPRO = 5, } [Serializable]//需要在转换为json格式的类的上方添加序列化 public class AimDeviceInfo { public int id; public int type = -1;//类型 AimDeviceType public int pos; //位置 public bool bInitMac = false; //是否初始化Mac public string mac; //记录当前 public AimDeviceInfo(int _id) { this.id = _id; } public void setInitMac(string macTemp) { bInitMac = true; mac = macTemp; } public void resetInitMac() { bInitMac = false; mac = ""; } } [Serializable] public class AimDeviceInfos { public List arry; } /* 瞄准处理器 */ public class AimHandler : MonoBehaviour { //记录一个设备 public AimDeviceInfo aimDeviceInfo = null; public AimDeviceInfo tempAimDeviceInfo = null;//临时处理值。最后赋值给aimDeviceInfo public AimDeviceInfos aimDeviceInfos = new AimDeviceInfos(); int deviceSelectIndex = 0;//默认选中第一个设备(1p) public Action aimDeviceInfoChangeEvent; public int DeviceType { get { //if (m_axisHandler.GetType() == typeof(Axis9Handler)) return 9; //if (m_axisHandler.GetType() == typeof(Axis663Handler)) return 663; return 0; } } //陀螺仪校准进度记录 [NonSerialized] public int gyrCalibrateCompleteCount = 0; [NonSerialized] public int gyrCalibrateTotalCount = 2000; public static AimHandler ins; public bool bInitOne = false; public OnCrossBtnEventEvent OnCrossBtnEvent; public delegate void OnCrossBtnEventEvent(); /// /// 准心事件 /// public void InvokeOnCrossBtnEvent() { try { OnCrossBtnEvent?.Invoke(); } catch (Exception e) { Debug.LogError(e); } } void Start() { ins = this; } public void onClearAimDeviceInfosNew() { PlayerPrefs.DeleteKey("aim-device-info-" + LoginMgr.myUserInfo.id); aimDeviceInfos.arry.Clear(); } /// /// 移除2p。即除了1p之后的设备 /// public void onClear2PAimDeviceInfosNew() { OnGetAimDeviceInfos(); if (aimDeviceInfos.arry.Count > 1) { aimDeviceInfos.arry.RemoveRange(1, aimDeviceInfos.arry.Count - 1); } OnSaveAimDeviceInfos(); } public void OnGetAimDeviceInfos() { string deviceInfo = PlayerPrefs.GetString("aim-device-info-" + LoginMgr.myUserInfo.id, ""); Debug.Log("get deviceSelectIndex:" + deviceInfo); if (deviceInfo != "") { aimDeviceInfos = JsonUtility.FromJson(deviceInfo);//这里的类是依据最外层{}决定的 } aimDeviceInfoChangeEvent?.Invoke(); } public void OnSaveAimDeviceInfos() { aimDeviceInfoChangeEvent?.Invoke(); PlayerPrefs.SetString("aim-device-info-" + LoginMgr.myUserInfo.id, JsonUtility.ToJson(aimDeviceInfos)); } //创建一个选择值 public void onCreateTempAimDeviceInfo() { tempAimDeviceInfo = new AimDeviceInfo(deviceSelectIndex); Debug.Log("onCreateTempAimDeviceInfo deviceSelectIndex:" + deviceSelectIndex); } //是否存在AimDeviceInfo,存在更新,不存在创建; public void onCreateAimDeviceInfoById() { OnGetAimDeviceInfos(); //deviceIndex 区分 1p 还是 2p bool bCanAdd = true; foreach (AimDeviceInfo p in aimDeviceInfos.arry) { if (deviceSelectIndex == p.id) { aimDeviceInfo = p; bCanAdd = false; } //Debug.Log("33deviceSelectIndex:" + deviceSelectIndex + ",bCanAdd:" + bCanAdd+ " , id:" + p.id +" , type:"+ p.type); } if (bCanAdd) { Debug.Log("add deviceSelectIndex:" + deviceSelectIndex); aimDeviceInfo = new AimDeviceInfo(deviceSelectIndex); aimDeviceInfos.arry.Add(aimDeviceInfo); } OnSaveAimDeviceInfos(); } public void SetAimDeviceSelectIndex(int selectIndex) { if (selectIndex < 0) { Debug.LogWarning("selectIndex不能小于0:"+ selectIndex); return; } deviceSelectIndex = selectIndex; Debug.Log("SetAimDeviceSelectIndex :" + selectIndex); } public void SetTempAimDeviceType(AimDeviceType _aimDeviceType) { if (tempAimDeviceInfo == null) return; tempAimDeviceInfo.type = (int)_aimDeviceType; } public void SetAimDeviceType(AimDeviceType _aimDeviceType) { if (aimDeviceInfo == null) return; aimDeviceInfo.type = (int)_aimDeviceType; _AimDeviceInfosUpdate(); OnSaveAimDeviceInfos(); } public void SetAimDeviceType(int _aimDeviceType) { if (aimDeviceInfo == null) return; aimDeviceInfo.type = _aimDeviceType; _AimDeviceInfosUpdate(); OnSaveAimDeviceInfos(); } //APP连接需进行MAC地址的比对。 //只有再引导初始化页面才保存连接使用的mac地址。 public void SetAimDeviceMac(string _mac) { if (aimDeviceInfo == null) return; aimDeviceInfo.setInitMac(_mac); _AimDeviceInfosUpdate(); OnSaveAimDeviceInfos(); } //重置mac存储信息 public void ResetAimDeviceMac() { if (aimDeviceInfo == null) return; aimDeviceInfo.resetInitMac(); _AimDeviceInfosUpdate(); OnSaveAimDeviceInfos(); } void _AimDeviceInfosUpdate() { for (int i = 0; i < aimDeviceInfos.arry.Count; i++) { if (aimDeviceInfo.id == aimDeviceInfos.arry[i].id) { aimDeviceInfos.arry[i] = aimDeviceInfo; } } } #region 根据设备1p或者2p 获取HOUYIPRO的状态 public bool isHOUYIPRO(BluetoothPlayer bluetoothPlayer) { bool _isHOUYIPRO = false; foreach (AimDeviceInfo p in AimHandler.ins.aimDeviceInfos.arry) { if ((int)bluetoothPlayer == p.id && p.type == (int)AimDeviceType.HOUYIPRO) { _isHOUYIPRO = true; } } return _isHOUYIPRO; } #endregion #region 根据设备1p或者2p 获取ARTEMISPro的状态 public bool isARTEMISPro(BluetoothPlayer bluetoothPlayer) { bool _isARTEMISPro = false; foreach (AimDeviceInfo p in ins.aimDeviceInfos.arry) { if ((int)bluetoothPlayer == p.id && p.type == (int)AimDeviceType.ARTEMISPRO) { _isARTEMISPro = true; } } return _isARTEMISPro; } #endregion [NonSerialized] public bool lerpForRotation = true; [NonSerialized] public float lerpTimeRate = 7; //加一个枪射击的触发时间 float _lastShootTime = 0; public void Update() { } public void OnDataReceived(byte[] bytes) { if (bytes.Length != 27 && bytes.Length != 39) { if (bytes.Length == 2) { if (bytes[0] == 0x66 && bytes[1] == 0x31) { if (bInitOne) { bInitOne = false; if (aimDeviceInfo.type == (int)AimDeviceType.NONE) { AutoResetView.DoIdentity(); } else { //准心开关 CrossBtnEvent(); } } else { if (SB_EventSystem.ins && SB_EventSystem.ins.simulateMouseIsAwaked) { //流程触发红外描点 InfraredScreenPositioningView infraredScreenPositioningView = FindAnyObjectByType(); if (infraredScreenPositioningView) { InvokeOnCrossBtnEvent(); } } else { if (aimDeviceInfo.type == (int)AimDeviceType.NONE) { AutoResetView.DoIdentity(); } else { //准心开关 CrossBtnEvent(); } } } } else if (bytes[0] == 0x66 && bytes[1] == 0x32) { //红外部分 if (GlobalData.MyDeviceMode == DeviceMode.Gun || BluetoothAim.ins && BluetoothAim.ins.isMainConnectToInfraredDevice()) { InfraredGuider infraredGuider = FindAnyObjectByType(); //‘校准'功能的调用,使用原来调出光标的功能键;即在HOUYI Pro使用长按视角归位键;在ARTEMIS Pro使用快速双击按键 if (infraredGuider == null) { AutoResetView.DoIdentity(); } else { //先判断是否处于校准步骤 infraredGuider.onLongClickDevice(); } } else if (SB_EventSystem.ins) { // if (SB_EventSystem.ins && !CommonConfig.SpecialVersion1) { //唤起/隐藏虚拟鼠标 SB_EventSystem.ins.AwakenSimulateMouse(); } } else if (bytes[1] == 10) { //显示电量 DeviceBatteryView.ins.RenderBattery(1, bytes[0]); //DeviceView.ins.RenderBattery(1, bytes[0]); } } else if (bytes[0] == 0x5b) { if (GlobalData.MyDeviceMode == DeviceMode.Gun) { if (Time.realtimeSinceStartup - _lastShootTime >= 1) { _lastShootTime = Time.realtimeSinceStartup; InfraredScreenPositioningView view = FindAnyObjectByType(); if (view) { InvokeOnCrossBtnEvent(); } } } // 无论如何都执行红外射击检测 ShootCheck.ins.ShootByInfrared(bytes); } else if (bytes[0] == 0x5C) { //00 弹夹分离,01 上弹夹 ShootCheck.ins.UpdateTheMagazine(bytes); } else if (bytes[0] == 0x5E) { Debug.Log("接收到系统数据:" + BitConverter.ToString(bytes)); var boxUserSettings = FindAnyObjectByType(); //设备类型 switch (bytes[1]) { case 0x01: Debug.Log("设备类型:HOUYI Pro"); UserSettings.ins.selectDevicesName = "HOUYI Pro"; UserSettings.ins.Save(); boxUserSettings?.OnUpdateClickInfoByName(); break; case 0x02: Debug.Log("设备类型:ARTEMIS Pro"); UserSettings.ins.selectDevicesName = "ARTEMIS Pro"; UserSettings.ins.Save(); boxUserSettings?.OnUpdateClickInfoByName(); break; case 0x03: Debug.Log("设备类型:Pistol 1"); UserSettings.ins.selectDevicesName = "Pistol M9"; UserSettings.ins.Save(); boxUserSettings?.OnUpdateClickInfoByName(); break; } // 系统类型 switch (bytes[2]) { case 0x01: Debug.Log("系统类型:移动手机"); break; case 0x02: Debug.Log("系统类型:PC电脑"); break; case 0x03: Debug.Log("系统类型:VR设备"); break; } } return; } } /// /// 操作准心开关事件 /// private void CrossBtnEvent() { Debug.Log("CrossBtnEvent"); //准心开关 InvokeOnCrossBtnEvent(); //b端不处理准心 if (CommonConfig.StandaloneModeOrPlatformB) { InfraredGuider infraredGuider = FindAnyObjectByType(); if (infraredGuider) { infraredGuider.onClickDevice(); } return; } if (GameAssistUI.ins) { InfraredGuider infraredGuider = FindAnyObjectByType(); if (infraredGuider == null) { //显示控制准心按钮 Transform _button5 = GameAssistUI.ins.transform.Find("Button5"); if (_button5.gameObject.activeSelf) { Button crossHairBtn = _button5.GetComponent