UIManager.cs 52 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using InfraredManager;
  4. using o0InfraredLocate.ZIM;
  5. using SLAMUVC;
  6. using SmartBowSDK;
  7. using UnityEngine;
  8. using UnityEngine.SceneManagement;
  9. using UnityEngine.UI;
  10. using ZIM;
  11. using static ScreenLocate;
  12. namespace InfraredDLLManager
  13. {
  14. [RequireComponent(typeof(BLEManager))]
  15. public class UIManager : MonoBehaviour
  16. {
  17. [Header("蓝牙操作")]
  18. //连接弓箭按钮
  19. public Button mConnectBow1P;
  20. private Text mConnectBowText1P;
  21. //连接弓箭按钮
  22. public Button mConnectBow2P;
  23. private Text mConnectBowText2P;
  24. //滚动的日志
  25. public GameObject logObj;
  26. public Text mScrollViewLogTextBow;
  27. private int bowLogTextCount = 0;
  28. //清空日志按钮
  29. public Button mClearLogBow;
  30. public Button mControlLogBtn;
  31. [Header("操作")]
  32. public Toggle mToggleSinglePoint;
  33. public Toggle mToggleSinglePointColorRed;
  34. public Toggle mToggleSinglePointColorGreen;
  35. //是否设置红色光标识别最大点
  36. bool bIdentifyRed = true;
  37. public Text PosInfo;
  38. #region 需要隐藏的面板节点
  39. [Header("面板节点")]
  40. public GameObject[] uiArray;
  41. public bool bGetPanelActive
  42. {
  43. get
  44. {
  45. return bPanelActive;
  46. }
  47. }
  48. bool bPanelActive = true;
  49. #endregion
  50. //图片数据
  51. public RawImage rawImage;
  52. public Transform webCameraViewParent;
  53. public GameObject loadingPanel;
  54. //关联的蓝牙脚本
  55. BLEManager bleManager;
  56. public BLEManager myBleManager
  57. {
  58. get { return bleManager; }
  59. }
  60. #region 定位相关参数
  61. //线段宽度阈值
  62. public ParamFloatValue lineWidth = new ParamFloatValue("ic_lineWidth", 4.0f);
  63. //扇形宽度
  64. public ParamFloatValue fanWidth = new ParamFloatValue("ic_fanWidth", 90.0f);
  65. public ParamFloatValue captureValue = new ParamFloatValue("ic_captureValue", 30.0f);
  66. public ParamFloatValue delayValue = new ParamFloatValue("ic_delayValue", 30.0f);
  67. #endregion
  68. #region 算法部分接口使用
  69. InfraredCameraHelper ICHelper;
  70. [SerializeField] List<RectTransform> _crosshairsInCamera;
  71. #endregion
  72. #region 单例
  73. private static UIManager _Instance;
  74. public static UIManager GetInstance()
  75. {
  76. return _Instance;
  77. }
  78. #endregion
  79. #region 画线
  80. [Header("画线")]
  81. [SerializeField] LineGenerator CurUILineGenerator;//当前结果屏幕线条
  82. #endregion
  83. void Awake()
  84. {
  85. loadingPanel.gameObject.SetActive(true);
  86. _Instance = this;
  87. bleManager = GetComponent<BLEManager>();
  88. if (bleManager) bleManager.OnLogAction += SetLogText;
  89. Debug.Log("InitInfraredCamera!");
  90. InitInfraredCamera();
  91. InitReturnLogReporter();
  92. SceneManager.sceneLoaded += OnSceneLoaded;
  93. }
  94. // Start is called before the first frame update
  95. void Start()
  96. {
  97. mConnectBow1P.onClick.AddListener(() =>
  98. {
  99. if (bleManager) bleManager.ConnectBluetoothDevice(bleManager.MyBowSmartBowHelper);
  100. });
  101. mConnectBowText1P = mConnectBow1P.GetComponentInChildren<Text>();
  102. mConnectBow2P.onClick.AddListener(() =>
  103. {
  104. if (bleManager) bleManager.ConnectBluetoothDevice(bleManager.MyBowSmartBowHelper2);
  105. });
  106. mConnectBowText2P = mConnectBow2P.GetComponentInChildren<Text>();
  107. mClearLogBow.onClick.AddListener(clearLogText);
  108. mControlLogBtn.onClick.AddListener(onControlLog);
  109. InitOffsetBtns();
  110. }
  111. void OnDestroy()
  112. {
  113. if (bleManager) bleManager.OnLogAction -= SetLogText;
  114. }
  115. // Update is called once per frame
  116. void Update()
  117. {
  118. if (ICHelper == null) return;
  119. Texture texture = ICHelper.GetCameraTexture();
  120. if (rawImage.texture == null || texture?.GetNativeTexturePtr() != rawImage.texture.GetNativeTexturePtr())
  121. {
  122. rawImage.texture = texture;
  123. }
  124. //刷新一个fps
  125. if (reporter && bleManager)
  126. {
  127. //reporter.fps
  128. bleManager.SetFPS(reporter.fps);
  129. }
  130. //更新ui
  131. if (bleManager)
  132. {
  133. //进入游戏
  134. if (bleManager.MyBowSmartBowHelper != null)
  135. {
  136. BLEUIStatus(bleManager.MyBowSmartBowHelper, mConnectBow1P, mConnectBowText1P, "1P");
  137. }
  138. if (bleManager.MyBowSmartBowHelper2 != null)
  139. {
  140. BLEUIStatus(bleManager.MyBowSmartBowHelper2, mConnectBow2P, mConnectBowText2P, "2P");
  141. }
  142. }
  143. }
  144. #region 更新蓝牙状态
  145. /// <summary>
  146. /// 更新蓝牙连接ui
  147. /// </summary>
  148. /// <param name="_smartBowHandler"></param>
  149. /// <param name="mConnectBow"></param>
  150. /// <param name="mConnectBowText"></param>
  151. /// <param name="name"></param>
  152. public void BLEUIStatus(SmartBowHelper _smartBowHandler, Button mConnectBow, Text mConnectBowText, string name = "1P")
  153. {
  154. BluetoothStatusEnum bluetoothStatusEnum = _smartBowHandler.GetBluetoothStatus();
  155. bool mBowConnected = bluetoothStatusEnum == BluetoothStatusEnum.Connected;
  156. bool mBowIsConnecting = bluetoothStatusEnum == BluetoothStatusEnum.Connecting;
  157. if (!mBowConnected && !mBowIsConnecting)
  158. {
  159. //未连接,未扫描,不是连接中
  160. mConnectBowText.text = "连接" + name;
  161. if (!mConnectBow.interactable)
  162. mConnectBow.interactable = true;
  163. }
  164. else if (mBowIsConnecting)
  165. {
  166. //扫描中
  167. mConnectBowText.text = "扫描中...";
  168. if (mConnectBow.interactable)
  169. mConnectBow.interactable = false;
  170. }
  171. else if (mBowConnected)
  172. {
  173. //已连接
  174. mConnectBowText.text = "已连接";
  175. if (!mConnectBow.interactable)
  176. mConnectBow.interactable = true;
  177. }
  178. }
  179. #endregion
  180. #region 页面ui控制部分
  181. public void SetLogText(string text)
  182. {
  183. //Debug.Log("SetLogText:" + text);
  184. if (bowLogTextCount > 200)
  185. {
  186. clearLogText();
  187. }
  188. mScrollViewLogTextBow.text += text + "\n";
  189. bowLogTextCount++;
  190. }
  191. public void clearLogText()
  192. {
  193. mScrollViewLogTextBow.text = "";
  194. bowLogTextCount = 0;
  195. }
  196. public void onControlLog()
  197. {
  198. logObj.SetActive(!logObj.activeSelf);
  199. }
  200. // 当场景加载完成时调用的方法
  201. void OnSceneLoaded(Scene scene, LoadSceneMode mode)
  202. {
  203. // 执行加载完成后的操作
  204. Debug.Log("场景加载完成: " + scene.name);
  205. if (scene.name == "InfraredGameDouble" || scene.name == "InfraredGameSingle")
  206. {
  207. hideManager();
  208. }
  209. }
  210. /// <summary>
  211. /// 设置单点模式
  212. /// </summary>
  213. public void onToggleSinglePoint()
  214. {
  215. //Debug.Log("mToggleSinglePoint.isOn:" + mToggleSinglePoint.isOn);
  216. if (mToggleSinglePoint.isOn)
  217. {
  218. ICHelper.SetSinglePoint(true);
  219. bIdentifyRed = true;
  220. mToggleSinglePointColorRed.isOn = true;
  221. mToggleSinglePointColorRed.interactable = false;
  222. mToggleSinglePointColorGreen.isOn = false;
  223. mToggleSinglePointColorGreen.interactable = false;
  224. _infraredOffsetText.text = "单点-1P全屏中心点校准";
  225. _infraredOffsetBtn2P.interactable = false;
  226. }
  227. else
  228. {
  229. ICHelper.SetSinglePoint(false);
  230. mToggleSinglePointColorRed.isOn = true;
  231. mToggleSinglePointColorRed.interactable = true;
  232. mToggleSinglePointColorGreen.interactable = true;
  233. _infraredOffsetText.text = "1P左半屏中心校准\n2P是右半屏中心点校准";
  234. _infraredOffsetBtn2P.interactable = true;
  235. }
  236. }
  237. /// <summary>
  238. /// 切换颜色状态
  239. /// </summary>
  240. public void onToggleSinglePointColorRed()
  241. {
  242. // Debug.Log("mToggleSinglePointColorRed.isOn:" + mToggleSinglePointColorRed.isOn);
  243. if (mToggleSinglePointColorRed.isOn)
  244. {
  245. bIdentifyRed = true;
  246. mToggleSinglePointColorGreen.isOn = false;
  247. }
  248. }
  249. public void onToggleSinglePointColorGreen()
  250. {
  251. //Debug.Log("mToggleSinglePointColorGreen.isOn:" + mToggleSinglePointColorGreen.isOn);
  252. if (mToggleSinglePointColorGreen.isOn)
  253. {
  254. bIdentifyRed = false;
  255. mToggleSinglePointColorRed.isOn = false;
  256. }
  257. }
  258. public void OnClick_ScreenLocateManual()
  259. {
  260. GameObject o = ViewManager2.ShowTestInfraredScreenPositioningView(webCameraViewParent);
  261. InfraredScreenPositioningView _infraredScreenPositioningView = o.GetComponent<InfraredScreenPositioningView>();//FindObjectOfType<InfraredScreenPositioningView>();
  262. _infraredScreenPositioningView.enterFromInfraredDemo = true;
  263. _infraredScreenPositioningView.MyUIManager = this;
  264. }
  265. //隐藏控制面板UI
  266. public void hideManager()
  267. {
  268. // transform.parent.GetComponent<Canvas>().gameObject.SetActive(false);
  269. bPanelActive = false;
  270. for (int i = 0; i < uiArray.Length; i++)
  271. {
  272. uiArray[i].SetActive(false);
  273. }
  274. }
  275. //显示控制面板UI
  276. public void showManager()
  277. {
  278. // transform.parent.GetComponent<Canvas>().gameObject.SetActive(true);
  279. bPanelActive = true;
  280. for (int i = 0; i < uiArray.Length; i++)
  281. {
  282. uiArray[i].SetActive(true);
  283. }
  284. }
  285. #endregion
  286. #region 相机初始化部分
  287. /// <summary>
  288. /// 初始化相机
  289. /// </summary>
  290. void InitInfraredCamera()
  291. {
  292. //SDK创建
  293. if (ICHelper == null)
  294. {
  295. ICHelper = InfraredCameraHelper.GetInstance();
  296. #if UNITY_STANDALONE_WIN || UNITY_EDITOR
  297. ICHelper.CreateToPc();
  298. #endif
  299. #if UNITY_ANDROID
  300. //开始时候设置一个默认分辨率
  301. ICHelper.Create(320, 240);
  302. #endif
  303. //单点情况下更新
  304. ICHelper.OnPositionUpdate += (Vector2 point, Vector2 cameraLocation) =>
  305. {
  306. HideUICrosshairs(1);
  307. Ray ray = Camera.main.ScreenPointToRay(point);
  308. Vector3 rayEndPoint = ray.GetPoint(200);
  309. Quaternion quat = Quaternion.LookRotation(rayEndPoint - Camera.main.transform.position);
  310. //Object localRotation = quat;
  311. ShowUICrosshairs(cameraLocation, 0);
  312. ShowGameUICrosshairs(point, 0);
  313. if (PosInfo) PosInfo.text = "红:" + point.ToString("F2");
  314. };
  315. //双点情况下更新
  316. ICHelper.OnPositionUpdate2 += (Vector2[] points, Vector2[] cameraLocations) =>
  317. {
  318. string _posText = "";
  319. HideUICrosshairs(0);
  320. HideUICrosshairs(1);
  321. float halfScreenWidth = Screen.width / 2f; // 假设为全屏宽度的一半
  322. for (int i = 0; i < points.Length; i++)
  323. {
  324. Vector2 point = points[i];
  325. // 判断是否为右屏并调整坐标
  326. if (i == 1)
  327. {
  328. point.x -= halfScreenWidth; // 同步到右屏坐标系
  329. }
  330. Ray ray = Camera.main.ScreenPointToRay(point);
  331. Vector3 rayEndPoint = ray.GetPoint(200);
  332. Quaternion quat = Quaternion.LookRotation(rayEndPoint - Camera.main.transform.position);
  333. if (i == 0)
  334. {
  335. //Object1 localRotation = quat;
  336. ShowUICrosshairs(cameraLocations[0], 0);
  337. ShowGameUICrosshairs(points[0], 0);
  338. _posText += "红0:" + points[0].ToString("F2");
  339. }
  340. if (i == 1)
  341. {
  342. //Object2 localRotation = quat;
  343. ShowUICrosshairs(cameraLocations[1], 1);
  344. ShowGameUICrosshairs(points[1], 1);
  345. _posText += "\n";
  346. _posText += "黄1:" + points[1].ToString("F2");
  347. }
  348. if (PosInfo) PosInfo.text = _posText;
  349. }
  350. };
  351. ICHelper.OnUVCIsReady += (UVCManager.CameraInfo camera) =>
  352. {
  353. //生成控制摄像机的参数滑条
  354. Debug.Log("初始化摄像机!");
  355. //延迟重新设置一次分辨率
  356. StartCoroutine(delayInitOhterInfo(camera));
  357. };
  358. //屏幕变化时候
  359. ICHelper.OnUVCPosUpdate += (list) =>
  360. {
  361. Debug.Log("OnUVCPosUpdate list.Count" + list.Count);
  362. SetLocatePointsToCameraRender(list, 1, 1);
  363. //InfraredScreenPositioningView 页面
  364. if (list.Count == 4)
  365. {
  366. FindObjectOfType<InfraredScreenPositioningView>()?.SyncScreenPosition();
  367. }
  368. else
  369. {
  370. FindObjectOfType<InfraredScreenPositioningView>()?.onReset();
  371. }
  372. };
  373. //算法准备事件
  374. ICHelper.OnScreenLocateIsReady += () =>
  375. {
  376. Debug.Log("OnScreenLocateIsReady.");
  377. //检测红外亮度阈值
  378. SetInfraredFilterValue(infraredFileterValue.Get());
  379. _infraredFilter.onValueChanged.AddListener(SetInfraredFilterValue);
  380. //默认设置双点模式
  381. mToggleSinglePoint.isOn = false;
  382. onToggleSinglePoint();
  383. InitCenterOffsets(PlayerType.FirstPlayer);
  384. InitCenterOffsets(PlayerType.SecondPlayer);
  385. //读取完成之后
  386. loadingPanel.gameObject.SetActive(false);
  387. };
  388. }
  389. }
  390. /// <summary>
  391. /// 更新屏幕下的十字准心位置
  392. /// </summary>
  393. /// <param name="value"></param>
  394. void ShowUICrosshairs(Vector2 newPoint2, int index)
  395. {
  396. ////获取一个偏移量,使得最后输出的准心是指向正中心
  397. //Vector2 newPoint2 = value - ICHelper.GetCenterOffset(value, "CameraLocation");
  398. // 检测到光点
  399. var pos = newPoint2.pixelToLocalPosition_AnchorCenter(ICHelper.GetUVCCameraInfo().Size, rawImage.rectTransform.rect);
  400. //红色为最大值则按顺序赋值,反之最小
  401. int curIndex = 0;
  402. if (bIdentifyRed)
  403. {
  404. curIndex = index;
  405. }
  406. else
  407. {
  408. curIndex = 1 - index;
  409. }
  410. _crosshairsInCamera[curIndex].gameObject.SetActive(true);
  411. _crosshairsInCamera[curIndex].anchoredPosition = pos;
  412. }
  413. /// <summary>
  414. /// 直接更新全屏UI位置
  415. /// </summary>
  416. /// <param name="newPoint2"></param>
  417. /// <param name="index"></param>
  418. void ShowGameUICrosshairs(Vector2 newPoint2, int index)
  419. {
  420. //红色为最大值则按顺序赋值,反之最小
  421. int curIndex = 0;
  422. if (bIdentifyRed)
  423. {
  424. curIndex = index;
  425. }
  426. else
  427. {
  428. curIndex = 1 - index;
  429. }
  430. //todo 游戏里面ui show index
  431. }
  432. void HideUICrosshairs(int index)
  433. {
  434. if (bIdentifyRed)
  435. {
  436. _crosshairsInCamera[index].gameObject.SetActive(false);
  437. }
  438. else
  439. {
  440. _crosshairsInCamera[1 - index].gameObject.SetActive(false);
  441. }
  442. }
  443. /// <summary>
  444. /// 初始化一些游戏配置
  445. /// </summary>
  446. /// <returns></returns>
  447. IEnumerator delayInitOhterInfo(UVCManager.CameraInfo camera)
  448. {
  449. yield return new WaitForEndOfFrame();
  450. #if UNITY_ANDROID || UNITY_IOS
  451. initSlider(camera);
  452. camera.GetResolutionsStrs();
  453. #endif
  454. #if UNITY_STANDALONE_WIN || UNITY_EDITOR
  455. initSliderPC();
  456. #endif
  457. }
  458. bool showPoints = false;
  459. public void SetLocatePointsToCameraRender(List<Vector2> points, float w, float h)
  460. {
  461. //Transform pointsTF2 = _cameraRender.transform.Find("Points");
  462. //if (pointsTF2.childCount == points.Count)
  463. //{
  464. // Vector2 texSize = new Vector2(w, h);
  465. // for (int i = 0; i < pointsTF2.childCount; i++)
  466. // {
  467. // Transform pointTF = pointsTF2.GetChild(i);
  468. // Vector2 pos = points[i];
  469. // pointTF.localPosition = pos.pixelToLocalPosition_AnchorCenter(texSize, _cameraRender.rectTransform.rect);
  470. // pointTF.gameObject.SetActive(true);
  471. // showPoints = true;
  472. // }
  473. //}
  474. //else
  475. //{
  476. // for (int i = 0; i < pointsTF2.childCount; i++)
  477. // {
  478. // Transform pointTF = pointsTF2.GetChild(i);
  479. // pointTF.gameObject.SetActive(false);
  480. // showPoints = false;
  481. // }
  482. //}
  483. //绘制数据
  484. DrawTestLine();
  485. }
  486. void DrawTestLine()
  487. {
  488. Vector2 texSize = ScreenLocate.Main.getUVCCameraInfoSize;
  489. // 判断 texSize 是否为有效值
  490. if (texSize == Vector2.zero)
  491. {
  492. Debug.LogWarning("Texture size is zero, cannot proceed with line drawing.");
  493. return;
  494. }
  495. if (ScreenLocate.quadUnityVectorList.Count == 4)
  496. {
  497. //绘制白色线段
  498. var lo = new Vector2(-0.5f, -0.5f);
  499. CurUILineGenerator.Points = new Vector2[4] {
  500. 2 * (ScreenLocate.quadUnityVectorList[0] + lo),
  501. 2 * (ScreenLocate.quadUnityVectorList[1] + lo),
  502. 2 * (ScreenLocate.quadUnityVectorList[3] + lo),
  503. 2 * (ScreenLocate.quadUnityVectorList[2] + lo) };
  504. }
  505. }
  506. #endregion
  507. #region 参数控制
  508. //调试UVC参数
  509. [Header("相机UVC")]
  510. [SerializeField] GameObject _cameraParameterPanel;
  511. [SerializeField] GameObject togglePrefab; // 拖入一个Toggle预设体
  512. [SerializeField] GameObject sliderPrefab; // 拖入一个Slider预设体
  513. //存储滑块信息。camera
  514. public Dictionary<string, ParamFloatValue> ParamFloatValueCameraSlider = new Dictionary<string, ParamFloatValue>();
  515. //自动曝光
  516. bool bAutoAE = false;
  517. Toggle CTRLAEToggle;
  518. Slider CTRLAEABSSlider;
  519. string[] sliderNameArray = new string[]{
  520. "自动曝光模式",
  521. "曝光时间(绝对)",
  522. "亮度", //
  523. "对比度",
  524. "色调",
  525. "饱和度",
  526. "锐度",
  527. "伽玛",
  528. //"白平衡温度",
  529. //"白平衡分量",
  530. "背光补偿",
  531. "增益" };
  532. string[] sliderStrArray = new string[]{
  533. "CTRL_AE",
  534. "CTRL_AE_ABS",
  535. "PU_BRIGHTNESS",
  536. "PU_CONTRAST",
  537. "PU_HUE",
  538. "PU_SATURATION",
  539. "PU_SHARPNESS",
  540. "PU_GAMMA",
  541. //"PU_WB_TEMP",
  542. //"PU_WB_COMPO",
  543. "PU_BACKLIGHT",
  544. "PU_GAIN" };
  545. UVCManager.CameraInfo currentCameraInfo;
  546. //初始化相机参数
  547. public void initSlider(UVCManager.CameraInfo cameraInfo)
  548. {
  549. if (currentCameraInfo != null) return;
  550. currentCameraInfo = cameraInfo;
  551. string[] sliderNameArrayKey = new string[] {
  552. "AutoExposureMode", // "自动曝光模式"
  553. "ExposureTimeAbsolute", // "曝光时间(绝对)"
  554. "Brightness", // "亮度"
  555. "Contrast", // "对比度"
  556. "Hue", // "色调"
  557. "Saturation", // "饱和度"
  558. "Sharpness", // "锐度"
  559. "Gamma", // "伽玛"
  560. "BacklightCompensation", // "背光补偿"
  561. "Gain" // "增益"
  562. };
  563. for (int i = 0; i < sliderStrArray.Length; i++)
  564. {
  565. string typeStr = sliderStrArray[i];
  566. Debug.Log("typeStr:" + typeStr);
  567. // UInt64 _VALUE = cameraInfo.GetTypeByName(typeStr);
  568. //不支持的,跳过
  569. bool bContains = cameraInfo.ContainsKey(typeStr);
  570. if (!bContains) continue;
  571. if (typeStr == "CTRL_AE")
  572. {
  573. //曝光Toggle
  574. GameObject toggleObject = Instantiate(togglePrefab, _cameraParameterPanel.transform);
  575. toggleObject.SetActive(true);
  576. toggleObject.name = typeStr;
  577. Text labelObj = toggleObject.transform.Find("Label").GetComponent<Text>();
  578. labelObj.text = sliderNameArray[i];
  579. Toggle toggle = toggleObject.GetComponent<Toggle>();
  580. CTRLAEToggle = toggle;
  581. UVCCtrlInfo _AEInfo = cameraInfo.GetInfo(typeStr);
  582. Debug.Log("UVCCtrlInfo:" + _AEInfo.ToString());
  583. int _currentValue = cameraInfo.GetValue(typeStr);
  584. bAutoAE = _currentValue == 8 ? true : false; //如果当前值是 8,则当前摄像机是自动曝光模式
  585. toggle.isOn = bAutoAE;
  586. //cameraInfo.SetValue(_VALUE, _currentValue!=8? 8:1);
  587. toggle.onValueChanged.AddListener((bool bValue) =>
  588. {
  589. //Debug.Log("Toggle value changed to: " + bValue + " from " + _VALUE);
  590. if (typeStr == "CTRL_AE")
  591. {
  592. //开关控制是否自动曝光
  593. bAutoAE = bValue;
  594. if (CTRLAEABSSlider) CTRLAEABSSlider.interactable = !bAutoAE;
  595. int _value = bValue ? 8 : 1;
  596. //Debug.Log("_value " + _value);
  597. cameraInfo.SetValue(typeStr, _value);
  598. }
  599. });
  600. }
  601. else
  602. {
  603. //其余使用slider
  604. GameObject sliderObject = Instantiate(sliderPrefab, _cameraParameterPanel.transform);
  605. sliderObject.SetActive(true);
  606. sliderObject.name = typeStr;
  607. Slider slider = sliderObject.GetComponent<Slider>();
  608. Text textObj = sliderObject.transform.Find("value").GetComponent<Text>();
  609. Text titleTextObj = sliderObject.transform.Find("title").GetComponent<Text>();
  610. titleTextObj.text = sliderNameArray[i];//类型名字
  611. if (slider != null)
  612. {
  613. UVCCtrlInfo _UVCCtrlInfo = cameraInfo.GetInfo(typeStr);
  614. Debug.Log(_UVCCtrlInfo.ToString());
  615. slider.minValue = _UVCCtrlInfo.min;
  616. slider.maxValue = _UVCCtrlInfo.max;
  617. slider.wholeNumbers = true;
  618. int _defValue = _UVCCtrlInfo.def;
  619. //指定默认值
  620. //5、UVC亮度 - 50
  621. //6、UVC对比度 - 50
  622. if (typeStr == "PU_BRIGHTNESS")
  623. {
  624. _defValue = 50;
  625. }
  626. else if (typeStr == "PU_CONTRAST")
  627. {
  628. _defValue = 50;
  629. }
  630. //记录一个typeStr类型的数据存储操作对象
  631. ParamFloatValue paramFloatValue = new ParamFloatValue("ic_uvc_" + typeStr, _defValue);
  632. ParamFloatValueCameraSlider.Add(typeStr, paramFloatValue);
  633. if (typeStr == "PU_BRIGHTNESS" || typeStr == "PU_CONTRAST")
  634. {
  635. //获取设置默认存储的值
  636. int _Value = (int)paramFloatValue.Get();
  637. cameraInfo.SetValue(typeStr, _Value);
  638. Debug.Log("[InfraredDemo] UVC 设置" + typeStr + "默认值:" + _Value);
  639. slider.value = _Value;
  640. textObj.text = _Value + "";
  641. }
  642. else
  643. {
  644. //获取设置当前值
  645. int _currentValue = cameraInfo.GetValue(typeStr);
  646. slider.value = _currentValue;
  647. textObj.text = _currentValue + "";
  648. }
  649. //如果是曝光slider
  650. if (typeStr == "CTRL_AE_ABS")
  651. {
  652. CTRLAEABSSlider = slider;
  653. slider.interactable = !bAutoAE;
  654. }
  655. slider.onValueChanged.AddListener((newValue) =>
  656. {
  657. var _value = Mathf.FloorToInt(newValue);
  658. textObj.text = _value + "";
  659. //Debug.Log("Slider value changed to: " + newValue + " from " + _VALUE);
  660. cameraInfo.SetValue(typeStr, _value);
  661. paramFloatValue.Set(_value);
  662. });
  663. }
  664. }
  665. }
  666. }
  667. public void OpenUVCPanel()
  668. {
  669. _cameraParameterPanel.SetActive(true);
  670. }
  671. public void CloseUVCPanel()
  672. {
  673. _cameraParameterPanel.SetActive(false);
  674. }
  675. public void onResetUVCData()
  676. {
  677. #if UNITY_ANDROID || UNITY_IOS
  678. resetUVCData();
  679. #endif
  680. #if UNITY_STANDALONE_WIN || UNITY_EDITOR
  681. resetPCData();
  682. #endif
  683. }
  684. void resetUVCData()
  685. {
  686. if (currentCameraInfo == null) return;
  687. for (int i = 0; i < sliderStrArray.Length; i++)
  688. {
  689. string typeStr = sliderStrArray[i];
  690. // UInt64 _VALUE = currentCameraInfo.GetTypeByName(typeStr);
  691. bool bContains = currentCameraInfo.ContainsKey(typeStr);
  692. if (!bContains) continue;
  693. if (typeStr == "CTRL_AE")
  694. {
  695. //toggle值不进行重置
  696. Debug.Log("CTRL_AE 不需要重置");
  697. }
  698. else if (typeStr == "CTRL_AE_ABS")
  699. {
  700. if (!bAutoAE)
  701. {
  702. //如果是手动曝光,重置值
  703. Transform trans = _cameraParameterPanel.transform.Find(typeStr);
  704. Slider slider = trans.GetComponent<Slider>();
  705. Text textObj = trans.Find("value").GetComponent<Text>();
  706. UVCCtrlInfo _AEInfo = currentCameraInfo.GetInfo(typeStr);
  707. //获取当前值
  708. int _currentValue = currentCameraInfo.GetValue(typeStr);
  709. Debug.Log("CTRL_AE_ABS:" + _currentValue + " = " + _AEInfo.def + " = " + ",bAutoAE:" + bAutoAE);
  710. textObj.text = _AEInfo.def + "";
  711. slider.value = _AEInfo.def;
  712. if (_AEInfo.def != _currentValue) currentCameraInfo.SetValue(typeStr, _AEInfo.def);
  713. }
  714. }
  715. else
  716. {
  717. Transform trans = _cameraParameterPanel.transform.Find(typeStr);
  718. Slider slider = trans.GetComponent<Slider>();
  719. Text textObj = trans.Find("value").GetComponent<Text>();
  720. UVCCtrlInfo _UVCCtrlInfo = currentCameraInfo.GetInfo(typeStr);
  721. ParamFloatValue paramFloatValue = ParamFloatValueCameraSlider.GetValueOrDefault(typeStr);
  722. //重置的值
  723. int _defValue = _UVCCtrlInfo.def;
  724. if (typeStr == "PU_BRIGHTNESS")
  725. {
  726. _defValue = (int)paramFloatValue.GetDefault();
  727. }
  728. else if (typeStr == "PU_CONTRAST")
  729. {
  730. _defValue = (int)paramFloatValue.GetDefault();
  731. }
  732. textObj.text = _defValue + "";
  733. slider.value = _defValue;
  734. //获取当前值
  735. int _currentValue = currentCameraInfo.GetValue(typeStr);
  736. //重置存储值
  737. paramFloatValue.Reset();
  738. //存储初始值,设置一次到UVC参数
  739. if (_defValue != _currentValue) currentCameraInfo.SetValue(typeStr, _defValue);
  740. }
  741. }
  742. }
  743. //windows 相机
  744. string[] sliderNameArrayPC = new string[]{
  745. "亮度",
  746. "对比度",};
  747. string[] sliderNameArrayPCKey = new string[]{
  748. "Brightness",
  749. "Contrast",};
  750. string[] sliderStrArrayPC = new string[]{
  751. "PU_BRIGHTNESS",
  752. "PU_CONTRAST"};
  753. //记录一个typeStr类型的数据存储操作对象
  754. ParamFloatValue pcBRIGHTNESS = new ParamFloatValue("ic_pc_PU_BRIGHTNESS", 0);
  755. ParamFloatValue pcCONTRAST = new ParamFloatValue("ic_pc_PU_CONTRAST", 0);
  756. public void initSliderPC()
  757. {
  758. for (int i = 0; i < sliderStrArrayPC.Length; i++)
  759. {
  760. string typeStr = sliderStrArrayPC[i];
  761. GameObject sliderObject = Instantiate(sliderPrefab, _cameraParameterPanel.transform);
  762. sliderObject.SetActive(true);
  763. sliderObject.name = typeStr;
  764. Slider slider = sliderObject.GetComponent<Slider>();
  765. Text textObj = sliderObject.transform.Find("value").GetComponent<Text>();
  766. Text titleTextObj = sliderObject.transform.Find("title").GetComponent<Text>();
  767. titleTextObj.text = sliderNameArrayPC[i];//类型名字
  768. if (slider != null)
  769. {
  770. slider.minValue = -1;
  771. slider.maxValue = 1;
  772. //记录一个typeStr类型的数据存储操作对象
  773. if (typeStr == "PU_BRIGHTNESS")
  774. {
  775. //获取设置默认存储的值
  776. float _Value = pcBRIGHTNESS.Get();
  777. ICHelper.SetBrightness(_Value);
  778. Debug.Log("[InfraredDemo] PC 设置 PU_BRIGHTNESS:" + typeStr + "默认值:" + _Value);
  779. slider.value = _Value;
  780. textObj.text = _Value + "";
  781. slider.onValueChanged.AddListener((newValue) =>
  782. {
  783. var _value = newValue;
  784. textObj.text = _value + "";
  785. ICHelper.SetBrightness(_value);
  786. pcBRIGHTNESS.Set(_value);
  787. });
  788. }
  789. else if (typeStr == "PU_CONTRAST")
  790. {
  791. //获取设置默认存储的值
  792. float _Value = pcCONTRAST.Get();
  793. ICHelper.SetContrast(_Value);
  794. Debug.Log("[InfraredDemo] PC 设置 PU_CONTRAST:" + typeStr + "默认值:" + _Value);
  795. slider.value = _Value;
  796. textObj.text = _Value + "";
  797. slider.onValueChanged.AddListener((newValue) =>
  798. {
  799. var _value = newValue;
  800. textObj.text = _value + "";
  801. ICHelper.SetContrast(_value);
  802. pcCONTRAST.Set(_value);
  803. });
  804. }
  805. }
  806. }
  807. }
  808. void resetPCData()
  809. {
  810. for (int i = 0; i < sliderStrArrayPC.Length; i++)
  811. {
  812. string typeStr = sliderStrArrayPC[i];
  813. Transform trans = _cameraParameterPanel.transform.Find(typeStr);
  814. Slider slider = trans.GetComponent<Slider>();
  815. Text textObj = trans.Find("value").GetComponent<Text>();
  816. //重置的值
  817. int _defValue = 0;
  818. if (typeStr == "PU_BRIGHTNESS")
  819. {
  820. _defValue = 0;
  821. ICHelper.SetBrightness(_defValue);
  822. }
  823. else if (typeStr == "PU_CONTRAST")
  824. {
  825. _defValue = 0;
  826. ICHelper.SetContrast(_defValue);
  827. }
  828. textObj.text = _defValue + "";
  829. slider.value = _defValue;
  830. }
  831. }
  832. public class ParamFloatValue
  833. {
  834. private string _saveKey;
  835. private float _valueDefault;
  836. private bool _valueLoaded;
  837. private float _value;
  838. public ParamFloatValue(string saveKey, float valueDefault)
  839. {
  840. _saveKey = saveKey;
  841. _valueDefault = valueDefault;
  842. }
  843. public float Get()
  844. {
  845. if (!_valueLoaded) _value = PlayerPrefs.GetFloat(_saveKey, _valueDefault);
  846. return _value;
  847. }
  848. public float GetDefault()
  849. {
  850. return _valueDefault;
  851. }
  852. public string GetKey()
  853. {
  854. return _saveKey;
  855. }
  856. public void Set(float value)
  857. {
  858. _value = value;
  859. PlayerPrefs.SetFloat(_saveKey, _value);
  860. PlayerPrefs.Save();
  861. }
  862. /// <summary>
  863. /// 重置成默认值
  864. /// </summary>
  865. public void Reset()
  866. {
  867. PlayerPrefs.SetFloat(_saveKey, _valueDefault);
  868. PlayerPrefs.Save();
  869. }
  870. }
  871. /// <summary>
  872. /// 存储Vector2
  873. /// </summary>
  874. public class ParamVector2Value
  875. {
  876. private string _saveKey;
  877. private Vector2 _valueDefault;
  878. private bool _valueLoaded;
  879. private Vector2 _value;
  880. public ParamVector2Value(string saveKey, Vector2 valueDefault)
  881. {
  882. _saveKey = saveKey;
  883. _valueDefault = valueDefault;
  884. }
  885. public Vector2 Get()
  886. {
  887. if (!_valueLoaded)
  888. {
  889. float x = PlayerPrefs.GetFloat(_saveKey + "_x", _valueDefault.x);
  890. float y = PlayerPrefs.GetFloat(_saveKey + "_y", _valueDefault.y);
  891. _value = new Vector2(x, y);
  892. _valueLoaded = true;
  893. }
  894. return _value;
  895. }
  896. public Vector2 GetDefault()
  897. {
  898. return _valueDefault;
  899. }
  900. public string GetKey()
  901. {
  902. return _saveKey;
  903. }
  904. public void Set(Vector2 value)
  905. {
  906. _value = value;
  907. PlayerPrefs.SetFloat(_saveKey + "_x", _value.x);
  908. PlayerPrefs.SetFloat(_saveKey + "_y", _value.y);
  909. PlayerPrefs.Save();
  910. }
  911. /// <summary>
  912. /// 重置成默认值
  913. /// </summary>
  914. public void Reset()
  915. {
  916. PlayerPrefs.SetFloat(_saveKey + "_x", _valueDefault.x);
  917. PlayerPrefs.SetFloat(_saveKey + "_y", _valueDefault.y);
  918. PlayerPrefs.Save();
  919. }
  920. }
  921. #endregion
  922. #region 相机感光度(默认修改对比度)
  923. public void onSetSliderCustomValue(Slider _slider, float min = 0.0f, float max = 10.0f)
  924. {
  925. onSetSliderValue(_slider, "PU_CONTRAST", min, max);
  926. }
  927. public void onSliderCustomEvent(float value, float min = 0.0f, float max = 10.0f)
  928. {
  929. onSliderEvent(value, "PU_CONTRAST", min, max);
  930. }
  931. public void onSetSliderCustomBrightnessValue(Slider _slider, float min = 0.0f, float max = 10.0f)
  932. {
  933. onSetSliderValue(_slider, "PU_BRIGHTNESS", min, max);
  934. }
  935. public void onSliderCustomBrightnessEvent(float value, float min = 0.0f, float max = 10.0f)
  936. {
  937. onSliderEvent(value, "PU_BRIGHTNESS", min, max);
  938. }
  939. public void onSetSliderValue(Slider _slider, string typeStr = "PU_CONTRAST", float min = 0.0f, float max = 10.0f)
  940. {
  941. if (BluetoothWindows.IsWindows())
  942. {
  943. float v = typeStr == "PU_CONTRAST" ? ICHelper.GetContrast() : ICHelper.GetBrightness();
  944. // 目标区间 [0, 10] 的边界值
  945. double targetMin = min;
  946. double targetMax = max;
  947. double originalMin = -1;
  948. double originalMax = 1;
  949. // 计算转换后的值
  950. double v2 = MapValue(v, originalMin, originalMax, targetMin, targetMax);
  951. Debug.Log("PC获取相机的感光度 " + typeStr + " :" + v + " = " + v2);
  952. _slider.SetValueWithoutNotify((float)v2);
  953. return;
  954. }
  955. //功能也改为UVC的对比度
  956. if (ICHelper != null)
  957. {
  958. //string typeStr = "PU_CONTRAST";//"PU_BRIGHTNESS";
  959. //UInt64 _VALUE = currentCameraInfo.GetTypeByName(typeStr);
  960. UVCCtrlInfo _UVCCtrlInfo = currentCameraInfo.GetInfo(typeStr);
  961. float v = currentCameraInfo.GetValue(typeStr); // ICHelper.GetBrightness();
  962. //float v2 = (v / _UVCCtrlInfo.max) * 10;
  963. // 目标区间 [0, 10] 的边界值
  964. double targetMin = min;
  965. double targetMax = max;
  966. double originalMin = _UVCCtrlInfo.min;
  967. double originalMax = _UVCCtrlInfo.max;
  968. // 计算转换后的值
  969. double v2 = MapValue(v, originalMin, originalMax, targetMin, targetMax);
  970. Debug.Log("获取相机的感光度" + typeStr + ": " + v + " = " + v2);
  971. _slider.SetValueWithoutNotify((float)v2);
  972. }
  973. else _slider.SetValueWithoutNotify(5);
  974. }
  975. public void onSliderEvent(float value, string typeStr = "PU_CONTRAST", float min = 0.0f, float max = 10.0f)
  976. {
  977. // string typeStr = "PU_CONTRAST";// "PU_BRIGHTNESS";
  978. //pc
  979. if (BluetoothWindows.IsWindows())
  980. {
  981. Transform trans = _cameraParameterPanel.transform.Find(typeStr);
  982. Slider slider = trans.GetComponent<Slider>();
  983. Text textObj = trans.Find("value").GetComponent<Text>();
  984. // 原始区间和目标区间的边界值
  985. double originalMin = min;
  986. double originalMax = max;
  987. double targetMin = -1;
  988. double targetMax = 1;
  989. // 计算转换后的值
  990. double result = MapValue(value, originalMin, originalMax, targetMin, targetMax);
  991. float _current = (float)result;
  992. //Debug.Log("_current:" + _current + " , result:" + result);
  993. textObj.text = _current + "";
  994. slider.value = _current;
  995. if (typeStr == "PU_CONTRAST")
  996. {
  997. ICHelper.SetContrast(_current);
  998. pcCONTRAST.Set(_current);
  999. }
  1000. else
  1001. {
  1002. ICHelper.SetBrightness(_current);
  1003. pcBRIGHTNESS.Set(_current);
  1004. }
  1005. return;
  1006. }
  1007. //修改亮度时,调试界面的亮度也应该一起修改
  1008. //功能也改为UVC的对比度
  1009. if (ICHelper != null)
  1010. {
  1011. //Slider slider = transform.Find("InfraredCamera/Layout/SliderBrightness")
  1012. // .GetComponent<Slider>();
  1013. // UInt64 _VALUE = currentCameraInfo.GetTypeByName(typeStr);
  1014. Transform trans = _cameraParameterPanel.transform.Find(typeStr);
  1015. Slider slider = trans.GetComponent<Slider>();
  1016. Text textObj = trans.Find("value").GetComponent<Text>();
  1017. UVCCtrlInfo _UVCCtrlInfo = currentCameraInfo.GetInfo(typeStr);
  1018. int _currentUVCValue = currentCameraInfo.GetValue(typeStr);
  1019. //value 0 ~ 10
  1020. // 原始区间和目标区间的边界值
  1021. double originalMin = min;
  1022. double originalMax = max;
  1023. double targetMin = _UVCCtrlInfo.min;
  1024. double targetMax = _UVCCtrlInfo.max;
  1025. // 计算转换后的值
  1026. double result = MapValue(value, originalMin, originalMax, targetMin, targetMax);
  1027. int _current = (int)(result);
  1028. Debug.Log("_current:" + value + " , result:" + result);
  1029. textObj.text = _current + "";
  1030. slider.value = _current;
  1031. //dUVCParameters.GetValueOrDefault(typeStr).Set(_current);
  1032. //存储初始值,设置一次到UVC参数
  1033. if (_currentUVCValue != _current) currentCameraInfo.SetValue(typeStr, _current);
  1034. }
  1035. }
  1036. public static double MapValue(double value, double originalMin, double originalMax, double targetMin, double targetMax)
  1037. {
  1038. // 线性插值公式
  1039. return targetMin + (value - originalMin) * (targetMax - targetMin) / (originalMax - originalMin);
  1040. }
  1041. #endregion
  1042. /// <summary>
  1043. /// 提取转换四边形的方法
  1044. /// </summary>
  1045. /// <param name="quad"></param>
  1046. /// <param name="texSize"></param>
  1047. /// <returns></returns>
  1048. public Vector2[] ConvertQuadToPoints(QuadrilateralInCamera quad, Vector2 texSize)
  1049. {
  1050. if (quad == null || quad.Quad == null || quad.Quad.Count < 4)
  1051. {
  1052. Debug.LogWarning("Invalid quadrilateral data provided.");
  1053. return new Vector2[0]; // 返回空数组以避免异常
  1054. }
  1055. Vector2 offset = new Vector2(-0.5f, -0.5f); // 假设 'lo' 是某个已定义的偏移量
  1056. return new Vector2[4] {
  1057. 2 * (new Vector2(quad.Quad[0].x / texSize.x, quad.Quad[0].y / texSize.y) + offset),
  1058. 2 * (new Vector2(quad.Quad[1].x / texSize.x, quad.Quad[1].y / texSize.y) + offset),
  1059. 2 * (new Vector2(quad.Quad[3].x / texSize.x, quad.Quad[3].y / texSize.y) + offset),
  1060. 2 * (new Vector2(quad.Quad[2].x / texSize.x, quad.Quad[2].y / texSize.y) + offset)
  1061. };
  1062. }
  1063. #region 中心点定位
  1064. [Header("红外点")]
  1065. [SerializeField] Text _infraredOffsetText;
  1066. [SerializeField] Button _infraredOffsetBtn1P;
  1067. [SerializeField] Button _infraredOffsetBtn2P;
  1068. //准心的偏移值
  1069. public ParamVector2Value cameraLocationValue = new ParamVector2Value("ic_cameraLocation", Vector2.zero);
  1070. public ParamVector2Value screenUVValue = new ParamVector2Value("ic_screenUV", Vector2.zero);
  1071. public ParamVector2Value cameraLocationValue1P = new ParamVector2Value("ic_cameraLocation1P", Vector2.zero);
  1072. public ParamVector2Value screenUVValue1P = new ParamVector2Value("ic_screenUV1P", Vector2.zero);
  1073. public ParamVector2Value cameraLocationValue2P = new ParamVector2Value("ic_cameraLocation2P", Vector2.zero);
  1074. public ParamVector2Value screenUVValue2P = new ParamVector2Value("ic_screenUV2P", Vector2.zero);
  1075. /// <summary>
  1076. /// 偏移点按钮
  1077. /// </summary>
  1078. public void InitOffsetBtns()
  1079. {
  1080. _infraredOffsetBtn1P.onClick.AddListener(() =>
  1081. {
  1082. SetAdjustPointsOffset(PlayerType.FirstPlayer);
  1083. });
  1084. _infraredOffsetBtn2P.onClick.AddListener(() =>
  1085. {
  1086. SetAdjustPointsOffset(PlayerType.SecondPlayer);
  1087. });
  1088. }
  1089. /// <summary>
  1090. /// 设置存储的中心偏移位置
  1091. /// </summary>
  1092. public void InitCenterOffset()
  1093. {
  1094. //ICHelper.SetCenterOffset(cameraLocationValue.Get(), "CameraLocation");
  1095. //ICHelper.SetCenterOffset(screenUVValue.Get(), "ScreenUV");
  1096. }
  1097. /// <summary>
  1098. /// 重置中心点
  1099. /// </summary>
  1100. public void ResetCenterOffset()
  1101. {
  1102. ICHelper.ResetCenterOffset();
  1103. }
  1104. /// <summary>
  1105. /// 撤销中心点
  1106. /// </summary>
  1107. public void RevokeCenterOffset()
  1108. {
  1109. ICHelper.RevokeCenterOffset();
  1110. }
  1111. /// <summary>
  1112. /// 重置定位数据
  1113. /// </summary>
  1114. public void ResetPositioningData(bool bSyncLocal = false)
  1115. {
  1116. ICHelper.ClearInfraredPositioningData(bSyncLocal);
  1117. }
  1118. /// <summary>
  1119. /// 设置存储的中心偏移位置--双点
  1120. /// </summary>
  1121. public void InitCenterOffsets(PlayerType playerType)
  1122. {
  1123. if (ICHelper.IsSinglePoint())
  1124. {
  1125. ICHelper.SetCenterOffset(cameraLocationValue.Get(), "CameraLocation");
  1126. ICHelper.SetCenterOffset(screenUVValue.Get(), "ScreenUV");
  1127. }
  1128. else
  1129. {
  1130. ICHelper.SetCenterOffsets(playerType, playerType == PlayerType.FirstPlayer ? cameraLocationValue1P.Get() : cameraLocationValue2P.Get(), "CameraLocation");
  1131. ICHelper.SetCenterOffsets(playerType, playerType == PlayerType.FirstPlayer ? screenUVValue1P.Get() : screenUVValue2P.Get(), "ScreenUV");
  1132. }
  1133. }
  1134. /// <summary>
  1135. /// 撤销中心点--双点
  1136. /// </summary>
  1137. public void RevokeCenterOffsets()
  1138. {
  1139. ICHelper.RevokeCenterOffsets();
  1140. }
  1141. /// <summary>
  1142. /// 重置中心点--双点
  1143. /// </summary>
  1144. public void ResetCenterOffsets()
  1145. {
  1146. ICHelper.ResetCenterOffsets();
  1147. }
  1148. /// <summary>
  1149. /// 校准中心点偏移量,双点情况下要设置 SetCenterOffsets
  1150. /// </summary>
  1151. /// <param name="playerType">玩家类型</param>
  1152. public void SetAdjustPointsOffset(PlayerType playerType)
  1153. {
  1154. var buffer = ICHelper.getScreenLocate().infraredSpotBuffer;
  1155. if (buffer != null)
  1156. {
  1157. if (playerType == PlayerType.FirstPlayer && buffer[0].CameraLocation != null)
  1158. {
  1159. if (ICHelper.IsSinglePoint())
  1160. { //单点
  1161. var centerOffset = ICHelper.GetCenterOffset(buffer[0].CameraLocation.Value);
  1162. cameraLocationValue.Set(centerOffset);
  1163. var uvCenterOffset = ICHelper.GetCenterOffset(buffer[0].ScreenUV.Value, "ScreenUV");
  1164. screenUVValue.Set(uvCenterOffset);
  1165. }
  1166. else
  1167. {
  1168. var centerOffset = ICHelper.GetCenterOffset(buffer[0].CameraLocation.Value, true);
  1169. cameraLocationValue1P.Set(centerOffset);
  1170. ICHelper.SetCenterOffsets(playerType, centerOffset);
  1171. var uvCenterOffset = ICHelper.GetCenterOffset(buffer[0].ScreenUV.Value, true, "ScreenUV");
  1172. screenUVValue1P.Set(uvCenterOffset);
  1173. ICHelper.SetCenterOffsets(playerType, uvCenterOffset, "ScreenUV");
  1174. }
  1175. }
  1176. if (playerType == PlayerType.SecondPlayer && buffer[1].CameraLocation != null)
  1177. {
  1178. var centerOffset = ICHelper.GetCenterOffset(buffer[1].CameraLocation.Value, false);
  1179. cameraLocationValue2P.Set(centerOffset);
  1180. ICHelper.SetCenterOffsets(playerType, centerOffset);
  1181. var uvCenterOffset = ICHelper.GetCenterOffset(buffer[1].ScreenUV.Value, false, "ScreenUV");
  1182. screenUVValue2P.Set(uvCenterOffset);
  1183. ICHelper.SetCenterOffsets(playerType, uvCenterOffset, "ScreenUV");
  1184. }
  1185. }
  1186. }
  1187. #endregion
  1188. #region Log 控制台
  1189. //控制台
  1190. private bool s_LogReporterInited = false;
  1191. Reporter reporter;
  1192. public void InitReturnLogReporter()
  1193. {
  1194. if (s_LogReporterInited) return;
  1195. s_LogReporterInited = true;
  1196. GameObject obj = (GameObject)Instantiate(Resources.Load("Prefabs/LogReporter"));
  1197. reporter = obj.GetComponent<Reporter>();
  1198. Debug.LogWarning("在屏幕上画个圈即可打开控制台");
  1199. }
  1200. #endregion
  1201. #region 准心
  1202. //红外准心,默认打开吧
  1203. public ParamFloatValue crosshairValue1P = new ParamFloatValue("ic_crosshairValue1P", 1);
  1204. public ParamFloatValue crosshairValue2P = new ParamFloatValue("ic_crosshairValue2P", 1);
  1205. /// <summary>
  1206. /// 初始化时候获取设置和存储来控制显示准心
  1207. /// </summary>
  1208. /// <returns></returns>
  1209. public bool bInitCrosshairShow(PlayerType playerType)
  1210. {
  1211. if (playerType == PlayerType.FirstPlayer)
  1212. return getCrosshairValue(playerType) == 1 ? true : false;
  1213. else
  1214. return getCrosshairValue(playerType) == 1 ? true : false;
  1215. }
  1216. /// <summary>
  1217. /// 获取弓箭准心存储值
  1218. /// </summary>
  1219. /// <returns></returns>
  1220. public int getCrosshairValue(PlayerType playerType)
  1221. {
  1222. if (playerType == PlayerType.FirstPlayer)
  1223. return (int)crosshairValue1P.Get();
  1224. else
  1225. return (int)crosshairValue2P.Get();
  1226. }
  1227. public void setCrosshairValue(PlayerType playerType, bool bshow)
  1228. {
  1229. if (playerType == PlayerType.FirstPlayer)
  1230. crosshairValue1P.Set(bshow ? 1 : 0);
  1231. else
  1232. crosshairValue2P.Set(bshow ? 1 : 0);
  1233. }
  1234. #endregion
  1235. #region 亮度检测部分
  1236. //红外线阈值
  1237. [Header("红外线阈值")]
  1238. [SerializeField] Slider _infraredFilter;
  1239. //亮度过滤阈值 - 0.8
  1240. public ParamFloatValue infraredFileterValue = new ParamFloatValue("ic_infraredFileterValue", 0.8f);
  1241. public void SetInfraredFilterValue(float v)
  1242. {
  1243. infraredFileterValue.Set(v);
  1244. _infraredFilter.SetValueWithoutNotify(infraredFileterValue.Get());
  1245. _infraredFilter.transform.Find("value").GetComponent<Text>().text = infraredFileterValue.Get().ToString("f1");
  1246. ICHelper.SetInfraredLocateBrightnessThreshold(infraredFileterValue.Get());
  1247. }
  1248. #endregion
  1249. }
  1250. }