using System.Collections; using System.Collections.Generic; using UnityEngine; using LineUI; using UnityEngine.UI; using System.Linq; public class LinePosition { public int index; public List pos; } public class InfraredScreenPositioningView : JCUnityLib.ViewBase { [SerializeField] RectTransform pos1; [SerializeField] RectTransform pos2; [SerializeField] RectTransform pos3; [SerializeField] RectTransform pos4; //画线时候的点偏移量 [SerializeField] int offset = 20; [SerializeField] Line line; List oldLinePosition; Vector3 beginPos; Vector3 endPos; //相机感光部分 [SerializeField] Slider slider; [SerializeField] RawImage rawImage; private void Awake() { GetLocalPos(); } void Start() { //记录操作的位置信息 oldLinePosition = new List(); SetLinePos(); //相机感光度 if (InfraredDemo._ins) { slider.onValueChanged.AddListener((value) => { InfraredDemo._ins.onSliderEvent(value); }); InfraredDemo._ins.onSetSliderValue(slider); } //slider.onValueChanged.AddListener((value) => { // //onSliderEvent(value); // InfraredDemo._ins.SetBrightness(value); //}); //slider.value = InfraredDemo._ins.brightness.Get(); } void Update() { if (InfraredDemo.running) { //渲染相机画面 rawImage.texture = InfraredDemo.infraredCameraHelper.GetCameraTexture(); rawImage.material = InfraredDemo.infraredCameraHelper.GetCameraMaterial(); } } public void OnClick_Back() { AudioMgr.ins.PlayBtn(); ViewMgr.Instance.DestroyView(); } #region 绘制线段部分 //点击拖拽的开始位置 public void onBeginPos(int index, Vector3 pos) { beginPos = pos; } public void onDragPos(int index, Vector3 pos) { //设置线段的点 SetRectanglePoints(linePosConversion(pos1.localPosition, pos2.localPosition, pos3.localPosition, pos4.localPosition)); } //点击拖拽的结束位置 public void onEndPos(int index, Vector3 pos) { endPos = pos; if (beginPos == endPos) return; //Debug.Log(index+",最后的点:" + pos); //再记录一次最后的点 SetLinePos(); } //同步设置图片对应的位置到line public void SetLinePos() { //记录一个操作点的操作位置 AddOldLinePosition(); //设置线段的点 SetRectanglePoints(linePosConversion(pos1.localPosition, pos2.localPosition, pos3.localPosition, pos4.localPosition)); } void AddOldLinePosition() { //记录一个操作点的操作位置 List screenPositions = new List(); screenPositions.Add(pos1.localPosition); screenPositions.Add(pos2.localPosition); screenPositions.Add(pos3.localPosition); screenPositions.Add(pos4.localPosition); LinePosition linePosition = new LinePosition(); linePosition.index = oldLinePosition.Count; linePosition.pos = screenPositions; oldLinePosition.Add(linePosition); } List linePosConversion(Vector3 _pos1, Vector3 _pos2, Vector3 _pos3, Vector3 _pos4) { List _screenPositions = new List(); Vector2 startPos1 = new Vector2(_pos1.x - pos1.rect.width * 0.25f - offset, _pos1.y - pos1.rect.height * 0.25f - offset); Vector2 startPos2 = new Vector2(_pos2.x + pos2.rect.width * 0.25f + offset, _pos2.y - pos2.rect.height * 0.25f - offset); Vector2 startPos3 = new Vector2(_pos3.x + pos3.rect.width * 0.25f + offset, _pos3.y + pos3.rect.height * 0.25f + offset); Vector2 startPos4 = new Vector2(_pos4.x - pos4.rect.width * 0.25f - offset, _pos4.y + pos4.rect.height * 0.25f + offset); _screenPositions.Add(startPos1); _screenPositions.Add(startPos2); _screenPositions.Add(startPos3); _screenPositions.Add(startPos4); return _screenPositions; } void SetRectanglePoints(List screenPositions) { line.SetLine(screenPositions); } //撤回上一个元素 public void onRecall() { // 获取并删除最后一个元素,并且保留一个元素 if (oldLinePosition.Count > 1) // 确保列表不为空 { // 获取回退的那个元素点 LinePosition lastElement_second = oldLinePosition[oldLinePosition.Count - 2]; // 获取最后一个元素 //LinePosition lastElement = oldLinePosition[oldLinePosition.Count - 1]; //Debug.Log(JsonUtility.ToJson(lastElement) + " = " + oldLinePosition.Count); oldLinePosition.RemoveAt(oldLinePosition.Count - 1); // 删除最后一个元素 pos1.localPosition = lastElement_second.pos[0]; pos2.localPosition = lastElement_second.pos[1]; pos3.localPosition = lastElement_second.pos[2]; pos4.localPosition = lastElement_second.pos[3]; //设置线段的点 SetRectanglePoints(linePosConversion(lastElement_second.pos[0], lastElement_second.pos[1], lastElement_second.pos[2], lastElement_second.pos[3])); } } //确认修改 public void onConfirmation() { if (!ConfirmScreenLocateManual()) return; if (oldLinePosition.Count > 1) // 确保列表不为空 { LinePosition lastElement = oldLinePosition[oldLinePosition.Count - 1]; oldLinePosition.Clear(); oldLinePosition.Add(lastElement); } if (InfraredDemo.running) { //跳转入界面 AudioMgr.ins.PlayBtn(); ViewManager2.HideView(ViewManager2.Path_InfraredScreenPositioningView); ViewManager2.ShowView(ViewManager2.Path_ConnectGuidanceView); } //存储一次节点 SaveLocalPos(); } //设置位置 public void onReset() { oldLinePosition.Clear(); int _x = 120, _y = 77; pos1.anchoredPosition = new Vector3(_x, _y, 0); pos2.anchoredPosition = new Vector3(-_x, _y, 0); pos3.anchoredPosition = new Vector3(-_x, -_y, 0); pos4.anchoredPosition = new Vector3(_x, -_y, 0); //设置一次位置 SetLinePos(); } #endregion List _locatePointList = new(); float _texWidth; float _texHeight; void RecordLocatePoint(RectTransform p, Vector2 pivot) { Vector2 pos = JCUnityLib.RectTransformUtils.GetPositionByPivot(p, pivot); pos.x = Mathf.Clamp01(pos.x / Screen.width) * _texWidth; pos.y = Mathf.Clamp01(pos.y / Screen.height) * _texHeight; _locatePointList.Add(pos); } bool ConfirmScreenLocateManual() { if (InfraredDemo.running) { //渲染截图 Texture2D texture2D = InfraredDemo.infraredCameraHelper.EnterScreenLocateManual(); if (texture2D == null) { InfraredDemo.infraredCameraHelper.QuitScreenLocateManual(null); return false; } _locatePointList.Clear(); _texWidth = texture2D.width; _texHeight = texture2D.height; RecordLocatePoint(pos1, new Vector2(0, 0)); RecordLocatePoint(pos2, new Vector2(1, 0)); RecordLocatePoint(pos3, new Vector2(1, 1)); RecordLocatePoint(pos4, new Vector2(0, 1)); InfraredDemo.infraredCameraHelper.QuitScreenLocateManual(_locatePointList); FindObjectOfType().SetLocatePointsToCameraRender(_locatePointList, _texWidth, _texHeight); return true; } return false; } void SaveLocalPos() { List screenPositions = new List(); screenPositions.Add(pos1.localPosition); screenPositions.Add(pos2.localPosition); screenPositions.Add(pos3.localPosition); screenPositions.Add(pos4.localPosition); string saveStr = string.Join(';', screenPositions.Select(v => $"{v.x},{v.y},{v.z}")); Debug.Log(saveStr); PlayerPrefs.SetString("ScreenPositioningView", saveStr); } void GetLocalPos() { string posListStr = PlayerPrefs.GetString("ScreenPositioningView", ""); if (!string.IsNullOrWhiteSpace(posListStr)) { List posList = posListStr.Split(';') .Select(s => { string[] parts = s.Split(','); return new Vector3(float.Parse(parts[0]), float.Parse(parts[1]), float.Parse(parts[2])); }) .ToList(); pos1.localPosition = posList[0]; pos2.localPosition = posList[1]; pos3.localPosition = posList[2]; pos4.localPosition = posList[3]; SetRectanglePoints(linePosConversion(pos1.localPosition, pos2.localPosition, pos3.localPosition, pos4.localPosition)); } } }