InfraredDemo.cs 86 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367
  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() + "开始时候的mirror:"+ mirrorIndex.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. public void onDoubleFlip()
  797. {
  798. CameraMirror cameraMirror = CameraMirror.DOUBLE_FLIP;
  799. mirrorIndex.Set((int)cameraMirror);
  800. infraredCameraHelper.onDoubleFlip();
  801. }
  802. public void onFlipDefault()
  803. {
  804. CameraMirror cameraMirror = CameraMirror.NONE;
  805. mirrorIndex.Set((int)cameraMirror);
  806. infraredCameraHelper.onFlipDefault();
  807. }
  808. /// <summary>
  809. /// 获取并且初始化一次记录点的数据
  810. /// </summary>
  811. /// <returns></returns>
  812. IEnumerator initScreenLocateManual()
  813. {
  814. yield return new WaitForSeconds(1f);
  815. infraredCameraHelper.InitScreenLocateManual();
  816. }
  817. IEnumerator RestartOrKillApp()
  818. {
  819. yield return new WaitForSeconds(0.3f);
  820. if (Application.isEditor) yield break;
  821. if (Application.platform == RuntimePlatform.Android)
  822. {
  823. using (var unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
  824. {
  825. const int kIntent_FLAG_ACTIVITY_CLEAR_TASK = 0x00008000;
  826. const int kIntent_FLAG_ACTIVITY_NEW_TASK = 0x10000000;
  827. var currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
  828. var pm = currentActivity.Call<AndroidJavaObject>("getPackageManager");
  829. var intent = pm.Call<AndroidJavaObject>("getLaunchIntentForPackage", Application.identifier);
  830. intent.Call<AndroidJavaObject>("setFlags", kIntent_FLAG_ACTIVITY_NEW_TASK | kIntent_FLAG_ACTIVITY_CLEAR_TASK);
  831. currentActivity.Call("startActivity", intent);
  832. currentActivity.Call("finish");
  833. var process = new AndroidJavaClass("android.os.Process");
  834. int pid = process.CallStatic<int>("myPid");
  835. process.CallStatic("killProcess", pid);
  836. }
  837. }
  838. else
  839. {
  840. // 获取当前应用程序的可执行文件路径
  841. string executablePath = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
  842. // 重启应用程序
  843. System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo
  844. {
  845. FileName = executablePath,
  846. UseShellExecute = false
  847. };
  848. System.Diagnostics.Process.Start(startInfo);
  849. // 退出当前应用程序
  850. Application.Quit();
  851. }
  852. ;
  853. }
  854. void UpdateInfraredCamera()
  855. {
  856. if (!_visiable) return;
  857. if (!_inited) return;
  858. if (infraredCameraHelper == null) return;
  859. //渲染相机画面
  860. //_cameraRender.texture = infraredCameraHelper.GetCameraTexture();
  861. //_cameraRender.material = infraredCameraHelper.GetCameraMaterial();
  862. if (ScreenLocate.Main.getUVCTexture)
  863. {
  864. if (isFullscreen || ScreenLocate.Main.OutputTextures[4] == null)
  865. {
  866. if (_cameraRender.texture == null || ScreenLocate.Main.getUVCTexture.GetNativeTexturePtr() != _cameraRender.texture.GetNativeTexturePtr())
  867. _cameraRender.texture = ScreenLocate.Main.getUVCTexture;
  868. //ScreenLocate.Main.OutputTextures[4] == null 并且 摄像机缩小的情况下。显示适配线段
  869. if (!isFullscreen) SetAllToggle(true);
  870. }
  871. else if (ScreenLocate.Main.OutputTextures[4] != null)
  872. {
  873. //缩小的情况下。显示黑白色差的合成图
  874. if (_cameraRender.texture == null || ScreenLocate.Main.OutputTextures[4] != null && ScreenLocate.Main.OutputTextures[4].GetNativeTexturePtr() != _cameraRender.texture.GetNativeTexturePtr())
  875. _cameraRender.texture = ScreenLocate.Main.OutputTextures[4];
  876. //底图缩小的情况下。不显示适配线段,并且隐藏points
  877. if (!isFullscreen)
  878. {
  879. if (showPoints)
  880. {
  881. Transform pointsTF2 = _cameraRender.transform.Find("Points");
  882. for (int i = 0; i < pointsTF2.childCount; i++)
  883. {
  884. Transform pointTF = pointsTF2.GetChild(i);
  885. pointTF.gameObject.SetActive(false);
  886. showPoints = false;
  887. }
  888. }
  889. SetAllToggle(false);
  890. }
  891. }
  892. //_cameraRender.SetNativeSize();
  893. // _MaintainAspectRatio.AdjustSize();
  894. }
  895. //在相机画面显示准心
  896. if (ScreenLocate.Main)
  897. {
  898. var _sl = ScreenLocate.Main;
  899. //var buffer = _sl.infraredSpotBuffer;
  900. //if (buffer != null)
  901. //{
  902. // for (int i = 0; i < buffer.Length; i++)
  903. // {
  904. // if (buffer[i].CameraLocation != null)
  905. // {
  906. // //添加一个偏移量,使得最后输出的准心是指向正中心
  907. // Vector2 newPoint2 = _sl.GetOffsetCameraLocation(buffer[i].CameraLocation.Value);
  908. // // 检测到光点
  909. // var pos = newPoint2.pixelToLocalPosition_AnchorCenter(_sl.mUVCCameraInfo.Size, _cameraRender.rectTransform.rect);
  910. // _crosshairsInCamera[i].gameObject.SetActive(true);
  911. // _crosshairsInCamera[i].anchoredPosition = pos;
  912. // }
  913. // else
  914. // _crosshairsInCamera[i].gameObject.SetActive(false);
  915. // }
  916. //}
  917. //渲染固定摄像机分辨率
  918. SetCalibrationFixedText(_sl.mUVCCameraInfo.CurrentCalibrationResolution);
  919. //渲染摄像机大小
  920. if (_sl.mUVCCameraInfo != null) SetCameraSizeText(_sl.mUVCCameraInfo.Size);
  921. //渲染摄像机识别点位置
  922. SetQuadUnityVectorListText(_sl.PrintVector2List(ScreenLocate.quadUnityVectorList));
  923. }
  924. }
  925. /// <summary>
  926. /// 更新屏幕下的十字准心位置
  927. /// </summary>
  928. /// <param name="value"></param>
  929. void ShowUICrosshairs(Vector2 newPoint2, int index)
  930. {
  931. ////获取一个偏移量,使得最后输出的准心是指向正中心
  932. //Vector2 newPoint2 = value - ICHelper.GetCenterOffset(value, "CameraLocation");
  933. // 检测到光点
  934. var pos = newPoint2.pixelToLocalPosition_AnchorCenter(infraredCameraHelper.GetUVCCameraInfo().Size, _cameraRender.rectTransform.rect);
  935. //红色为最大值则按顺序赋值,反之最小
  936. int curIndex = index;
  937. //if (bIdentifyRed)
  938. //{
  939. // curIndex = index;
  940. //}
  941. //else
  942. //{
  943. // curIndex = 1 - index;
  944. //}
  945. _crosshairsInCamera[curIndex].gameObject.SetActive(true);
  946. _crosshairsInCamera[curIndex].anchoredPosition = pos;
  947. }
  948. bool showPoints = false;
  949. public void SetLocatePointsToCameraRender(List<Vector2> points, float w, float h)
  950. {
  951. Transform pointsTF2 = _cameraRender.transform.Find("Points");
  952. if (pointsTF2.childCount == points.Count)
  953. {
  954. Vector2 texSize = new Vector2(w, h);
  955. for (int i = 0; i < pointsTF2.childCount; i++)
  956. {
  957. Transform pointTF = pointsTF2.GetChild(i);
  958. Vector2 pos = points[i];
  959. pointTF.localPosition = pos.pixelToLocalPosition_AnchorCenter(texSize, _cameraRender.rectTransform.rect);
  960. pointTF.gameObject.SetActive(true);
  961. showPoints = true;
  962. }
  963. }
  964. else
  965. {
  966. for (int i = 0; i < pointsTF2.childCount; i++)
  967. {
  968. Transform pointTF = pointsTF2.GetChild(i);
  969. pointTF.gameObject.SetActive(false);
  970. showPoints = false;
  971. }
  972. }
  973. //绘制数据
  974. DrawTestLine();
  975. }
  976. #region 测试数据绘制
  977. [SerializeField] private Toggle curToggle;
  978. [SerializeField] private Toggle autoToggle; // 控制 AutoUILineGenerator 的 Toggle
  979. [SerializeField] private Toggle semiAutoToggle; // 控制 SemiAutoUILineGenerator 的 Toggle
  980. [SerializeField] private Toggle manualToggle; // 控制 ManualUILineGenerator 的 Toggle
  981. [SerializeField] LineGenerator CurUILineGenerator;//当前结果屏幕线条
  982. [SerializeField] LineGenerator AutoUILineGenerator;//第一个结果屏幕线条
  983. [SerializeField] LineGenerator SemiAutoUILineGenerator;//第二个结果屏幕线条
  984. [SerializeField] LineGenerator ManualUILineGenerator;//第三个结果屏幕线条
  985. [SerializeField] private Dropdown dropdown; // 引用场景中的 Dropdown 组件
  986. [SerializeField] RawImage _cameraRenderTest5;
  987. [SerializeField] RawImage _cameraRenderTest6;
  988. void DrawTestLine()
  989. {
  990. Vector2 texSize = ScreenLocate.Main.getUVCCameraInfoSize;
  991. // 判断 texSize 是否为有效值
  992. if (texSize == Vector2.zero)
  993. {
  994. Debug.LogWarning("Texture size is zero, cannot proceed with line drawing.");
  995. return;
  996. }
  997. // 设置三个屏幕四边形和线条生成器
  998. QuadrilateralInCamera[] screenQuads = new QuadrilateralInCamera[] {
  999. ScreenLocate.Main.ScreenIdentification?.QuadAuto,
  1000. ScreenLocate.Main.ScreenIdentification?.QuadSemiAuto,
  1001. ScreenLocate.Main.ScreenIdentification?.QuadManual
  1002. };
  1003. LineGenerator[] lineGenerators = new LineGenerator[] {
  1004. AutoUILineGenerator,
  1005. SemiAutoUILineGenerator,
  1006. ManualUILineGenerator
  1007. };
  1008. for (int i = 0; i < screenQuads.Length; i++)
  1009. {
  1010. if (screenQuads[i] == null)
  1011. {
  1012. Debug.LogWarning($"Screen quadrilateral {i} is null, skipping this line.");
  1013. continue;
  1014. }
  1015. if (lineGenerators[i] == null)
  1016. {
  1017. Debug.LogWarning($"Line generator {i} is null, skipping this line.");
  1018. continue;
  1019. }
  1020. lineGenerators[i].Points = ConvertQuadToPoints(screenQuads[i], texSize);
  1021. }
  1022. // 清除旧选项并填充新的选项
  1023. dropdown.ClearOptions();
  1024. List<string> options = new List<string>();
  1025. //for (int i = 0; i < screenQuads.Length; i++)
  1026. //{
  1027. // options.Add($"Quad {i + 1}");
  1028. //}
  1029. //options.Add("自动识别");
  1030. //options.Add("半自动识别");
  1031. //options.Add("手动识别");
  1032. options.Add(TextAutoLanguage2.GetTextByKey("AutoRecognition")); // "自动识别"
  1033. options.Add(TextAutoLanguage2.GetTextByKey("SemiAutoRecognition")); // "半自动识别"
  1034. options.Add(TextAutoLanguage2.GetTextByKey("ManualRecognition")); // "手动识别"
  1035. dropdown.AddOptions(options);
  1036. // 添加监听器来处理选择事件
  1037. dropdown.onValueChanged.AddListener((index) =>
  1038. {
  1039. OnDropdownValueChanged(index, screenQuads);
  1040. });
  1041. if (screenQuads[0] != null || screenQuads[1] != null)
  1042. {
  1043. Texture texImage6 = ScreenLocate.Main.OutputTextures[5];
  1044. if (texImage6 != null) _cameraRenderTest6.texture = texImage6;
  1045. }
  1046. if (ScreenLocate.quadUnityVectorList.Count == 4)
  1047. {
  1048. //绘制白色线段
  1049. var lo = new Vector2(-0.5f, -0.5f);
  1050. CurUILineGenerator.Points = new Vector2[4] {
  1051. 2 * (ScreenLocate.quadUnityVectorList[0] + lo),
  1052. 2 * (ScreenLocate.quadUnityVectorList[1] + lo),
  1053. 2 * (ScreenLocate.quadUnityVectorList[3] + lo),
  1054. 2 * (ScreenLocate.quadUnityVectorList[2] + lo) };
  1055. }
  1056. }
  1057. // 当下拉框选项更改时调用的方法
  1058. private void OnDropdownValueChanged(int index, QuadrilateralInCamera[] screenQuads)
  1059. {
  1060. if (index >= 0 && index < screenQuads.Length)
  1061. {
  1062. if (screenQuads[index] != null)
  1063. {
  1064. QuadrilateralInCamera selectedQuad = screenQuads[index];
  1065. Debug.Log($"Selected Quad {index + 1}: {selectedQuad}");
  1066. CurUILineGenerator.Points = ConvertQuadToPoints(selectedQuad, ScreenLocate.Main.getUVCCameraInfoSize);
  1067. }
  1068. else
  1069. {
  1070. Debug.LogWarning($"Selected Quad {index + 1} is null.");
  1071. }
  1072. }
  1073. else
  1074. {
  1075. Debug.LogWarning("所选索引超出范围!");
  1076. }
  1077. }
  1078. /// <summary>
  1079. /// 提取转换四边形的方法
  1080. /// </summary>
  1081. /// <param name="quad"></param>
  1082. /// <param name="texSize"></param>
  1083. /// <returns></returns>
  1084. public Vector2[] ConvertQuadToPoints(QuadrilateralInCamera quad, Vector2 texSize)
  1085. {
  1086. if (quad == null || quad.Quad == null || quad.Quad.Count < 4)
  1087. {
  1088. Debug.LogWarning("Invalid quadrilateral data provided.");
  1089. return new Vector2[0]; // 返回空数组以避免异常
  1090. }
  1091. Vector2 offset = new Vector2(-0.5f, -0.5f); // 假设 'lo' 是某个已定义的偏移量
  1092. return new Vector2[4] {
  1093. 2 * (new Vector2(quad.Quad[0].x / texSize.x, quad.Quad[0].y / texSize.y) + offset),
  1094. 2 * (new Vector2(quad.Quad[1].x / texSize.x, quad.Quad[1].y / texSize.y) + offset),
  1095. 2 * (new Vector2(quad.Quad[3].x / texSize.x, quad.Quad[3].y / texSize.y) + offset),
  1096. 2 * (new Vector2(quad.Quad[2].x / texSize.x, quad.Quad[2].y / texSize.y) + offset)
  1097. };
  1098. }
  1099. public Vector2[] ConvertPointsToCoordinates(Vector2[] points, Vector2 texSize, Vector2 pivot)
  1100. {
  1101. if (points == null || points.Length < 1)
  1102. {
  1103. Debug.LogWarning("Invalid point data provided.");
  1104. return new Vector2[0]; // 返回空数组以避免异常
  1105. }
  1106. Vector2 offset = new Vector2(-0.5f, -0.5f); // 将坐标从中心对齐到左下角对齐
  1107. List<Vector2> transformedPoints = new List<Vector2>();
  1108. // 遍历所有传入的点进行转换
  1109. foreach (var point in points)
  1110. {
  1111. // 转换每个点,考虑 texSize 和 pivot 偏移
  1112. Vector2 transformedPoint = 2 * ((point / texSize) + offset + pivot);
  1113. transformedPoints.Add(transformedPoint);
  1114. }
  1115. return transformedPoints.ToArray();
  1116. }
  1117. void initToggle()
  1118. {
  1119. // 监听 Toggle 值的变化
  1120. if (curToggle != null)
  1121. curToggle.onValueChanged.AddListener(isOn => ToggleLineGenerator(CurUILineGenerator, isOn));
  1122. // 监听 Toggle 值的变化
  1123. if (autoToggle != null)
  1124. autoToggle.onValueChanged.AddListener(isOn => ToggleLineGenerator(AutoUILineGenerator, isOn));
  1125. if (semiAutoToggle != null)
  1126. semiAutoToggle.onValueChanged.AddListener(isOn => ToggleLineGenerator(SemiAutoUILineGenerator, isOn));
  1127. if (manualToggle != null)
  1128. manualToggle.onValueChanged.AddListener(isOn => ToggleLineGenerator(ManualUILineGenerator, isOn));
  1129. }
  1130. // 控制 LineGenerator 的启用/禁用
  1131. private void ToggleLineGenerator(LineGenerator lineGenerator, bool isOn)
  1132. {
  1133. if (lineGenerator != null && lineGenerator.enabled != isOn)
  1134. {
  1135. lineGenerator.enabled = isOn;
  1136. Debug.Log($"{lineGenerator.name} is now {(isOn ? "enabled" : "disabled")}");
  1137. }
  1138. }
  1139. /// <summary>
  1140. /// 设置全部显示
  1141. /// </summary>
  1142. /// <param name="value"></param>
  1143. private void SetAllToggle(bool value)
  1144. {
  1145. ToggleLineGenerator(CurUILineGenerator, value);
  1146. ToggleLineGenerator(AutoUILineGenerator, value);
  1147. ToggleLineGenerator(SemiAutoUILineGenerator, value);
  1148. ToggleLineGenerator(ManualUILineGenerator, value);
  1149. }
  1150. /// <summary>
  1151. /// 放大时候同步一次toggle
  1152. /// </summary>
  1153. private void SyncAllToggle()
  1154. {
  1155. ToggleLineGenerator(CurUILineGenerator, curToggle.isOn);
  1156. ToggleLineGenerator(AutoUILineGenerator, autoToggle.isOn);
  1157. ToggleLineGenerator(SemiAutoUILineGenerator, semiAutoToggle.isOn);
  1158. ToggleLineGenerator(ManualUILineGenerator, manualToggle.isOn);
  1159. }
  1160. // 下拉菜单用于显示纹理名称
  1161. public Dropdown textureDropdown;
  1162. // 按钮用于导出选中的纹理
  1163. public Button exportSelectedButton;
  1164. // 按钮用于导出所有纹理
  1165. public Button exportAllButton;
  1166. // 定义纹理名称
  1167. string[] textureNames;
  1168. /// <summary>
  1169. /// 更新一下菜单
  1170. /// </summary>
  1171. public void UpdateLanguage()
  1172. {
  1173. string[] _textureNames = {
  1174. TextAutoLanguage2.GetTextByKey("ScreenAOriginal"), // "A屏幕原图"
  1175. TextAutoLanguage2.GetTextByKey("SemiAutoSegmentB"), // "B半自动识别线段"
  1176. TextAutoLanguage2.GetTextByKey("BlackWhiteContrastC"), // "C黑白色差"
  1177. TextAutoLanguage2.GetTextByKey("RecognitionResultD"), // "D识别结果"
  1178. TextAutoLanguage2.GetTextByKey("ColorContrastOverlayE"), // "E色差叠加识别结果"
  1179. TextAutoLanguage2.GetTextByKey("SemiAutoAlternativeF") // "F半自动备选线段"
  1180. };
  1181. textureNames = _textureNames;
  1182. // 设置下拉菜单的选项
  1183. textureDropdown.ClearOptions();
  1184. textureDropdown.AddOptions(new System.Collections.Generic.List<string>(textureNames));
  1185. }
  1186. void initExport()
  1187. {
  1188. UpdateLanguage();
  1189. // 添加导出选中纹理的按钮点击事件
  1190. exportSelectedButton.onClick.AddListener(() => SaveTextureToLocal(textureDropdown.value));
  1191. // 添加导出所有纹理的按钮点击事件
  1192. exportAllButton.onClick.AddListener(SaveAllTexturesToLocal);
  1193. }
  1194. /// <summary>
  1195. /// 导出所有纹理
  1196. /// </summary>
  1197. public void SaveAllTexturesToLocal()
  1198. {
  1199. for (int i = 0; i < textureNames.Length; i++)
  1200. {
  1201. SaveTextureToLocal(i); // 调用之前定义的保存方法
  1202. }
  1203. }
  1204. /// <summary>
  1205. /// 导出图片
  1206. /// </summary>
  1207. /// <param name="index"></param>
  1208. public void SaveTextureToLocal(int index)
  1209. {
  1210. Texture2D[] outputTexture2D = ScreenLocate.Main.OutputTextures;
  1211. if (outputTexture2D == null || index >= outputTexture2D.Length || outputTexture2D[index] == null)
  1212. {
  1213. Debug.LogError("Invalid texture index or texture is null.index:" + index);
  1214. return;
  1215. }
  1216. // 定义保存路径
  1217. string time = DateTime.Now.ToString("yyyyMMdd_HHmmss");
  1218. string baseName = $"{time}_Texture_{index}";
  1219. // 检查索引是否在命名数组内
  1220. string fileName = index < textureNames.Length ? textureNames[index] : $"Texture_{index}";
  1221. #if UNITY_ANDROID && !UNITY_EDITOR_WIN
  1222. string path = System.IO.Path.Combine("/storage/emulated/0/Download", $"{baseName}_{fileName}.png"); //public
  1223. #else
  1224. string path = System.IO.Path.Combine(Application.persistentDataPath, $"{baseName}_{fileName}.png");
  1225. #endif
  1226. // 编码纹理为 PNG 格式
  1227. byte[] bytes = outputTexture2D[index].EncodeToPNG();
  1228. // 将字节写入文件
  1229. System.IO.File.WriteAllBytes(path, bytes);
  1230. Debug.Log($"Texture saved as: {path}");
  1231. //NativeGallery.SaveImageToGallery(path,"InfraredGame", $"{baseName}_{fileName}.png",(success,path)=> {
  1232. // Debug.Log(success?$" 成功保存到相册: {path}" : "保存失败");
  1233. //});
  1234. }
  1235. //下面是处理对象放大缩小
  1236. public RectTransform cameraObj1; // 拖拽你的 CameraSize1 对象到此字段
  1237. public Button toggleButton; // 缩小时使用的按钮
  1238. private Vector2 originalSize;
  1239. private Vector2 originalAnchoredPosition; // 使用 anchoredPosition 代替 localPosition
  1240. private Vector2 originalAnchorMin;
  1241. private Vector2 originalAnchorMax;
  1242. private int originalSiblingIndex; // 保存初始的层级索引
  1243. private bool isFullscreen = false;
  1244. /// <summary>
  1245. /// 测试效果屏幕数据初始化
  1246. /// </summary>
  1247. void InitFullScreen()
  1248. {
  1249. if (cameraObj1 != null)
  1250. {
  1251. // 保存初始大小、位置和层级索引
  1252. originalSize = cameraObj1.sizeDelta;
  1253. originalAnchoredPosition = cameraObj1.anchoredPosition;
  1254. originalAnchorMin = cameraObj1.anchorMin; // 记录初始 anchorMin
  1255. originalAnchorMax = cameraObj1.anchorMax; // 记录初始 anchorMax
  1256. originalSiblingIndex = cameraObj1.GetSiblingIndex();
  1257. // 为 cameraObj1 添加点击事件
  1258. cameraObj1.GetComponent<Button>().onClick.AddListener(ToggleFullscreen);
  1259. toggleButton.transform.parent.gameObject.SetActive(false);
  1260. }
  1261. if (toggleButton != null)
  1262. {
  1263. // 为按钮添加点击事件以恢复大小
  1264. toggleButton.onClick.AddListener(RestoreSize);
  1265. }
  1266. }
  1267. void ToggleFullscreen()
  1268. {
  1269. if (cameraObj1 == null) return;
  1270. if (!isFullscreen)
  1271. {
  1272. // 设置锚点为全屏,调整位置和偏移量
  1273. cameraObj1.anchorMin = Vector2.zero;
  1274. cameraObj1.anchorMax = Vector2.one;
  1275. cameraObj1.offsetMin = Vector2.zero;
  1276. cameraObj1.offsetMax = Vector2.zero;
  1277. cameraObj1.anchoredPosition = Vector3.zero;
  1278. cameraObj1.SetSiblingIndex(cameraObj1.parent.childCount - 1); // 设置为最上层
  1279. //刷新一次点
  1280. SetLocatePointsToCameraRender(ScreenLocate.quadUnityVectorList, 1, 1);
  1281. toggleButton.transform.parent.gameObject.SetActive(true);
  1282. isFullscreen = true;
  1283. //放大情况根据toggle来显示
  1284. SyncAllToggle();
  1285. }
  1286. }
  1287. void RestoreSize()
  1288. {
  1289. if (cameraObj1 == null || !isFullscreen) return;
  1290. // 恢复锚点和偏移量
  1291. cameraObj1.anchorMin = originalAnchorMin; // 使用在 Start() 中记录的初始锚点
  1292. cameraObj1.anchorMax = originalAnchorMax; // 使用在 Start() 中记录的初始锚点
  1293. cameraObj1.sizeDelta = originalSize;
  1294. cameraObj1.anchoredPosition = originalAnchoredPosition; // 恢复为初始 anchoredPosition
  1295. cameraObj1.SetSiblingIndex(originalSiblingIndex); // 恢复到原本的层级索引
  1296. //刷新一次点
  1297. SetLocatePointsToCameraRender(ScreenLocate.quadUnityVectorList, 1, 1);
  1298. toggleButton.transform.parent.gameObject.SetActive(false);
  1299. isFullscreen = false;
  1300. }
  1301. #endregion
  1302. public void SetLocatePointsToCameraRenderTest(List<Vector2> points, float w, float h)
  1303. {
  1304. Transform pointsTF2 = _cameraRender.transform.Find("PointsTest");
  1305. if (pointsTF2.childCount == points.Count)
  1306. {
  1307. Vector2 texSize = new Vector2(w, h);
  1308. for (int i = 0; i < pointsTF2.childCount; i++)
  1309. {
  1310. Transform pointTF = pointsTF2.GetChild(i);
  1311. Vector2 pos = points[i];
  1312. pointTF.localPosition = pos.pixelToLocalPosition_AnchorCenter(texSize, _cameraRender.rectTransform.rect);
  1313. pointTF.gameObject.SetActive(true);
  1314. }
  1315. }
  1316. else
  1317. {
  1318. for (int i = 0; i < pointsTF2.childCount; i++)
  1319. {
  1320. Transform pointTF = pointsTF2.GetChild(i);
  1321. pointTF.gameObject.SetActive(false);
  1322. }
  1323. }
  1324. }
  1325. void SetShakeFilterValue(float v)
  1326. {
  1327. shakeFilterValue.Set(v);
  1328. _sliderShakeFilter.SetValueWithoutNotify(shakeFilterValue.Get());
  1329. _sliderShakeFilter.transform.Find("Value").GetComponent<Text>().text = shakeFilterValue.Get().ToString("f1");
  1330. infraredCameraHelper.SetShakeFilterValue(shakeFilterValue.Get());
  1331. }
  1332. /// <summary>
  1333. /// 重新设置分辨率
  1334. /// </summary>
  1335. /// <param name="index"></param>
  1336. public void resolutionRestartApp(int index)
  1337. {
  1338. #if UNITY_ANDROID || UNITY_IOS
  1339. //StartCoroutine(RestartOrKillApp());
  1340. //获取第一个分辨率设置后设置size
  1341. switch (index)
  1342. {
  1343. case 0:
  1344. infraredCameraHelper.SetHighCameraResolution();
  1345. resoution.Set(index);
  1346. _dropdownResolution2.SetValueWithoutNotify(index);
  1347. break;
  1348. case 1:
  1349. infraredCameraHelper.SetLowCameraResolution();
  1350. resoution.Set(index);
  1351. _dropdownResolution2.SetValueWithoutNotify(index);
  1352. break;
  1353. }
  1354. #endif
  1355. }
  1356. /// <summary>
  1357. /// 初始化时候,设置的值
  1358. /// </summary>
  1359. /// <param name="index"></param>
  1360. public Vector2 SetDefByIndex(int index = 0)
  1361. {
  1362. //SetResolutionNew 里面对应的下标
  1363. Vector2 vec2 = new Vector2(320, 240);
  1364. switch (index)
  1365. {
  1366. case 0:
  1367. vec2 = new Vector2(320, 240);
  1368. break;
  1369. case 1:
  1370. vec2 = new Vector2(160, 120);
  1371. break;
  1372. }
  1373. return vec2;
  1374. }
  1375. /// <summary>
  1376. /// 当 Dropdown 选择变化时的处理方法
  1377. /// </summary>
  1378. /// <param name="OnResolutionChanged">320x240</param>
  1379. private void OnResolutionChanged(int index)
  1380. {
  1381. #if UNITY_ANDROID || UNITY_IOS
  1382. Debug.Log("Selected Resolution: " + index);
  1383. // 将选定的分辨率转换为实际的宽度和高度
  1384. // 并且需要判断是否存在最低分辨率
  1385. if (index == 1 && currentCameraInfo.ContainsResulutionKey("160x120"))
  1386. {
  1387. // 在这里你可以根据实际需要设置屏幕分辨率或进行其他操作
  1388. infraredCameraHelper.SetLowCameraResolution();
  1389. // 保存选择的分辨率到 PlayerPrefs
  1390. resoution.Set(index);
  1391. }
  1392. else if (index == 0)
  1393. {
  1394. //如果是0就 使用高分辨率
  1395. infraredCameraHelper.SetHighCameraResolution();
  1396. // 保存选择的分辨率到 PlayerPrefs
  1397. resoution.Set(index);
  1398. }
  1399. #endif
  1400. }
  1401. /// <summary>
  1402. /// 野鸭关卡测试初始值
  1403. /// </summary>
  1404. /// <param name="optionIndex"></param>
  1405. public void SetDuckLevelTest(int optionIndex)
  1406. {
  1407. //选择下标+1
  1408. int v = optionIndex + 1;
  1409. duckHunterLevel.Set(v);
  1410. int defLevel = (int)duckHunterLevel.Get() - 1 < 0 ? 0 : (int)duckHunterLevel.Get() - 1;
  1411. _duckLevelDropdown.SetValueWithoutNotify(defLevel);
  1412. //_duckLevelDropdown.transform.Find("Value").GetComponent<Text>().text = defLevel+"";
  1413. }
  1414. void OnClick_Reset()
  1415. {
  1416. //SetBrightness(1);
  1417. //SetSaturation(1);
  1418. //SetContrast(1);
  1419. SetShakeFilterValue(6);
  1420. SetLineWidth(4);
  1421. SetFanWidth(90);
  1422. #if UNITY_IOS
  1423. SetInfraredFilterValue(0.6f);
  1424. #else
  1425. SetInfraredFilterValue(0.8f);
  1426. #endif
  1427. SetCaptureValue(30.0f);
  1428. SetDelayValue(30.0f);
  1429. //重置为第一关
  1430. SetDuckLevelTest(0);
  1431. }
  1432. /// <summary>
  1433. /// 清除当前红外存储的所有key
  1434. /// </summary>
  1435. public void OnClickClearInfraredGuider()
  1436. {
  1437. BluetoothAim.ins.ClearAllInfraredGuider();
  1438. }
  1439. public void OnClickClearAll()
  1440. {
  1441. PlayerPrefs.DeleteAll();
  1442. // 保存更改
  1443. PlayerPrefs.Save();
  1444. StartCoroutine(RestartOrKillApp());
  1445. }
  1446. void OnClick_ScreenLocateManual()
  1447. {
  1448. bool bEnter = true;
  1449. if (BluetoothAim.ins && BluetoothAim.ins.status == BluetoothStatusEnum.ConnectSuccess)
  1450. {
  1451. if (BluetoothAim.ins.isMainConnectToInfraredDevice() || BluetoothAim.ins.isMainConnectToGun())
  1452. {
  1453. bEnter = true;
  1454. }
  1455. else
  1456. {
  1457. bEnter = false;
  1458. //只有红外设备才能进行屏幕识别
  1459. PopupMgr.ins.ShowTipTop(TextAutoLanguage2.GetTextByKey("Connect_Tip_Infrared"));
  1460. }
  1461. }
  1462. if (bEnter)
  1463. {
  1464. ViewManager2.ShowView(ViewManager2.Path_InfraredScreenPositioningView);
  1465. FindObjectOfType<InfraredScreenPositioningView>().enterFromInfraredDemo = true;
  1466. }
  1467. }
  1468. void OnClick_ScreenLocateManualAuto()
  1469. {
  1470. bool bEnter = true;
  1471. if (BluetoothAim.ins && BluetoothAim.ins.status == BluetoothStatusEnum.ConnectSuccess)
  1472. {
  1473. if (BluetoothAim.ins.isMainConnectToInfraredDevice() || BluetoothAim.ins.isMainConnectToGun())
  1474. {
  1475. bEnter = true;
  1476. }
  1477. else
  1478. {
  1479. bEnter = false;
  1480. //只有红外设备才能进行屏幕识别
  1481. PopupMgr.ins.ShowTipTop(TextAutoLanguage2.GetTextByKey("Connect_Tip_Infrared"));
  1482. }
  1483. }
  1484. if (bEnter)
  1485. {
  1486. ResetCenterOffset();
  1487. ResetPositioningData();
  1488. infraredCameraHelper.EnterScreenLocateManualAuto();
  1489. }
  1490. }
  1491. public void OnClick_SetAdjustPointsOffset()
  1492. {
  1493. //var _sl = ScreenLocate.Main;
  1494. //var buffer = _sl.infraredSpotBuffer;
  1495. //if (buffer != null)
  1496. //{
  1497. // for (int i = 0; i < buffer.Length; i++)
  1498. // {
  1499. // if (buffer[i].CameraLocation != null)
  1500. // {
  1501. // Debug.Log("CameraLocation:"+buffer[i].CameraLocation.Value);
  1502. // var centerOffset = infraredCameraHelper.GetCenterOffset(buffer[i].CameraLocation.Value, "CameraLocation");
  1503. // Debug.Log("CenterOffset: " + centerOffset);
  1504. // cameraLocationValue.Set(centerOffset);
  1505. // var uvCenterOffset = infraredCameraHelper.GetCenterOffset(buffer[i].ScreenUV.Value, "ScreenUV");
  1506. // Debug.Log("UvCenterOffset: " + uvCenterOffset);
  1507. // screenUVValue.Set(uvCenterOffset);
  1508. // //如果是新手教程场景里面的校准
  1509. // InfraredGuider infraredGuiderObj = FindObjectOfType<InfraredGuider>();
  1510. // if (infraredGuiderObj != null)
  1511. // {
  1512. // GameObject infraredGuiderGameObject = infraredGuiderObj.gameObject;
  1513. // infraredGuiderGameObject.GetComponent<InfraredGuider>().SetTitleAfterCalibration();
  1514. // }
  1515. // }
  1516. // }
  1517. //}
  1518. //只能校准第一个
  1519. if (infraredCameraHelper.IsSinglePoint())
  1520. {
  1521. SetAdjustPointsOffset(PlayerType.FirstPlayer);
  1522. }
  1523. else
  1524. {
  1525. SetAdjustPointsOffset(PlayerType.FirstPlayer);
  1526. SetAdjustPointsOffset(PlayerType.SecondPlayer);
  1527. }
  1528. }
  1529. public void OnClick_SetAdjustPointsOffset_full()
  1530. {
  1531. if (infraredCameraHelper.IsSinglePoint())
  1532. {
  1533. SetAdjustPointsOffset(PlayerType.FirstPlayer);
  1534. }
  1535. else
  1536. {
  1537. SetAdjustPointsOffset_full(PlayerType.FirstPlayer);
  1538. SetAdjustPointsOffset_full(PlayerType.SecondPlayer);
  1539. }
  1540. }
  1541. /// <summary>
  1542. /// 设置存储的中心偏移位置
  1543. /// </summary>
  1544. public void InitCenterOffset()
  1545. {
  1546. infraredCameraHelper.SetCenterOffset(cameraLocationValue.Get(), "CameraLocation");
  1547. infraredCameraHelper.SetCenterOffset(screenUVValue.Get(), "ScreenUV");
  1548. }
  1549. /// <summary>
  1550. /// 重置中心点
  1551. /// </summary>
  1552. public void ResetCenterOffset()
  1553. {
  1554. infraredCameraHelper.ResetCenterOffset();
  1555. }
  1556. /// <summary>
  1557. /// 撤销中心点
  1558. /// </summary>
  1559. public void RevokeCenterOffset()
  1560. {
  1561. infraredCameraHelper.RevokeCenterOffset();
  1562. }
  1563. /// <summary>
  1564. /// 重置定位数据
  1565. /// </summary>
  1566. public void ResetPositioningData(bool bSyncLocal = false)
  1567. {
  1568. infraredCameraHelper.ClearInfraredPositioningData(bSyncLocal);
  1569. }
  1570. void SetCaptureValue(float v)
  1571. {
  1572. captureValue.Set(v);
  1573. _sliderCapture.SetValueWithoutNotify(captureValue.Get());
  1574. _sliderCapture.transform.Find("Value").GetComponent<Text>().text = captureValue.Get().ToString("f1");
  1575. infraredCameraHelper.SetCapture((int)captureValue.Get());
  1576. }
  1577. void SetDelayValue(float v)
  1578. {
  1579. delayValue.Set(v);
  1580. _sliderDelay.SetValueWithoutNotify(delayValue.Get());
  1581. _sliderDelay.transform.Find("Value").GetComponent<Text>().text = delayValue.Get().ToString("f1");
  1582. infraredCameraHelper.SetDelay((int)delayValue.Get());
  1583. }
  1584. #endregion
  1585. #region 相机感光度(默认修改对比度)
  1586. public void onSetSliderCustomValue(Slider _slider, float min = 0.0f, float max = 10.0f)
  1587. {
  1588. onSetSliderValue(_slider, "PU_CONTRAST", min, max);
  1589. }
  1590. public void onSliderCustomEvent(float value, float min = 0.0f, float max = 10.0f)
  1591. {
  1592. onSliderEvent(value, "PU_CONTRAST", min, max);
  1593. }
  1594. public void onSetSliderCustomBrightnessValue(Slider _slider, float min = 0.0f, float max = 10.0f)
  1595. {
  1596. onSetSliderValue(_slider, "PU_BRIGHTNESS", min, max);
  1597. }
  1598. public void onSliderCustomBrightnessEvent(float value, float min = 0.0f, float max = 10.0f)
  1599. {
  1600. onSliderEvent(value, "PU_BRIGHTNESS", min, max);
  1601. }
  1602. public void onSetSliderValue(Slider _slider, string typeStr = "PU_CONTRAST", float min = 0.0f, float max = 10.0f)
  1603. {
  1604. if (BluetoothWindows.IsWindows())
  1605. {
  1606. float v = typeStr == "PU_CONTRAST" ? infraredCameraHelper.GetContrast() : infraredCameraHelper.GetBrightness();
  1607. // 目标区间 [0, 10] 的边界值
  1608. double targetMin = min;
  1609. double targetMax = max;
  1610. double originalMin = -1;
  1611. double originalMax = 1;
  1612. // 计算转换后的值
  1613. double v2 = MapValue(v, originalMin, originalMax, targetMin, targetMax);
  1614. Debug.Log("PC获取相机的感光度 " + typeStr + " :" + v + " = " + v2);
  1615. _slider.SetValueWithoutNotify((float)v2);
  1616. return;
  1617. }
  1618. //功能也改为UVC的对比度
  1619. if (running)
  1620. {
  1621. //string typeStr = "PU_CONTRAST";//"PU_BRIGHTNESS";
  1622. //UInt64 _VALUE = currentCameraInfo.GetTypeByName(typeStr);
  1623. UVCCtrlInfo _UVCCtrlInfo = currentCameraInfo.GetInfo(typeStr);
  1624. float v = currentCameraInfo.GetValue(typeStr); // infraredCameraHelper.GetBrightness();
  1625. //float v2 = (v / _UVCCtrlInfo.max) * 10;
  1626. // 目标区间 [0, 10] 的边界值
  1627. double targetMin = min;
  1628. double targetMax = max;
  1629. double originalMin = _UVCCtrlInfo.min;
  1630. double originalMax = _UVCCtrlInfo.max;
  1631. // 计算转换后的值
  1632. double v2 = MapValue(v, originalMin, originalMax, targetMin, targetMax);
  1633. Debug.Log("获取相机的感光度" + typeStr + ": " + v + " = " + v2);
  1634. _slider.SetValueWithoutNotify((float)v2);
  1635. }
  1636. else _slider.SetValueWithoutNotify(5);
  1637. }
  1638. public void onSliderEvent(float value, string typeStr = "PU_CONTRAST", float min = 0.0f, float max = 10.0f)
  1639. {
  1640. // string typeStr = "PU_CONTRAST";// "PU_BRIGHTNESS";
  1641. //pc
  1642. if (BluetoothWindows.IsWindows())
  1643. {
  1644. Transform trans = _cameraParameterPanel.transform.Find(typeStr);
  1645. Slider slider = trans.GetComponent<Slider>();
  1646. Text textObj = trans.Find("text").GetComponent<Text>();
  1647. // 原始区间和目标区间的边界值
  1648. double originalMin = min;
  1649. double originalMax = max;
  1650. double targetMin = -1;
  1651. double targetMax = 1;
  1652. // 计算转换后的值
  1653. double result = MapValue(value, originalMin, originalMax, targetMin, targetMax);
  1654. float _current = (float)result;
  1655. //Debug.Log("_current:" + _current + " , result:" + result);
  1656. textObj.text = _current + "";
  1657. slider.value = _current;
  1658. if (typeStr == "PU_CONTRAST")
  1659. {
  1660. infraredCameraHelper.SetContrast(_current);
  1661. pcCONTRAST.Set(_current);
  1662. }
  1663. else
  1664. {
  1665. infraredCameraHelper.SetBrightness(_current);
  1666. pcBRIGHTNESS.Set(_current);
  1667. }
  1668. return;
  1669. }
  1670. //修改亮度时,调试界面的亮度也应该一起修改
  1671. //功能也改为UVC的对比度
  1672. if (running)
  1673. {
  1674. //Slider slider = transform.Find("InfraredCamera/Layout/SliderBrightness")
  1675. // .GetComponent<Slider>();
  1676. // UInt64 _VALUE = currentCameraInfo.GetTypeByName(typeStr);
  1677. Transform trans = _cameraParameterPanel.transform.Find(typeStr);
  1678. Slider slider = trans.GetComponent<Slider>();
  1679. Text textObj = trans.Find("text").GetComponent<Text>();
  1680. UVCCtrlInfo _UVCCtrlInfo = currentCameraInfo.GetInfo(typeStr);
  1681. int _currentUVCValue = currentCameraInfo.GetValue(typeStr);
  1682. //value 0 ~ 10
  1683. // 原始区间和目标区间的边界值
  1684. double originalMin = min;
  1685. double originalMax = max;
  1686. double targetMin = _UVCCtrlInfo.min;
  1687. double targetMax = _UVCCtrlInfo.max;
  1688. // 计算转换后的值
  1689. double result = MapValue(value, originalMin, originalMax, targetMin, targetMax);
  1690. int _current = (int)(result);
  1691. Debug.Log("_current:" + value + " , result:" + result);
  1692. textObj.text = _current + "";
  1693. slider.value = _current;
  1694. //dUVCParameters.GetValueOrDefault(typeStr).Set(_current);
  1695. //存储初始值,设置一次到UVC参数
  1696. if (_currentUVCValue != _current) currentCameraInfo.SetValue(typeStr, _current);
  1697. }
  1698. }
  1699. public static double MapValue(double value, double originalMin, double originalMax, double targetMin, double targetMax)
  1700. {
  1701. // 线性插值公式
  1702. return targetMin + (value - originalMin) * (targetMax - targetMin) / (originalMax - originalMin);
  1703. }
  1704. #endregion
  1705. #region 绘制线段部分
  1706. public void SetLineWidth(float v)
  1707. {
  1708. lineWidth.Set(v);
  1709. _sliderLineWidth.SetValueWithoutNotify(lineWidth.Get());
  1710. _sliderLineWidth.transform.Find("Value").GetComponent<Text>().text = lineWidth.Get().ToString("f1");
  1711. }
  1712. public void SetFanWidth(float v)
  1713. {
  1714. fanWidth.Set(v);
  1715. _fanWidth.SetValueWithoutNotify(fanWidth.Get());
  1716. _fanWidth.transform.Find("Value").GetComponent<Text>().text = fanWidth.Get().ToString("f1");
  1717. }
  1718. #endregion
  1719. #region 双人准心
  1720. //红外准心,默认打开吧
  1721. public ParamFloatValue crosshairValue1P = new ParamFloatValue("ic_crosshairValue1P", 1);
  1722. public ParamFloatValue crosshairValue2P = new ParamFloatValue("ic_crosshairValue2P", 1);
  1723. /// <summary>
  1724. /// 初始化时候获取设置和存储来控制显示准心
  1725. /// </summary>
  1726. /// <returns></returns>
  1727. public bool bInitDoubleCrosshairShow(PlayerType playerType)
  1728. {
  1729. if (playerType == PlayerType.FirstPlayer)
  1730. return getDoubleCrosshairValue(playerType) == 1 ? true : false;
  1731. else
  1732. return getDoubleCrosshairValue(playerType) == 1 ? true : false;
  1733. }
  1734. /// <summary>
  1735. /// 获取弓箭准心存储值
  1736. /// </summary>
  1737. /// <returns></returns>
  1738. public int getDoubleCrosshairValue(PlayerType playerType)
  1739. {
  1740. if (playerType == PlayerType.FirstPlayer)
  1741. return (int)crosshairValue1P.Get();
  1742. else
  1743. return (int)crosshairValue2P.Get();
  1744. }
  1745. public void setDoubleCrosshairValue(PlayerType playerType, bool bshow)
  1746. {
  1747. if (playerType == PlayerType.FirstPlayer)
  1748. crosshairValue1P.Set(bshow ? 1 : 0);
  1749. else
  1750. crosshairValue2P.Set(bshow ? 1 : 0);
  1751. }
  1752. #endregion
  1753. #region 双人中心点定位
  1754. [Header("红外点")]
  1755. [SerializeField] Button _infraredOffsetBtn1P;
  1756. [SerializeField] Button _infraredOffsetBtn2P;
  1757. //准心的偏移值
  1758. public ParamVector2Value cameraLocationValue1P = new ParamVector2Value("ic_cameraLocation1P", Vector2.zero);
  1759. public ParamVector2Value screenUVValue1P = new ParamVector2Value("ic_screenUV1P", Vector2.zero);
  1760. public ParamVector2Value cameraLocationValue2P = new ParamVector2Value("ic_cameraLocation2P", Vector2.zero);
  1761. public ParamVector2Value screenUVValue2P = new ParamVector2Value("ic_screenUV2P", Vector2.zero);
  1762. //双点模式下的全屏偏移量,相当于两个单点
  1763. public ParamVector2Value cameraLocationValue1P_full = new ParamVector2Value("ic_cameraLocation1P_full", Vector2.zero);
  1764. public ParamVector2Value screenUVValue1P_full = new ParamVector2Value("ic_screenUV1P_full", Vector2.zero);
  1765. public ParamVector2Value cameraLocationValue2P_full = new ParamVector2Value("ic_cameraLocation2P_full", Vector2.zero);
  1766. public ParamVector2Value screenUVValue2P_full = new ParamVector2Value("ic_screenUV2P_full", Vector2.zero);
  1767. /// <summary>
  1768. /// 设置单点模式
  1769. /// </summary>
  1770. public void onToggleSinglePoint()
  1771. {
  1772. //Debug.Log("mToggleSinglePoint.isOn:" + mToggleSinglePoint.isOn);
  1773. if (!infraredCameraHelper.IsSinglePoint())
  1774. {
  1775. infraredCameraHelper.SetSinglePoint(true);
  1776. }
  1777. else
  1778. {
  1779. infraredCameraHelper.SetSinglePoint(false);
  1780. }
  1781. }
  1782. /// <summary>
  1783. /// 设置是否是单,双点模式
  1784. /// </summary>
  1785. /// <param name="value"></param>
  1786. public void SetSinglePoint(bool value, ScreenPointTypeEnum screenPointType = ScreenPointTypeEnum.None)
  1787. {
  1788. if (!infraredCameraHelper.getScreenLocate()) return;
  1789. infraredCameraHelper.SetSinglePoint(value);
  1790. //重新设置双点数据
  1791. InitCenterOffsets(PlayerType.FirstPlayer, screenPointType);
  1792. InitCenterOffsets(PlayerType.SecondPlayer, screenPointType);
  1793. Debug.Log("设置是否是单模式:" + value + ",screenPointType:" + screenPointType);
  1794. }
  1795. /// <summary>
  1796. /// 偏移点按钮
  1797. /// </summary>
  1798. public void InitOffsetBtns()
  1799. {
  1800. _infraredOffsetBtn1P.onClick.AddListener(() =>
  1801. {
  1802. SetAdjustPointsOffset(PlayerType.FirstPlayer);
  1803. });
  1804. _infraredOffsetBtn2P.onClick.AddListener(() =>
  1805. {
  1806. SetAdjustPointsOffset(PlayerType.SecondPlayer);
  1807. });
  1808. }
  1809. /// <summary>
  1810. /// 设置存储的中心偏移位置--双点
  1811. /// </summary>
  1812. public void InitCenterOffsets(PlayerType playerType, ScreenPointTypeEnum screenPointType = ScreenPointTypeEnum.None)
  1813. {
  1814. if (!infraredCameraHelper.getScreenLocate()) return;
  1815. if (infraredCameraHelper.IsSinglePoint())
  1816. {
  1817. infraredCameraHelper.SetCenterOffset(cameraLocationValue.Get(), "CameraLocation");
  1818. infraredCameraHelper.SetCenterOffset(screenUVValue.Get(), "ScreenUV");
  1819. }
  1820. else
  1821. {
  1822. if (screenPointType == ScreenPointTypeEnum.None || screenPointType == ScreenPointTypeEnum.HalfScreen) {
  1823. infraredCameraHelper.SetCenterOffsets(playerType, playerType == PlayerType.FirstPlayer ? cameraLocationValue1P.Get() : cameraLocationValue2P.Get(), "CameraLocation");
  1824. infraredCameraHelper.SetCenterOffsets(playerType, playerType == PlayerType.FirstPlayer ? screenUVValue1P.Get() : screenUVValue2P.Get(), "ScreenUV");
  1825. }
  1826. if (screenPointType == ScreenPointTypeEnum.None || screenPointType == ScreenPointTypeEnum.FullScreen)
  1827. {
  1828. //全屏双点
  1829. infraredCameraHelper.SetCenterOffsets(playerType, playerType == PlayerType.FirstPlayer ? cameraLocationValue1P_full.Get() : cameraLocationValue2P_full.Get(), "CameraLocation");
  1830. infraredCameraHelper.SetCenterOffsets(playerType, playerType == PlayerType.FirstPlayer ? screenUVValue1P_full.Get() : screenUVValue2P_full.Get(), "ScreenUV");
  1831. }
  1832. }
  1833. }
  1834. /// <summary>
  1835. /// 撤销中心点--双点
  1836. /// </summary>
  1837. public void RevokeCenterOffsets()
  1838. {
  1839. if (!infraredCameraHelper.getScreenLocate()) return;
  1840. infraredCameraHelper.RevokeCenterOffsets();
  1841. }
  1842. /// <summary>
  1843. /// 重置中心点--双点
  1844. /// </summary>
  1845. public void ResetCenterOffsets()
  1846. {
  1847. if (!infraredCameraHelper.getScreenLocate()) return;
  1848. infraredCameraHelper.ResetCenterOffsets();
  1849. }
  1850. /// <summary>
  1851. /// 校准中心点偏移量,双点情况下要设置 SetCenterOffsets
  1852. /// </summary>
  1853. /// <param name="playerType">玩家类型</param>
  1854. public void SetAdjustPointsOffset(PlayerType playerType)
  1855. {
  1856. if (!infraredCameraHelper.getScreenLocate()) return;
  1857. if (infraredCameraHelper.GetUVCCameraInfo() == null) return;
  1858. var buffer = infraredCameraHelper.getScreenLocate().infraredSpotBuffer;
  1859. if (buffer != null)
  1860. {
  1861. if (playerType == PlayerType.FirstPlayer && buffer[0].CameraLocation != null)
  1862. {
  1863. if (infraredCameraHelper.IsSinglePoint())
  1864. { //单点
  1865. var centerOffset = infraredCameraHelper.GetCenterOffset(buffer[0].CameraLocation.Value);
  1866. cameraLocationValue.Set(centerOffset);
  1867. var uvCenterOffset = infraredCameraHelper.GetCenterOffset(buffer[0].ScreenUV.Value, "ScreenUV");
  1868. screenUVValue.Set(uvCenterOffset);
  1869. //如果是新手教程场景里面的校准
  1870. InfraredGuider infraredGuiderObj = FindObjectOfType<InfraredGuider>();
  1871. if (infraredGuiderObj != null)
  1872. {
  1873. GameObject infraredGuiderGameObject = infraredGuiderObj.gameObject;
  1874. infraredGuiderGameObject.GetComponent<InfraredGuider>().SetTitleAfterCalibration();
  1875. }
  1876. }
  1877. else
  1878. {
  1879. var centerOffset = infraredCameraHelper.GetCenterOffset(buffer[0].CameraLocation.Value, true);
  1880. cameraLocationValue1P.Set(centerOffset);
  1881. infraredCameraHelper.SetCenterOffsets(playerType, centerOffset);
  1882. var uvCenterOffset = infraredCameraHelper.GetCenterOffset(buffer[0].ScreenUV.Value, true, "ScreenUV");
  1883. screenUVValue1P.Set(uvCenterOffset);
  1884. infraredCameraHelper.SetCenterOffsets(playerType, uvCenterOffset, "ScreenUV");
  1885. }
  1886. }
  1887. if (playerType == PlayerType.SecondPlayer && buffer[1].CameraLocation != null)
  1888. {
  1889. var centerOffset = infraredCameraHelper.GetCenterOffset(buffer[1].CameraLocation.Value, false);
  1890. cameraLocationValue2P.Set(centerOffset);
  1891. infraredCameraHelper.SetCenterOffsets(playerType, centerOffset);
  1892. var uvCenterOffset = infraredCameraHelper.GetCenterOffset(buffer[1].ScreenUV.Value, false, "ScreenUV");
  1893. screenUVValue2P.Set(uvCenterOffset);
  1894. infraredCameraHelper.SetCenterOffsets(playerType, uvCenterOffset, "ScreenUV");
  1895. }
  1896. }
  1897. }
  1898. //记录全屏双点校准
  1899. public void SetAdjustPointsOffset_full(PlayerType playerType)
  1900. {
  1901. if (!infraredCameraHelper.getScreenLocate()) return;
  1902. if (infraredCameraHelper.GetUVCCameraInfo() == null) return;
  1903. if (infraredCameraHelper.IsSinglePoint()) return;
  1904. var buffer = infraredCameraHelper.getScreenLocate().infraredSpotBuffer;
  1905. if (buffer != null)
  1906. {
  1907. if (playerType == PlayerType.FirstPlayer && buffer[0].CameraLocation != null)
  1908. {
  1909. var centerOffset = infraredCameraHelper.GetCenterOffset(buffer[0].CameraLocation.Value);
  1910. cameraLocationValue1P_full.Set(centerOffset);
  1911. infraredCameraHelper.SetCenterOffsets(playerType, centerOffset);
  1912. var uvCenterOffset = infraredCameraHelper.GetCenterOffset(buffer[0].ScreenUV.Value, "ScreenUV");
  1913. screenUVValue1P_full.Set(uvCenterOffset);
  1914. infraredCameraHelper.SetCenterOffsets(playerType, uvCenterOffset, "ScreenUV");
  1915. }
  1916. if (playerType == PlayerType.SecondPlayer && buffer[1].CameraLocation != null)
  1917. {
  1918. var centerOffset = infraredCameraHelper.GetCenterOffset(buffer[1].CameraLocation.Value);
  1919. cameraLocationValue2P_full.Set(centerOffset);
  1920. infraredCameraHelper.SetCenterOffsets(playerType, centerOffset);
  1921. var uvCenterOffset = infraredCameraHelper.GetCenterOffset(buffer[1].ScreenUV.Value, "ScreenUV");
  1922. screenUVValue2P_full.Set(uvCenterOffset);
  1923. infraredCameraHelper.SetCenterOffsets(playerType, uvCenterOffset, "ScreenUV");
  1924. Debug.Log("设置点2");
  1925. }
  1926. }
  1927. }
  1928. #endregion
  1929. #region 亮度检测部分
  1930. public void SetInfraredFilterValue(float v)
  1931. {
  1932. if (!infraredCameraHelper.getScreenLocate()) return;
  1933. infraredFileterValue.Set(v);
  1934. _infraredFilter.SetValueWithoutNotify(infraredFileterValue.Get());
  1935. _infraredFilter.transform.Find("Value").GetComponent<Text>().text = infraredFileterValue.Get().ToString("f1");
  1936. infraredCameraHelper.SetInfraredLocateBrightnessThreshold(infraredFileterValue.Get());
  1937. }
  1938. #endregion
  1939. public void resetInfraredPlayerPrefs()
  1940. {
  1941. //测试用
  1942. PlayerPrefs.DeleteKey("entry-guider-infrared-" + LoginMgr.myUserInfo.id);
  1943. PlayerPrefs.DeleteKey("hideInfraredBowAndArrow");
  1944. }
  1945. #region 显示Log部分信息
  1946. [SerializeField] Text _calibrationFixedText;
  1947. [SerializeField] Text _cameraSizeText;
  1948. [SerializeField] Text _quadUnityVectorListText;
  1949. /// <summary>
  1950. /// 校准时候的固定值分辨率
  1951. /// </summary>
  1952. /// <param name="v"></param>
  1953. public void SetCalibrationFixedText(Vector2 v)
  1954. {
  1955. _calibrationFixedText.text = v.x + "*" + v.y;
  1956. }
  1957. /// <summary>
  1958. /// 渲染摄像机当前分辨率
  1959. /// </summary>
  1960. /// <param name="v"></param>
  1961. public void SetCameraSizeText(Vector2 v)
  1962. {
  1963. _cameraSizeText.text = v.x + "*" + v.y;
  1964. }
  1965. /// <summary>
  1966. /// 渲染摄像机识别点
  1967. /// </summary>
  1968. /// <param name="v"></param>
  1969. public void SetQuadUnityVectorListText(string v)
  1970. {
  1971. _quadUnityVectorListText.text = v;
  1972. }
  1973. #endregion
  1974. #region 错误日志
  1975. public void HandleLog(string logString, string stackTrace, LogType type)
  1976. {
  1977. if (type == LogType.Exception || type == LogType.Error)
  1978. {
  1979. SaveLogToFile(logString, stackTrace);
  1980. }
  1981. }
  1982. void SaveLogToFile(string message, string stackTrace)
  1983. {
  1984. string path;
  1985. #if UNITY_ANDROID && !UNITY_EDITOR_WIN
  1986. // 保存到 Android 的公共 Download 文件夹,便于用户直接查看
  1987. path = System.IO.Path.Combine("/storage/emulated/0/Download", "crash_log.txt");
  1988. #else
  1989. // 其他平台使用 Application.persistentDataPath
  1990. path = System.IO.Path.Combine(Application.persistentDataPath, "crash_log.txt");
  1991. #endif
  1992. // 打印路径确认
  1993. Debug.Log($"Log file saved at: {path}");
  1994. // 将日志写入到指定路径的文件中
  1995. System.IO.File.AppendAllText(path, $"{message}\n{stackTrace}\n\n");
  1996. }
  1997. #endregion
  1998. }
  1999. public class ParamFloatValue
  2000. {
  2001. private string _saveKey;
  2002. private float _valueDefault;
  2003. private bool _valueLoaded;
  2004. private float _value;
  2005. public ParamFloatValue(string saveKey, float valueDefault)
  2006. {
  2007. _saveKey = saveKey;
  2008. _valueDefault = valueDefault;
  2009. }
  2010. public float Get()
  2011. {
  2012. if (!_valueLoaded) _value = PlayerPrefs.GetFloat(_saveKey, _valueDefault);
  2013. return _value;
  2014. }
  2015. public float GetDefault()
  2016. {
  2017. return _valueDefault;
  2018. }
  2019. public string GetKey()
  2020. {
  2021. return _saveKey;
  2022. }
  2023. public void Set(float value)
  2024. {
  2025. _value = value;
  2026. PlayerPrefs.SetFloat(_saveKey, _value);
  2027. PlayerPrefs.Save();
  2028. }
  2029. /// <summary>
  2030. /// 重置成默认值
  2031. /// </summary>
  2032. public void Reset()
  2033. {
  2034. PlayerPrefs.SetFloat(_saveKey, _valueDefault);
  2035. PlayerPrefs.Save();
  2036. }
  2037. }
  2038. /// <summary>
  2039. /// 存储Vector2
  2040. /// </summary>
  2041. public class ParamVector2Value
  2042. {
  2043. private string _saveKey;
  2044. private Vector2 _valueDefault;
  2045. private bool _valueLoaded;
  2046. private Vector2 _value;
  2047. public ParamVector2Value(string saveKey, Vector2 valueDefault)
  2048. {
  2049. _saveKey = saveKey;
  2050. _valueDefault = valueDefault;
  2051. }
  2052. public Vector2 Get()
  2053. {
  2054. if (!_valueLoaded)
  2055. {
  2056. float x = PlayerPrefs.GetFloat(_saveKey + "_x", _valueDefault.x);
  2057. float y = PlayerPrefs.GetFloat(_saveKey + "_y", _valueDefault.y);
  2058. _value = new Vector2(x, y);
  2059. _valueLoaded = true;
  2060. }
  2061. return _value;
  2062. }
  2063. public Vector2 GetDefault()
  2064. {
  2065. return _valueDefault;
  2066. }
  2067. public string GetKey()
  2068. {
  2069. return _saveKey;
  2070. }
  2071. public void Set(Vector2 value)
  2072. {
  2073. _value = value;
  2074. PlayerPrefs.SetFloat(_saveKey + "_x", _value.x);
  2075. PlayerPrefs.SetFloat(_saveKey + "_y", _value.y);
  2076. PlayerPrefs.Save();
  2077. }
  2078. /// <summary>
  2079. /// 重置成默认值
  2080. /// </summary>
  2081. public void Reset()
  2082. {
  2083. PlayerPrefs.SetFloat(_saveKey + "_x", _valueDefault.x);
  2084. PlayerPrefs.SetFloat(_saveKey + "_y", _valueDefault.y);
  2085. PlayerPrefs.Save();
  2086. }
  2087. }