using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using AFeijia.UI;
using TMPro;
using UnityEngineInternal;
using System.Net;
using Newtonsoft.Json;
using System;
using System.Text;
public class CanvasMain : UITool
{
[Manual]
public static CanvasMain Instance { get; private set; }
#region 交互
///
/// 退出按钮
///
private Button QuitBtn;
///
/// 教学模式
///
private Button TutorialBtn;
///
/// 练习模式
///
private Button TrainingBtn;
///
/// 考核模式
///
private Button ExaminationBtn;
///
/// 原理按钮
///
private Button PrincipleBtn;
///
/// 结构按钮
///
private Button StructureBtn;
///
/// True:原理模式;False:结构模式
/// 默认为原理模式
///
[Manual]
public bool IsPrincipleMode = true;
///
/// True:教学模式;False:练习模式
///
[Manual]
public bool IsTutorialMode = true;
#endregion
#region 用户信息
///
/// 用户姓名
///
private TextMeshProUGUI UserName;
///
/// 用户部门信息
///
private TextMeshProUGUI UserDepartment;
///
/// 用户登录时间
///
private TextMeshProUGUI UserLoginTime;
///
/// 用户信息数据
///
[Manual]
public UserInfoData UserInfoData;
#endregion
#region 分类、设备信息
///
/// 分类容器
///
private RectTransform ClassificationContent;
///
/// 分类数据
///
[Manual]
public ClassificationData[] ClassificationData;
///
/// 分类预制体
///
[Manual]
public ClassificationItem ClassificationButtonPrefab;
///
/// 设备信息介绍部分根节点
///
public RectTransform DeviceIntroductionRoot;
///
/// 设备信息介绍
///
public TextMeshProUGUI Introduction;
///
/// 播放配音按钮
///
public Button PlayAudioButton;
[Manual]
public Canvas TagCanvas;
///
/// 结构标签容器
///
[Manual]
public RectTransform TagsContent;
///
/// 上一个选中的设备
///
[Manual]
public DeviceItem LastDeviceItem;
///
/// 实例化的标签
///
[Manual]
public List TagFollows = new List();
#endregion
#region 界面控制节点
///
/// 设备生成根节点
///
public GameObject GameCenter;
///
/// 设备分类列表根节点
///
public RectTransform DeviceListRoot;
///
/// 训练界面根节点
///
public RectTransform TrainingRoot;
///
/// 考核界面根节点
///
public RectTransform ExaminationRoot;
///
/// 教学交互根节点
///
public RectTransform TutorialRoot;
#endregion
#region 数据
public ExamInfo ExamInfo;
public List ExamContents = new List();
#endregion
double t;
protected override void Awake()
{
Debug.Log(t = Time.realtimeSinceStartupAsDouble);
base.Awake();
Instance = this;
Debug.Log(Time.realtimeSinceStartupAsDouble - t);
}
// Start is called before the first frame update
void Start()
{
if (GameInit.Instance != null)
{
switch (GameInit.GameMode)
{
case GameMode.Tutorial:
OnTutorial();
break;
case GameMode.Training:
OnTraining();
break;
case GameMode.Examination:
//切换到考核模式
//考核模式沿用训练功能,做部分适配
OnExamination();
GetExamInfo();
break;
default:
break;
}
}
else
{
//在编辑器启动
InterfaceManager.IpAddress = "http://localhost:5204/";
}
Introduction.text = "";
QuitBtn.onClick.AddListener(OnQuit);
TutorialBtn.onClick.AddListener(OnTutorial);
TrainingBtn.onClick.AddListener(OnTraining);
PrincipleBtn.onClick.AddListener(OnPrinciple);
StructureBtn.onClick.AddListener(OnStructure);
PlayAudioButton.onClick.AddListener(OnPlayAudio);
//接口调用
UpdateClassificationData();
UpdateUserInfo();
//GetExamInfo();
StartCoroutine(MainCoroutine.Instance.CallLogin());
}
private void LateUpdate()
{
if (hide)
{
cal += 1;
if (cal >= 1)
{
go.gameObject.SetActive(false);
hide = false;
}
}
#if UNITY_EDITOR
if (Input.GetKeyDown(KeyCode.Space))
{
OnExamination();
}
#endif
}
///
/// 点击退出按钮
///
private void OnQuit()
{
//弹出面板时禁用实时效果
OrbitCamera.ProhibitOperations = true;
TipsPanel.Instance.Tips("提示", "确定要退出吗?", (quit) =>
{
if (quit)
{
Application.Quit();
}
else
{
//面板关闭时恢复
OrbitCamera.ProhibitOperations = false;
}
});
//#if UNITY_EDITOR
// Debug.Log("退出");
//#else
// Application.Quit();
//#endif
}
///
/// 点击教学模式按钮
///
private void OnTutorial()
{
Debug.Log("教学模式");
IsTutorialMode = true;
//修改按钮图标状态
TutorialBtn.GetComponent().SetStatus(true);
TrainingBtn.GetComponent().SetStatus(false);
//通过相机渲染层来控制展示模型
Camera.main.cullingMask |= (1 << 8);
//恢复标签展示
TagCanvas.gameObject.SetActive(true);
//恢复相机旋转平移缩放等操作
OrbitCamera.ProhibitOperations = false;
//展示教学界面
TutorialRoot.gameObject.SetActive(true);
//隐藏训练界面
TrainingRoot.gameObject.SetActive(false);
//提交训练成绩会隐藏设备列表,在此恢复显示设备列表
DeviceListRoot.gameObject.SetActive(true);
//
TrainingManager.Instance.IsTutorial = true;
}
///
/// 点击练习模式按钮
///
private void OnTraining()
{
Debug.Log("练习模式");
IsTutorialMode = false;
//修改按钮图标状态
TutorialBtn.GetComponent().SetStatus(false);
TrainingBtn.GetComponent().SetStatus(true);
//通过相机渲染层来控制不展示模型
Camera.main.cullingMask &= ~(1 << 8);
//不展示标签
TagCanvas.gameObject.SetActive(false);
//禁止相机旋转平移缩放等操作
OrbitCamera.ProhibitOperations = true;
//隐藏设备介绍信息
TutorialRoot.gameObject.SetActive(false);
//展示训练界面
TrainingRoot.gameObject.SetActive(true);
//根据所选设备初始化选择项
TrainingManager.Instance.Init(DeviceItem.SelectedItem);
//若上次提交成绩后未返回,则再次进入练习模式时需要隐藏设备列表
if (TrainingManager.Instance.TrainingScore.gameObject.activeSelf)
DeviceListRoot.gameObject.SetActive(false);
//开始训练计时
MainCoroutine.Instance.StartTimer();
//
TrainingManager.Instance.IsTutorial = false;
//关闭解说
AudioManager.Instance.StopAudio();
//状态恢复
PlayAudioButton.GetComponent().SetStatus(false);
}
///
/// 考核模式
///
private void OnExamination()
{
//隐藏教学和练习按钮,展示考核按钮
TutorialBtn.gameObject.SetActive(false);
TrainingBtn.gameObject.SetActive(false);
ExaminationBtn.gameObject.SetActive(true);
//通过相机渲染层来控制不展示模型
Camera.main.cullingMask &= ~(1 << 8);
//不展示标签
TagCanvas.gameObject.SetActive(false);
//禁止相机旋转平移缩放等操作
OrbitCamera.ProhibitOperations = true;
//隐藏设备介绍信息
TutorialRoot.gameObject.SetActive(false);
//展示考核界面
TrainingRoot.gameObject.SetActive(true);
//切换考核界面
TrainingManager.Instance.SwitchExaminationMode();
TrainingManager.Instance.IsTutorial = false;
}
///
/// 点击原理按钮
///
public void OnPrinciple()
{
Debug.Log("原理");
//切换回原理模式,关闭爆炸效果
if (!IsPrincipleMode)
{
PrincipleBtn.image.color = new Color(1, 1, 1, 1);
StructureBtn.image.color = new Color(1, 1, 1, 0.4f);
DeviceIntroductionRoot.gameObject.SetActive(true);
HideDeviceTags();
IsPrincipleMode = true;
}
}
///
/// 点击结构按钮
/// 展示标签信息
/// 标签信息在点击结构按钮和在结构菜单下切换设备都需要改变
///
private void OnStructure()
{
Debug.Log("结构");
if (IsPrincipleMode)
{
StructureBtn.image.color = new Color(1, 1, 1, 1);
PrincipleBtn.image.color = new Color(1, 1, 1, 0.4f);
DeviceIntroductionRoot.gameObject.SetActive(false);
ShowDeviceTags();
IsPrincipleMode = false;
}
}
private void OnPlayAudio()
{
if (AudioManager.Instance.IsPlaying())
{
AudioManager.Instance.PauseAudio();
PlayAudioButton.GetComponent().SetStatus(false);
}
else
{
if (DeviceItem.SelectedItem != null)
{
AudioManager.Instance.PlayAudio(DeviceItem.SelectedItem.DevicesItemData.dev_name, true);
PlayAudioButton.GetComponent().SetStatus(true);
}
}
}
///
/// 展示设备标签及爆炸效果
///
public void ShowDeviceTags()
{
//根据设备展示标签
if (DeviceItem.SelectedItem == null) return;
//所选设备没变,无需更新展示内容
if (LastDeviceItem != null && LastDeviceItem == DeviceItem.SelectedItem) return;
//所选设备改变,需要更新展示内容
for (int i = 0; i < TagFollows.Count; i++)
{
Destroy(TagFollows[i].gameObject);
}
TagFollows.Clear();
if (!DeviceItem.InstantiatedObjects.ContainsKey(DeviceItem.SelectedItem.DevicesItemData.dev_name))
{
Debug.Log("未找到对应设备模型!");
return;
}
var selectedDevice = DeviceItem.InstantiatedObjects[DeviceItem.SelectedItem.DevicesItemData.dev_name];
//展示爆炸动画
if (selectedDevice.transform.GetComponent())
selectedDevice.transform.GetComponent().SetTrigger("Explode");
for (int i = 0; i < selectedDevice.transform.childCount; i++)
{
switch (selectedDevice.transform.GetChild(i).tag)
{
case "Tag_L":
var tag_l = Instantiate(Resources.Load("Prefabs/UI/Tag_L"), TagsContent);
tag_l.Init(selectedDevice.transform.GetChild(i).name, selectedDevice.transform.GetChild(i).transform);
TagFollows.Add(tag_l);
break;
case "Tag_R":
var tag_r = Instantiate(Resources.Load("Prefabs/UI/Tag_R"), TagsContent);
tag_r.Init(selectedDevice.transform.GetChild(i).name, selectedDevice.transform.GetChild(i).transform);
TagFollows.Add(tag_r);
break;
case "Tag_LB":
var tag_lb = Instantiate(Resources.Load("Prefabs/UI/Tag_LB"), TagsContent);
tag_lb.Init(selectedDevice.transform.GetChild(i).name, selectedDevice.transform.GetChild(i).transform);
TagFollows.Add(tag_lb);
break;
case "Tag_RB":
var tag_rb = Instantiate(Resources.Load("Prefabs/UI/Tag_RB"), TagsContent);
tag_rb.Init(selectedDevice.transform.GetChild(i).name, selectedDevice.transform.GetChild(i).transform);
TagFollows.Add(tag_rb);
break;
default:
break;
}
if (selectedDevice.transform.GetChild(i).CompareTag("Tag_L"))
{
var tag = Instantiate(Resources.Load("Prefabs/UI/Tag_L"), TagsContent);
tag.Init(selectedDevice.transform.GetChild(i).name, selectedDevice.transform.GetChild(i).transform);
TagFollows.Add(tag);
}
else if (selectedDevice.transform.GetChild(i).CompareTag("Tag_R"))
{
var tag = Instantiate(Resources.Load("Prefabs/UI/Tag_R"), TagsContent);
tag.Init(selectedDevice.transform.GetChild(i).name, selectedDevice.transform.GetChild(i).transform);
TagFollows.Add(tag);
}
}
TagsContent.gameObject.SetActive(true);
}
///
/// 控制上一个爆炸的设备被切换后延迟隐藏
///
bool hide;
///
/// 延迟计算时间
///
float cal;
///
/// 上一个爆炸设备
///
GameObject go;
///
/// 隐藏标签及爆炸效果
///
public void HideDeviceTags(bool immediately = false, GameObject lastDevice = null)
{
if (DeviceItem.SelectedItem == null) return;
if (!DeviceItem.InstantiatedObjects.ContainsKey(DeviceItem.SelectedItem.DevicesItemData.dev_name))
{
Debug.Log("未找到对应设备模型!");
return;
}
var selectedDevice = DeviceItem.InstantiatedObjects[DeviceItem.SelectedItem.DevicesItemData.dev_name];
if (selectedDevice.transform.GetComponent())
{
if (immediately)
{
this.go = selectedDevice;
selectedDevice.transform.GetComponent().Play("收拢", 0, 1);
hide = true;
cal = 0;
}
else
{
selectedDevice.transform.GetComponent().SetTrigger("Retract");
}
}
TagsContent.gameObject.SetActive(false);
}
///
/// 更新分类设备数据并实例化结构树及设备
///
private void UpdateClassificationData()
{
//StartCoroutine(InterfaceManager.GetData(InterfaceManager.GET_Data, (data) =>
//{
// ClassificationData = Newtonsoft.Json.JsonConvert.DeserializeObject(data);
// if (ClassificationButtonPrefab == null) ClassificationButtonPrefab = Resources.Load("Prefabs/UI/ClassificationItem");
// for (int i = 0; i < ClassificationData.Length; i++)
// {
// var inst = Instantiate(ClassificationButtonPrefab, ClassificationContent);
// inst.Init(ClassificationData[i]);
// }
//}));
StartCoroutine(InterfaceManager.GetDataFullUrl(InterfaceManager.ConfigureDevicePath, (data) =>
{
ClassificationData = Newtonsoft.Json.JsonConvert.DeserializeObject(data);
if (ClassificationButtonPrefab == null) ClassificationButtonPrefab = Resources.Load("Prefabs/UI/ClassificationItem");
for (int i = 0; i < ClassificationData.Length; i++)
{
var inst = Instantiate(ClassificationButtonPrefab, ClassificationContent);
inst.Init(ClassificationData[i]);
}
}));
}
///
/// 处理用户信息
///
public void UpdateUserInfo()
{
UserName.text = WWW.UnEscapeURL(GameInit.InfoIni.user_name, Encoding.UTF8);
UserDepartment.text = "--";
UserLoginTime.text = DateTime.Now.ToString("g");
//StartCoroutine(InterfaceManager.GetData(InterfaceManager.GET_User, (data) =>
//{
// UserInfoData = Newtonsoft.Json.JsonConvert.DeserializeObject(data);
// UserName.text = UserInfoData.name;
// UserDepartment.text = UserInfoData.department;
// UserLoginTime.text = UserInfoData.logintime;
//}));
}
private void GetExamInfo()
{
var _exam_info_url = InterfaceManager.API_DIC["IPADDRESS"] + InterfaceManager.API_DIC["EXAM_INFO"] + "?id=" + GameInit.InfoIni.exam_id;
Debug.Log("-- 获取考试信息url:" + _exam_info_url);
StartCoroutine(InterfaceManager.Get(_exam_info_url, (_error, _data) =>
{
if (!string.IsNullOrEmpty(_error))
{
//TipsPanel.Instance.Tips("ERROR", _error, (_true) => { });
Debug.Log("--" + _error);
}
else
{
ExamInfo = JsonConvert.DeserializeObject>(_data).data;
ExamContents = JsonConvert.DeserializeObject>(ExamInfo.examContent);
for (int i = 0; i < ExamContents.Count; i++)
{
ExamContents[i].device = ExamContents[i].point.Replace("选择正确的模型图", "");
}
}
}));
}
}