InfraredDemo.cs 43 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5. using InfraredManager;
  6. using ZIM;
  7. using System.Linq;
  8. using SLAMUVC;
  9. using System;
  10. using SmartBowSDK;
  11. using ZIM.Unity;
  12. using o0InfraredLocate.ZIM;
  13. public class InfraredDemo : MonoBehaviour
  14. {
  15. public static bool DebugInEditor = true;
  16. public static InfraredDemo _ins;
  17. [SerializeField]
  18. RectTransform canvasRectTransform;
  19. public Button mBtnSee;
  20. public static void Create()
  21. {
  22. if (_ins) return;
  23. GameObject o = Instantiate(Resources.Load<GameObject>("InfraredDemo"));
  24. DontDestroyOnLoad(o);
  25. _ins = o.GetComponent<InfraredDemo>();
  26. //直接初始化一次
  27. _ins.InitInfraredCamera();
  28. }
  29. void Start()
  30. {
  31. if (Application.platform != RuntimePlatform.WindowsEditor) DebugInEditor = false;
  32. SetVisiable(false);
  33. InitDebugScreenPoint();
  34. gameObject.AddComponent<FPSTester>();
  35. mBtnSee.interactable = false;
  36. mBtnSee.transform.Find("Text").GetComponent<Text>().text = "等待初始化..";
  37. //直接初始化一次
  38. //InitInfraredCamera();
  39. Debug.Log("[InfraredDemo] Start Function!");
  40. #if UNITY_STANDALONE_WIN
  41. _calibrationFixedText.transform.parent.gameObject.SetActive(false);
  42. #endif
  43. }
  44. void Update()
  45. {
  46. UpdateInfraredCamera();
  47. //UpdateDebugScreenPoint();
  48. }
  49. public void OnClick_See()
  50. {
  51. SetVisiable(!_visiable);
  52. }
  53. //初始化一次 initScreenLocateManual
  54. bool hasCalled = false;
  55. bool _visiable;
  56. void SetVisiable(bool value)
  57. {
  58. _visiable = value;
  59. transform.Find("Background").gameObject.SetActive(value);
  60. transform.Find("InfraredCamera").gameObject.SetActive(value);
  61. transform.Find("BtnSee").GetComponentInChildren<Text>().text = value ? "隐藏界面" : "调试红外";
  62. //if (value) InitInfraredCamera();
  63. if (!hasCalled && value)
  64. {
  65. hasCalled = true;
  66. //如果本地有记录,初始化一次
  67. StartCoroutine(initScreenLocateManual());
  68. Debug.Log("[InfraredDemo] SetVisiable Function!");
  69. }
  70. }
  71. Text _spText;
  72. Vector2 _screenPoint;
  73. void InitDebugScreenPoint()
  74. {
  75. _spText = transform.Find("SPText").GetComponent<Text>();
  76. //_spText.gameObject.SetActive(DebugInEditor);
  77. _spText.gameObject.SetActive(false);
  78. }
  79. void UpdateDebugScreenPoint()
  80. {
  81. if (!DebugInEditor) return;
  82. if (infraredCameraHelper == null) return;
  83. _screenPoint.x = Mathf.Clamp(
  84. _screenPoint.x + Input.GetAxis("Horizontal") * Screen.width / 400f,
  85. 0, Screen.width);
  86. _screenPoint.y = Mathf.Clamp(
  87. _screenPoint.y + Input.GetAxis("Vertical") * Screen.height / 400f,
  88. 0, Screen.height);
  89. infraredCameraHelper.InvokeOnPositionUpdate(_screenPoint);
  90. _spText.text = _screenPoint.ToString();
  91. }
  92. #region 红外摄像
  93. [SerializeField] RawImage _cameraRender;
  94. [SerializeField] RawImage _cameraRender2;
  95. /// <summary>
  96. /// 测试texture
  97. /// </summary>
  98. public RawImage MyCameraRender2
  99. {
  100. get { return _cameraRender2; }
  101. set { _cameraRender2 = value; }
  102. }
  103. //[SerializeField] MaintainAspectRatio _MaintainAspectRatio;
  104. [SerializeField] List<RectTransform> _crosshairsInCamera;
  105. [SerializeField] Slider _sliderShakeFilter;
  106. [SerializeField] Button _btnReset;
  107. [SerializeField] Button _btnScreenLocateManual;
  108. [SerializeField] Button _btnScreenLocateManualAuto;
  109. [SerializeField] Slider _sliderCapture;
  110. [SerializeField] Slider _sliderDelay;
  111. [SerializeField] Dropdown _dropdownResolution;
  112. [SerializeField] Dropdown _dropdownResolution2;
  113. [SerializeField] Slider _sliderLineWidth;
  114. //红外线阈值
  115. [SerializeField] Slider _infraredFilter;
  116. //调试UVC参数
  117. [SerializeField] GameObject _cameraParameterPanel;
  118. [SerializeField] Button _btnAdjusting;
  119. //野鸭选择
  120. [SerializeField] Dropdown _duckLevelDropdown;
  121. //Dictionary<string, ParamFloatValue> dUVCParameters = new Dictionary<string, ParamFloatValue>();
  122. //public ParamFloatValue brightness = new ParamFloatValue("ic_brightness", 1.0f);
  123. //public ParamFloatValue saturation = new ParamFloatValue("ic_saturation", 1.0f);
  124. //public ParamFloatValue contrast = new ParamFloatValue("ic_contrast", 1.0f);
  125. #if UNITY_ANDROID
  126. //初始化纹理-1280*720,index = 0
  127. // public ParamFloatValue resoution = new ParamFloatValue("ic_resoution2", 0);
  128. //摄像机分辨率 -320*240,index = 10
  129. public ParamFloatValue resoutionNew = new ParamFloatValue("ic_resoutionNew", 10);
  130. //摄像机分辨率 -只处理高低分辨率情况
  131. public ParamFloatValue resoution = new ParamFloatValue("ic_resoution", 0);
  132. string[] resolutions = { "高分辨率", "低分辨率" };
  133. #endif
  134. //抖动过滤值 - 6.0
  135. public ParamFloatValue shakeFilterValue = new ParamFloatValue("ic_shakeFilterValue2", 6.0f);
  136. //亮度过滤阈值 - 0.8
  137. public ParamFloatValue infraredFileterValue = new ParamFloatValue("ic_infraredFileterValue", 0.8f);
  138. //线段宽度阈值
  139. public ParamFloatValue lineWidth = new ParamFloatValue("ic_lineWidth", 10.0f);
  140. public ParamFloatValue captureValue = new ParamFloatValue("ic_captureValue", 30.0f);
  141. public ParamFloatValue delayValue = new ParamFloatValue("ic_delayValue", 30.0f);
  142. //红外准心,默认打开吧
  143. public ParamFloatValue crosshairValue = new ParamFloatValue("ic_crosshairValue",1);
  144. //野鸭测试存储
  145. public ParamFloatValue duckHunterLevel = new ParamFloatValue("test_duckHunterLevelValue", 1);
  146. public static InfraredCameraHelper infraredCameraHelper;
  147. public static bool running { get => infraredCameraHelper != null; }
  148. private bool _inited;
  149. #region 参数控制
  150. public GameObject togglePrefab; // 拖入一个Toggle预设体
  151. public GameObject sliderPrefab; // 拖入一个Slider预设体
  152. public GameObject spawnPoint;
  153. //自动曝光
  154. bool bAutoAE = false;
  155. Toggle CTRLAEToggle;
  156. Slider CTRLAEABSSlider;
  157. string[] sliderNameArray = new string[]{
  158. "自动曝光模式",
  159. "曝光时间(绝对)",
  160. "亮度", //
  161. "对比度",
  162. "色调",
  163. "饱和度",
  164. "锐度",
  165. "伽玛",
  166. //"白平衡温度",
  167. //"白平衡分量",
  168. "背光补偿",
  169. "增益" };
  170. string[] sliderStrArray = new string[]{
  171. "CTRL_AE",
  172. "CTRL_AE_ABS",
  173. "PU_BRIGHTNESS",
  174. "PU_CONTRAST",
  175. "PU_HUE",
  176. "PU_SATURATION",
  177. "PU_SHARPNESS",
  178. "PU_GAMMA",
  179. //"PU_WB_TEMP",
  180. //"PU_WB_COMPO",
  181. "PU_BACKLIGHT",
  182. "PU_GAIN" };
  183. UVCManager.CameraInfo currentCameraInfo;
  184. //初始化相机参数
  185. public void initSlider(UVCManager.CameraInfo cameraInfo)
  186. {
  187. if (currentCameraInfo != null) return;
  188. currentCameraInfo = cameraInfo;
  189. for (int i = 0; i < sliderStrArray.Length; i++)
  190. {
  191. string typeStr = sliderStrArray[i];
  192. // UInt64 _VALUE = cameraInfo.GetTypeByName(typeStr);
  193. //不支持的,跳过
  194. bool bContains = cameraInfo.ContainsKey(typeStr);
  195. if (!bContains) continue;
  196. if (typeStr == "CTRL_AE")
  197. {
  198. //曝光Toggle
  199. GameObject toggleObject = Instantiate(togglePrefab, spawnPoint.transform);
  200. toggleObject.SetActive(true);
  201. toggleObject.name = typeStr;
  202. Text labelObj = toggleObject.transform.Find("Label").GetComponent<Text>();
  203. labelObj.text = sliderNameArray[i];
  204. Toggle toggle = toggleObject.GetComponent<Toggle>();
  205. CTRLAEToggle = toggle;
  206. UVCCtrlInfo _AEInfo = cameraInfo.GetInfo(typeStr);
  207. Debug.Log("UVCCtrlInfo:" + _AEInfo.ToString());
  208. int _currentValue = cameraInfo.GetValue(typeStr);
  209. bAutoAE = _currentValue == 8 ? true : false; //如果当前值是 8,则当前摄像机是自动曝光模式
  210. toggle.isOn = bAutoAE;
  211. //cameraInfo.SetValue(_VALUE, _currentValue!=8? 8:1);
  212. toggle.onValueChanged.AddListener((bool bValue) =>
  213. {
  214. //Debug.Log("Toggle value changed to: " + bValue + " from " + _VALUE);
  215. if (typeStr == "CTRL_AE")
  216. {
  217. //开关控制是否自动曝光
  218. bAutoAE = bValue;
  219. if (CTRLAEABSSlider) CTRLAEABSSlider.interactable = !bAutoAE;
  220. int _value = bValue ? 8 : 1;
  221. //Debug.Log("_value " + _value);
  222. cameraInfo.SetValue(typeStr, _value);
  223. }
  224. });
  225. }
  226. else
  227. {
  228. //其余使用slider
  229. GameObject sliderObject = Instantiate(sliderPrefab, spawnPoint.transform);
  230. sliderObject.SetActive(true);
  231. sliderObject.name = typeStr;
  232. Slider slider = sliderObject.GetComponent<Slider>();
  233. Text textObj = sliderObject.transform.Find("text").GetComponent<Text>();
  234. Text titleTextObj = sliderObject.transform.Find("title").GetComponent<Text>();
  235. titleTextObj.text = sliderNameArray[i];//类型名字
  236. if (slider != null)
  237. {
  238. UVCCtrlInfo _UVCCtrlInfo = cameraInfo.GetInfo(typeStr);
  239. slider.minValue = _UVCCtrlInfo.min;
  240. slider.maxValue = _UVCCtrlInfo.max;
  241. slider.wholeNumbers = true;
  242. int _defValue = _UVCCtrlInfo.def;
  243. //指定默认值
  244. //5、UVC亮度 - 50
  245. //6、UVC对比度 - 50
  246. if (typeStr == "PU_BRIGHTNESS") {
  247. _defValue = 50;
  248. } else if (typeStr == "PU_CONTRAST") {
  249. _defValue = 50;
  250. }
  251. //记录一个typeStr类型的数据存储操作对象
  252. ParamFloatValue paramFloatValue = new ParamFloatValue("ic_uvc_" + typeStr, _defValue);
  253. if (typeStr == "PU_BRIGHTNESS" || typeStr == "PU_CONTRAST")
  254. {
  255. //获取设置默认存储的值
  256. int _Value = (int)paramFloatValue.Get();
  257. cameraInfo.SetValue(typeStr, _Value);
  258. Debug.Log("[InfraredDemo] UVC 设置" + typeStr + "默认值:" + _Value);
  259. slider.value = _Value;
  260. textObj.text = _Value + "";
  261. }
  262. else {
  263. //获取设置当前值
  264. int _currentValue = cameraInfo.GetValue(typeStr);
  265. slider.value = _currentValue;
  266. textObj.text = _currentValue + "";
  267. }
  268. //如果是曝光slider
  269. if (typeStr == "CTRL_AE_ABS")
  270. {
  271. CTRLAEABSSlider = slider;
  272. slider.interactable = !bAutoAE;
  273. }
  274. slider.onValueChanged.AddListener((newValue) =>
  275. {
  276. var _value = Mathf.FloorToInt(newValue);
  277. textObj.text = _value + "";
  278. //Debug.Log("Slider value changed to: " + newValue + " from " + _VALUE);
  279. cameraInfo.SetValue(typeStr, _value);
  280. });
  281. }
  282. }
  283. }
  284. }
  285. public void OpenUVCPanel()
  286. {
  287. _cameraParameterPanel.SetActive(true);
  288. }
  289. public void CloseUVCPanel()
  290. {
  291. _cameraParameterPanel.SetActive(false);
  292. }
  293. public void onResetUVCData()
  294. {
  295. #if UNITY_ANDROID
  296. resetUVCData();
  297. #endif
  298. #if UNITY_STANDALONE_WIN || UNITY_EDITOR
  299. resetPCData();
  300. #endif
  301. }
  302. void resetUVCData() {
  303. if (currentCameraInfo == null) return;
  304. for (int i = 0; i < sliderStrArray.Length; i++)
  305. {
  306. string typeStr = sliderStrArray[i];
  307. // UInt64 _VALUE = currentCameraInfo.GetTypeByName(typeStr);
  308. bool bContains = currentCameraInfo.ContainsKey(typeStr);
  309. if (!bContains) continue;
  310. if (typeStr == "CTRL_AE")
  311. {
  312. //toggle值不进行重置
  313. Debug.Log("CTRL_AE 不需要重置");
  314. }
  315. else if (typeStr == "CTRL_AE_ABS")
  316. {
  317. if (!bAutoAE)
  318. {
  319. //如果是手动曝光,重置值
  320. Transform trans = _cameraParameterPanel.transform.Find(typeStr);
  321. Slider slider = trans.GetComponent<Slider>();
  322. Text textObj = trans.Find("text").GetComponent<Text>();
  323. UVCCtrlInfo _AEInfo = currentCameraInfo.GetInfo(typeStr);
  324. //获取当前值
  325. int _currentValue = currentCameraInfo.GetValue(typeStr);
  326. Debug.Log("CTRL_AE_ABS:" + _currentValue + " = " + _AEInfo.def + " = " + ",bAutoAE:" + bAutoAE);
  327. textObj.text = _AEInfo.def + "";
  328. slider.value = _AEInfo.def;
  329. if (_AEInfo.def != _currentValue) currentCameraInfo.SetValue(typeStr, _AEInfo.def);
  330. }
  331. }
  332. else
  333. {
  334. Transform trans = _cameraParameterPanel.transform.Find(typeStr);
  335. Slider slider = trans.GetComponent<Slider>();
  336. Text textObj = trans.Find("text").GetComponent<Text>();
  337. UVCCtrlInfo _UVCCtrlInfo = currentCameraInfo.GetInfo(typeStr);
  338. //重置的值
  339. int _defValue = _UVCCtrlInfo.def;
  340. if (typeStr == "PU_BRIGHTNESS")
  341. {
  342. _defValue = 50;
  343. }
  344. else if (typeStr == "PU_CONTRAST")
  345. {
  346. _defValue = 50;
  347. }
  348. textObj.text = _defValue + "";
  349. slider.value = _defValue;
  350. //获取当前值
  351. int _currentValue = currentCameraInfo.GetValue(typeStr);
  352. //重置存储值
  353. //dUVCParameters.GetValueOrDefault(typeStr).Set(_UVCCtrlInfo.def);
  354. //存储初始值,设置一次到UVC参数
  355. if (_defValue != _currentValue) currentCameraInfo.SetValue(typeStr, _defValue);
  356. }
  357. }
  358. }
  359. //windows 相机
  360. string[] sliderNameArrayPC = new string[]{
  361. "亮度",
  362. "对比度",};
  363. string[] sliderStrArrayPC = new string[]{
  364. "PU_BRIGHTNESS",
  365. "PU_CONTRAST"};
  366. //记录一个typeStr类型的数据存储操作对象
  367. ParamFloatValue pcBRIGHTNESS = new ParamFloatValue("ic_pc_PU_BRIGHTNESS", 0);
  368. ParamFloatValue pcCONTRAST = new ParamFloatValue("ic_pc_PU_CONTRAST", 0);
  369. public void initSliderPC()
  370. {
  371. for (int i = 0; i < sliderStrArrayPC.Length; i++)
  372. {
  373. string typeStr = sliderStrArrayPC[i];
  374. GameObject sliderObject = Instantiate(sliderPrefab, spawnPoint.transform);
  375. sliderObject.SetActive(true);
  376. sliderObject.name = typeStr;
  377. Slider slider = sliderObject.GetComponent<Slider>();
  378. Text textObj = sliderObject.transform.Find("text").GetComponent<Text>();
  379. Text titleTextObj = sliderObject.transform.Find("title").GetComponent<Text>();
  380. titleTextObj.text = sliderNameArrayPC[i];//类型名字
  381. if (slider != null)
  382. {
  383. slider.minValue = -1;
  384. slider.maxValue = 1;
  385. //记录一个typeStr类型的数据存储操作对象
  386. if (typeStr == "PU_BRIGHTNESS")
  387. {
  388. //获取设置默认存储的值
  389. float _Value = pcBRIGHTNESS.Get();
  390. infraredCameraHelper.SetBrightness(_Value);
  391. Debug.Log("[InfraredDemo] PC 设置 PU_BRIGHTNESS:" + typeStr + "默认值:" + _Value);
  392. slider.value = _Value;
  393. textObj.text = _Value + "";
  394. slider.onValueChanged.AddListener((newValue) =>
  395. {
  396. var _value = newValue;
  397. textObj.text = _value + "";
  398. infraredCameraHelper.SetBrightness(_value);
  399. pcBRIGHTNESS.Set(_value);
  400. });
  401. }
  402. else if (typeStr == "PU_CONTRAST")
  403. {
  404. //获取设置默认存储的值
  405. float _Value = pcCONTRAST.Get();
  406. infraredCameraHelper.SetContrast(_Value);
  407. Debug.Log("[InfraredDemo] PC 设置 PU_CONTRAST:" + typeStr + "默认值:" + _Value);
  408. slider.value = _Value;
  409. textObj.text = _Value + "";
  410. slider.onValueChanged.AddListener((newValue) =>
  411. {
  412. var _value = newValue;
  413. textObj.text = _value + "";
  414. infraredCameraHelper.SetContrast(_value);
  415. pcCONTRAST.Set(_value);
  416. });
  417. }
  418. }
  419. }
  420. }
  421. void resetPCData() {
  422. for (int i = 0; i < sliderStrArrayPC.Length; i++)
  423. {
  424. string typeStr = sliderStrArrayPC[i];
  425. Transform trans = _cameraParameterPanel.transform.Find(typeStr);
  426. Slider slider = trans.GetComponent<Slider>();
  427. Text textObj = trans.Find("text").GetComponent<Text>();
  428. //重置的值
  429. int _defValue = 0;
  430. if (typeStr == "PU_BRIGHTNESS")
  431. {
  432. _defValue = 0;
  433. infraredCameraHelper.SetBrightness(_defValue);
  434. }
  435. else if (typeStr == "PU_CONTRAST")
  436. {
  437. _defValue = 0;
  438. infraredCameraHelper.SetContrast(_defValue);
  439. }
  440. textObj.text = _defValue + "";
  441. slider.value = _defValue;
  442. }
  443. }
  444. #endregion
  445. void InitInfraredCamera()
  446. {
  447. if (_inited) return;
  448. _inited = true;
  449. //SDK创建
  450. if (infraredCameraHelper == null)
  451. {
  452. infraredCameraHelper = InfraredCameraHelper.GetInstance();
  453. #if UNITY_STANDALONE_WIN || UNITY_EDITOR
  454. infraredCameraHelper.CreateToPc();
  455. #endif
  456. #if UNITY_ANDROID
  457. //开始时候设置一个默认分辨率
  458. Debug.Log("开始时候的分辨率下标:" + resoution.Get());
  459. Vector2 resoutionVec2 = SetDefByIndex((int)resoution.Get());
  460. infraredCameraHelper.Create((int)resoutionVec2.x, (int)resoutionVec2.y);
  461. #endif
  462. infraredCameraHelper.OnPositionUpdate += (Vector2 point) =>
  463. {
  464. //跑九轴时候,不处理这里位置
  465. if (AimHandler.ins && AimHandler.ins.bRuning9Axis()) return;
  466. if (Camera.main == null) return;
  467. Ray ray = Camera.main.ScreenPointToRay(point);
  468. Vector3 rayEndPoint = ray.GetPoint(200);
  469. Quaternion quat = Quaternion.LookRotation(rayEndPoint - Camera.main.transform.position);
  470. // 挑战场景中其相机的父级有旋转,需要换算
  471. if (UnityEngine.SceneManagement.SceneManager.GetActiveScene().name == "GameChallenge")
  472. {
  473. quat = Quaternion.AngleAxis(-180, Vector3.up) * quat;
  474. }
  475. if (CameraToLook.ins != null) CameraToLook.ins.localRotation = quat;
  476. if (SB_EventSystem.ins) SB_EventSystem.ins.MoveSimulateMouseByInfrared(point);
  477. //移动目标游戏
  478. if(GeneratingTarget.gm!=null) GeneratingTarget.gm.shootingEvent.OnPositionUpdate(point);
  479. };
  480. infraredCameraHelper.OnUVCIsReady += (UVCManager.CameraInfo camera) =>
  481. {
  482. //生成控制摄像机的参数滑条
  483. Debug.Log("初始化摄像机!");
  484. //可以操作按钮
  485. mBtnSee.interactable = true;
  486. mBtnSee.transform.Find("Text").GetComponent<Text>().text = "调试红外";
  487. //延迟重新设置一次分辨率
  488. StartCoroutine(delayInitOhterInfo(camera));
  489. };
  490. //屏幕变化时候
  491. infraredCameraHelper.OnUVCPosUpdate += (list) =>
  492. {
  493. Debug.Log("OnUVCPosUpdate list.Count" + list.Count);
  494. SetLocatePointsToCameraRender(list, 1, 1);
  495. //InfraredScreenPositioningView 页面
  496. if (list.Count == 4)
  497. {
  498. FindObjectOfType<InfraredScreenPositioningView>()?.SyncScreenPosition();
  499. }
  500. else {
  501. FindObjectOfType<InfraredScreenPositioningView>()?.onReset();
  502. }
  503. };
  504. }
  505. }
  506. /// <summary>
  507. /// 初始化一些游戏配置
  508. /// </summary>
  509. /// <returns></returns>
  510. IEnumerator delayInitOhterInfo(UVCManager.CameraInfo camera) {
  511. //yield return new WaitForSeconds(1f);
  512. yield return new WaitForEndOfFrame();
  513. #if UNITY_ANDROID
  514. initSlider(camera);
  515. camera.GetResolutionsStrs();
  516. // 清除默认选项
  517. _dropdownResolution2.ClearOptions();
  518. // 将分辨率字符串数组转换为 Dropdown 选项
  519. _dropdownResolution2.AddOptions(new List<string>(resolutions));
  520. // 默认设置
  521. int index = (int)resoution.Get();
  522. _dropdownResolution2.value = index;
  523. _dropdownResolution2.RefreshShownValue();
  524. // 处理 Dropdown 的选择变化
  525. _dropdownResolution2.onValueChanged.AddListener(index => { OnResolutionChanged(index);});
  526. #endif
  527. #if UNITY_STANDALONE_WIN || UNITY_EDITOR
  528. initSliderPC();
  529. //隐藏不需要的设置
  530. _btnAdjusting.transform.Find("Text").GetComponent<Text>().text = "调整PC参数";
  531. _dropdownResolution.gameObject.SetActive(false);
  532. _dropdownResolution2.gameObject.SetActive(false);
  533. #endif
  534. //震动阈值
  535. SetShakeFilterValue(shakeFilterValue.Get());
  536. _sliderShakeFilter.onValueChanged.AddListener(SetShakeFilterValue);
  537. //功能按钮
  538. //重置触发测试
  539. _btnReset.onClick.AddListener(OnClick_Reset);
  540. _btnScreenLocateManual.onClick.AddListener(OnClick_ScreenLocateManual);
  541. _btnScreenLocateManualAuto.onClick.AddListener(OnClick_ScreenLocateManualAuto);
  542. SetCaptureValue(captureValue.Get());
  543. _sliderCapture.onValueChanged.AddListener(SetCaptureValue);
  544. SetDelayValue(delayValue.Get());
  545. _sliderDelay.onValueChanged.AddListener(SetDelayValue);
  546. //绘制线段
  547. SetLineWidth(lineWidth.Get());
  548. _sliderLineWidth.onValueChanged.AddListener(SetLineWidth);
  549. //检测红外亮度阈值
  550. SetInfraredFilterValue(infraredFileterValue.Get());
  551. _infraredFilter.onValueChanged.AddListener(SetInfraredFilterValue);
  552. //野鸭设置初始关卡
  553. int defLevel = (int)duckHunterLevel.Get() - 1 < 0 ? 0 : (int)duckHunterLevel.Get() - 1;
  554. _duckLevelDropdown.SetValueWithoutNotify(defLevel);
  555. _duckLevelDropdown.onValueChanged.AddListener(SetDuckLevelTest);
  556. }
  557. /// <summary>
  558. /// 初始化时候获取设置和存储来控制显示准心
  559. /// </summary>
  560. /// <returns></returns>
  561. public bool bInitCrosshairShow() {
  562. return UserSettings.ins.openCrossHair && getCrosshairValue() == 1 ? true : false;
  563. }
  564. /// <summary>
  565. /// 获取弓箭准心存储值
  566. /// </summary>
  567. /// <returns></returns>
  568. public int getCrosshairValue() {
  569. return (int)crosshairValue.Get();
  570. }
  571. public void setCrosshairValue(bool bshow) {
  572. crosshairValue.Set(bshow?1:0);
  573. }
  574. public void onStartPreview()
  575. {
  576. infraredCameraHelper.onStartPreview();
  577. }
  578. public void onStopPreview()
  579. {
  580. infraredCameraHelper.onStopPreview();
  581. }
  582. /// <summary>
  583. /// 获取并且初始化一次记录点的数据
  584. /// </summary>
  585. /// <returns></returns>
  586. IEnumerator initScreenLocateManual()
  587. {
  588. yield return new WaitForSeconds(1f);
  589. infraredCameraHelper.InitScreenLocateManual();
  590. }
  591. IEnumerator RestartOrKillApp()
  592. {
  593. yield return new WaitForSeconds(0.3f);
  594. if (Application.isEditor) yield break;
  595. if (Application.platform == RuntimePlatform.Android)
  596. {
  597. using (var unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
  598. {
  599. const int kIntent_FLAG_ACTIVITY_CLEAR_TASK = 0x00008000;
  600. const int kIntent_FLAG_ACTIVITY_NEW_TASK = 0x10000000;
  601. var currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
  602. var pm = currentActivity.Call<AndroidJavaObject>("getPackageManager");
  603. var intent = pm.Call<AndroidJavaObject>("getLaunchIntentForPackage", Application.identifier);
  604. intent.Call<AndroidJavaObject>("setFlags", kIntent_FLAG_ACTIVITY_NEW_TASK | kIntent_FLAG_ACTIVITY_CLEAR_TASK);
  605. currentActivity.Call("startActivity", intent);
  606. currentActivity.Call("finish");
  607. var process = new AndroidJavaClass("android.os.Process");
  608. int pid = process.CallStatic<int>("myPid");
  609. process.CallStatic("killProcess", pid);
  610. }
  611. }
  612. else {
  613. // 获取当前应用程序的可执行文件路径
  614. string executablePath = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
  615. // 重启应用程序
  616. System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo
  617. {
  618. FileName = executablePath,
  619. UseShellExecute = false
  620. };
  621. System.Diagnostics.Process.Start(startInfo);
  622. // 退出当前应用程序
  623. Application.Quit();
  624. };
  625. }
  626. void UpdateInfraredCamera()
  627. {
  628. if (!_visiable) return;
  629. if (!_inited) return;
  630. if (infraredCameraHelper == null) return;
  631. //渲染相机画面
  632. //_cameraRender.texture = infraredCameraHelper.GetCameraTexture();
  633. //_cameraRender.material = infraredCameraHelper.GetCameraMaterial();
  634. if (ScreenLocate.Main.getUVCTexture)
  635. {
  636. if(_cameraRender.texture ==null || ScreenLocate.Main.getUVCTexture.GetNativeTexturePtr() != _cameraRender.texture.GetNativeTexturePtr())
  637. _cameraRender.texture = ScreenLocate.Main.getUVCTexture;
  638. //_cameraRender.SetNativeSize();
  639. // _MaintainAspectRatio.AdjustSize();
  640. }
  641. //在相机画面显示准心
  642. if (ScreenLocate.Main)
  643. {
  644. var _sl = ScreenLocate.Main;
  645. var buffer = _sl.infraredSpotBuffer;
  646. if (buffer != null)
  647. {
  648. for (int i = 0; i < buffer.Length; i++)
  649. {
  650. if (buffer[i].CameraLocation != null)
  651. {
  652. //添加一个偏移量,使得最后输出的准心是指向正中心
  653. Vector2 newPoint2 = _sl.GetOffsetCameraLocation(buffer[i].CameraLocation.Value);
  654. // 检测到光点
  655. var pos = newPoint2.pixelToLocalPosition_AnchorCenter(_sl.mUVCCameraInfo.Size, _cameraRender.rectTransform.rect);
  656. _crosshairsInCamera[i].gameObject.SetActive(true);
  657. _crosshairsInCamera[i].anchoredPosition = pos;
  658. }
  659. else
  660. _crosshairsInCamera[i].gameObject.SetActive(false);
  661. }
  662. }
  663. //渲染固定摄像机分辨率
  664. SetCalibrationFixedText(_sl.mUVCCameraInfo.CurrentCalibrationResolution);
  665. //渲染摄像机大小
  666. if(_sl.mUVCCameraInfo != null) SetCameraSizeText(_sl.mUVCCameraInfo.Size);
  667. //渲染摄像机识别点位置
  668. SetQuadUnityVectorListText(_sl.PrintVector2List(ScreenLocate.quadUnityVectorList));
  669. }
  670. }
  671. public void SetLocatePointsToCameraRender(List<Vector2> points, float w, float h)
  672. {
  673. Transform pointsTF2 = _cameraRender.transform.Find("Points");
  674. if (pointsTF2.childCount == points.Count)
  675. {
  676. Vector2 texSize = new Vector2(w, h);
  677. for (int i = 0; i < pointsTF2.childCount; i++)
  678. {
  679. Transform pointTF = pointsTF2.GetChild(i);
  680. Vector2 pos = points[i];
  681. pointTF.localPosition = pos.pixelToLocalPosition_AnchorCenter(texSize, _cameraRender.rectTransform.rect);
  682. pointTF.gameObject.SetActive(true);
  683. }
  684. }
  685. else {
  686. for (int i = 0; i < pointsTF2.childCount; i++)
  687. {
  688. Transform pointTF = pointsTF2.GetChild(i);
  689. pointTF.gameObject.SetActive(false);
  690. }
  691. }
  692. }
  693. public void SetLocatePointsToCameraRenderTest(List<Vector2> points, float w, float h)
  694. {
  695. Transform pointsTF2 = _cameraRender.transform.Find("PointsTest");
  696. if (pointsTF2.childCount == points.Count)
  697. {
  698. Vector2 texSize = new Vector2(w, h);
  699. for (int i = 0; i < pointsTF2.childCount; i++)
  700. {
  701. Transform pointTF = pointsTF2.GetChild(i);
  702. Vector2 pos = points[i];
  703. pointTF.localPosition = pos.pixelToLocalPosition_AnchorCenter(texSize, _cameraRender.rectTransform.rect);
  704. pointTF.gameObject.SetActive(true);
  705. }
  706. }
  707. else
  708. {
  709. for (int i = 0; i < pointsTF2.childCount; i++)
  710. {
  711. Transform pointTF = pointsTF2.GetChild(i);
  712. pointTF.gameObject.SetActive(false);
  713. }
  714. }
  715. }
  716. void SetShakeFilterValue(float v)
  717. {
  718. shakeFilterValue.Set(v);
  719. _sliderShakeFilter.SetValueWithoutNotify(shakeFilterValue.Get());
  720. _sliderShakeFilter.transform.Find("Value").GetComponent<Text>().text = shakeFilterValue.Get().ToString("f1");
  721. infraredCameraHelper.SetShakeFilterValue(shakeFilterValue.Get());
  722. }
  723. /// <summary>
  724. /// 重新设置分辨率
  725. /// </summary>
  726. /// <param name="index"></param>
  727. public void resolutionRestartApp(int index)
  728. {
  729. #if UNITY_ANDROID
  730. //StartCoroutine(RestartOrKillApp());
  731. //获取第一个分辨率设置后设置size
  732. switch (index)
  733. {
  734. case 0:
  735. infraredCameraHelper.SetHighCameraResolution();
  736. resoution.Set(index);
  737. _dropdownResolution2.SetValueWithoutNotify(index);
  738. break;
  739. case 1:
  740. infraredCameraHelper.SetLowCameraResolution();
  741. resoution.Set(index);
  742. _dropdownResolution2.SetValueWithoutNotify(index);
  743. break;
  744. }
  745. #endif
  746. }
  747. /// <summary>
  748. /// 初始化时候,设置的值
  749. /// </summary>
  750. /// <param name="index"></param>
  751. public Vector2 SetDefByIndex(int index = 0)
  752. {
  753. //SetResolutionNew 里面对应的下标
  754. Vector2 vec2 = new Vector2(320, 240);
  755. switch (index)
  756. {
  757. case 0:
  758. vec2 = new Vector2(320, 240);
  759. break;
  760. case 1:
  761. vec2 = new Vector2(160, 120);
  762. break;
  763. }
  764. return vec2;
  765. }
  766. /// <summary>
  767. /// 当 Dropdown 选择变化时的处理方法
  768. /// </summary>
  769. /// <param name="OnResolutionChanged">320x240</param>
  770. private void OnResolutionChanged(int index)
  771. {
  772. #if UNITY_ANDROID
  773. Debug.Log("Selected Resolution: " + index);
  774. // 将选定的分辨率转换为实际的宽度和高度
  775. // 并且需要判断是否存在最低分辨率
  776. if (index == 1 && currentCameraInfo.ContainsResulutionKey("160x120"))
  777. {
  778. // 在这里你可以根据实际需要设置屏幕分辨率或进行其他操作
  779. infraredCameraHelper.SetLowCameraResolution();
  780. // 保存选择的分辨率到 PlayerPrefs
  781. resoution.Set(index);
  782. }
  783. else if(index == 0){
  784. //如果是0就 使用高分辨率
  785. infraredCameraHelper.SetHighCameraResolution();
  786. // 保存选择的分辨率到 PlayerPrefs
  787. resoution.Set(index);
  788. }
  789. #endif
  790. }
  791. /// <summary>
  792. /// 野鸭关卡测试初始值
  793. /// </summary>
  794. /// <param name="optionIndex"></param>
  795. public void SetDuckLevelTest(int optionIndex)
  796. {
  797. //选择下标+1
  798. int v = optionIndex + 1;
  799. duckHunterLevel.Set(v);
  800. _sliderLineWidth.SetValueWithoutNotify(duckHunterLevel.Get());
  801. _sliderLineWidth.transform.Find("Value").GetComponent<Text>().text = duckHunterLevel.Get().ToString("f1");
  802. }
  803. void OnClick_Reset()
  804. {
  805. //SetBrightness(1);
  806. //SetSaturation(1);
  807. //SetContrast(1);
  808. SetShakeFilterValue(6);
  809. SetLineWidth(10);
  810. SetInfraredFilterValue(0.8f);
  811. SetCaptureValue(30.0f);
  812. SetDelayValue(30.0f);
  813. //重置为第一关
  814. SetDuckLevelTest(0);
  815. }
  816. public void OnClickClearAll() {
  817. PlayerPrefs.DeleteAll();
  818. // 保存更改
  819. PlayerPrefs.Save();
  820. StartCoroutine(RestartOrKillApp());
  821. }
  822. void OnClick_ScreenLocateManual()
  823. {
  824. ViewManager2.ShowView(ViewManager2.Path_InfraredScreenPositioningView);
  825. FindObjectOfType<InfraredScreenPositioningView>().enterFromInfraredDemo = true;
  826. }
  827. void OnClick_ScreenLocateManualAuto()
  828. {
  829. infraredCameraHelper.EnterScreenLocateManualAuto();
  830. }
  831. public void OnClick_SetAdjustPointsOffset()
  832. {
  833. var _sl = ScreenLocate.Main;
  834. var buffer = _sl.infraredSpotBuffer;
  835. if (buffer != null)
  836. {
  837. for (int i = 0; i < buffer.Length; i++)
  838. {
  839. if (buffer[i].CameraLocation != null)
  840. {
  841. Debug.Log("CameraLocation:"+buffer[i].CameraLocation.Value);
  842. var centerOffset = infraredCameraHelper.GetCenterOffset(buffer[i].CameraLocation.Value, "CameraLocation");
  843. Debug.Log("CenterOffset: " + centerOffset);
  844. var uvCenterOffset = infraredCameraHelper.GetCenterOffset(buffer[i].ScreenUV.Value, "ScreenUV");
  845. Debug.Log("UvCenterOffset: " + uvCenterOffset);
  846. //如果是新手教程场景里面的校准
  847. InfraredGuider infraredGuiderObj = FindObjectOfType<InfraredGuider>();
  848. if (infraredGuiderObj != null)
  849. {
  850. GameObject infraredGuiderGameObject = infraredGuiderObj.gameObject;
  851. infraredGuiderGameObject.GetComponent<InfraredGuider>().SetTitleAfterCalibration();
  852. }
  853. }
  854. }
  855. }
  856. }
  857. /// <summary>
  858. /// 重置中心点
  859. /// </summary>
  860. public void ResetCenterOffset() {
  861. infraredCameraHelper.ResetCenterOffset();
  862. }
  863. void SetCaptureValue(float v)
  864. {
  865. captureValue.Set(v);
  866. _sliderCapture.SetValueWithoutNotify(captureValue.Get());
  867. _sliderCapture.transform.Find("Value").GetComponent<Text>().text = captureValue.Get().ToString("f1");
  868. infraredCameraHelper.SetCapture((int)captureValue.Get());
  869. }
  870. void SetDelayValue(float v)
  871. {
  872. delayValue.Set(v);
  873. _sliderDelay.SetValueWithoutNotify(delayValue.Get());
  874. _sliderDelay.transform.Find("Value").GetComponent<Text>().text = delayValue.Get().ToString("f1");
  875. infraredCameraHelper.SetDelay((int)delayValue.Get());
  876. }
  877. #endregion
  878. #region 相机感光度(默认修改对比度)
  879. public void onSetSliderCustomValue(Slider _slider, float min = 0.0f, float max = 10.0f)
  880. {
  881. onSetSliderValue(_slider, "PU_CONTRAST", min, max);
  882. }
  883. public void onSliderCustomEvent(float value, float min = 0.0f, float max = 10.0f)
  884. {
  885. onSliderEvent(value, "PU_CONTRAST", min, max);
  886. }
  887. public void onSetSliderValue(Slider _slider,string typeStr = "PU_CONTRAST", float min = 0.0f, float max = 10.0f)
  888. {
  889. if (BluetoothWindows.IsWindows()) {
  890. float v = typeStr == "PU_CONTRAST"?infraredCameraHelper.GetContrast(): infraredCameraHelper.GetBrightness();
  891. // 目标区间 [0, 10] 的边界值
  892. double targetMin = min;
  893. double targetMax = max;
  894. double originalMin = -1;
  895. double originalMax = 1;
  896. // 计算转换后的值
  897. double v2 = MapValue(v, originalMin, originalMax, targetMin, targetMax);
  898. Debug.Log("PC获取相机的感光度 "+ typeStr + " :" + v + " = " + v2);
  899. _slider.SetValueWithoutNotify((float)v2);
  900. return;
  901. }
  902. //功能也改为UVC的对比度
  903. if (running)
  904. {
  905. //string typeStr = "PU_CONTRAST";//"PU_BRIGHTNESS";
  906. //UInt64 _VALUE = currentCameraInfo.GetTypeByName(typeStr);
  907. UVCCtrlInfo _UVCCtrlInfo = currentCameraInfo.GetInfo(typeStr);
  908. float v = currentCameraInfo.GetValue(typeStr); // infraredCameraHelper.GetBrightness();
  909. //float v2 = (v / _UVCCtrlInfo.max) * 10;
  910. // 目标区间 [0, 10] 的边界值
  911. double targetMin = 0.0;
  912. double targetMax = 10.0;
  913. double originalMin = _UVCCtrlInfo.min;
  914. double originalMax = _UVCCtrlInfo.max;
  915. // 计算转换后的值
  916. double v2 = MapValue(v, originalMin, originalMax, targetMin, targetMax);
  917. Debug.Log("获取相机的感光度" + typeStr + ": " + v + " = " + v2);
  918. _slider.SetValueWithoutNotify((float)v2);
  919. }
  920. else _slider.SetValueWithoutNotify(5);
  921. }
  922. public void onSliderEvent(float value, string typeStr = "PU_CONTRAST", float min = 0.0f,float max = 10.0f)
  923. {
  924. // string typeStr = "PU_CONTRAST";// "PU_BRIGHTNESS";
  925. //pc
  926. if (BluetoothWindows.IsWindows())
  927. {
  928. Transform trans = _cameraParameterPanel.transform.Find(typeStr);
  929. Slider slider = trans.GetComponent<Slider>();
  930. Text textObj = trans.Find("text").GetComponent<Text>();
  931. // 原始区间和目标区间的边界值
  932. double originalMin = min;
  933. double originalMax = max;
  934. double targetMin = -1;
  935. double targetMax = 1;
  936. // 计算转换后的值
  937. double result = MapValue(value, originalMin, originalMax, targetMin, targetMax);
  938. float _current = (float)result;
  939. //Debug.Log("_current:" + _current + " , result:" + result);
  940. textObj.text = _current + "";
  941. slider.value = _current;
  942. if (typeStr == "PU_CONTRAST")
  943. {
  944. infraredCameraHelper.SetContrast(_current);
  945. pcCONTRAST.Set(_current);
  946. }
  947. else {
  948. infraredCameraHelper.SetBrightness(_current);
  949. pcBRIGHTNESS.Set(_current);
  950. }
  951. return;
  952. }
  953. //修改亮度时,调试界面的亮度也应该一起修改
  954. //功能也改为UVC的对比度
  955. if (running)
  956. {
  957. //Slider slider = transform.Find("InfraredCamera/Layout/SliderBrightness")
  958. // .GetComponent<Slider>();
  959. // UInt64 _VALUE = currentCameraInfo.GetTypeByName(typeStr);
  960. Transform trans = _cameraParameterPanel.transform.Find(typeStr);
  961. Slider slider = trans.GetComponent<Slider>();
  962. Text textObj = trans.Find("text").GetComponent<Text>();
  963. UVCCtrlInfo _UVCCtrlInfo = currentCameraInfo.GetInfo(typeStr);
  964. int _currentUVCValue = currentCameraInfo.GetValue(typeStr);
  965. //value 0 ~ 10
  966. // 原始区间和目标区间的边界值
  967. double originalMin = min;
  968. double originalMax = max;
  969. double targetMin = _UVCCtrlInfo.min;
  970. double targetMax = _UVCCtrlInfo.max;
  971. // 计算转换后的值
  972. double result = MapValue(value, originalMin, originalMax, targetMin, targetMax);
  973. int _current = (int)(result);
  974. Debug.Log("_current:" + value + " , result:" + result);
  975. textObj.text = _current + "";
  976. slider.value = _current;
  977. //dUVCParameters.GetValueOrDefault(typeStr).Set(_current);
  978. //存储初始值,设置一次到UVC参数
  979. if (_currentUVCValue != _current) currentCameraInfo.SetValue(typeStr, _current);
  980. }
  981. }
  982. public static double MapValue(double value, double originalMin, double originalMax, double targetMin, double targetMax)
  983. {
  984. // 线性插值公式
  985. return targetMin + (value - originalMin) * (targetMax - targetMin) / (originalMax - originalMin);
  986. }
  987. #endregion
  988. #region 绘制线段部分
  989. public void SetLineWidth(float v)
  990. {
  991. lineWidth.Set(v);
  992. _sliderLineWidth.SetValueWithoutNotify(lineWidth.Get());
  993. _sliderLineWidth.transform.Find("Value").GetComponent<Text>().text = lineWidth.Get().ToString("f1");
  994. }
  995. #endregion
  996. #region 亮度检测部分
  997. public void SetInfraredFilterValue(float v)
  998. {
  999. infraredFileterValue.Set(v);
  1000. _infraredFilter.SetValueWithoutNotify(infraredFileterValue.Get());
  1001. _infraredFilter.transform.Find("Value").GetComponent<Text>().text = infraredFileterValue.Get().ToString("f1");
  1002. infraredCameraHelper.SetInfraredLocateBrightnessThreshold(infraredFileterValue.Get());
  1003. }
  1004. #endregion
  1005. public void resetInfraredPlayerPrefs()
  1006. {
  1007. //测试用
  1008. PlayerPrefs.DeleteKey("entry-guider-infrared-" + LoginMgr.myUserInfo.id);
  1009. PlayerPrefs.DeleteKey("hideInfraredBowAndArrow");
  1010. }
  1011. #region 显示Log部分信息
  1012. [SerializeField] Text _calibrationFixedText;
  1013. [SerializeField] Text _cameraSizeText;
  1014. [SerializeField] Text _quadUnityVectorListText;
  1015. /// <summary>
  1016. /// 校准时候的固定值分辨率
  1017. /// </summary>
  1018. /// <param name="v"></param>
  1019. public void SetCalibrationFixedText(Vector2 v)
  1020. {
  1021. _calibrationFixedText.text = v.x + "*" + v.y;
  1022. }
  1023. /// <summary>
  1024. /// 渲染摄像机当前分辨率
  1025. /// </summary>
  1026. /// <param name="v"></param>
  1027. public void SetCameraSizeText(Vector2 v)
  1028. {
  1029. _cameraSizeText.text = v.x + "*" + v.y;
  1030. }
  1031. /// <summary>
  1032. /// 渲染摄像机识别点
  1033. /// </summary>
  1034. /// <param name="v"></param>
  1035. public void SetQuadUnityVectorListText(string v)
  1036. {
  1037. _quadUnityVectorListText.text = v;
  1038. }
  1039. #endregion
  1040. }
  1041. public class ParamFloatValue
  1042. {
  1043. private string _saveKey;
  1044. private float _valueDefault;
  1045. private bool _valueLoaded;
  1046. private float _value;
  1047. public ParamFloatValue(string saveKey, float valueDefault)
  1048. {
  1049. _saveKey = saveKey;
  1050. _valueDefault = valueDefault;
  1051. }
  1052. public float Get()
  1053. {
  1054. if (!_valueLoaded) _value = PlayerPrefs.GetFloat(_saveKey, _valueDefault);
  1055. return _value;
  1056. }
  1057. public void Set(float value)
  1058. {
  1059. _value = value;
  1060. PlayerPrefs.SetFloat(_saveKey, _value);
  1061. PlayerPrefs.Save();
  1062. }
  1063. }