588 lines
20 KiB
C#
588 lines
20 KiB
C#
using System;
|
||
using System.Collections;
|
||
using System.Collections.Generic;
|
||
using System.Linq;
|
||
using System.Text;
|
||
using UnityEngine;
|
||
using UnityEngine.UI;
|
||
using DataModel.Model;
|
||
using LitJson;
|
||
|
||
public class GameManage : MonoBehaviour
|
||
{
|
||
public static GameManage Instance;
|
||
|
||
/// <summary>
|
||
/// 初始位置
|
||
/// </summary>
|
||
public Transform initPos;
|
||
|
||
public float OnceTime = 0.06f;
|
||
public int lerpTime = 2;
|
||
|
||
public bool is单机模式;
|
||
|
||
public Canvas canvas;
|
||
|
||
|
||
public ScoreManage scoreManage;
|
||
|
||
|
||
|
||
#region 回调
|
||
/// <summary>
|
||
/// 科目启停回调
|
||
/// </summary>
|
||
[HideInInspector]
|
||
public Action<string, string, string, bool> action_subject;
|
||
/// <summary>
|
||
/// 步骤启停回调
|
||
/// </summary>
|
||
[HideInInspector]
|
||
public Action<string, string, string, string, bool> action_step;
|
||
/// <summary>
|
||
/// 开始暂停回调
|
||
/// </summary>
|
||
[HideInInspector]
|
||
public Action<bool> action_Pause;
|
||
/// <summary>
|
||
/// 关闭房间回调
|
||
/// </summary>
|
||
[HideInInspector]
|
||
public Action action_close;
|
||
|
||
#endregion
|
||
|
||
private void Awake()
|
||
{
|
||
Instance = this;
|
||
//房间域
|
||
LoadManage.programState = ProgramState.进行中;
|
||
|
||
//初始化注册
|
||
UnityEngine.SceneManagement.SceneManager.GetActiveScene().GetRootGameObjects().ToList().ForEach(a =>
|
||
{
|
||
InitAllSyncInRoot(a.transform, false);
|
||
});
|
||
|
||
if (!is单机模式)
|
||
{
|
||
//获取步骤信息
|
||
StartCoroutine(MyNetMQClient.CallGet("http://" + MyNetMQClient.CallIP + "/Handler/Practice.ashx?action=queryPracticesubjectStep&PracticeId=" + LoadManage.Instance.currentPractice.Id, str =>
|
||
{
|
||
var json = JsonMapper.ToObject<CallResultList<practicesubjectstep>>(str);
|
||
if (json.state)
|
||
{
|
||
LoadManage.Instance.psteps = json.data;
|
||
//获取所有的practiceseat
|
||
StartCoroutine(MyNetMQClient.CallGet("http://" + MyNetMQClient.CallIP + "/Handler/Practice.ashx?action=querypracticeseat&PracticeId=" + LoadManage.Instance.currentPractice.Id, str2 =>
|
||
{
|
||
var json2 = JsonMapper.ToObject<CallResultList<practiceseat>>(str2);
|
||
if (json2.state)
|
||
{
|
||
|
||
LoadManage.Instance.pseats = json2.data;
|
||
|
||
LoadManage.Instance.myPracticeSeat = LoadManage.Instance.pseats.FindAll(a => a.UserAccount == LoadManage.Instance.me.user.user_name);
|
||
|
||
//初始化打分系统
|
||
scoreManage.Init();
|
||
|
||
//恢复当前训练信息
|
||
var tmpps = LoadManage.Instance.psubjects.FindAll(a => a.State == 0);
|
||
if (tmpps != null && tmpps.Count > 0)
|
||
{
|
||
foreach (var item in tmpps)
|
||
{
|
||
practiceseat tmppseat = LoadManage.Instance.myPracticeSeat.Find(a => a.Field_Char1 == item.Id);
|
||
if (tmppseat != null)
|
||
{
|
||
//本人当前科目
|
||
LoadManage.Instance.currentPracticeSubejct = item;
|
||
LoadManage.Instance.currentPracticeSeat = tmppseat;
|
||
//当前正在进行中步骤
|
||
LoadManage.Instance.currentPracticeSubjectStep = LoadManage.Instance.psteps.Find(a => a.PracticeSubjectId == item.Id && a.SeatId == tmppseat.SeatId && a.StepState=="0");
|
||
Debug.Log("当前科目:" + item.Name);
|
||
Debug.Log("当前岗位:" + tmppseat.SeatName);
|
||
if (LoadManage.Instance.currentPracticeSubjectStep != null)
|
||
{
|
||
Debug.Log("当前步骤正在进行中:" + LoadManage.Instance.currentPracticeSubjectStep.Name);
|
||
}
|
||
|
||
|
||
//激活当前步骤相应打分点(科目进行中且步骤未完成)
|
||
if (LoadManage.Instance.currentPractice.MissionModel == "考核")
|
||
{
|
||
//未完成的步骤
|
||
var noOverSteps = LoadManage.Instance.psteps.FindAll(a => a.PracticeSubjectId == item.Id && a.SeatId == tmppseat.SeatId && a.StepState != "1");
|
||
var allSB=scoreManage.transform.Find(item.Name).GetComponentsInChildren<ScoreBase>(true).ToList();
|
||
if (noOverSteps!=null && noOverSteps.Count>0)
|
||
{
|
||
noOverSteps.ForEach(a =>
|
||
{
|
||
allSB.FindAll(b => b.stepOrder == a.OrderIndex).ForEach(b =>
|
||
{
|
||
b.SetActive(true);
|
||
});
|
||
|
||
});
|
||
}
|
||
|
||
}
|
||
|
||
//开二维软件
|
||
SoftManage.Instance.StartSoft(LoadManage.Instance.currentPractice.Id, LoadManage.Instance.currentPracticeSubejct.Name, LoadManage.Instance.currentPracticeSeat.SeatName, LoadManage.Instance.currentPracticeSeat.UserAccount, 0);
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
//当前切换当前科目
|
||
GetMaoDian();
|
||
}
|
||
else
|
||
{
|
||
string msg = json2.message;
|
||
Debug.LogError(msg);
|
||
|
||
}
|
||
}));
|
||
;
|
||
}
|
||
else
|
||
{
|
||
string msg = json.message;
|
||
Debug.LogError(msg);
|
||
|
||
}
|
||
}));
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取锚点
|
||
/// </summary>
|
||
private void GetMaoDian()
|
||
{
|
||
|
||
//获取房间数据
|
||
UpLoadMe();
|
||
}
|
||
|
||
private void OnDestroy()
|
||
{
|
||
action_subject = null;
|
||
action_step = null;
|
||
}
|
||
/// <summary>
|
||
/// 注册科目启停回调
|
||
/// </summary>
|
||
/// <param name="action_subject"> practiceid,praticeSubjectId,科目名,是否开启</param>
|
||
public void SetSubjectAction(Action<string, string, string, bool> action_subject)
|
||
{
|
||
this.action_subject += action_subject;
|
||
}
|
||
/// <summary>
|
||
/// 注册步骤启停回调
|
||
/// </summary>
|
||
/// <param name="action_step">practiceid,praticeSubjectId,科目名,pratciesubjectstepId,是否开启</param>
|
||
public void SetStepAction(Action<string, string, string, string, bool> action_step)
|
||
{
|
||
this.action_step += action_step;
|
||
}
|
||
/// <summary>
|
||
/// 注册开始暂停回调 (true:开始 ,false:暂停)
|
||
/// </summary>
|
||
/// <param name="action_pause"></param>
|
||
public void SetPauseAction(Action<bool> action_pause)
|
||
{
|
||
this.action_Pause = action_pause;
|
||
}
|
||
/// <summary>
|
||
/// 注册关闭回调
|
||
/// </summary>
|
||
/// <param name="action_close"></param>
|
||
public void SetCloseAction(Action action_close)
|
||
{
|
||
this.action_close = action_close;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 切换科目状态
|
||
/// </summary>
|
||
/// <param name="msg"></param>
|
||
public void SubjectChange(string msg)
|
||
{
|
||
// practiceId + "," + praticeSubjectId + "," + subjectName + "," + (OpenOrClose ? "开" : "关")
|
||
string[] tmps = msg.Split(',');
|
||
string practiceId = tmps[0];
|
||
string praticeSubjectId = tmps[1];
|
||
string subjectName = tmps[2];
|
||
string OpenOrClose = tmps[3];
|
||
bool oc = true;
|
||
if (OpenOrClose == "开")
|
||
{
|
||
oc = true;
|
||
}
|
||
else if (OpenOrClose == "关")
|
||
{
|
||
oc = false;
|
||
}
|
||
else
|
||
{
|
||
Debug.LogError("错误:" + OpenOrClose);
|
||
return;
|
||
}
|
||
|
||
if (practiceId == LoadManage.Instance.currentPractice.Id)
|
||
{
|
||
practicesubject ps = LoadManage.Instance.psubjects.Find(a => a.Id == praticeSubjectId);
|
||
if (ps != null)
|
||
{
|
||
if (oc)
|
||
{
|
||
//开
|
||
if (LoadManage.Instance.currentPracticeSubejct != null && LoadManage.Instance.currentPracticeSubejct.OrderIndex != ps.OrderIndex)
|
||
{
|
||
Debug.LogError("此科目不能并行");
|
||
return;
|
||
}
|
||
ps.State = 0;
|
||
LoadManage.Instance.currentPracticeSubejct = ps;
|
||
|
||
practiceseat pseat = LoadManage.Instance.myPracticeSeat.Find(a => a.Field_Char1 == praticeSubjectId);
|
||
if (pseat != null)
|
||
{
|
||
//自己参与当前科目
|
||
LoadManage.Instance.currentPracticeSeat = pseat;
|
||
Debug.Log("科目开启成功:" + ps.Name);
|
||
if (action_subject != null)
|
||
{
|
||
action_subject.Invoke(practiceId, praticeSubjectId, subjectName, oc);
|
||
}
|
||
|
||
//开二维软件
|
||
SoftManage.Instance.StartSoft(LoadManage.Instance.currentPractice.Id, LoadManage.Instance.currentPracticeSubejct.Name, LoadManage.Instance.currentPracticeSeat.SeatName, LoadManage.Instance.currentPracticeSeat.UserAccount, 0);
|
||
|
||
|
||
//激活自己相应打分
|
||
if(LoadManage.Instance.currentPractice.MissionModel=="考核")
|
||
{
|
||
scoreManage.transform.Find(ps.Name).GetComponentsInChildren<ScoreBase>(true).ToList().ForEach(c =>
|
||
{
|
||
if (c.seatName == pseat.SeatName)
|
||
{
|
||
c.SetActive(true);
|
||
}
|
||
});
|
||
}
|
||
}
|
||
else
|
||
{
|
||
Debug.Log("未参与此科目:" + ps.Name);
|
||
}
|
||
|
||
}
|
||
else
|
||
{
|
||
//关
|
||
if (LoadManage.Instance.currentPracticeSubejct != null && LoadManage.Instance.currentPracticeSubejct.Id == ps.Id)
|
||
{
|
||
//自己参与当前科目
|
||
ps.State = 1;
|
||
LoadManage.Instance.currentPracticeSubejct = null;
|
||
practiceseat pseat = LoadManage.Instance.myPracticeSeat.Find(a => a.Field_Char1 == praticeSubjectId);
|
||
if (pseat != null)
|
||
{
|
||
LoadManage.Instance.currentPracticeSeat = null;
|
||
Debug.Log("科目关闭成功:" + ps.Name);
|
||
if (action_subject != null)
|
||
{
|
||
action_subject.Invoke(practiceId, praticeSubjectId, subjectName, oc);
|
||
}
|
||
|
||
//关闭所有相应打分
|
||
if (LoadManage.Instance.currentPractice.MissionModel == "考核")
|
||
{
|
||
scoreManage.transform.Find(ps.Name).GetComponentsInChildren<ScoreBase>(true).ToList().ForEach(c =>
|
||
{
|
||
c.SetActive(false);
|
||
});
|
||
|
||
//指挥提交总表
|
||
if (pseat.SeatNo == "0")
|
||
{
|
||
scoreManage.SubmitApprise(subjectName);
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
Debug.Log("未参与此科目:" + ps.Name);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
Debug.LogError("错误:未找到科目");
|
||
}
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 切换步骤状态
|
||
/// </summary>
|
||
/// <param name="msg"></param>
|
||
public void StepChange(string msg)
|
||
{
|
||
// practiceId + "," + praticeSubjectId + "," + subjectName + "," + pratciesubjectstepId + "," + (OpenOrClose ? "开" : "关")
|
||
string[] tmps = msg.Split(',');
|
||
string practiceId = tmps[0];
|
||
string praticeSubjectId = tmps[1];
|
||
string subjectName = tmps[2];
|
||
string pratciesubjectstepId = tmps[3];
|
||
string OpenOrClose = tmps[4];
|
||
bool oc = true;
|
||
if (OpenOrClose == "开")
|
||
{
|
||
oc = true;
|
||
}
|
||
else if (OpenOrClose == "关")
|
||
{
|
||
oc = false;
|
||
}
|
||
else
|
||
{
|
||
Debug.LogError("错误:" + OpenOrClose);
|
||
return;
|
||
}
|
||
|
||
if (practiceId == LoadManage.Instance.currentPractice.Id)
|
||
{
|
||
practicesubjectstep step = LoadManage.Instance.psteps.Find(a => a.ID == pratciesubjectstepId);
|
||
if (step != null)
|
||
{
|
||
step.StepState = (oc ? 0 : 1).ToString();
|
||
|
||
if (action_step != null)
|
||
{
|
||
action_step.Invoke(practiceId, praticeSubjectId, subjectName, pratciesubjectstepId, oc);
|
||
}
|
||
|
||
if (oc)
|
||
{
|
||
//开启步骤
|
||
LoadManage.Instance.currentPracticeSubjectStep = step;
|
||
}
|
||
else
|
||
{
|
||
//结束步骤
|
||
|
||
LoadManage.Instance.currentPracticeSubjectStep = null;
|
||
|
||
//提交此步骤子表分数
|
||
scoreManage.transform.Find(subjectName).GetComponentsInChildren<ScoreBase>(true).ToList().ForEach(c =>
|
||
{
|
||
if (c.stepOrder == step.OrderIndex)
|
||
{
|
||
c.Submit();
|
||
}
|
||
});
|
||
}
|
||
}
|
||
else
|
||
{
|
||
Debug.LogError("错误:未找到步骤");
|
||
}
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 注册一个根物体下所有同步组件
|
||
/// </summary>
|
||
/// <param name="a"></param>
|
||
public void InitAllSyncInRoot(Transform a, bool isPlayer, string id = "")
|
||
{
|
||
a.GetComponentsInChildren<FunctionSync_Active>(true).ToList().ForEach(b =>
|
||
{
|
||
if (isPlayer)
|
||
{
|
||
b.gameObject.name = id + b.gameObject.name;
|
||
}
|
||
b.Init();
|
||
});
|
||
a.GetComponentsInChildren<FunctionSync_Animator>(true).ToList().ForEach(b =>
|
||
{
|
||
if (isPlayer)
|
||
{
|
||
b.gameObject.name = id + b.gameObject.name;
|
||
}
|
||
b.Init();
|
||
});
|
||
a.GetComponentsInChildren<FunctionSync_Audio>(true).ToList().ForEach(b =>
|
||
{
|
||
if (isPlayer)
|
||
{
|
||
b.gameObject.name = id + b.gameObject.name;
|
||
}
|
||
b.Init();
|
||
});
|
||
a.GetComponentsInChildren<FunctionSync_CreateObejct>(true).ToList().ForEach(b =>
|
||
{
|
||
b.Init();
|
||
});
|
||
a.GetComponentsInChildren<FunctionSync_Material>(true).ToList().ForEach(b =>
|
||
{
|
||
if (isPlayer)
|
||
{
|
||
b.gameObject.name = id + b.gameObject.name;
|
||
}
|
||
b.Init();
|
||
});
|
||
a.GetComponentsInChildren<FunctionSync_Parent>(true).ToList().ForEach(b =>
|
||
{
|
||
if (isPlayer)
|
||
{
|
||
b.gameObject.name = id + b.gameObject.name;
|
||
}
|
||
b.Init();
|
||
});
|
||
a.GetComponentsInChildren<FunctionSync_ParticleSystem>(true).ToList().ForEach(b =>
|
||
{
|
||
if (isPlayer)
|
||
{
|
||
b.gameObject.name = id + b.gameObject.name;
|
||
}
|
||
b.Init();
|
||
});
|
||
a.GetComponentsInChildren<FunctionSync_PositionRoate>(true).ToList().ForEach(b =>
|
||
{
|
||
b.Init();
|
||
});
|
||
a.GetComponentsInChildren<FunctionSync_Scale>(true).ToList().ForEach(b =>
|
||
{
|
||
b.Init();
|
||
});
|
||
a.GetComponentsInChildren<FunctionSync_Text>(true).ToList().ForEach(b =>
|
||
{
|
||
if (b.isAutoInit)
|
||
{
|
||
b.Init();
|
||
}
|
||
});
|
||
a.GetComponentsInChildren<FunctionSync_MaterialTexture>(true).ToList().ForEach(b =>
|
||
{
|
||
b.Init();
|
||
});
|
||
a.GetComponentsInChildren<OneValueSyncObject>(true).ToList().ForEach(b =>
|
||
{
|
||
if (!b.自定义回调)
|
||
{
|
||
b.InitDynamic("sync_" + b.name, null, b.valueType);
|
||
}
|
||
|
||
});
|
||
|
||
|
||
}
|
||
/// <summary>
|
||
/// 初始化科目
|
||
/// </summary>
|
||
public void InitSubject()
|
||
{
|
||
//初始化科目数据
|
||
//设备位置状态
|
||
//初始化评估
|
||
|
||
}
|
||
|
||
|
||
[HideInInspector]
|
||
public float checkTime = 6;
|
||
private void Update()
|
||
{
|
||
#if !UNITY_EDITOR
|
||
|
||
// //检查是否去服务器连接
|
||
// checkTime -= Time.deltaTime;
|
||
// if (checkTime < 0)
|
||
// {
|
||
// Debug.Log("时间超过6秒");
|
||
// Quit();
|
||
// }
|
||
#endif
|
||
}
|
||
|
||
/// <summary>
|
||
/// 上传自己的信息(加入房间,并获取房间信息)
|
||
/// </summary>
|
||
public void UpLoadMe()
|
||
{
|
||
if (!is单机模式)
|
||
{
|
||
LoadManage.Instance.RSclient.Send(LoadManage.Instance.currentRoomArea,32,new byte[1]);
|
||
Debug.Log("发送加入房间");
|
||
}
|
||
|
||
//关闭界面
|
||
}
|
||
|
||
/// <summary>
|
||
/// 退出房间
|
||
/// </summary>
|
||
public void Quit()
|
||
{
|
||
Debug.Log("退出房间");
|
||
//初始化
|
||
LoadManage.programState = ProgramState.结束;
|
||
OneValueSyncObject.OneAxisSyncObjectList.Clear();
|
||
FunctionSync_PositionRoate.positionRoateSyncObejctList.Clear();
|
||
FunctionSync_Video.dicVideo.Clear();
|
||
FunctionSync_Media.functionSync_MediaDic.Clear();
|
||
FunctionSync_CreateObejct.createDic.Clear();
|
||
|
||
FunctionSync_CreateObejct.Instance = null;
|
||
|
||
action_subject = null;
|
||
action_step = null;
|
||
|
||
//发送退出房间指令
|
||
if (!is单机模式 && LoadManage.Instance.me != null)
|
||
{
|
||
//byte[] bytes = Encoding.UTF8.GetBytes(LoadManage.Instance.MyId);
|
||
//byte[] names = Encoding.UTF8.GetBytes(LoadManage.Instance.MyName);
|
||
//byte[] tmps = new byte[8 + bytes.Length+ names.Length];
|
||
//Array.Copy(BitConverter.GetBytes(bytes.Length), 0, tmps, 0, 4);
|
||
////id
|
||
//Array.Copy(bytes, 0, tmps, 4, bytes.Length);
|
||
////name
|
||
//Array.Copy(BitConverter.GetBytes(names.Length), 0, tmps, 4 + bytes.Length, 4);
|
||
//Array.Copy(names, 0, tmps, 8 + bytes.Length, names.Length);
|
||
//LoadManage.Instance.RSclient.Send(LoadManage.Instance.currentRoomArea, 10, tmps);
|
||
//Debug.Log("发送退出房间");
|
||
}
|
||
//初始化LoadManage脚本
|
||
LoadManage.Instance.currentRoomArea = "";
|
||
//LoadManage.Instance.MyId = "";
|
||
LoadManage.Instance.SyncId = 0;
|
||
checkTime = 10;
|
||
|
||
//断开通信
|
||
LoadManage.Instance.RemoveRoomServerClient();
|
||
if (LoadManage.Instance.systemMode == SystemMode.PC)
|
||
{
|
||
UnityEngine.SceneManagement.SceneManager.LoadScene("MainSencePC");
|
||
}
|
||
else if (LoadManage.Instance.systemMode == SystemMode.MR)
|
||
{
|
||
UnityEngine.SceneManagement.SceneManager.LoadScene("MainSenceMR");
|
||
}
|
||
}
|
||
|
||
|
||
|
||
} |