InfraredDemo.cs 86 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353
  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. using WildAttack;
  14. public enum ScreenPointTypeEnum
  15. {
  16. None = 0,//没有模式,用于初始化
  17. HalfScreen = 1, // 半屏模式
  18. FullScreen = 2 // 全屏模式
  19. }
  20. public class InfraredDemo : JCUnityLib.ViewBase
  21. {
  22. public static bool DebugInEditor = true;
  23. public static InfraredDemo _ins;
  24. [SerializeField]
  25. RectTransform canvasRectTransform;
  26. public Button mBtnSee;
  27. Reporter reporter;
  28. public Text FPSText;
  29. public static void Create()
  30. {
  31. if (_ins) return;
  32. GameObject o = Instantiate(Resources.Load<GameObject>("InfraredDemo"));
  33. DontDestroyOnLoad(o);
  34. _ins = o.GetComponent<InfraredDemo>();
  35. //添加一个父物体
  36. o.transform.SetParent(ViewMgr.Instance.transform.Find("1").transform);
  37. CanvasScaler canvasScaler = o.GetComponent<CanvasScaler>();
  38. if (canvasScaler != null)
  39. {
  40. Destroy(canvasScaler);
  41. }
  42. RectTransform rectTransform = o.GetComponent<RectTransform>();
  43. rectTransform.anchorMin = Vector2.zero; // 左下角对齐父级
  44. rectTransform.anchorMax = Vector2.one; // 右上角对齐父级
  45. rectTransform.offsetMin = Vector2.zero; // 移除左下角偏移
  46. rectTransform.offsetMax = Vector2.zero; // 移除右上角偏移
  47. rectTransform.localScale = Vector3.one; // 确保缩放为 1
  48. //直接初始化一次
  49. _ins.InitInfraredCamera();
  50. }
  51. void Start()
  52. {
  53. //生成一个控制台
  54. GameObject obj = UserPlayer.InitReturnLogReporter() as GameObject;
  55. if (obj != null)
  56. {
  57. reporter = obj.GetComponent<Reporter>();
  58. //Application.logMessageReceived += HandleLog;
  59. // 模拟错误日志
  60. // Debug.LogError("Test Error: This is a simulated error message.");
  61. // 模拟异常日志
  62. // Debug.LogException(new System.Exception("Test Exception: This is a simulated exception."));
  63. }
  64. if (Application.platform != RuntimePlatform.WindowsEditor) DebugInEditor = false;
  65. SetVisiable(false);
  66. InitDebugScreenPoint();
  67. // gameObject.AddComponent<FPSTester>();
  68. //有需要可以隐藏
  69. if (CommonConfig.StandaloneModeOrPlatformB || CommonConfig.bHideInfraredDemoBtnSee)
  70. {
  71. mBtnSee.gameObject.SetActive(false);
  72. }
  73. else
  74. {
  75. mBtnSee.interactable = false;
  76. mBtnSee.transform.Find("Text").GetComponent<Text>().text = TextAutoLanguage2.GetTextByKey("WaitingForInitialization"); // "等待初始化..";
  77. }
  78. //直接初始化一次
  79. //InitInfraredCamera();
  80. Debug.Log("[InfraredDemo] Start Function!");
  81. initToggle();
  82. initExport();
  83. InitFullScreen();
  84. #if UNITY_STANDALONE_WIN
  85. _calibrationFixedText.transform.parent.gameObject.SetActive(false);
  86. #endif
  87. }
  88. void OnDestroy()
  89. {
  90. //if (reporter != null) Application.logMessageReceived -= HandleLog;
  91. }
  92. void Update()
  93. {
  94. UpdateInfraredCamera();
  95. //UpdateDebugScreenPoint();
  96. if (reporter != null) FPSText.text = "FPS:" + reporter.fps;
  97. }
  98. public void OnClick_See()
  99. {
  100. SetVisiable(!_visiable);
  101. }
  102. //初始化一次 initScreenLocateManual
  103. bool hasCalled = false;
  104. bool _visiable;
  105. void SetVisiable(bool value)
  106. {
  107. _visiable = value;
  108. transform.Find("Background").gameObject.SetActive(value);
  109. transform.Find("InfraredCamera").gameObject.SetActive(value);
  110. //如果是b端,控制这里按钮显示
  111. if (CommonConfig.StandaloneModeOrPlatformB)
  112. {
  113. mBtnSee.gameObject.SetActive(value);
  114. }
  115. updateBtnSee();
  116. Action<Text> onApplyToNext = (t) =>
  117. {
  118. updateBtnSee();
  119. };
  120. mBtnSee.GetComponentInChildren<TextAutoLanguage2>().onApplyToNext += onApplyToNext;
  121. //if (value) InitInfraredCamera();
  122. //刷新翻译的Dropdown
  123. if (value)
  124. {
  125. UpdateLanguage();
  126. updateDropdownResolution2();
  127. }
  128. //if (!hasCalled && value)
  129. //{
  130. // hasCalled = true;
  131. // //如果本地有记录,初始化一次
  132. // StartCoroutine(initScreenLocateManual());
  133. // Debug.Log("[InfraredDemo] SetVisiable Function!");
  134. //}
  135. }
  136. void updateBtnSee()
  137. {
  138. mBtnSee.GetComponentInChildren<Text>().text = _visiable ? TextAutoLanguage2.GetTextByKey("HideInterface") : TextAutoLanguage2.GetTextByKey("DebugInfrared");//"隐藏界面" : "调试红外";
  139. }
  140. Text _spText;
  141. Vector2 _screenPoint;
  142. void InitDebugScreenPoint()
  143. {
  144. _spText = transform.Find("SPText").GetComponent<Text>();
  145. //_spText.gameObject.SetActive(DebugInEditor);
  146. _spText.gameObject.SetActive(false);
  147. }
  148. //void UpdateDebugScreenPoint()
  149. //{
  150. // if (!DebugInEditor) return;
  151. // if (infraredCameraHelper == null) return;
  152. // _screenPoint.x = Mathf.Clamp(
  153. // _screenPoint.x + Input.GetAxis("Horizontal") * Screen.width / 400f,
  154. // 0, Screen.width);
  155. // _screenPoint.y = Mathf.Clamp(
  156. // _screenPoint.y + Input.GetAxis("Vertical") * Screen.height / 400f,
  157. // 0, Screen.height);
  158. // infraredCameraHelper.InvokeOnPositionUpdate(_screenPoint);
  159. // _spText.text = _screenPoint.ToString();
  160. //}
  161. #region 红外摄像
  162. [SerializeField] RawImage _cameraRender;
  163. [SerializeField] RawImage _cameraRender2;
  164. /// <summary>
  165. /// 测试texture
  166. /// </summary>
  167. public RawImage MyCameraRender2
  168. {
  169. get { return _cameraRender2; }
  170. set { _cameraRender2 = value; }
  171. }
  172. //[SerializeField] MaintainAspectRatio _MaintainAspectRatio;
  173. [SerializeField] List<RectTransform> _crosshairsInCamera;
  174. [SerializeField] Slider _sliderShakeFilter;
  175. [SerializeField] Button _btnReset;
  176. [SerializeField] Button _btnScreenLocateManual;
  177. [SerializeField] Button _btnScreenLocateManualAuto;
  178. [SerializeField] Slider _sliderCapture;
  179. [SerializeField] Slider _sliderDelay;
  180. [SerializeField] Dropdown _dropdownResolution;
  181. [SerializeField] Dropdown _dropdownResolution2;
  182. [SerializeField] Slider _sliderLineWidth;
  183. [SerializeField] Slider _fanWidth;
  184. //红外线阈值
  185. [SerializeField] Slider _infraredFilter;
  186. //调试UVC参数
  187. [SerializeField] GameObject _cameraParameterPanel;
  188. [SerializeField] Button _btnAdjusting;
  189. //野鸭选择
  190. [SerializeField] Dropdown _duckLevelDropdown;
  191. //Dictionary<string, ParamFloatValue> dUVCParameters = new Dictionary<string, ParamFloatValue>();
  192. //public ParamFloatValue brightness = new ParamFloatValue("ic_brightness", 1.0f);
  193. //public ParamFloatValue saturation = new ParamFloatValue("ic_saturation", 1.0f);
  194. //public ParamFloatValue contrast = new ParamFloatValue("ic_contrast", 1.0f);
  195. #if UNITY_ANDROID || UNITY_IOS
  196. //初始化纹理-1280*720,index = 0
  197. // public ParamFloatValue resoution = new ParamFloatValue("ic_resoution2", 0);
  198. //摄像机分辨率 -320*240,index = 10
  199. public ParamFloatValue resoutionNew = new ParamFloatValue("ic_resoutionNew", 10);
  200. //摄像机分辨率 -只处理高低分辨率情况
  201. public ParamFloatValue resoution = new ParamFloatValue("ic_resoution", 0);
  202. //string[] resolutions = { "高分辨率", "低分辨率" };
  203. public ParamFloatValue mirrorIndex = new ParamFloatValue("ic_mirror", 0);
  204. #endif
  205. //抖动过滤值 - 6.0
  206. public ParamFloatValue shakeFilterValue = new ParamFloatValue("ic_shakeFilterValue2", 6.0f);
  207. //亮度过滤阈值 - 0.8
  208. #if UNITY_IOS
  209. public ParamFloatValue infraredFileterValue = new ParamFloatValue("ic_infraredFileterValue", 0.6f);
  210. #else
  211. public ParamFloatValue infraredFileterValue = new ParamFloatValue("ic_infraredFileterValue", 0.8f);
  212. #endif
  213. //准心的偏移值
  214. public ParamVector2Value cameraLocationValue = new ParamVector2Value("ic_cameraLocation", Vector2.zero);
  215. public ParamVector2Value screenUVValue = new ParamVector2Value("ic_screenUV", Vector2.zero);
  216. //线段宽度阈值
  217. public ParamFloatValue lineWidth = new ParamFloatValue("ic_lineWidth", 4.0f);
  218. //扇形宽度
  219. public ParamFloatValue fanWidth = new ParamFloatValue("ic_fanWidth", 90.0f);
  220. public ParamFloatValue captureValue = new ParamFloatValue("ic_captureValue", 30.0f);
  221. public ParamFloatValue delayValue = new ParamFloatValue("ic_delayValue", 30.0f);
  222. //红外准心,默认打开吧
  223. public ParamFloatValue crosshairValue = new ParamFloatValue("ic_crosshairValue", 1);
  224. //野鸭测试存储
  225. public ParamFloatValue duckHunterLevel = new ParamFloatValue("test_duckHunterLevelValue", 1);
  226. //存储滑块信息。camera
  227. public Dictionary<string, ParamFloatValue> ParamFloatValueCameraSlider = new Dictionary<string, ParamFloatValue>();
  228. public static InfraredCameraHelper infraredCameraHelper;
  229. public static bool running { get => infraredCameraHelper != null; }
  230. private bool _inited;
  231. Camera leftCamera = null;
  232. Camera rightCamera = null;
  233. #region 参数控制
  234. public GameObject togglePrefab; // 拖入一个Toggle预设体
  235. public GameObject sliderPrefab; // 拖入一个Slider预设体
  236. public GameObject spawnPoint;
  237. //自动曝光
  238. bool bAutoAE = false;
  239. Toggle CTRLAEToggle;
  240. Slider CTRLAEABSSlider;
  241. string[] sliderNameArray = new string[]{
  242. "自动曝光模式",
  243. "曝光时间(绝对)",
  244. "亮度", //
  245. "对比度",
  246. "色调",
  247. "饱和度",
  248. "锐度",
  249. "伽玛",
  250. //"白平衡温度",
  251. //"白平衡分量",
  252. "背光补偿",
  253. "增益" };
  254. string[] sliderStrArray = new string[]{
  255. "CTRL_AE",
  256. "CTRL_AE_ABS",
  257. "PU_BRIGHTNESS",
  258. "PU_CONTRAST",
  259. "PU_HUE",
  260. "PU_SATURATION",
  261. "PU_SHARPNESS",
  262. "PU_GAMMA",
  263. //"PU_WB_TEMP",
  264. //"PU_WB_COMPO",
  265. "PU_BACKLIGHT",
  266. "PU_GAIN" };
  267. UVCManager.CameraInfo currentCameraInfo;
  268. //初始化相机参数
  269. public void initSlider(UVCManager.CameraInfo cameraInfo)
  270. {
  271. if (currentCameraInfo != null) return;
  272. currentCameraInfo = cameraInfo;
  273. string[] sliderNameArrayKey = new string[] {
  274. "AutoExposureMode", // "自动曝光模式"
  275. "ExposureTimeAbsolute", // "曝光时间(绝对)"
  276. "Brightness", // "亮度"
  277. "Contrast", // "对比度"
  278. "Hue", // "色调"
  279. "Saturation", // "饱和度"
  280. "Sharpness", // "锐度"
  281. "Gamma", // "伽玛"
  282. "BacklightCompensation", // "背光补偿"
  283. "Gain" // "增益"
  284. };
  285. for (int i = 0; i < sliderStrArray.Length; i++)
  286. {
  287. string typeStr = sliderStrArray[i];
  288. // UInt64 _VALUE = cameraInfo.GetTypeByName(typeStr);
  289. //不支持的,跳过
  290. bool bContains = cameraInfo.ContainsKey(typeStr);
  291. if (!bContains) continue;
  292. if (typeStr == "CTRL_AE")
  293. {
  294. //曝光Toggle
  295. GameObject toggleObject = Instantiate(togglePrefab, spawnPoint.transform);
  296. toggleObject.SetActive(true);
  297. toggleObject.name = typeStr;
  298. Text labelObj = toggleObject.transform.Find("Label").GetComponent<Text>();
  299. //labelObj.text = sliderNameArray[i];
  300. labelObj.gameObject.AddComponent<TextAutoLanguage2>().SetTextKey(sliderNameArrayKey[i]);
  301. Toggle toggle = toggleObject.GetComponent<Toggle>();
  302. CTRLAEToggle = toggle;
  303. UVCCtrlInfo _AEInfo = cameraInfo.GetInfo(typeStr);
  304. Debug.Log("UVCCtrlInfo:" + _AEInfo.ToString());
  305. int _currentValue = cameraInfo.GetValue(typeStr);
  306. bAutoAE = _currentValue == 8 ? true : false; //如果当前值是 8,则当前摄像机是自动曝光模式
  307. toggle.isOn = bAutoAE;
  308. //cameraInfo.SetValue(_VALUE, _currentValue!=8? 8:1);
  309. toggle.onValueChanged.AddListener((bool bValue) =>
  310. {
  311. //Debug.Log("Toggle value changed to: " + bValue + " from " + _VALUE);
  312. if (typeStr == "CTRL_AE")
  313. {
  314. //开关控制是否自动曝光
  315. bAutoAE = bValue;
  316. if (CTRLAEABSSlider) CTRLAEABSSlider.interactable = !bAutoAE;
  317. int _value = bValue ? 8 : 1;
  318. //Debug.Log("_value " + _value);
  319. cameraInfo.SetValue(typeStr, _value);
  320. }
  321. });
  322. }
  323. else
  324. {
  325. //其余使用slider
  326. GameObject sliderObject = Instantiate(sliderPrefab, spawnPoint.transform);
  327. sliderObject.SetActive(true);
  328. sliderObject.name = typeStr;
  329. Slider slider = sliderObject.GetComponent<Slider>();
  330. Text textObj = sliderObject.transform.Find("text").GetComponent<Text>();
  331. Text titleTextObj = sliderObject.transform.Find("title").GetComponent<Text>();
  332. //titleTextObj.text = sliderNameArray[i];//类型名字
  333. titleTextObj.gameObject.AddComponent<TextAutoLanguage2>().SetTextKey(sliderNameArrayKey[i]);
  334. if (slider != null)
  335. {
  336. UVCCtrlInfo _UVCCtrlInfo = cameraInfo.GetInfo(typeStr);
  337. slider.minValue = _UVCCtrlInfo.min;
  338. slider.maxValue = _UVCCtrlInfo.max;
  339. slider.wholeNumbers = true;
  340. int _defValue = _UVCCtrlInfo.def;
  341. //指定默认值
  342. //5、UVC亮度 - 50
  343. //6、UVC对比度 - 50
  344. #if UNITY_ANDROID
  345. if (typeStr == "PU_BRIGHTNESS")
  346. {
  347. _defValue = 50;
  348. }
  349. else if (typeStr == "PU_CONTRAST")
  350. {
  351. _defValue = 50;
  352. }
  353. #endif
  354. //记录一个typeStr类型的数据存储操作对象
  355. ParamFloatValue paramFloatValue = new ParamFloatValue("ic_uvc_" + typeStr, _defValue);
  356. ParamFloatValueCameraSlider.Add(typeStr, paramFloatValue);
  357. if (typeStr == "PU_BRIGHTNESS" || typeStr == "PU_CONTRAST")
  358. {
  359. //获取设置默认存储的值
  360. int _Value = (int)paramFloatValue.Get();
  361. cameraInfo.SetValue(typeStr, _Value);
  362. Debug.Log("[InfraredDemo] UVC 设置" + typeStr + "默认值:" + _Value);
  363. slider.value = _Value;
  364. textObj.text = _Value + "";
  365. }
  366. else
  367. {
  368. //获取设置当前值
  369. int _currentValue = cameraInfo.GetValue(typeStr);
  370. slider.value = _currentValue;
  371. textObj.text = _currentValue + "";
  372. }
  373. //如果是曝光slider
  374. if (typeStr == "CTRL_AE_ABS")
  375. {
  376. CTRLAEABSSlider = slider;
  377. slider.interactable = !bAutoAE;
  378. }
  379. slider.onValueChanged.AddListener((newValue) =>
  380. {
  381. var _value = Mathf.FloorToInt(newValue);
  382. textObj.text = _value + "";
  383. //Debug.Log("Slider value changed to: " + newValue + " from " + _VALUE);
  384. cameraInfo.SetValue(typeStr, _value);
  385. paramFloatValue.Set(_value);
  386. });
  387. }
  388. }
  389. }
  390. }
  391. public void OpenUVCPanel()
  392. {
  393. _cameraParameterPanel.SetActive(true);
  394. }
  395. public void CloseUVCPanel()
  396. {
  397. _cameraParameterPanel.SetActive(false);
  398. }
  399. public void onResetUVCData()
  400. {
  401. #if UNITY_ANDROID || UNITY_IOS
  402. resetUVCData();
  403. #endif
  404. #if UNITY_STANDALONE_WIN || UNITY_EDITOR
  405. resetPCData();
  406. #endif
  407. }
  408. void resetUVCData()
  409. {
  410. if (currentCameraInfo == null) return;
  411. for (int i = 0; i < sliderStrArray.Length; i++)
  412. {
  413. string typeStr = sliderStrArray[i];
  414. // UInt64 _VALUE = currentCameraInfo.GetTypeByName(typeStr);
  415. bool bContains = currentCameraInfo.ContainsKey(typeStr);
  416. if (!bContains) continue;
  417. if (typeStr == "CTRL_AE")
  418. {
  419. //toggle值不进行重置
  420. Debug.Log("CTRL_AE 不需要重置");
  421. }
  422. else if (typeStr == "CTRL_AE_ABS")
  423. {
  424. if (!bAutoAE)
  425. {
  426. //如果是手动曝光,重置值
  427. Transform trans = _cameraParameterPanel.transform.Find(typeStr);
  428. Slider slider = trans.GetComponent<Slider>();
  429. Text textObj = trans.Find("text").GetComponent<Text>();
  430. UVCCtrlInfo _AEInfo = currentCameraInfo.GetInfo(typeStr);
  431. //获取当前值
  432. int _currentValue = currentCameraInfo.GetValue(typeStr);
  433. Debug.Log("CTRL_AE_ABS:" + _currentValue + " = " + _AEInfo.def + " = " + ",bAutoAE:" + bAutoAE);
  434. textObj.text = _AEInfo.def + "";
  435. slider.value = _AEInfo.def;
  436. if (_AEInfo.def != _currentValue) currentCameraInfo.SetValue(typeStr, _AEInfo.def);
  437. }
  438. }
  439. else
  440. {
  441. Transform trans = _cameraParameterPanel.transform.Find(typeStr);
  442. Slider slider = trans.GetComponent<Slider>();
  443. Text textObj = trans.Find("text").GetComponent<Text>();
  444. UVCCtrlInfo _UVCCtrlInfo = currentCameraInfo.GetInfo(typeStr);
  445. ParamFloatValue paramFloatValue = ParamFloatValueCameraSlider.GetValueOrDefault(typeStr);
  446. //重置的值
  447. int _defValue = _UVCCtrlInfo.def;
  448. if (typeStr == "PU_BRIGHTNESS")
  449. {
  450. _defValue = (int)paramFloatValue.GetDefault();
  451. }
  452. else if (typeStr == "PU_CONTRAST")
  453. {
  454. _defValue = (int)paramFloatValue.GetDefault();
  455. }
  456. textObj.text = _defValue + "";
  457. slider.value = _defValue;
  458. //获取当前值
  459. int _currentValue = currentCameraInfo.GetValue(typeStr);
  460. //重置存储值
  461. paramFloatValue.Reset();
  462. //存储初始值,设置一次到UVC参数
  463. if (_defValue != _currentValue) currentCameraInfo.SetValue(typeStr, _defValue);
  464. }
  465. }
  466. }
  467. //windows 相机
  468. string[] sliderNameArrayPC = new string[]{
  469. "亮度",
  470. "对比度",};
  471. string[] sliderNameArrayPCKey = new string[]{
  472. "Brightness",
  473. "Contrast",};
  474. string[] sliderStrArrayPC = new string[]{
  475. "PU_BRIGHTNESS",
  476. "PU_CONTRAST"};
  477. //记录一个typeStr类型的数据存储操作对象
  478. ParamFloatValue pcBRIGHTNESS = new ParamFloatValue("ic_pc_PU_BRIGHTNESS", 0);
  479. ParamFloatValue pcCONTRAST = new ParamFloatValue("ic_pc_PU_CONTRAST", 0);
  480. public void initSliderPC()
  481. {
  482. for (int i = 0; i < sliderStrArrayPC.Length; i++)
  483. {
  484. string typeStr = sliderStrArrayPC[i];
  485. GameObject sliderObject = Instantiate(sliderPrefab, spawnPoint.transform);
  486. sliderObject.SetActive(true);
  487. sliderObject.name = typeStr;
  488. Slider slider = sliderObject.GetComponent<Slider>();
  489. Text textObj = sliderObject.transform.Find("text").GetComponent<Text>();
  490. Text titleTextObj = sliderObject.transform.Find("title").GetComponent<Text>();
  491. //titleTextObj.text = TextAutoLanguage2.GetTextByKey(sliderNameArrayPCKey[i]);// sliderNameArrayPC[i];//类型名字
  492. titleTextObj.gameObject.AddComponent<TextAutoLanguage2>().SetTextKey(sliderNameArrayPCKey[i]);
  493. if (slider != null)
  494. {
  495. slider.minValue = -1;
  496. slider.maxValue = 1;
  497. //记录一个typeStr类型的数据存储操作对象
  498. if (typeStr == "PU_BRIGHTNESS")
  499. {
  500. //获取设置默认存储的值
  501. float _Value = pcBRIGHTNESS.Get();
  502. infraredCameraHelper.SetBrightness(_Value);
  503. Debug.Log("[InfraredDemo] PC 设置 PU_BRIGHTNESS:" + typeStr + "默认值:" + _Value);
  504. slider.value = _Value;
  505. textObj.text = _Value + "";
  506. slider.onValueChanged.AddListener((newValue) =>
  507. {
  508. var _value = newValue;
  509. textObj.text = _value + "";
  510. infraredCameraHelper.SetBrightness(_value);
  511. pcBRIGHTNESS.Set(_value);
  512. });
  513. }
  514. else if (typeStr == "PU_CONTRAST")
  515. {
  516. //获取设置默认存储的值
  517. float _Value = pcCONTRAST.Get();
  518. infraredCameraHelper.SetContrast(_Value);
  519. Debug.Log("[InfraredDemo] PC 设置 PU_CONTRAST:" + typeStr + "默认值:" + _Value);
  520. slider.value = _Value;
  521. textObj.text = _Value + "";
  522. slider.onValueChanged.AddListener((newValue) =>
  523. {
  524. var _value = newValue;
  525. textObj.text = _value + "";
  526. infraredCameraHelper.SetContrast(_value);
  527. pcCONTRAST.Set(_value);
  528. });
  529. }
  530. }
  531. }
  532. }
  533. void resetPCData()
  534. {
  535. for (int i = 0; i < sliderStrArrayPC.Length; i++)
  536. {
  537. string typeStr = sliderStrArrayPC[i];
  538. Transform trans = _cameraParameterPanel.transform.Find(typeStr);
  539. Slider slider = trans.GetComponent<Slider>();
  540. Text textObj = trans.Find("text").GetComponent<Text>();
  541. //重置的值
  542. int _defValue = 0;
  543. if (typeStr == "PU_BRIGHTNESS")
  544. {
  545. _defValue = 0;
  546. infraredCameraHelper.SetBrightness(_defValue);
  547. }
  548. else if (typeStr == "PU_CONTRAST")
  549. {
  550. _defValue = 0;
  551. infraredCameraHelper.SetContrast(_defValue);
  552. }
  553. textObj.text = _defValue + "";
  554. slider.value = _defValue;
  555. }
  556. }
  557. #endregion
  558. void InitInfraredCamera()
  559. {
  560. if (_inited) return;
  561. _inited = true;
  562. //SDK创建
  563. if (infraredCameraHelper == null)
  564. {
  565. infraredCameraHelper = InfraredCameraHelper.GetInstance();
  566. #if UNITY_STANDALONE_WIN || UNITY_EDITOR
  567. infraredCameraHelper.CreateToPc();
  568. #endif
  569. #if UNITY_ANDROID || UNITY_IOS
  570. //开始时候设置一个默认分辨率
  571. Debug.Log("开始时候的分辨率下标:" + resoution.Get());
  572. Vector2 resoutionVec2 = SetDefByIndex((int)resoution.Get());
  573. CameraMirror cameraMirror = (CameraMirror)mirrorIndex.Get();
  574. infraredCameraHelper.Create((int)resoutionVec2.x, (int)resoutionVec2.y, cameraMirror);
  575. #endif
  576. infraredCameraHelper.OnPositionUpdate += (Vector2 point, Vector2 cameraLocation) =>
  577. {
  578. //跑九轴时候,不处理这里位置
  579. if (AimHandler.ins && AimHandler.ins.bRuning9Axis()) return;
  580. if (Camera.main == null) return;
  581. Ray ray = Camera.main.ScreenPointToRay(point);
  582. Vector3 rayEndPoint = ray.GetPoint(200);
  583. Quaternion quat = Quaternion.LookRotation(rayEndPoint - Camera.main.transform.position);
  584. // 挑战场景中其相机的父级有旋转,需要换算
  585. if (UnityEngine.SceneManagement.SceneManager.GetActiveScene().name == "GameChallenge")
  586. {
  587. quat = Quaternion.AngleAxis(-180, Vector3.up) * quat;
  588. }
  589. if (GameAssistUI.ins && GameAssistUI.ins.scaleAimOn)
  590. {
  591. if (CameraToLook.ins != null)
  592. {
  593. // 平滑旋转逻辑
  594. float dt = Mathf.Min(Time.deltaTime, 0.05f); // 避免低帧率造成旋转跳跃
  595. float smoothingFactor = GameMgr.gameType == 1 ? 12 : 7f; // 原始未开镜的FOV,可调节,数值越大越“跟手”
  596. CameraToLook.ins.localRotation = Quaternion.Slerp(
  597. CameraToLook.ins.localRotation,
  598. quat,
  599. dt * GameAssistUI.ins.currentSensitivity * smoothingFactor
  600. );
  601. }
  602. }
  603. else {
  604. if (CameraToLook.ins != null) CameraToLook.ins.localRotation = quat;
  605. }
  606. if (SB_EventSystem.ins) SB_EventSystem.ins.MoveSimulateMouseByInfrared(point);
  607. //移动目标游戏
  608. if (GeneratingTarget.gm != null) GeneratingTarget.gm.shootingEvent.OnPositionUpdate(point);
  609. ShowUICrosshairs(cameraLocation, 0);
  610. };
  611. //双点情况下更新
  612. infraredCameraHelper.OnPositionUpdate2 += (Vector2[] points, Vector2[] cameraLocations) =>
  613. {
  614. // 获取左右相机
  615. if (leftCamera == null) leftCamera = GameObject.Find("BowCameraFixedFirst")?.GetComponent<Camera>();
  616. if (rightCamera == null) rightCamera = GameObject.Find("BowCameraFixedSecond")?.GetComponent<Camera>();
  617. float halfScreenWidth = Screen.width / 2f; // 假设为全屏宽度的一半
  618. for (int i = 0; i < points.Length; i++)
  619. {
  620. Vector2 point = points[i];
  621. // 判断是否为右屏并调整坐标
  622. //if (i == 1)
  623. //{
  624. // point.x -= halfScreenWidth; // 同步到右屏坐标系
  625. //}
  626. if (i == 0 && leftCamera != null)
  627. {
  628. Ray ray1 = leftCamera.ScreenPointToRay(point);
  629. Vector3 rayEndPoint1 = ray1.GetPoint(200);
  630. Quaternion quat = Quaternion.LookRotation(rayEndPoint1 - ray1.origin);
  631. if (CameraToLook.ins != null) CameraToLook.ins.localRotation = quat;
  632. // ShowUICrosshairs(cameraLocations[0], 0);
  633. }
  634. if (i == 1 && rightCamera != null) //大点算2p
  635. {
  636. Ray ray2 = rightCamera.ScreenPointToRay(point);
  637. Vector3 rayEndPoint2 = ray2.GetPoint(200);
  638. Quaternion quat = Quaternion.LookRotation(rayEndPoint2 - ray2.origin);
  639. if (CameraToLookNew.ins != null) CameraToLookNew.ins.localRotation2P = quat;
  640. // ShowUICrosshairs(cameraLocations[1], 1);
  641. }
  642. ShowUICrosshairs(cameraLocations[i], i);
  643. }
  644. };
  645. infraredCameraHelper.OnUVCIsReady += (UVCManager.CameraInfo camera) =>
  646. {
  647. //生成控制摄像机的参数滑条
  648. Debug.Log("初始化摄像机!");
  649. //可以操作按钮
  650. mBtnSee.interactable = true;
  651. //mBtnSee.transform.Find("Text").GetComponent<Text>().text = "调试红外";
  652. updateBtnSee();
  653. //延迟重新设置一次分辨率
  654. StartCoroutine(delayInitOhterInfo(camera));
  655. };
  656. //屏幕变化时候
  657. infraredCameraHelper.OnUVCPosUpdate += (list) =>
  658. {
  659. Debug.Log("OnUVCPosUpdate list.Count" + list.Count);
  660. SetLocatePointsToCameraRender(list, 1, 1);
  661. //InfraredScreenPositioningView 页面
  662. if (list.Count == 4)
  663. {
  664. FindObjectOfType<InfraredScreenPositioningView>()?.SyncScreenPosition();
  665. }
  666. else
  667. {
  668. FindObjectOfType<InfraredScreenPositioningView>()?.onReset();
  669. }
  670. };
  671. //算法准备事件
  672. infraredCameraHelper.OnScreenLocateIsReady += () =>
  673. {
  674. Debug.Log("OnScreenLocateIsReady.");
  675. //b端设置偏移值
  676. if (CommonConfig.StandaloneModeOrPlatformB)
  677. {
  678. InitCenterOffset();
  679. }
  680. //开机默认单点,里面会设置一次数据
  681. SetSinglePoint(true);
  682. //设置双点数据
  683. //InitCenterOffsets(PlayerType.FirstPlayer);
  684. //InitCenterOffsets(PlayerType.SecondPlayer);
  685. };
  686. }
  687. }
  688. private void updateDropdownResolution2()
  689. {
  690. string[] resolutions = {
  691. TextAutoLanguage2.GetTextByKey("HighResolution"),
  692. TextAutoLanguage2.GetTextByKey("LowResolution")
  693. };
  694. // 清除默认选项
  695. _dropdownResolution2.ClearOptions();
  696. // 将分辨率字符串数组转换为 Dropdown 选项
  697. _dropdownResolution2.AddOptions(new List<string>(resolutions));
  698. }
  699. /// <summary>
  700. /// 初始化一些游戏配置
  701. /// </summary>
  702. /// <returns></returns>
  703. IEnumerator delayInitOhterInfo(UVCManager.CameraInfo camera)
  704. {
  705. //yield return new WaitForSeconds(1f);
  706. yield return new WaitForEndOfFrame();
  707. #if UNITY_ANDROID || UNITY_IOS
  708. initSlider(camera);
  709. camera.GetResolutionsStrs();
  710. // 默认设置
  711. updateDropdownResolution2();
  712. int index = (int)resoution.Get();
  713. _dropdownResolution2.value = index;
  714. _dropdownResolution2.RefreshShownValue();
  715. // 处理 Dropdown 的选择变化
  716. _dropdownResolution2.onValueChanged.AddListener(index => { OnResolutionChanged(index); });
  717. #endif
  718. #if UNITY_STANDALONE_WIN || UNITY_EDITOR
  719. initSliderPC();
  720. //隐藏不需要的设置
  721. _btnAdjusting.transform.Find("Text").GetComponent<Text>().text = "调整PC参数";
  722. _dropdownResolution.gameObject.SetActive(false);
  723. _dropdownResolution2.gameObject.SetActive(false);
  724. #endif
  725. //震动阈值
  726. SetShakeFilterValue(shakeFilterValue.Get());
  727. _sliderShakeFilter.onValueChanged.AddListener(SetShakeFilterValue);
  728. //功能按钮
  729. //重置触发测试
  730. _btnReset.onClick.AddListener(OnClick_Reset);
  731. _btnScreenLocateManual.onClick.AddListener(OnClick_ScreenLocateManual);
  732. _btnScreenLocateManualAuto.onClick.AddListener(OnClick_ScreenLocateManualAuto);
  733. SetCaptureValue(captureValue.Get());
  734. _sliderCapture.onValueChanged.AddListener(SetCaptureValue);
  735. SetDelayValue(delayValue.Get());
  736. _sliderDelay.onValueChanged.AddListener(SetDelayValue);
  737. //绘制线段
  738. SetLineWidth(lineWidth.Get());
  739. _sliderLineWidth.onValueChanged.AddListener(SetLineWidth);
  740. SetFanWidth(fanWidth.Get());
  741. _fanWidth.onValueChanged.AddListener(SetFanWidth);
  742. //检测红外亮度阈值
  743. SetInfraredFilterValue(infraredFileterValue.Get());
  744. _infraredFilter.onValueChanged.AddListener(SetInfraredFilterValue);
  745. //野鸭设置初始关卡
  746. int defLevel = (int)duckHunterLevel.Get() - 1 < 0 ? 0 : (int)duckHunterLevel.Get() - 1;
  747. _duckLevelDropdown.SetValueWithoutNotify(defLevel);
  748. _duckLevelDropdown.onValueChanged.AddListener(SetDuckLevelTest);
  749. ////b端设置偏移值
  750. //if (CommonConfig.StandaloneModeOrPlatformB) {
  751. // InitCenterOffset();
  752. //}
  753. }
  754. /// <summary>
  755. /// 初始化时候获取设置和存储来控制显示准心
  756. /// </summary>
  757. /// <returns></returns>
  758. public bool bInitCrosshairShow()
  759. {
  760. return UserSettings.ins.openCrossHair && getCrosshairValue() == 1 ? true : false;
  761. }
  762. /// <summary>
  763. /// 获取弓箭准心存储值
  764. /// </summary>
  765. /// <returns></returns>
  766. public int getCrosshairValue()
  767. {
  768. return (int)crosshairValue.Get();
  769. }
  770. public void setCrosshairValue(bool bshow)
  771. {
  772. crosshairValue.Set(bshow ? 1 : 0);
  773. }
  774. public void onStartPreview()
  775. {
  776. infraredCameraHelper.onStartPreview();
  777. }
  778. public void onStopPreview()
  779. {
  780. infraredCameraHelper.onStopPreview();
  781. }
  782. //水平
  783. public void onFlipHorizontally()
  784. {
  785. CameraMirror cameraMirror = CameraMirror.HORIZONTAL;
  786. mirrorIndex.Set((int)cameraMirror);
  787. infraredCameraHelper.onFlipHorizontally();
  788. }
  789. //垂直
  790. public void onFlipVertically()
  791. {
  792. CameraMirror cameraMirror = CameraMirror.VERTICAL;
  793. mirrorIndex.Set((int)cameraMirror);
  794. infraredCameraHelper.onFlipVertically();
  795. }
  796. /// <summary>
  797. /// 获取并且初始化一次记录点的数据
  798. /// </summary>
  799. /// <returns></returns>
  800. IEnumerator initScreenLocateManual()
  801. {
  802. yield return new WaitForSeconds(1f);
  803. infraredCameraHelper.InitScreenLocateManual();
  804. }
  805. IEnumerator RestartOrKillApp()
  806. {
  807. yield return new WaitForSeconds(0.3f);
  808. if (Application.isEditor) yield break;
  809. if (Application.platform == RuntimePlatform.Android)
  810. {
  811. using (var unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
  812. {
  813. const int kIntent_FLAG_ACTIVITY_CLEAR_TASK = 0x00008000;
  814. const int kIntent_FLAG_ACTIVITY_NEW_TASK = 0x10000000;
  815. var currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
  816. var pm = currentActivity.Call<AndroidJavaObject>("getPackageManager");
  817. var intent = pm.Call<AndroidJavaObject>("getLaunchIntentForPackage", Application.identifier);
  818. intent.Call<AndroidJavaObject>("setFlags", kIntent_FLAG_ACTIVITY_NEW_TASK | kIntent_FLAG_ACTIVITY_CLEAR_TASK);
  819. currentActivity.Call("startActivity", intent);
  820. currentActivity.Call("finish");
  821. var process = new AndroidJavaClass("android.os.Process");
  822. int pid = process.CallStatic<int>("myPid");
  823. process.CallStatic("killProcess", pid);
  824. }
  825. }
  826. else
  827. {
  828. // 获取当前应用程序的可执行文件路径
  829. string executablePath = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
  830. // 重启应用程序
  831. System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo
  832. {
  833. FileName = executablePath,
  834. UseShellExecute = false
  835. };
  836. System.Diagnostics.Process.Start(startInfo);
  837. // 退出当前应用程序
  838. Application.Quit();
  839. }
  840. ;
  841. }
  842. void UpdateInfraredCamera()
  843. {
  844. if (!_visiable) return;
  845. if (!_inited) return;
  846. if (infraredCameraHelper == null) return;
  847. //渲染相机画面
  848. //_cameraRender.texture = infraredCameraHelper.GetCameraTexture();
  849. //_cameraRender.material = infraredCameraHelper.GetCameraMaterial();
  850. if (ScreenLocate.Main.getUVCTexture)
  851. {
  852. if (isFullscreen || ScreenLocate.Main.OutputTextures[4] == null)
  853. {
  854. if (_cameraRender.texture == null || ScreenLocate.Main.getUVCTexture.GetNativeTexturePtr() != _cameraRender.texture.GetNativeTexturePtr())
  855. _cameraRender.texture = ScreenLocate.Main.getUVCTexture;
  856. //ScreenLocate.Main.OutputTextures[4] == null 并且 摄像机缩小的情况下。显示适配线段
  857. if (!isFullscreen) SetAllToggle(true);
  858. }
  859. else if (ScreenLocate.Main.OutputTextures[4] != null)
  860. {
  861. //缩小的情况下。显示黑白色差的合成图
  862. if (_cameraRender.texture == null || ScreenLocate.Main.OutputTextures[4] != null && ScreenLocate.Main.OutputTextures[4].GetNativeTexturePtr() != _cameraRender.texture.GetNativeTexturePtr())
  863. _cameraRender.texture = ScreenLocate.Main.OutputTextures[4];
  864. //底图缩小的情况下。不显示适配线段,并且隐藏points
  865. if (!isFullscreen)
  866. {
  867. if (showPoints)
  868. {
  869. Transform pointsTF2 = _cameraRender.transform.Find("Points");
  870. for (int i = 0; i < pointsTF2.childCount; i++)
  871. {
  872. Transform pointTF = pointsTF2.GetChild(i);
  873. pointTF.gameObject.SetActive(false);
  874. showPoints = false;
  875. }
  876. }
  877. SetAllToggle(false);
  878. }
  879. }
  880. //_cameraRender.SetNativeSize();
  881. // _MaintainAspectRatio.AdjustSize();
  882. }
  883. //在相机画面显示准心
  884. if (ScreenLocate.Main)
  885. {
  886. var _sl = ScreenLocate.Main;
  887. //var buffer = _sl.infraredSpotBuffer;
  888. //if (buffer != null)
  889. //{
  890. // for (int i = 0; i < buffer.Length; i++)
  891. // {
  892. // if (buffer[i].CameraLocation != null)
  893. // {
  894. // //添加一个偏移量,使得最后输出的准心是指向正中心
  895. // Vector2 newPoint2 = _sl.GetOffsetCameraLocation(buffer[i].CameraLocation.Value);
  896. // // 检测到光点
  897. // var pos = newPoint2.pixelToLocalPosition_AnchorCenter(_sl.mUVCCameraInfo.Size, _cameraRender.rectTransform.rect);
  898. // _crosshairsInCamera[i].gameObject.SetActive(true);
  899. // _crosshairsInCamera[i].anchoredPosition = pos;
  900. // }
  901. // else
  902. // _crosshairsInCamera[i].gameObject.SetActive(false);
  903. // }
  904. //}
  905. //渲染固定摄像机分辨率
  906. SetCalibrationFixedText(_sl.mUVCCameraInfo.CurrentCalibrationResolution);
  907. //渲染摄像机大小
  908. if (_sl.mUVCCameraInfo != null) SetCameraSizeText(_sl.mUVCCameraInfo.Size);
  909. //渲染摄像机识别点位置
  910. SetQuadUnityVectorListText(_sl.PrintVector2List(ScreenLocate.quadUnityVectorList));
  911. }
  912. }
  913. /// <summary>
  914. /// 更新屏幕下的十字准心位置
  915. /// </summary>
  916. /// <param name="value"></param>
  917. void ShowUICrosshairs(Vector2 newPoint2, int index)
  918. {
  919. ////获取一个偏移量,使得最后输出的准心是指向正中心
  920. //Vector2 newPoint2 = value - ICHelper.GetCenterOffset(value, "CameraLocation");
  921. // 检测到光点
  922. var pos = newPoint2.pixelToLocalPosition_AnchorCenter(infraredCameraHelper.GetUVCCameraInfo().Size, _cameraRender.rectTransform.rect);
  923. //红色为最大值则按顺序赋值,反之最小
  924. int curIndex = index;
  925. //if (bIdentifyRed)
  926. //{
  927. // curIndex = index;
  928. //}
  929. //else
  930. //{
  931. // curIndex = 1 - index;
  932. //}
  933. _crosshairsInCamera[curIndex].gameObject.SetActive(true);
  934. _crosshairsInCamera[curIndex].anchoredPosition = pos;
  935. }
  936. bool showPoints = false;
  937. public void SetLocatePointsToCameraRender(List<Vector2> points, float w, float h)
  938. {
  939. Transform pointsTF2 = _cameraRender.transform.Find("Points");
  940. if (pointsTF2.childCount == points.Count)
  941. {
  942. Vector2 texSize = new Vector2(w, h);
  943. for (int i = 0; i < pointsTF2.childCount; i++)
  944. {
  945. Transform pointTF = pointsTF2.GetChild(i);
  946. Vector2 pos = points[i];
  947. pointTF.localPosition = pos.pixelToLocalPosition_AnchorCenter(texSize, _cameraRender.rectTransform.rect);
  948. pointTF.gameObject.SetActive(true);
  949. showPoints = true;
  950. }
  951. }
  952. else
  953. {
  954. for (int i = 0; i < pointsTF2.childCount; i++)
  955. {
  956. Transform pointTF = pointsTF2.GetChild(i);
  957. pointTF.gameObject.SetActive(false);
  958. showPoints = false;
  959. }
  960. }
  961. //绘制数据
  962. DrawTestLine();
  963. }
  964. #region 测试数据绘制
  965. [SerializeField] private Toggle curToggle;
  966. [SerializeField] private Toggle autoToggle; // 控制 AutoUILineGenerator 的 Toggle
  967. [SerializeField] private Toggle semiAutoToggle; // 控制 SemiAutoUILineGenerator 的 Toggle
  968. [SerializeField] private Toggle manualToggle; // 控制 ManualUILineGenerator 的 Toggle
  969. [SerializeField] LineGenerator CurUILineGenerator;//当前结果屏幕线条
  970. [SerializeField] LineGenerator AutoUILineGenerator;//第一个结果屏幕线条
  971. [SerializeField] LineGenerator SemiAutoUILineGenerator;//第二个结果屏幕线条
  972. [SerializeField] LineGenerator ManualUILineGenerator;//第三个结果屏幕线条
  973. [SerializeField] private Dropdown dropdown; // 引用场景中的 Dropdown 组件
  974. [SerializeField] RawImage _cameraRenderTest5;
  975. [SerializeField] RawImage _cameraRenderTest6;
  976. void DrawTestLine()
  977. {
  978. Vector2 texSize = ScreenLocate.Main.getUVCCameraInfoSize;
  979. // 判断 texSize 是否为有效值
  980. if (texSize == Vector2.zero)
  981. {
  982. Debug.LogWarning("Texture size is zero, cannot proceed with line drawing.");
  983. return;
  984. }
  985. // 设置三个屏幕四边形和线条生成器
  986. QuadrilateralInCamera[] screenQuads = new QuadrilateralInCamera[] {
  987. ScreenLocate.Main.ScreenIdentification?.QuadAuto,
  988. ScreenLocate.Main.ScreenIdentification?.QuadSemiAuto,
  989. ScreenLocate.Main.ScreenIdentification?.QuadManual
  990. };
  991. LineGenerator[] lineGenerators = new LineGenerator[] {
  992. AutoUILineGenerator,
  993. SemiAutoUILineGenerator,
  994. ManualUILineGenerator
  995. };
  996. for (int i = 0; i < screenQuads.Length; i++)
  997. {
  998. if (screenQuads[i] == null)
  999. {
  1000. Debug.LogWarning($"Screen quadrilateral {i} is null, skipping this line.");
  1001. continue;
  1002. }
  1003. if (lineGenerators[i] == null)
  1004. {
  1005. Debug.LogWarning($"Line generator {i} is null, skipping this line.");
  1006. continue;
  1007. }
  1008. lineGenerators[i].Points = ConvertQuadToPoints(screenQuads[i], texSize);
  1009. }
  1010. // 清除旧选项并填充新的选项
  1011. dropdown.ClearOptions();
  1012. List<string> options = new List<string>();
  1013. //for (int i = 0; i < screenQuads.Length; i++)
  1014. //{
  1015. // options.Add($"Quad {i + 1}");
  1016. //}
  1017. //options.Add("自动识别");
  1018. //options.Add("半自动识别");
  1019. //options.Add("手动识别");
  1020. options.Add(TextAutoLanguage2.GetTextByKey("AutoRecognition")); // "自动识别"
  1021. options.Add(TextAutoLanguage2.GetTextByKey("SemiAutoRecognition")); // "半自动识别"
  1022. options.Add(TextAutoLanguage2.GetTextByKey("ManualRecognition")); // "手动识别"
  1023. dropdown.AddOptions(options);
  1024. // 添加监听器来处理选择事件
  1025. dropdown.onValueChanged.AddListener((index) =>
  1026. {
  1027. OnDropdownValueChanged(index, screenQuads);
  1028. });
  1029. if (screenQuads[0] != null || screenQuads[1] != null)
  1030. {
  1031. Texture texImage6 = ScreenLocate.Main.OutputTextures[5];
  1032. if (texImage6 != null) _cameraRenderTest6.texture = texImage6;
  1033. }
  1034. if (ScreenLocate.quadUnityVectorList.Count == 4)
  1035. {
  1036. //绘制白色线段
  1037. var lo = new Vector2(-0.5f, -0.5f);
  1038. CurUILineGenerator.Points = new Vector2[4] {
  1039. 2 * (ScreenLocate.quadUnityVectorList[0] + lo),
  1040. 2 * (ScreenLocate.quadUnityVectorList[1] + lo),
  1041. 2 * (ScreenLocate.quadUnityVectorList[3] + lo),
  1042. 2 * (ScreenLocate.quadUnityVectorList[2] + lo) };
  1043. }
  1044. }
  1045. // 当下拉框选项更改时调用的方法
  1046. private void OnDropdownValueChanged(int index, QuadrilateralInCamera[] screenQuads)
  1047. {
  1048. if (index >= 0 && index < screenQuads.Length)
  1049. {
  1050. if (screenQuads[index] != null)
  1051. {
  1052. QuadrilateralInCamera selectedQuad = screenQuads[index];
  1053. Debug.Log($"Selected Quad {index + 1}: {selectedQuad}");
  1054. CurUILineGenerator.Points = ConvertQuadToPoints(selectedQuad, ScreenLocate.Main.getUVCCameraInfoSize);
  1055. }
  1056. else
  1057. {
  1058. Debug.LogWarning($"Selected Quad {index + 1} is null.");
  1059. }
  1060. }
  1061. else
  1062. {
  1063. Debug.LogWarning("所选索引超出范围!");
  1064. }
  1065. }
  1066. /// <summary>
  1067. /// 提取转换四边形的方法
  1068. /// </summary>
  1069. /// <param name="quad"></param>
  1070. /// <param name="texSize"></param>
  1071. /// <returns></returns>
  1072. public Vector2[] ConvertQuadToPoints(QuadrilateralInCamera quad, Vector2 texSize)
  1073. {
  1074. if (quad == null || quad.Quad == null || quad.Quad.Count < 4)
  1075. {
  1076. Debug.LogWarning("Invalid quadrilateral data provided.");
  1077. return new Vector2[0]; // 返回空数组以避免异常
  1078. }
  1079. Vector2 offset = new Vector2(-0.5f, -0.5f); // 假设 'lo' 是某个已定义的偏移量
  1080. return new Vector2[4] {
  1081. 2 * (new Vector2(quad.Quad[0].x / texSize.x, quad.Quad[0].y / texSize.y) + offset),
  1082. 2 * (new Vector2(quad.Quad[1].x / texSize.x, quad.Quad[1].y / texSize.y) + offset),
  1083. 2 * (new Vector2(quad.Quad[3].x / texSize.x, quad.Quad[3].y / texSize.y) + offset),
  1084. 2 * (new Vector2(quad.Quad[2].x / texSize.x, quad.Quad[2].y / texSize.y) + offset)
  1085. };
  1086. }
  1087. public Vector2[] ConvertPointsToCoordinates(Vector2[] points, Vector2 texSize, Vector2 pivot)
  1088. {
  1089. if (points == null || points.Length < 1)
  1090. {
  1091. Debug.LogWarning("Invalid point data provided.");
  1092. return new Vector2[0]; // 返回空数组以避免异常
  1093. }
  1094. Vector2 offset = new Vector2(-0.5f, -0.5f); // 将坐标从中心对齐到左下角对齐
  1095. List<Vector2> transformedPoints = new List<Vector2>();
  1096. // 遍历所有传入的点进行转换
  1097. foreach (var point in points)
  1098. {
  1099. // 转换每个点,考虑 texSize 和 pivot 偏移
  1100. Vector2 transformedPoint = 2 * ((point / texSize) + offset + pivot);
  1101. transformedPoints.Add(transformedPoint);
  1102. }
  1103. return transformedPoints.ToArray();
  1104. }
  1105. void initToggle()
  1106. {
  1107. // 监听 Toggle 值的变化
  1108. if (curToggle != null)
  1109. curToggle.onValueChanged.AddListener(isOn => ToggleLineGenerator(CurUILineGenerator, isOn));
  1110. // 监听 Toggle 值的变化
  1111. if (autoToggle != null)
  1112. autoToggle.onValueChanged.AddListener(isOn => ToggleLineGenerator(AutoUILineGenerator, isOn));
  1113. if (semiAutoToggle != null)
  1114. semiAutoToggle.onValueChanged.AddListener(isOn => ToggleLineGenerator(SemiAutoUILineGenerator, isOn));
  1115. if (manualToggle != null)
  1116. manualToggle.onValueChanged.AddListener(isOn => ToggleLineGenerator(ManualUILineGenerator, isOn));
  1117. }
  1118. // 控制 LineGenerator 的启用/禁用
  1119. private void ToggleLineGenerator(LineGenerator lineGenerator, bool isOn)
  1120. {
  1121. if (lineGenerator != null && lineGenerator.enabled != isOn)
  1122. {
  1123. lineGenerator.enabled = isOn;
  1124. Debug.Log($"{lineGenerator.name} is now {(isOn ? "enabled" : "disabled")}");
  1125. }
  1126. }
  1127. /// <summary>
  1128. /// 设置全部显示
  1129. /// </summary>
  1130. /// <param name="value"></param>
  1131. private void SetAllToggle(bool value)
  1132. {
  1133. ToggleLineGenerator(CurUILineGenerator, value);
  1134. ToggleLineGenerator(AutoUILineGenerator, value);
  1135. ToggleLineGenerator(SemiAutoUILineGenerator, value);
  1136. ToggleLineGenerator(ManualUILineGenerator, value);
  1137. }
  1138. /// <summary>
  1139. /// 放大时候同步一次toggle
  1140. /// </summary>
  1141. private void SyncAllToggle()
  1142. {
  1143. ToggleLineGenerator(CurUILineGenerator, curToggle.isOn);
  1144. ToggleLineGenerator(AutoUILineGenerator, autoToggle.isOn);
  1145. ToggleLineGenerator(SemiAutoUILineGenerator, semiAutoToggle.isOn);
  1146. ToggleLineGenerator(ManualUILineGenerator, manualToggle.isOn);
  1147. }
  1148. // 下拉菜单用于显示纹理名称
  1149. public Dropdown textureDropdown;
  1150. // 按钮用于导出选中的纹理
  1151. public Button exportSelectedButton;
  1152. // 按钮用于导出所有纹理
  1153. public Button exportAllButton;
  1154. // 定义纹理名称
  1155. string[] textureNames;
  1156. /// <summary>
  1157. /// 更新一下菜单
  1158. /// </summary>
  1159. public void UpdateLanguage()
  1160. {
  1161. string[] _textureNames = {
  1162. TextAutoLanguage2.GetTextByKey("ScreenAOriginal"), // "A屏幕原图"
  1163. TextAutoLanguage2.GetTextByKey("SemiAutoSegmentB"), // "B半自动识别线段"
  1164. TextAutoLanguage2.GetTextByKey("BlackWhiteContrastC"), // "C黑白色差"
  1165. TextAutoLanguage2.GetTextByKey("RecognitionResultD"), // "D识别结果"
  1166. TextAutoLanguage2.GetTextByKey("ColorContrastOverlayE"), // "E色差叠加识别结果"
  1167. TextAutoLanguage2.GetTextByKey("SemiAutoAlternativeF") // "F半自动备选线段"
  1168. };
  1169. textureNames = _textureNames;
  1170. // 设置下拉菜单的选项
  1171. textureDropdown.ClearOptions();
  1172. textureDropdown.AddOptions(new System.Collections.Generic.List<string>(textureNames));
  1173. }
  1174. void initExport()
  1175. {
  1176. UpdateLanguage();
  1177. // 添加导出选中纹理的按钮点击事件
  1178. exportSelectedButton.onClick.AddListener(() => SaveTextureToLocal(textureDropdown.value));
  1179. // 添加导出所有纹理的按钮点击事件
  1180. exportAllButton.onClick.AddListener(SaveAllTexturesToLocal);
  1181. }
  1182. /// <summary>
  1183. /// 导出所有纹理
  1184. /// </summary>
  1185. public void SaveAllTexturesToLocal()
  1186. {
  1187. for (int i = 0; i < textureNames.Length; i++)
  1188. {
  1189. SaveTextureToLocal(i); // 调用之前定义的保存方法
  1190. }
  1191. }
  1192. /// <summary>
  1193. /// 导出图片
  1194. /// </summary>
  1195. /// <param name="index"></param>
  1196. public void SaveTextureToLocal(int index)
  1197. {
  1198. Texture2D[] outputTexture2D = ScreenLocate.Main.OutputTextures;
  1199. if (outputTexture2D == null || index >= outputTexture2D.Length || outputTexture2D[index] == null)
  1200. {
  1201. Debug.LogError("Invalid texture index or texture is null.index:" + index);
  1202. return;
  1203. }
  1204. // 定义保存路径
  1205. string time = DateTime.Now.ToString("yyyyMMdd_HHmmss");
  1206. string baseName = $"{time}_Texture_{index}";
  1207. // 检查索引是否在命名数组内
  1208. string fileName = index < textureNames.Length ? textureNames[index] : $"Texture_{index}";
  1209. #if UNITY_ANDROID && !UNITY_EDITOR_WIN
  1210. string path = System.IO.Path.Combine("/storage/emulated/0/Download", $"{baseName}_{fileName}.png"); //public
  1211. #else
  1212. string path = System.IO.Path.Combine(Application.persistentDataPath, $"{baseName}_{fileName}.png");
  1213. #endif
  1214. // 编码纹理为 PNG 格式
  1215. byte[] bytes = outputTexture2D[index].EncodeToPNG();
  1216. // 将字节写入文件
  1217. System.IO.File.WriteAllBytes(path, bytes);
  1218. Debug.Log($"Texture saved as: {path}");
  1219. //NativeGallery.SaveImageToGallery(path,"InfraredGame", $"{baseName}_{fileName}.png",(success,path)=> {
  1220. // Debug.Log(success?$" 成功保存到相册: {path}" : "保存失败");
  1221. //});
  1222. }
  1223. //下面是处理对象放大缩小
  1224. public RectTransform cameraObj1; // 拖拽你的 CameraSize1 对象到此字段
  1225. public Button toggleButton; // 缩小时使用的按钮
  1226. private Vector2 originalSize;
  1227. private Vector2 originalAnchoredPosition; // 使用 anchoredPosition 代替 localPosition
  1228. private Vector2 originalAnchorMin;
  1229. private Vector2 originalAnchorMax;
  1230. private int originalSiblingIndex; // 保存初始的层级索引
  1231. private bool isFullscreen = false;
  1232. /// <summary>
  1233. /// 测试效果屏幕数据初始化
  1234. /// </summary>
  1235. void InitFullScreen()
  1236. {
  1237. if (cameraObj1 != null)
  1238. {
  1239. // 保存初始大小、位置和层级索引
  1240. originalSize = cameraObj1.sizeDelta;
  1241. originalAnchoredPosition = cameraObj1.anchoredPosition;
  1242. originalAnchorMin = cameraObj1.anchorMin; // 记录初始 anchorMin
  1243. originalAnchorMax = cameraObj1.anchorMax; // 记录初始 anchorMax
  1244. originalSiblingIndex = cameraObj1.GetSiblingIndex();
  1245. // 为 cameraObj1 添加点击事件
  1246. cameraObj1.GetComponent<Button>().onClick.AddListener(ToggleFullscreen);
  1247. toggleButton.transform.parent.gameObject.SetActive(false);
  1248. }
  1249. if (toggleButton != null)
  1250. {
  1251. // 为按钮添加点击事件以恢复大小
  1252. toggleButton.onClick.AddListener(RestoreSize);
  1253. }
  1254. }
  1255. void ToggleFullscreen()
  1256. {
  1257. if (cameraObj1 == null) return;
  1258. if (!isFullscreen)
  1259. {
  1260. // 设置锚点为全屏,调整位置和偏移量
  1261. cameraObj1.anchorMin = Vector2.zero;
  1262. cameraObj1.anchorMax = Vector2.one;
  1263. cameraObj1.offsetMin = Vector2.zero;
  1264. cameraObj1.offsetMax = Vector2.zero;
  1265. cameraObj1.anchoredPosition = Vector3.zero;
  1266. cameraObj1.SetSiblingIndex(cameraObj1.parent.childCount - 1); // 设置为最上层
  1267. //刷新一次点
  1268. SetLocatePointsToCameraRender(ScreenLocate.quadUnityVectorList, 1, 1);
  1269. toggleButton.transform.parent.gameObject.SetActive(true);
  1270. isFullscreen = true;
  1271. //放大情况根据toggle来显示
  1272. SyncAllToggle();
  1273. }
  1274. }
  1275. void RestoreSize()
  1276. {
  1277. if (cameraObj1 == null || !isFullscreen) return;
  1278. // 恢复锚点和偏移量
  1279. cameraObj1.anchorMin = originalAnchorMin; // 使用在 Start() 中记录的初始锚点
  1280. cameraObj1.anchorMax = originalAnchorMax; // 使用在 Start() 中记录的初始锚点
  1281. cameraObj1.sizeDelta = originalSize;
  1282. cameraObj1.anchoredPosition = originalAnchoredPosition; // 恢复为初始 anchoredPosition
  1283. cameraObj1.SetSiblingIndex(originalSiblingIndex); // 恢复到原本的层级索引
  1284. //刷新一次点
  1285. SetLocatePointsToCameraRender(ScreenLocate.quadUnityVectorList, 1, 1);
  1286. toggleButton.transform.parent.gameObject.SetActive(false);
  1287. isFullscreen = false;
  1288. }
  1289. #endregion
  1290. public void SetLocatePointsToCameraRenderTest(List<Vector2> points, float w, float h)
  1291. {
  1292. Transform pointsTF2 = _cameraRender.transform.Find("PointsTest");
  1293. if (pointsTF2.childCount == points.Count)
  1294. {
  1295. Vector2 texSize = new Vector2(w, h);
  1296. for (int i = 0; i < pointsTF2.childCount; i++)
  1297. {
  1298. Transform pointTF = pointsTF2.GetChild(i);
  1299. Vector2 pos = points[i];
  1300. pointTF.localPosition = pos.pixelToLocalPosition_AnchorCenter(texSize, _cameraRender.rectTransform.rect);
  1301. pointTF.gameObject.SetActive(true);
  1302. }
  1303. }
  1304. else
  1305. {
  1306. for (int i = 0; i < pointsTF2.childCount; i++)
  1307. {
  1308. Transform pointTF = pointsTF2.GetChild(i);
  1309. pointTF.gameObject.SetActive(false);
  1310. }
  1311. }
  1312. }
  1313. void SetShakeFilterValue(float v)
  1314. {
  1315. shakeFilterValue.Set(v);
  1316. _sliderShakeFilter.SetValueWithoutNotify(shakeFilterValue.Get());
  1317. _sliderShakeFilter.transform.Find("Value").GetComponent<Text>().text = shakeFilterValue.Get().ToString("f1");
  1318. infraredCameraHelper.SetShakeFilterValue(shakeFilterValue.Get());
  1319. }
  1320. /// <summary>
  1321. /// 重新设置分辨率
  1322. /// </summary>
  1323. /// <param name="index"></param>
  1324. public void resolutionRestartApp(int index)
  1325. {
  1326. #if UNITY_ANDROID || UNITY_IOS
  1327. //StartCoroutine(RestartOrKillApp());
  1328. //获取第一个分辨率设置后设置size
  1329. switch (index)
  1330. {
  1331. case 0:
  1332. infraredCameraHelper.SetHighCameraResolution();
  1333. resoution.Set(index);
  1334. _dropdownResolution2.SetValueWithoutNotify(index);
  1335. break;
  1336. case 1:
  1337. infraredCameraHelper.SetLowCameraResolution();
  1338. resoution.Set(index);
  1339. _dropdownResolution2.SetValueWithoutNotify(index);
  1340. break;
  1341. }
  1342. #endif
  1343. }
  1344. /// <summary>
  1345. /// 初始化时候,设置的值
  1346. /// </summary>
  1347. /// <param name="index"></param>
  1348. public Vector2 SetDefByIndex(int index = 0)
  1349. {
  1350. //SetResolutionNew 里面对应的下标
  1351. Vector2 vec2 = new Vector2(320, 240);
  1352. switch (index)
  1353. {
  1354. case 0:
  1355. vec2 = new Vector2(320, 240);
  1356. break;
  1357. case 1:
  1358. vec2 = new Vector2(160, 120);
  1359. break;
  1360. }
  1361. return vec2;
  1362. }
  1363. /// <summary>
  1364. /// 当 Dropdown 选择变化时的处理方法
  1365. /// </summary>
  1366. /// <param name="OnResolutionChanged">320x240</param>
  1367. private void OnResolutionChanged(int index)
  1368. {
  1369. #if UNITY_ANDROID || UNITY_IOS
  1370. Debug.Log("Selected Resolution: " + index);
  1371. // 将选定的分辨率转换为实际的宽度和高度
  1372. // 并且需要判断是否存在最低分辨率
  1373. if (index == 1 && currentCameraInfo.ContainsResulutionKey("160x120"))
  1374. {
  1375. // 在这里你可以根据实际需要设置屏幕分辨率或进行其他操作
  1376. infraredCameraHelper.SetLowCameraResolution();
  1377. // 保存选择的分辨率到 PlayerPrefs
  1378. resoution.Set(index);
  1379. }
  1380. else if (index == 0)
  1381. {
  1382. //如果是0就 使用高分辨率
  1383. infraredCameraHelper.SetHighCameraResolution();
  1384. // 保存选择的分辨率到 PlayerPrefs
  1385. resoution.Set(index);
  1386. }
  1387. #endif
  1388. }
  1389. /// <summary>
  1390. /// 野鸭关卡测试初始值
  1391. /// </summary>
  1392. /// <param name="optionIndex"></param>
  1393. public void SetDuckLevelTest(int optionIndex)
  1394. {
  1395. //选择下标+1
  1396. int v = optionIndex + 1;
  1397. duckHunterLevel.Set(v);
  1398. int defLevel = (int)duckHunterLevel.Get() - 1 < 0 ? 0 : (int)duckHunterLevel.Get() - 1;
  1399. _duckLevelDropdown.SetValueWithoutNotify(defLevel);
  1400. //_duckLevelDropdown.transform.Find("Value").GetComponent<Text>().text = defLevel+"";
  1401. }
  1402. void OnClick_Reset()
  1403. {
  1404. //SetBrightness(1);
  1405. //SetSaturation(1);
  1406. //SetContrast(1);
  1407. SetShakeFilterValue(6);
  1408. SetLineWidth(4);
  1409. SetFanWidth(90);
  1410. #if UNITY_IOS
  1411. SetInfraredFilterValue(0.6f);
  1412. #else
  1413. SetInfraredFilterValue(0.8f);
  1414. #endif
  1415. SetCaptureValue(30.0f);
  1416. SetDelayValue(30.0f);
  1417. //重置为第一关
  1418. SetDuckLevelTest(0);
  1419. }
  1420. /// <summary>
  1421. /// 清除当前红外存储的所有key
  1422. /// </summary>
  1423. public void OnClickClearInfraredGuider()
  1424. {
  1425. BluetoothAim.ins.ClearAllInfraredGuider();
  1426. }
  1427. public void OnClickClearAll()
  1428. {
  1429. PlayerPrefs.DeleteAll();
  1430. // 保存更改
  1431. PlayerPrefs.Save();
  1432. StartCoroutine(RestartOrKillApp());
  1433. }
  1434. void OnClick_ScreenLocateManual()
  1435. {
  1436. bool bEnter = true;
  1437. if (BluetoothAim.ins && BluetoothAim.ins.status == BluetoothStatusEnum.ConnectSuccess)
  1438. {
  1439. if (BluetoothAim.ins.isMainConnectToInfraredDevice() || BluetoothAim.ins.isMainConnectToGun())
  1440. {
  1441. bEnter = true;
  1442. }
  1443. else
  1444. {
  1445. bEnter = false;
  1446. //只有红外设备才能进行屏幕识别
  1447. PopupMgr.ins.ShowTipTop(TextAutoLanguage2.GetTextByKey("Connect_Tip_Infrared"));
  1448. }
  1449. }
  1450. if (bEnter)
  1451. {
  1452. ViewManager2.ShowView(ViewManager2.Path_InfraredScreenPositioningView);
  1453. FindObjectOfType<InfraredScreenPositioningView>().enterFromInfraredDemo = true;
  1454. }
  1455. }
  1456. void OnClick_ScreenLocateManualAuto()
  1457. {
  1458. bool bEnter = true;
  1459. if (BluetoothAim.ins && BluetoothAim.ins.status == BluetoothStatusEnum.ConnectSuccess)
  1460. {
  1461. if (BluetoothAim.ins.isMainConnectToInfraredDevice() || BluetoothAim.ins.isMainConnectToGun())
  1462. {
  1463. bEnter = true;
  1464. }
  1465. else
  1466. {
  1467. bEnter = false;
  1468. //只有红外设备才能进行屏幕识别
  1469. PopupMgr.ins.ShowTipTop(TextAutoLanguage2.GetTextByKey("Connect_Tip_Infrared"));
  1470. }
  1471. }
  1472. if (bEnter)
  1473. {
  1474. ResetCenterOffset();
  1475. ResetPositioningData();
  1476. infraredCameraHelper.EnterScreenLocateManualAuto();
  1477. }
  1478. }
  1479. public void OnClick_SetAdjustPointsOffset()
  1480. {
  1481. //var _sl = ScreenLocate.Main;
  1482. //var buffer = _sl.infraredSpotBuffer;
  1483. //if (buffer != null)
  1484. //{
  1485. // for (int i = 0; i < buffer.Length; i++)
  1486. // {
  1487. // if (buffer[i].CameraLocation != null)
  1488. // {
  1489. // Debug.Log("CameraLocation:"+buffer[i].CameraLocation.Value);
  1490. // var centerOffset = infraredCameraHelper.GetCenterOffset(buffer[i].CameraLocation.Value, "CameraLocation");
  1491. // Debug.Log("CenterOffset: " + centerOffset);
  1492. // cameraLocationValue.Set(centerOffset);
  1493. // var uvCenterOffset = infraredCameraHelper.GetCenterOffset(buffer[i].ScreenUV.Value, "ScreenUV");
  1494. // Debug.Log("UvCenterOffset: " + uvCenterOffset);
  1495. // screenUVValue.Set(uvCenterOffset);
  1496. // //如果是新手教程场景里面的校准
  1497. // InfraredGuider infraredGuiderObj = FindObjectOfType<InfraredGuider>();
  1498. // if (infraredGuiderObj != null)
  1499. // {
  1500. // GameObject infraredGuiderGameObject = infraredGuiderObj.gameObject;
  1501. // infraredGuiderGameObject.GetComponent<InfraredGuider>().SetTitleAfterCalibration();
  1502. // }
  1503. // }
  1504. // }
  1505. //}
  1506. //只能校准第一个
  1507. if (infraredCameraHelper.IsSinglePoint())
  1508. {
  1509. SetAdjustPointsOffset(PlayerType.FirstPlayer);
  1510. }
  1511. else
  1512. {
  1513. SetAdjustPointsOffset(PlayerType.FirstPlayer);
  1514. SetAdjustPointsOffset(PlayerType.SecondPlayer);
  1515. }
  1516. }
  1517. public void OnClick_SetAdjustPointsOffset_full()
  1518. {
  1519. if (infraredCameraHelper.IsSinglePoint())
  1520. {
  1521. SetAdjustPointsOffset(PlayerType.FirstPlayer);
  1522. }
  1523. else
  1524. {
  1525. SetAdjustPointsOffset_full(PlayerType.FirstPlayer);
  1526. SetAdjustPointsOffset_full(PlayerType.SecondPlayer);
  1527. }
  1528. }
  1529. /// <summary>
  1530. /// 设置存储的中心偏移位置
  1531. /// </summary>
  1532. public void InitCenterOffset()
  1533. {
  1534. infraredCameraHelper.SetCenterOffset(cameraLocationValue.Get(), "CameraLocation");
  1535. infraredCameraHelper.SetCenterOffset(screenUVValue.Get(), "ScreenUV");
  1536. }
  1537. /// <summary>
  1538. /// 重置中心点
  1539. /// </summary>
  1540. public void ResetCenterOffset()
  1541. {
  1542. infraredCameraHelper.ResetCenterOffset();
  1543. }
  1544. /// <summary>
  1545. /// 撤销中心点
  1546. /// </summary>
  1547. public void RevokeCenterOffset()
  1548. {
  1549. infraredCameraHelper.RevokeCenterOffset();
  1550. }
  1551. /// <summary>
  1552. /// 重置定位数据
  1553. /// </summary>
  1554. public void ResetPositioningData(bool bSyncLocal = false)
  1555. {
  1556. infraredCameraHelper.ClearInfraredPositioningData(bSyncLocal);
  1557. }
  1558. void SetCaptureValue(float v)
  1559. {
  1560. captureValue.Set(v);
  1561. _sliderCapture.SetValueWithoutNotify(captureValue.Get());
  1562. _sliderCapture.transform.Find("Value").GetComponent<Text>().text = captureValue.Get().ToString("f1");
  1563. infraredCameraHelper.SetCapture((int)captureValue.Get());
  1564. }
  1565. void SetDelayValue(float v)
  1566. {
  1567. delayValue.Set(v);
  1568. _sliderDelay.SetValueWithoutNotify(delayValue.Get());
  1569. _sliderDelay.transform.Find("Value").GetComponent<Text>().text = delayValue.Get().ToString("f1");
  1570. infraredCameraHelper.SetDelay((int)delayValue.Get());
  1571. }
  1572. #endregion
  1573. #region 相机感光度(默认修改对比度)
  1574. public void onSetSliderCustomValue(Slider _slider, float min = 0.0f, float max = 10.0f)
  1575. {
  1576. onSetSliderValue(_slider, "PU_CONTRAST", min, max);
  1577. }
  1578. public void onSliderCustomEvent(float value, float min = 0.0f, float max = 10.0f)
  1579. {
  1580. onSliderEvent(value, "PU_CONTRAST", min, max);
  1581. }
  1582. public void onSetSliderCustomBrightnessValue(Slider _slider, float min = 0.0f, float max = 10.0f)
  1583. {
  1584. onSetSliderValue(_slider, "PU_BRIGHTNESS", min, max);
  1585. }
  1586. public void onSliderCustomBrightnessEvent(float value, float min = 0.0f, float max = 10.0f)
  1587. {
  1588. onSliderEvent(value, "PU_BRIGHTNESS", min, max);
  1589. }
  1590. public void onSetSliderValue(Slider _slider, string typeStr = "PU_CONTRAST", float min = 0.0f, float max = 10.0f)
  1591. {
  1592. if (BluetoothWindows.IsWindows())
  1593. {
  1594. float v = typeStr == "PU_CONTRAST" ? infraredCameraHelper.GetContrast() : infraredCameraHelper.GetBrightness();
  1595. // 目标区间 [0, 10] 的边界值
  1596. double targetMin = min;
  1597. double targetMax = max;
  1598. double originalMin = -1;
  1599. double originalMax = 1;
  1600. // 计算转换后的值
  1601. double v2 = MapValue(v, originalMin, originalMax, targetMin, targetMax);
  1602. Debug.Log("PC获取相机的感光度 " + typeStr + " :" + v + " = " + v2);
  1603. _slider.SetValueWithoutNotify((float)v2);
  1604. return;
  1605. }
  1606. //功能也改为UVC的对比度
  1607. if (running)
  1608. {
  1609. //string typeStr = "PU_CONTRAST";//"PU_BRIGHTNESS";
  1610. //UInt64 _VALUE = currentCameraInfo.GetTypeByName(typeStr);
  1611. UVCCtrlInfo _UVCCtrlInfo = currentCameraInfo.GetInfo(typeStr);
  1612. float v = currentCameraInfo.GetValue(typeStr); // infraredCameraHelper.GetBrightness();
  1613. //float v2 = (v / _UVCCtrlInfo.max) * 10;
  1614. // 目标区间 [0, 10] 的边界值
  1615. double targetMin = min;
  1616. double targetMax = max;
  1617. double originalMin = _UVCCtrlInfo.min;
  1618. double originalMax = _UVCCtrlInfo.max;
  1619. // 计算转换后的值
  1620. double v2 = MapValue(v, originalMin, originalMax, targetMin, targetMax);
  1621. Debug.Log("获取相机的感光度" + typeStr + ": " + v + " = " + v2);
  1622. _slider.SetValueWithoutNotify((float)v2);
  1623. }
  1624. else _slider.SetValueWithoutNotify(5);
  1625. }
  1626. public void onSliderEvent(float value, string typeStr = "PU_CONTRAST", float min = 0.0f, float max = 10.0f)
  1627. {
  1628. // string typeStr = "PU_CONTRAST";// "PU_BRIGHTNESS";
  1629. //pc
  1630. if (BluetoothWindows.IsWindows())
  1631. {
  1632. Transform trans = _cameraParameterPanel.transform.Find(typeStr);
  1633. Slider slider = trans.GetComponent<Slider>();
  1634. Text textObj = trans.Find("text").GetComponent<Text>();
  1635. // 原始区间和目标区间的边界值
  1636. double originalMin = min;
  1637. double originalMax = max;
  1638. double targetMin = -1;
  1639. double targetMax = 1;
  1640. // 计算转换后的值
  1641. double result = MapValue(value, originalMin, originalMax, targetMin, targetMax);
  1642. float _current = (float)result;
  1643. //Debug.Log("_current:" + _current + " , result:" + result);
  1644. textObj.text = _current + "";
  1645. slider.value = _current;
  1646. if (typeStr == "PU_CONTRAST")
  1647. {
  1648. infraredCameraHelper.SetContrast(_current);
  1649. pcCONTRAST.Set(_current);
  1650. }
  1651. else
  1652. {
  1653. infraredCameraHelper.SetBrightness(_current);
  1654. pcBRIGHTNESS.Set(_current);
  1655. }
  1656. return;
  1657. }
  1658. //修改亮度时,调试界面的亮度也应该一起修改
  1659. //功能也改为UVC的对比度
  1660. if (running)
  1661. {
  1662. //Slider slider = transform.Find("InfraredCamera/Layout/SliderBrightness")
  1663. // .GetComponent<Slider>();
  1664. // UInt64 _VALUE = currentCameraInfo.GetTypeByName(typeStr);
  1665. Transform trans = _cameraParameterPanel.transform.Find(typeStr);
  1666. Slider slider = trans.GetComponent<Slider>();
  1667. Text textObj = trans.Find("text").GetComponent<Text>();
  1668. UVCCtrlInfo _UVCCtrlInfo = currentCameraInfo.GetInfo(typeStr);
  1669. int _currentUVCValue = currentCameraInfo.GetValue(typeStr);
  1670. //value 0 ~ 10
  1671. // 原始区间和目标区间的边界值
  1672. double originalMin = min;
  1673. double originalMax = max;
  1674. double targetMin = _UVCCtrlInfo.min;
  1675. double targetMax = _UVCCtrlInfo.max;
  1676. // 计算转换后的值
  1677. double result = MapValue(value, originalMin, originalMax, targetMin, targetMax);
  1678. int _current = (int)(result);
  1679. Debug.Log("_current:" + value + " , result:" + result);
  1680. textObj.text = _current + "";
  1681. slider.value = _current;
  1682. //dUVCParameters.GetValueOrDefault(typeStr).Set(_current);
  1683. //存储初始值,设置一次到UVC参数
  1684. if (_currentUVCValue != _current) currentCameraInfo.SetValue(typeStr, _current);
  1685. }
  1686. }
  1687. public static double MapValue(double value, double originalMin, double originalMax, double targetMin, double targetMax)
  1688. {
  1689. // 线性插值公式
  1690. return targetMin + (value - originalMin) * (targetMax - targetMin) / (originalMax - originalMin);
  1691. }
  1692. #endregion
  1693. #region 绘制线段部分
  1694. public void SetLineWidth(float v)
  1695. {
  1696. lineWidth.Set(v);
  1697. _sliderLineWidth.SetValueWithoutNotify(lineWidth.Get());
  1698. _sliderLineWidth.transform.Find("Value").GetComponent<Text>().text = lineWidth.Get().ToString("f1");
  1699. }
  1700. public void SetFanWidth(float v)
  1701. {
  1702. fanWidth.Set(v);
  1703. _fanWidth.SetValueWithoutNotify(fanWidth.Get());
  1704. _fanWidth.transform.Find("Value").GetComponent<Text>().text = fanWidth.Get().ToString("f1");
  1705. }
  1706. #endregion
  1707. #region 双人准心
  1708. //红外准心,默认打开吧
  1709. public ParamFloatValue crosshairValue1P = new ParamFloatValue("ic_crosshairValue1P", 1);
  1710. public ParamFloatValue crosshairValue2P = new ParamFloatValue("ic_crosshairValue2P", 1);
  1711. /// <summary>
  1712. /// 初始化时候获取设置和存储来控制显示准心
  1713. /// </summary>
  1714. /// <returns></returns>
  1715. public bool bInitDoubleCrosshairShow(PlayerType playerType)
  1716. {
  1717. if (playerType == PlayerType.FirstPlayer)
  1718. return getDoubleCrosshairValue(playerType) == 1 ? true : false;
  1719. else
  1720. return getDoubleCrosshairValue(playerType) == 1 ? true : false;
  1721. }
  1722. /// <summary>
  1723. /// 获取弓箭准心存储值
  1724. /// </summary>
  1725. /// <returns></returns>
  1726. public int getDoubleCrosshairValue(PlayerType playerType)
  1727. {
  1728. if (playerType == PlayerType.FirstPlayer)
  1729. return (int)crosshairValue1P.Get();
  1730. else
  1731. return (int)crosshairValue2P.Get();
  1732. }
  1733. public void setDoubleCrosshairValue(PlayerType playerType, bool bshow)
  1734. {
  1735. if (playerType == PlayerType.FirstPlayer)
  1736. crosshairValue1P.Set(bshow ? 1 : 0);
  1737. else
  1738. crosshairValue2P.Set(bshow ? 1 : 0);
  1739. }
  1740. #endregion
  1741. #region 双人中心点定位
  1742. [Header("红外点")]
  1743. [SerializeField] Button _infraredOffsetBtn1P;
  1744. [SerializeField] Button _infraredOffsetBtn2P;
  1745. //准心的偏移值
  1746. public ParamVector2Value cameraLocationValue1P = new ParamVector2Value("ic_cameraLocation1P", Vector2.zero);
  1747. public ParamVector2Value screenUVValue1P = new ParamVector2Value("ic_screenUV1P", Vector2.zero);
  1748. public ParamVector2Value cameraLocationValue2P = new ParamVector2Value("ic_cameraLocation2P", Vector2.zero);
  1749. public ParamVector2Value screenUVValue2P = new ParamVector2Value("ic_screenUV2P", Vector2.zero);
  1750. //双点模式下的全屏偏移量,相当于两个单点
  1751. public ParamVector2Value cameraLocationValue1P_full = new ParamVector2Value("ic_cameraLocation1P_full", Vector2.zero);
  1752. public ParamVector2Value screenUVValue1P_full = new ParamVector2Value("ic_screenUV1P_full", Vector2.zero);
  1753. public ParamVector2Value cameraLocationValue2P_full = new ParamVector2Value("ic_cameraLocation2P_full", Vector2.zero);
  1754. public ParamVector2Value screenUVValue2P_full = new ParamVector2Value("ic_screenUV2P_full", Vector2.zero);
  1755. /// <summary>
  1756. /// 设置单点模式
  1757. /// </summary>
  1758. public void onToggleSinglePoint()
  1759. {
  1760. //Debug.Log("mToggleSinglePoint.isOn:" + mToggleSinglePoint.isOn);
  1761. if (!infraredCameraHelper.IsSinglePoint())
  1762. {
  1763. infraredCameraHelper.SetSinglePoint(true);
  1764. }
  1765. else
  1766. {
  1767. infraredCameraHelper.SetSinglePoint(false);
  1768. }
  1769. }
  1770. /// <summary>
  1771. /// 设置是否是单,双点模式
  1772. /// </summary>
  1773. /// <param name="value"></param>
  1774. public void SetSinglePoint(bool value, ScreenPointTypeEnum screenPointType = ScreenPointTypeEnum.None)
  1775. {
  1776. if (!infraredCameraHelper.getScreenLocate()) return;
  1777. infraredCameraHelper.SetSinglePoint(value);
  1778. //重新设置双点数据
  1779. InitCenterOffsets(PlayerType.FirstPlayer, screenPointType);
  1780. InitCenterOffsets(PlayerType.SecondPlayer, screenPointType);
  1781. Debug.Log("设置是否是单模式:" + value + ",screenPointType:" + screenPointType);
  1782. }
  1783. /// <summary>
  1784. /// 偏移点按钮
  1785. /// </summary>
  1786. public void InitOffsetBtns()
  1787. {
  1788. _infraredOffsetBtn1P.onClick.AddListener(() =>
  1789. {
  1790. SetAdjustPointsOffset(PlayerType.FirstPlayer);
  1791. });
  1792. _infraredOffsetBtn2P.onClick.AddListener(() =>
  1793. {
  1794. SetAdjustPointsOffset(PlayerType.SecondPlayer);
  1795. });
  1796. }
  1797. /// <summary>
  1798. /// 设置存储的中心偏移位置--双点
  1799. /// </summary>
  1800. public void InitCenterOffsets(PlayerType playerType, ScreenPointTypeEnum screenPointType = ScreenPointTypeEnum.None)
  1801. {
  1802. if (!infraredCameraHelper.getScreenLocate()) return;
  1803. if (infraredCameraHelper.IsSinglePoint())
  1804. {
  1805. infraredCameraHelper.SetCenterOffset(cameraLocationValue.Get(), "CameraLocation");
  1806. infraredCameraHelper.SetCenterOffset(screenUVValue.Get(), "ScreenUV");
  1807. }
  1808. else
  1809. {
  1810. if (screenPointType == ScreenPointTypeEnum.None || screenPointType == ScreenPointTypeEnum.HalfScreen) {
  1811. infraredCameraHelper.SetCenterOffsets(playerType, playerType == PlayerType.FirstPlayer ? cameraLocationValue1P.Get() : cameraLocationValue2P.Get(), "CameraLocation");
  1812. infraredCameraHelper.SetCenterOffsets(playerType, playerType == PlayerType.FirstPlayer ? screenUVValue1P.Get() : screenUVValue2P.Get(), "ScreenUV");
  1813. }
  1814. if (screenPointType == ScreenPointTypeEnum.None || screenPointType == ScreenPointTypeEnum.FullScreen)
  1815. {
  1816. //全屏双点
  1817. infraredCameraHelper.SetCenterOffsets(playerType, playerType == PlayerType.FirstPlayer ? cameraLocationValue1P_full.Get() : cameraLocationValue2P_full.Get(), "CameraLocation");
  1818. infraredCameraHelper.SetCenterOffsets(playerType, playerType == PlayerType.FirstPlayer ? screenUVValue1P_full.Get() : screenUVValue2P_full.Get(), "ScreenUV");
  1819. }
  1820. }
  1821. }
  1822. /// <summary>
  1823. /// 撤销中心点--双点
  1824. /// </summary>
  1825. public void RevokeCenterOffsets()
  1826. {
  1827. if (!infraredCameraHelper.getScreenLocate()) return;
  1828. infraredCameraHelper.RevokeCenterOffsets();
  1829. }
  1830. /// <summary>
  1831. /// 重置中心点--双点
  1832. /// </summary>
  1833. public void ResetCenterOffsets()
  1834. {
  1835. if (!infraredCameraHelper.getScreenLocate()) return;
  1836. infraredCameraHelper.ResetCenterOffsets();
  1837. }
  1838. /// <summary>
  1839. /// 校准中心点偏移量,双点情况下要设置 SetCenterOffsets
  1840. /// </summary>
  1841. /// <param name="playerType">玩家类型</param>
  1842. public void SetAdjustPointsOffset(PlayerType playerType)
  1843. {
  1844. if (!infraredCameraHelper.getScreenLocate()) return;
  1845. if (infraredCameraHelper.GetUVCCameraInfo() == null) return;
  1846. var buffer = infraredCameraHelper.getScreenLocate().infraredSpotBuffer;
  1847. if (buffer != null)
  1848. {
  1849. if (playerType == PlayerType.FirstPlayer && buffer[0].CameraLocation != null)
  1850. {
  1851. if (infraredCameraHelper.IsSinglePoint())
  1852. { //单点
  1853. var centerOffset = infraredCameraHelper.GetCenterOffset(buffer[0].CameraLocation.Value);
  1854. cameraLocationValue.Set(centerOffset);
  1855. var uvCenterOffset = infraredCameraHelper.GetCenterOffset(buffer[0].ScreenUV.Value, "ScreenUV");
  1856. screenUVValue.Set(uvCenterOffset);
  1857. //如果是新手教程场景里面的校准
  1858. InfraredGuider infraredGuiderObj = FindObjectOfType<InfraredGuider>();
  1859. if (infraredGuiderObj != null)
  1860. {
  1861. GameObject infraredGuiderGameObject = infraredGuiderObj.gameObject;
  1862. infraredGuiderGameObject.GetComponent<InfraredGuider>().SetTitleAfterCalibration();
  1863. }
  1864. }
  1865. else
  1866. {
  1867. var centerOffset = infraredCameraHelper.GetCenterOffset(buffer[0].CameraLocation.Value, true);
  1868. cameraLocationValue1P.Set(centerOffset);
  1869. infraredCameraHelper.SetCenterOffsets(playerType, centerOffset);
  1870. var uvCenterOffset = infraredCameraHelper.GetCenterOffset(buffer[0].ScreenUV.Value, true, "ScreenUV");
  1871. screenUVValue1P.Set(uvCenterOffset);
  1872. infraredCameraHelper.SetCenterOffsets(playerType, uvCenterOffset, "ScreenUV");
  1873. }
  1874. }
  1875. if (playerType == PlayerType.SecondPlayer && buffer[1].CameraLocation != null)
  1876. {
  1877. var centerOffset = infraredCameraHelper.GetCenterOffset(buffer[1].CameraLocation.Value, false);
  1878. cameraLocationValue2P.Set(centerOffset);
  1879. infraredCameraHelper.SetCenterOffsets(playerType, centerOffset);
  1880. var uvCenterOffset = infraredCameraHelper.GetCenterOffset(buffer[1].ScreenUV.Value, false, "ScreenUV");
  1881. screenUVValue2P.Set(uvCenterOffset);
  1882. infraredCameraHelper.SetCenterOffsets(playerType, uvCenterOffset, "ScreenUV");
  1883. }
  1884. }
  1885. }
  1886. //记录全屏双点校准
  1887. public void SetAdjustPointsOffset_full(PlayerType playerType)
  1888. {
  1889. if (!infraredCameraHelper.getScreenLocate()) return;
  1890. if (infraredCameraHelper.GetUVCCameraInfo() == null) return;
  1891. if (infraredCameraHelper.IsSinglePoint()) return;
  1892. var buffer = infraredCameraHelper.getScreenLocate().infraredSpotBuffer;
  1893. if (buffer != null)
  1894. {
  1895. if (playerType == PlayerType.FirstPlayer && buffer[0].CameraLocation != null)
  1896. {
  1897. var centerOffset = infraredCameraHelper.GetCenterOffset(buffer[0].CameraLocation.Value);
  1898. cameraLocationValue1P_full.Set(centerOffset);
  1899. infraredCameraHelper.SetCenterOffsets(playerType, centerOffset);
  1900. var uvCenterOffset = infraredCameraHelper.GetCenterOffset(buffer[0].ScreenUV.Value, "ScreenUV");
  1901. screenUVValue1P_full.Set(uvCenterOffset);
  1902. infraredCameraHelper.SetCenterOffsets(playerType, uvCenterOffset, "ScreenUV");
  1903. }
  1904. if (playerType == PlayerType.SecondPlayer && buffer[1].CameraLocation != null)
  1905. {
  1906. var centerOffset = infraredCameraHelper.GetCenterOffset(buffer[1].CameraLocation.Value);
  1907. cameraLocationValue2P_full.Set(centerOffset);
  1908. infraredCameraHelper.SetCenterOffsets(playerType, centerOffset);
  1909. var uvCenterOffset = infraredCameraHelper.GetCenterOffset(buffer[1].ScreenUV.Value, "ScreenUV");
  1910. screenUVValue2P_full.Set(uvCenterOffset);
  1911. infraredCameraHelper.SetCenterOffsets(playerType, uvCenterOffset, "ScreenUV");
  1912. Debug.Log("设置点2");
  1913. }
  1914. }
  1915. }
  1916. #endregion
  1917. #region 亮度检测部分
  1918. public void SetInfraredFilterValue(float v)
  1919. {
  1920. if (!infraredCameraHelper.getScreenLocate()) return;
  1921. infraredFileterValue.Set(v);
  1922. _infraredFilter.SetValueWithoutNotify(infraredFileterValue.Get());
  1923. _infraredFilter.transform.Find("Value").GetComponent<Text>().text = infraredFileterValue.Get().ToString("f1");
  1924. infraredCameraHelper.SetInfraredLocateBrightnessThreshold(infraredFileterValue.Get());
  1925. }
  1926. #endregion
  1927. public void resetInfraredPlayerPrefs()
  1928. {
  1929. //测试用
  1930. PlayerPrefs.DeleteKey("entry-guider-infrared-" + LoginMgr.myUserInfo.id);
  1931. PlayerPrefs.DeleteKey("hideInfraredBowAndArrow");
  1932. }
  1933. #region 显示Log部分信息
  1934. [SerializeField] Text _calibrationFixedText;
  1935. [SerializeField] Text _cameraSizeText;
  1936. [SerializeField] Text _quadUnityVectorListText;
  1937. /// <summary>
  1938. /// 校准时候的固定值分辨率
  1939. /// </summary>
  1940. /// <param name="v"></param>
  1941. public void SetCalibrationFixedText(Vector2 v)
  1942. {
  1943. _calibrationFixedText.text = v.x + "*" + v.y;
  1944. }
  1945. /// <summary>
  1946. /// 渲染摄像机当前分辨率
  1947. /// </summary>
  1948. /// <param name="v"></param>
  1949. public void SetCameraSizeText(Vector2 v)
  1950. {
  1951. _cameraSizeText.text = v.x + "*" + v.y;
  1952. }
  1953. /// <summary>
  1954. /// 渲染摄像机识别点
  1955. /// </summary>
  1956. /// <param name="v"></param>
  1957. public void SetQuadUnityVectorListText(string v)
  1958. {
  1959. _quadUnityVectorListText.text = v;
  1960. }
  1961. #endregion
  1962. #region 错误日志
  1963. public void HandleLog(string logString, string stackTrace, LogType type)
  1964. {
  1965. if (type == LogType.Exception || type == LogType.Error)
  1966. {
  1967. SaveLogToFile(logString, stackTrace);
  1968. }
  1969. }
  1970. void SaveLogToFile(string message, string stackTrace)
  1971. {
  1972. string path;
  1973. #if UNITY_ANDROID && !UNITY_EDITOR_WIN
  1974. // 保存到 Android 的公共 Download 文件夹,便于用户直接查看
  1975. path = System.IO.Path.Combine("/storage/emulated/0/Download", "crash_log.txt");
  1976. #else
  1977. // 其他平台使用 Application.persistentDataPath
  1978. path = System.IO.Path.Combine(Application.persistentDataPath, "crash_log.txt");
  1979. #endif
  1980. // 打印路径确认
  1981. Debug.Log($"Log file saved at: {path}");
  1982. // 将日志写入到指定路径的文件中
  1983. System.IO.File.AppendAllText(path, $"{message}\n{stackTrace}\n\n");
  1984. }
  1985. #endregion
  1986. }
  1987. public class ParamFloatValue
  1988. {
  1989. private string _saveKey;
  1990. private float _valueDefault;
  1991. private bool _valueLoaded;
  1992. private float _value;
  1993. public ParamFloatValue(string saveKey, float valueDefault)
  1994. {
  1995. _saveKey = saveKey;
  1996. _valueDefault = valueDefault;
  1997. }
  1998. public float Get()
  1999. {
  2000. if (!_valueLoaded) _value = PlayerPrefs.GetFloat(_saveKey, _valueDefault);
  2001. return _value;
  2002. }
  2003. public float GetDefault()
  2004. {
  2005. return _valueDefault;
  2006. }
  2007. public string GetKey()
  2008. {
  2009. return _saveKey;
  2010. }
  2011. public void Set(float value)
  2012. {
  2013. _value = value;
  2014. PlayerPrefs.SetFloat(_saveKey, _value);
  2015. PlayerPrefs.Save();
  2016. }
  2017. /// <summary>
  2018. /// 重置成默认值
  2019. /// </summary>
  2020. public void Reset()
  2021. {
  2022. PlayerPrefs.SetFloat(_saveKey, _valueDefault);
  2023. PlayerPrefs.Save();
  2024. }
  2025. }
  2026. /// <summary>
  2027. /// 存储Vector2
  2028. /// </summary>
  2029. public class ParamVector2Value
  2030. {
  2031. private string _saveKey;
  2032. private Vector2 _valueDefault;
  2033. private bool _valueLoaded;
  2034. private Vector2 _value;
  2035. public ParamVector2Value(string saveKey, Vector2 valueDefault)
  2036. {
  2037. _saveKey = saveKey;
  2038. _valueDefault = valueDefault;
  2039. }
  2040. public Vector2 Get()
  2041. {
  2042. if (!_valueLoaded)
  2043. {
  2044. float x = PlayerPrefs.GetFloat(_saveKey + "_x", _valueDefault.x);
  2045. float y = PlayerPrefs.GetFloat(_saveKey + "_y", _valueDefault.y);
  2046. _value = new Vector2(x, y);
  2047. _valueLoaded = true;
  2048. }
  2049. return _value;
  2050. }
  2051. public Vector2 GetDefault()
  2052. {
  2053. return _valueDefault;
  2054. }
  2055. public string GetKey()
  2056. {
  2057. return _saveKey;
  2058. }
  2059. public void Set(Vector2 value)
  2060. {
  2061. _value = value;
  2062. PlayerPrefs.SetFloat(_saveKey + "_x", _value.x);
  2063. PlayerPrefs.SetFloat(_saveKey + "_y", _value.y);
  2064. PlayerPrefs.Save();
  2065. }
  2066. /// <summary>
  2067. /// 重置成默认值
  2068. /// </summary>
  2069. public void Reset()
  2070. {
  2071. PlayerPrefs.SetFloat(_saveKey + "_x", _valueDefault.x);
  2072. PlayerPrefs.SetFloat(_saveKey + "_y", _valueDefault.y);
  2073. PlayerPrefs.Save();
  2074. }
  2075. }