using Newtonsoft.Json;
using Paroxe.PdfRenderer;
using RenderHeads.Media.AVProVideo.Demos;
using SK.Framework;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Playables;
using UnityEngine.UI;
///
/// 设备结构认知
///
public class EquipmentStructureView : UIView
{
public Variables variables;
private List devicesTimeline = new List();
private PlayableDirector currentDevice;
private bool isDragging;
public Animator[] animators;
private List models = new List();
private EnhancedModelViewerOrbitCamera enhancedModelViewerOrbitCamera;
private ModelSpreadController modelSpreadController;
public List deviceBtns = new List();
[System.Serializable]
public class ButtonData
{
public Sprite normalSprite;
public Sprite selectedSprite;
}
public List deviceBtnData = new List();
// 运行时使用的字典
private Dictionary buttonDictionary = new Dictionary();
private Button _currentSelectedButton;
[SerializeField] private List modeData = new List();
[SerializeField] private List funcData = new List();
protected override void OnInit(IViewData data)
{
base.OnInit(data);
variables.Set("my_EquipmentStructure", this);
}
void Start()
{
models.Clear();
GameObject trans = GameObject.Find("AllModels");
if (trans != null)
{
for (int i = 0; i < trans.transform.childCount; i++)
{
models.Add(trans.transform.GetChild(i).gameObject);
models[i].SetActive(false);
}
}
models.RemoveAt(0);
models[0].Activate();
enhancedModelViewerOrbitCamera = Camera.main.GetComponent();
modelSpreadController = this.gameObject.AddComponent();
modelSpreadController.SetTarget(models[0].transform);
/*
devicesTimeline.Add(variables.Get("空调"));
devicesTimeline.Add(variables.Get("泵"));
devicesTimeline.Add(variables.Get("空压机"));
Toggle[] toggles = variables.Get("设备列表").GetComponentsInChildren();
for (int i = 0; i < toggles.Length; i++)
{
int index = i;
toggles[i].onValueChanged.AddListener(delegate (bool isOn) { OnToggleValueChanged(isOn, index); });
}*/
InitLeftBtns();
SetSelectedButton(deviceBtns[0]);
SetHightlight(variables.Get("合并"), modeData[1]);
variables.Get("关闭界面").onClick.AddListener(delegate
{
Unload();
Load();
});
variables.Get("原理动画").onClick.AddListener(delegate
{
variables.Get("动画节点").gameObject.SetActive(!variables.Get("动画节点").gameObject.activeSelf);
});
variables.Get("拆解").onClick.AddListener(delegate
{
/*
variables.Get("1倍").gameObject.SetActive(!variables.Get("1倍").gameObject.activeSelf);
variables.Get("0.5倍").gameObject.SetActive(!variables.Get("0.5倍").gameObject.activeSelf);
variables.Get("0.25倍").gameObject.SetActive(!variables.Get("0.25倍").gameObject.activeSelf);*/
Debug.Log("拆解");
SetNormal(variables.Get("合并"), modeData[1]);
SetHightlight(variables.Get("拆解"), modeData[0]);
modelSpreadController.Split();
});
variables.Get("合并").onClick.AddListener(delegate
{
SetHightlight(variables.Get("合并"), modeData[1]);
SetNormal(variables.Get("拆解"), modeData[0]);
Debug.Log("合并");
modelSpreadController.Merge();
});
variables.Get("媒体资源").onClick.AddListener(delegate
{
variables.Get("操作手册").gameObject.SetActive(!variables.Get("操作手册").gameObject.activeSelf);
variables.Get("FAQ").gameObject.SetActive(!variables.Get("FAQ").gameObject.activeSelf);
variables.Get("维护视频").gameObject.SetActive(!variables.Get("维护视频").gameObject.activeSelf);
});
/*
variables.Get("安装调试").onClick.AddListener(delegate
{
});*/
variables.Get("1倍").onClick.AddListener(delegate
{
SetTimelineSpeed(1);
});
variables.Get("0.5倍").onClick.AddListener(delegate
{
SetTimelineSpeed(0.5f);
});
variables.Get("0.25倍").onClick.AddListener(delegate
{
SetTimelineSpeed(0.25f);
});
variables.Get("操作手册").onClick.AddListener(delegate
{
SetHightlight(variables.Get("操作手册"), funcData[0]);
SetNormal(variables.Get("FAQ"), funcData[1]);
SetNormal(variables.Get("维护视频"), funcData[2]);
//variables.Get("PDFViewer").Activate();
variables.Get("PDF背景").Activate();
// variables.Get("PDFViewer").LoadDocumentFromStreamingAssets("PDF", "空调操作手册.pdf");
GetFileJson();
});
variables.Get("FAQ").onClick.AddListener(delegate
{
SetNormal(variables.Get("操作手册"), funcData[0]);
SetHightlight(variables.Get("FAQ"), funcData[1]);
SetNormal(variables.Get("维护视频"), funcData[2]);
variables.Get("FAQ物体").Activate();
GetFileJson();
});
variables.Get("维护视频").onClick.AddListener(delegate
{
SetNormal(variables.Get("操作手册"), funcData[0]);
SetNormal(variables.Get("FAQ"), funcData[1]);
SetHightlight(variables.Get("维护视频"), funcData[2]);
variables.Get("MediaPlayerUI").gameObject.Activate();
});
StartCoroutine(OpenCheck());
}
void InitLeftBtns()
{
// 初始化字典
for (int i = 0; i < deviceBtns.Count; i++)
{
buttonDictionary[deviceBtns[i]] = deviceBtnData[i];
SetNormal(deviceBtns[i], deviceBtnData[i]);
// 添加点击事件
int index = i; // 闭包需要
deviceBtns[i].onClick.AddListener(() => OnButtonSelected(deviceBtns[index], index));
}
// 设置默认选中
if (deviceBtns.Count > 0)
{
SetSelectedButton(deviceBtns[0]);
}
}
private void OnButtonSelected(Button selectedButton, int index)
{
if (_currentSelectedButton == selectedButton) return;
// 取消上一个按钮的选中
if (_currentSelectedButton != null && buttonDictionary.ContainsKey(_currentSelectedButton))
{
SetNormal(_currentSelectedButton, buttonDictionary[_currentSelectedButton]);
}
for (int i = 0; i < models.Count; i++)
{
if (i == index)
{
models[i].Activate();
enhancedModelViewerOrbitCamera.SetTarget(models[i].transform);
modelSpreadController.SetTarget(models[i].transform);
}
else
{
models[i].Deactivate();
// 设置新按钮的选中
SetSelectedButton(selectedButton);
}
}
}
public void SetSelectedButton(Button button)
{
if (!buttonDictionary.ContainsKey(button))
{
Debug.LogWarning($"按钮 {button.name} 不在管理列表中");
return;
}
_currentSelectedButton = button;
SetHightlight(button, buttonDictionary[button]);
}
///
/// 获取对应设备的FAQ和PDF文件
///
private void GetFileJson()
{
Root root = new Root();
variables.Get("FAQText文本").text = "";
switch (_currentSelectedButton.name)
{
case "空调":
if (variables.Get("PDFViewer").gameObject.activeInHierarchy)
variables.Get("PDFViewer").LoadDocumentFromStreamingAssets("PDF", "空调操作手册.pdf");
root = JsonConvert.DeserializeObject(LocalTextLoader.LoadText(Application.streamingAssetsPath + "/FAQ/空调FAQ.json"));
for (int i = 0; i < root.DeviceFAQ.Count; i++)
{
variables.Get("FAQText文本").text += "" + root.DeviceFAQ[i].Question + " " + "\n\n" + "" + root.DeviceFAQ[i].Answer + " " + "\n\n";
}
break;
case "泵":
if (variables.Get("PDFViewer").gameObject.activeInHierarchy)
variables.Get("PDFViewer").LoadDocumentFromStreamingAssets("PDF", "泵操作手册.pdf");
root = JsonConvert.DeserializeObject(LocalTextLoader.LoadText(Application.streamingAssetsPath + "/FAQ/泵FAQ.json"));
for (int i = 0; i < root.DeviceFAQ.Count; i++)
{
variables.Get("FAQText文本").text += "" + root.DeviceFAQ[i].Question + " " + "\n\n" + "" + root.DeviceFAQ[i].Answer + " " + "\n\n";
}
break;
case "空压机":
if (variables.Get("PDFViewer").gameObject.activeInHierarchy)
variables.Get("PDFViewer").LoadDocumentFromStreamingAssets("PDF", "空压机操作手册.pdf");
root = JsonConvert.DeserializeObject(LocalTextLoader.LoadText(Application.streamingAssetsPath + "/FAQ/空压机FAQ.json"));
for (int i = 0; i < root.DeviceFAQ.Count; i++)
{
variables.Get("FAQText文本").text += "" + root.DeviceFAQ[i].Question + " " + "\n\n" + "" + root.DeviceFAQ[i].Answer + " " + "\n\n";
}
break;
}
LayoutRebuilder.ForceRebuildLayoutImmediate(variables.Get("FAQText文本").rectTransform);
}
IEnumerator OpenCheck()
{
yield return new WaitForSeconds(3f);
enhancedModelViewerOrbitCamera.SetEnableClickToFocus(true);
}
///
/// 设备开关状态改变事件
///
///
void OnToggleValueChanged(bool isOn, int index)
{
if (isOn)
{
Debug.Log($"设备:{index}");
if (Get() != null)
{
Debug.Log("关闭子结构");
Get().Unload();
}
for (int i = 0; i < models.Count; i++)
{
if (i == index)
{
models[i].Activate();
enhancedModelViewerOrbitCamera.SetTarget(models[i].transform);
//currentModel = models[i].transform;
modelSpreadController.SetTarget(models[i].transform);
}
else
{
models[i].Deactivate();
}
}
}
}
///
/// 速度改变事件
///
///
void SetTimelineSpeed(float speed)
{
if (currentDevice == null) return;
currentDevice.Resume();
variables.Get("动画节点").value = 0;
if (currentDevice.playableGraph.IsValid())
{
var rootPlayable = currentDevice.playableGraph.GetRootPlayable(0);
if (rootPlayable.IsValid())
rootPlayable.SetSpeed(speed);
}
variables.Get("动画节点").minValue = 0f;
variables.Get("动画节点").maxValue = (float)currentDevice.duration;
variables.Get("动画节点").wholeNumbers = false;
variables.Get("动画节点").onValueChanged.AddListener(delegate (float value)
{
currentDevice.time = value;
currentDevice.Evaluate();
});
currentDevice.Play();
}
void Update()
{
/*
// Timeline → Slider
if (!isDragging && currentDevice.state == PlayState.Playing)
{
variables.Get("动画节点").value = (float)currentDevice.time;
}
*/
}
///
/// 开始拖拽
///
///
public void OnBeginDrag(PointerEventData eventData)
{
isDragging = true;
currentDevice.Pause();
Freeze();
}
///
/// 拖拽结束
///
///
public void OnEndDrag(PointerEventData eventData)
{
isDragging = false;
currentDevice.time = variables.Get("动画节点").value;
currentDevice.Evaluate();
currentDevice.Play();
Resume();
}
public void Freeze()
{
foreach (var animator in animators)
{
if (animator != null)
animator.speed = 0f;
}
}
public void Resume()
{
foreach (var animator in animators)
{
if (animator != null)
animator.speed = 1f;
}
}
///
/// 退出子物体观察模式
///
public void ExitChildObservationMode()
{
//enhancedModelViewerOrbitCamera.ExitChildObservationMode();
}
#region ButtonData
///
/// 设置默认
///
///
///
private void SetNormal(Button target, ButtonData data)
{
Image img = target.GetComponent();
if (img != null)
{
img.sprite = data.normalSprite;
}
}
///
/// 设置高亮
///
///
///
private void SetHightlight(Button target, ButtonData data)
{
Image img = target.GetComponent();
if (img != null)
{
img.sprite = data.selectedSprite;
}
}
#endregion
}
public class DeviceFAQItem
{
///
/// 问题
///
public string Question { get; set; }
///
/// 回答
///
public string Answer { get; set; }
}
public class Root
{
///
/// 问题回答集合
///
public List DeviceFAQ { get; set; }
}