贺州人民医院电子沙盘
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

900 lines
35 KiB

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;
using AX.MessageSystem;
using System.Linq;
using UnityEngine.AI;
public class XiaoFangYuanDrawLine : MonoBehaviour
{
// Use this for initialization
public GameObject cloneObj;
public GameObject nullobject;
private GameObject prlineObj;
public GameObject Line;//管线模型
public GameObject Zhaomingxian;//照明线模型
public GameObject Guanxian;//管线模型
private Vector3 placementPos;//第一碰撞点
private Vector3 placementPos2;//第二碰撞点
private Vector3[] nowpath;
private Vector3[] newpath;
//private float timer = 0;
// private bool IsFirstPFFlag = false;//该记录的第一次寻路标志,开始记录时赋值true
private UnityEngine.AI.NavMeshPath NavMeshPath;
public List<Vector3> Allpath = new List<Vector3>();//关键点
public List<string> AllLine = new List<string>();//水带、照明线
public List<float> AllLineDistance = new List<float>();//水带长度
private int pointIndex = 1;
private bool flag;
float time;
float allLineDistance;//可用管线长度(管线总长减别人已用的长度)
float drawLineDistance;//已用管线长度
float DifferenceLine;//管线超出长度
private int MultipleSpeed = 1;//回放播放倍数
private Bag bag;
public int BeginLineNum;//开始铺设时水带数量
public int BeginLiftLineNum;//开始铺设时照明线数量
private float jugelength = 106f;
public int num;
private CloneGameObjInfo gameinfo;
void Awake()
{
NavMeshPath = new NavMeshPath();
//TheBackView.instance.SpeedChangeEvent += OnSpeedChangeEvent;
// MultipleSpeed = LoadManager.Instance.speedFactor;
}
void Start()
{
//string name = this.name + "drawline";
//string name_ = "TeamName-drawline-Zhaomingxian-" + this.name;
//if (!GameObject.Find(name_))
//{
// prlineObj = Instantiate(nullobject) as GameObject;
// prlineObj.name = name_;
// prlineObj.transform.parent = GameObject.Find("P_DrawLine").transform;
// // prlineObj.AddComponent<DestroyObj>();//用来记录删除消防管线
//}
//else
//{
// prlineObj = GameObject.Find(name_);
//}
CreatParent();
bag = GetComponent<Bag>();
gameinfo = GetComponent<CloneGameObjInfo>();
}
void OnDestroy()
{
// Destroy(prlineObj);
//TheBackView.instance.SpeedChangeEvent -= OnSpeedChangeEvent;
}
/// <summary>
/// 找到当前最靠近的Index点
/// </summary>
/// <param name="nowpath"></param>
/// <param name="point"></param>
/// <returns></returns>
//private int GetNearest(List<Vector3> nowpath, Vector3 point)
//{
// int index = 0;
// var result = (from x in nowpath
// select new { Key = x, Value = Vector3.Distance(point, x), Index = index++ })
// .OrderBy(x => x.Value).Take(Mathf.Min(1, nowpath.Count)); // 太多了,按照接近程度 take 10 个。
// index = result.ToList()[0].Index;
// return index;
//}
//private bool IsPointOnSegment(Vector3 Pi, Vector3 Pj, Vector3 Q)
//{
// if ((Q.x - Pi.x) * (Pj.z - Pi.z) == (Pj.x - Pi.x) * (Q.z - Pi.z) //叉乘
// && Mathf.Min(Pi.x, Pj.x) <= Q.x && Q.x <= Mathf.Max(Pi.x, Pj.x)//保证Q点坐标在pi,pj之间
// && Mathf.Min(Pi.z, Pj.z) <= Q.y && Q.y <= Mathf.Max(Pi.z, Pj.z))
// return true;
// else
// return false;
//}
// Update is called once per frame
void /*Fixed*/Update()
{
if (Line == null)
{
return;
}
if (!HasLine())
{
nowpath = null;
return;
}
drawLine();
time += Time.deltaTime;
if (time >= 0.5f / MultipleSpeed)//间隔0.5秒重新规划下管线
{
time = 0.0f;
if (nowpath != null && pointIndex < nowpath.Length && GetComponent<UnityEngine.AI.NavMeshAgent>().velocity.magnitude > 0)//只有移动的时候需要纠正路线
{
if (Vector3.Distance(nowpath[nowpath.Length - 1], Allpath[0]) > getHaveLine())
changeLine(true);
else
{
changeLine(false);
}
}
else if (flag)//寻路停止后再纠正一下管线位置
{
changeLine(true);
flag = false;
}
}
}
private void drawLine()
{
if (nowpath != null)
{
if (Allpath.Count == 0)
{
Allpath.Add(nowpath[0]);
}
for (int i = pointIndex; i < nowpath.Length; i++)
{
if (Vector3.Distance(transform.position, nowpath[i]) < 1.0f)
{
placementPos = nowpath[i - 1];
placementPos2 = nowpath[i];
pointIndex = i + 1;
Allpath.Add(placementPos2);
}
}
}
}
private void changeLine(bool has)
{
//float dis = Allpath.Count == 0 ? 0.0f : Vector3.Distance(transform.position, Allpath[Allpath.Count - 1]);
if (has)
{
if (!getDistance())
{
if (this.GetComponent<AgentController>().enabled)
{
this.GetComponent<AgentController>().StopAllCoroutines();
this.GetComponent<AgentController>().enabled = false;
this.GetComponent<UnityEngine.AI.NavMeshAgent>().enabled = false;
this.transform.position = correctLine();
//this.GetComponent<XiaoFangYuanMessage>().positionjiuzheng = true;
this.GetComponent<UnityEngine.AI.NavMeshAgent>().enabled = true;
this.GetComponent<AgentController>().enabled = true;
nowpath = null;//停止画线
return;
}
else
{
this.GetComponent<AgentController>().enabled = true;
this.GetComponent<AgentController>().StopAllCoroutines();
this.GetComponent<AgentController>().enabled = false;
this.GetComponent<UnityEngine.AI.NavMeshAgent>().enabled = false;
this.transform.position = correctLine();
//this.GetComponent<XiaoFangYuanMessage>().positionjiuzheng = true;
this.GetComponent<UnityEngine.AI.NavMeshAgent>().enabled = true;
nowpath = null;//停止画线
}
}
}
if (Allpath.Count == 0)
{
if (GetComponent<UnityEngine.AI.NavMeshAgent>().velocity.magnitude > 0)
{
MessageDispatcher.SendMessage("Operatinghints", (object)"水带长度不足,请装备水带");
}
return;
}
else if (Allpath.Count == 1)
{
for (int i = AllLine.Count - 1; i >= 0; i--)
{
if (GameObject.Find(AllLine[i]))
{
GameObject line = GameObject.Find(AllLine[i]);
Record(line.GetComponent<DrawLinMessage>(), true, false);
Destroy(GameObject.Find(AllLine[i]));
//NetworkManager.Instance.Send("ENTITY_DESTROY", AllLine[i]);
}
AllLine.RemoveAt(i);
//if(i< AllLineDistance.Count - 1)
//{
AllLineDistance.RemoveAt(i);
//}
}
NavMeshPath.ClearCorners();
try
{
//计算范围外距离最近的关键点和当前位置的平滑路径
UnityEngine.AI.NavMesh.CalculatePath(Allpath[0], transform.position, -1, NavMeshPath);
}
catch (Exception e)
{
System.Diagnostics.Trace.TraceError(e.Message);
}
//根据生成的关键点画线
newpath = NavMeshPath.corners;
for (int k = 1; k < newpath.Length; k++)
{
placementPos = newpath[k - 1];
placementPos2 = newpath[k];
Vector3 tempPos = (placementPos + placementPos2) / 2;//计算两个点的中点坐标,
InstanceLine(tempPos);
}
}
else if (Allpath.Count >= 2)
{
float dis = Vector3.Distance(transform.position, Allpath[Allpath.Count - 1]);
for (int i = Allpath.Count - 1; i >= 1; i--)
{
//实际有效点是 i-1
dis += Vector3.Distance(Allpath[i], Allpath[i - 1]);
if (dis > 10.0f)
{
//倒序删除范围内的活动关键点
for (int j = Allpath.Count - 1; j >= i; j--)
{
Allpath.RemoveAt(j);
}
for (int j = AllLine.Count - 1; j >= i - 1; j--)//这里分开循环是因为Allpath,AllLine的长度并不是一直相同的
{
if (GameObject.Find(AllLine[j]))
{
GameObject line = GameObject.Find(AllLine[j]);
Record(line.GetComponent<DrawLinMessage>(), true, false);
Destroy(GameObject.Find(AllLine[j]));
//NetworkManager.Instance.Send("ENTITY_DESTROY", AllLine[j]);
}
AllLine.RemoveAt(j);
//if (j < AllLineDistance.Count - 1)
//{
AllLineDistance.RemoveAt(j);
//}
}
NavMeshPath.ClearCorners();
try
{
//计算范围外距离最近的关键点和当前位置的平滑路径
UnityEngine.AI.NavMesh.CalculatePath(Allpath[i - 1], transform.position, -1, NavMeshPath);
}
catch (Exception e)
{
System.Diagnostics.Trace.TraceError(e.Message);
}
//根据生成的关键点画线
newpath = NavMeshPath.corners;
for (int k = 1; k < newpath.Length; k++)
{
placementPos = newpath[k - 1];
placementPos2 = newpath[k];
Vector3 tempPos = (placementPos + placementPos2) / 2;//计算两个点的中点坐标,
InstanceLine(tempPos);
}
break;
}
else if (i == 1)//从起点到现在位置都没超过限定距离
{
for (int j = Allpath.Count - 1; j > 0; j--)
{
Allpath.RemoveAt(j);//删除除起点外的所有点
}
for (int j = AllLine.Count - 1; j >= 0; j--)
{
if (GameObject.Find(AllLine[j]))
{
GameObject line = GameObject.Find(AllLine[j]);
Record(line.GetComponent<DrawLinMessage>(), true, false);
Destroy(GameObject.Find(AllLine[j]));
//NetworkManager.Instance.Send("ENTITY_DESTROY", AllLine[j]);
}
AllLine.RemoveAt(j);//删除所有线
//if (j < AllLineDistance.Count - 1)
//{
AllLineDistance.RemoveAt(j);
//}
}
NavMeshPath.ClearCorners();
try
{
//计算范围外距离最近的关键点和当前位置的平滑路径
UnityEngine.AI.NavMesh.CalculatePath(Allpath[0], transform.position, -1, NavMeshPath);
}
catch (Exception e)
{
System.Diagnostics.Trace.TraceError(e.Message);
}
//根据生成的关键点画线
newpath = NavMeshPath.corners;
for (int k = 1; k < newpath.Length; k++)
{
placementPos = newpath[k - 1];
placementPos2 = newpath[k];
Vector3 tempPos = (placementPos + placementPos2) / 2;//计算两个点的中点坐标
InstanceLine(tempPos);
}
}
}
}
setLineXiaoHao();
}
public void setLine()
{
BeginLineNum = bag.GetEquipNum("消防高压水带");
BeginLiftLineNum = bag.GetEquipNum("救生照明线");
var work = GetComponent<FireManMessage>().workType;
if (work == FireManSkills.LayWaterHose || work == FireManSkills.SprayFoam ||
work == FireManSkills.SprayWater || work == FireManSkills.Decontamination)
{
if (BeginLineNum <= 0)
{
if (!RecordEvent.IsReplay())
{
ResourceLoadWindow.Instance.LoadTextHintWindow("水带数量不足", 0.5f);
FireManSkillsPanel.GetInstance.CloselayhoseToggle();
}
return;
}
Line = Guanxian;
}
else if (work == FireManSkills.LayLifeSavingFlarePath)
{
if (BeginLiftLineNum <= 0)
{
if (!RecordEvent.IsReplay())
{
ResourceLoadWindow.Instance.LoadTextHintWindow("救生照明线数量不足", 0.5f);
FireManSkillsPanel.GetInstance.CloseLayLiftToggle();
}
return;
}
Line = Zhaomingxian;
}
////如果重新开始铺设,前一段没有设为结束段,将其设为结束段(出现在录制之前没有结束,继续铺设)
//if (prlineObj.transform.childCount > 0)
//{
// DrawLinMessage mess = prlineObj.transform.GetChild(prlineObj.transform.childCount - 1).GetComponent<DrawLinMessage>();
// if (!mess.Recorddata.IsEndDraw)
// {
// mess.Recorddata.IsEndDraw = true;
// }
//}
}
public void setPath(Vector3[] path)
{
//setLine();
// Debug.Log(Line.name);
nowpath = path;
pointIndex = 1;
flag = true;
}
/// <summary>
/// 判断是否携带了管线和照明线
/// </summary>
/// <returns></returns>
public bool HasLine()
{
float disLine = 0.0f;//携带管线长
float disZhaoMingXian = 0.0f;//携带照明线长
disLine = BeginLineNum * EquipSelect.GetInstance.DrawLineLength;
disZhaoMingXian = BeginLiftLineNum * EquipSelect.GetInstance.LiftLightLength;
//List<GameObject> AllMembers = this.GetComponent<XiaoFangYuanToShiNei>().AllMembers;
//List<GameObject> AllMembers = InputManager.Instance_.GetSelectedCharacters();
//List<GameObject> AllMembers = GetComponent<AgentRecord>().xfyList;
//for (int i = 0; i < AllMembers.Count; i++)
//{
// obj = AllMembers[i];
// if (obj && obj.name.Contains("xiaofangyuan"))
// {
// disLine += obj.GetComponent<XiaoFangYuanDrawLine>().getHaveLine();
// disZhaoMingXian += obj.GetComponent<XiaoFangYuanDrawLine>().getHaveZhaoMingXian();
// }
//}
if (Line.name.Equals(Guanxian.name))
{
if (disLine < 0.5f)
{
//ResourceLoadWindow.Instance.LoadTextHintWindow("水带不足", 0.5f);
return false;
}
}
else if (Line.name.Equals(Zhaomingxian.name))
{
if (disZhaoMingXian < 0.5f)
{
//ResourceLoadWindow.Instance.LoadTextHintWindow("救生照明线不足", 0.5f);
return false;
}
}
return true;
}
/// <summary>
/// 判断消防员携带水带是否还有剩余
/// </summary>
/// <returns></returns>
private bool getDistance()
{
bool flag = true;
allLineDistance = getAllLine();
drawLineDistance = getDrawLine();
if (allLineDistance < 0)//allLineDistance < drawLineDistance
{//可用管线<0
flag = false;
//DifferenceLine = drawLineDistance - allLineDistance;//超出可用范围长度
DifferenceLine = Mathf.Abs(allLineDistance);//超出可用范围长度
}
return flag;
}
//获取该消防员可用的管线、照明线长度
private float getAllLine()
{
float dis = 0.0f;
float disLine = 0.0f;//携带管线长
float disZhaoMingXian = 0.0f;//携带照明线长
float disDraw = 0.0f;//已用长度
//GameObject obj;
//List<GameObject> AllMembers = this.GetComponent<XiaoFangYuanToShiNei>().AllMembers;
//for (int i = 0; i < AllMembers.Count; i++)
//{
// obj = AllMembers[i];
// disLine += obj.GetComponent<XiaoFangYuanDrawLine>().getHaveLine();
// disZhaoMingXian += obj.GetComponent<XiaoFangYuanDrawLine>().getHaveZhaoMingXian();
// disDraw += obj.GetComponent<XiaoFangYuanDrawLine>().getDrawLine();
//}
disLine += getHaveLine();
disZhaoMingXian += getHaveZhaoMingXian();
disDraw += getDrawLine();
//dis = disLine > disZhaoMingXian ? disZhaoMingXian : disLine;//取最短值作为管线可用长度
//dis -= disDraw;
//dis += this.GetComponent<XiaoFangYuanDrawLine>().getDrawLine();
//if (dis>getHaveZhaoMingXian())
//{
// dis = getHaveZhaoMingXian();
// MessageDispatcher.SendMessage("Operatinghints", (object)"水带长度不足,请装备水带");
//}
//Debug.Log("可用照明线长度为:" + dis+"携带照明线的长度为:"+getHaveZhaoMingXian());
if (Line.name.Equals(Guanxian.name))
{
dis = disLine - disDraw;
}
else if (Line.name.Equals(Zhaomingxian.name))
{
dis = disZhaoMingXian - disDraw;
}
return dis;
}
//获取该消防员已用的管线长度
public float getDrawLine()
{
float dis = 0.0f;
if (AllLineDistance.Count > 0)
{
for (int i = 0; i < AllLineDistance.Count; i++)
{
dis += AllLineDistance[i];
}
}
return dis;
}
//获取该消防员携带的管线长度
public float getHaveLine()
{
float dis = 0.0f;
//Dictionary<string, CostEquip> costSelectedEquips = this.GetComponent<Bag>().costSelectedEquips;
//foreach (var item in costSelectedEquips)
//{
// if (item.Key.Contains("消防高压水带"))
// {
// dis = item.Value.selectedEquipNum * item.Value.unit;
// }
//}
dis = BeginLineNum * EquipSelect.GetInstance.DrawLineLength;
return dis;
}
//获取该消防员携带的照明线长度
public float getHaveZhaoMingXian()
{
float dis = 0.0f;
//Dictionary<string, CostEquip> costSelectedEquips = this.GetComponent<Bag>().costSelectedEquips;
//foreach (var item in costSelectedEquips)
//{
// if (item.Key.Contains("救生照明线"))
// {
// dis = item.Value.selectedEquipNum * item.Value.unit;
// }
//}
dis = BeginLiftLineNum * EquipSelect.GetInstance.LiftLightLength;
return dis;
}
//管线超出可用管线范围纠正方法
private Vector3 correctLine()
{
//int k = 0;
Vector3 pos = new Vector3();
float dis = 0;
for (int i = AllLineDistance.Count - 1; i >= 0; i--)
{
//倒序找出应该回退到第几条线上
dis += AllLineDistance[i];
if (dis >= DifferenceLine)
// if (dis >= getAllLine())
{
float ab = dis - DifferenceLine;
//float ab = dis - getAllLine();
float x = Allpath[i].x + (Allpath[i + 1].x - Allpath[i].x) * ab / AllLineDistance[i];
float y = Allpath[i].y + (Allpath[i + 1].y - Allpath[i].y) * ab / AllLineDistance[i];
float z = Allpath[i].z + (Allpath[i + 1].z - Allpath[i].z) * ab / AllLineDistance[i];
pos = new Vector3(x, y, z);//算出回退后消防员所在位置
//倒序删除多出的关键点和线
for (int j = Allpath.Count - 1; j >= i + 1; j--)
{
Allpath.RemoveAt(j);
}
for (int j = AllLine.Count - 1; j >= i; j--)//这里分开循环是因为Allpath,AllLine的长度并不是一直相同的
{
if (GameObject.Find(AllLine[j]))
{
GameObject line = GameObject.Find(AllLine[j]);
Record(line.GetComponent<DrawLinMessage>(), true, false);
Destroy(GameObject.Find(AllLine[j]));
//NetworkManager.Instance.Send("ENTITY_DESTROY", AllLine[j]);
}
AllLine.RemoveAt(j);
//if(j< AllLineDistance.Count - 1)
//{
AllLineDistance.RemoveAt(j);
//}
}
//将删除后最后一个点和消防员新位置连点成线
placementPos = Allpath[i];
placementPos2 = pos;
Vector3 tempPos = (placementPos + placementPos2) / 2;//计算两个点的中点坐标
InstanceLine(tempPos);
break;
}
}
return pos;
}
/// <summary>
/// 消耗为0时,执行该方法即可将消耗重置,已使用数量标记为0
/// 消耗不为0时,即为计算消耗
/// </summary>
private void setLineXiaoHao()
{
float dis = 0.0f;
float disLine = 0.0f;//管线长
float disZhaoMingXian = 0.0f;//照明线长
dis += getDrawLine();
if (Line.name.Equals(Guanxian.name))
{
disLine = dis;
}
else if (Line.name.Equals(Zhaomingxian.name))
{
disZhaoMingXian = dis;
}
if (Line.name.Equals(Guanxian.name))
{
int useNum = 0;
if (disLine >= BeginLineNum * EquipSelect.GetInstance.DrawLineLength)
//如果消耗管线总数大于此人选择的管线,那么此人管线全部标记为已消耗,再从下一个人身上继续扣除
{
useNum = BeginLineNum;
bag.SetEquipNum("消防高压水带", 0);
disLine -= BeginLineNum * EquipSelect.GetInstance.DrawLineLength;
}
else
{
//如果剩余消耗管线总数小于此人选择的管线,那么此人管线向上取整标记为已消耗,无需再从下一个人身上继续扣除了
useNum = (int)Math.Ceiling(disLine / EquipSelect.GetInstance.DrawLineLength);//向上取整
bag.SetEquipNum("消防高压水带", BeginLineNum - useNum);
disLine = 0.0f;
}
}
else if (Line.name.Equals(Zhaomingxian.name))
{
int useNum = 0;
if (disZhaoMingXian >= BeginLiftLineNum * EquipSelect.GetInstance.LiftLightLength)
{
useNum = BeginLiftLineNum;
bag.SetEquipNum("救生照明线", 0);
disZhaoMingXian -= BeginLiftLineNum * EquipSelect.GetInstance.LiftLightLength;
}
else
{
useNum = (int)Math.Ceiling(disZhaoMingXian / EquipSelect.GetInstance.LiftLightLength);//向上取整
bag.SetEquipNum("救生照明线", BeginLiftLineNum - useNum);
disZhaoMingXian = 0.0f;
}
}
// Line.GetComponent<DrawLinMessage>().length = dis;
#region 组消耗
//for (int i = 0; i < AllMembers.Count; i++)//按照顺序将消耗分配给成员
//{
// obj = AllMembers[i];
// Dictionary<string, CostEquip> costSelectedEquips = obj.GetComponent<Bag>().costSelectedEquips;
// foreach (var item in costSelectedEquips)
// {
// if (item.Key.Contains("消防高压水带"))
// {
// item.Value.useNum = 0;
// if (disLine >= item.Value.selectedEquipNum * item.Value.unit)
// //如果消耗管线总数大于此人选择的管线,那么此人管线全部标记为已消耗,再从下一个人身上继续扣除
// {
// item.Value.useNum = item.Value.selectedEquipNum;
// disLine -= item.Value.selectedEquipNum * item.Value.unit;
// }
// else
// {
// //如果剩余消耗管线总数小于此人选择的管线,那么此人管线向上取整标记为已消耗,无需再从下一个人身上继续扣除了
// item.Value.useNum =(int) Math.Ceiling(disLine / item.Value.unit);//向上取整
// disLine = 0.0f;
// }
// }
// else if (item.Key.Contains("救生照明线"))
// {
// item.Value.useNum = 0;
// if (disZhaoMingXian >= item.Value.selectedEquipNum * item.Value.unit)
// {
// item.Value.useNum = item.Value.selectedEquipNum;
// disZhaoMingXian -= item.Value.selectedEquipNum * item.Value.unit;
// }
// else
// {
// item.Value.useNum = (int)Math.Ceiling(disZhaoMingXian / item.Value.unit);//向上取整
// disZhaoMingXian = 0.0f;
// }
// }
// }
//}
#endregion
}
public void DelectAllLine()
{
}
//收起管线
public void destoryLine()
{
// changeLine();
//setLineXiaoHao();
FireManMessage mess = GetComponent<FireManMessage>();
//GetComponent<XiaoFangYuanDrawLine>().setLine();
if (mess.workType == FireManSkills.LayLifeSavingFlarePath ||
mess.workType == FireManSkills.LayWaterHose ||
mess.workType == FireManSkills.SprayFoam ||
mess.workType == FireManSkills.SprayWater ||
mess.workType == FireManSkills.Decontamination)
{
ResourceLoadWindow.Instance.LoadTextHintWindow("请先停止出水或者铺设", 0.5f);
return;
}
//装备添加
//收起管线时,实例化的管线中的DrawLinMessage的Recorddata为IsEndDraw的即为该段铺设的结束
int linenum = 0;
int liftlinenum = 0;
List<Equip> linelist = new List<Equip>();
if (prlineObj.transform.childCount > 0)
{
for (int i = 0; i < prlineObj.transform.childCount; i++)
{
// float linelength = 0;
//float liftlinelength = 0;
Transform line = prlineObj.transform.GetChild(i);
if (line.GetComponent<DrawLinMessage>().Recorddata.IsEndDraw)
{
if (line.GetComponent<CloneGameObjInfo>().gameObjType == CloneObjType.DrawLine)
{
//linelength += line.GetComponent<DrawLinMessage>().length;
linenum += Mathf.CeilToInt(line.GetComponent<DrawLinMessage>().AllLength / EquipSelect.GetInstance.DrawLineLength);
}
else if (line.GetComponent<CloneGameObjInfo>().gameObjType == CloneObjType.LiftLightLine)
{
liftlinenum += Mathf.CeilToInt(line.GetComponent<DrawLinMessage>().AllLength / EquipSelect.GetInstance.LiftLightLength);
}
}
Record(line.GetComponent<DrawLinMessage>(), true, false);
Destroy(line.gameObject);
}
}
Equip Drawline = EquipSelect.GetInstance.GetInitEquipByName("消防高压水带");
Drawline.Number = linenum;
linelist.Add(Drawline);
Equip liftline = EquipSelect.GetInstance.GetInitEquipByName("救生照明线");
liftline.Number = liftlinenum;
linelist.Add(liftline);
bag.EquipAdd(linelist);
//数据重置
BeginLineNum = 0;
BeginLiftLineNum = 0;
Allpath.Clear();
AllLine.Clear();
AllLineDistance.Clear();
nowpath = null;
}
public void EndDraw()
{
if (cloneObj == null)
{//回放之前铺设了管线,但是没有停止铺设,回访结束初始化之后将新生成的最后一段管线设置为cloneObj
if (prlineObj.transform.childCount > 0)
{
cloneObj = prlineObj.transform.GetChild(prlineObj.transform.childCount - 1).gameObject;
}
}
if (cloneObj != null)
{
//cloneObj.GetComponent<DrawLinMessage>().AllLength = getDrawLine();
setLineXiaoHao();
Record(cloneObj.GetComponent<DrawLinMessage>(), true, true);
//cloneObj.name += "-endLine";
Allpath.Clear();
AllLine.Clear();
AllLineDistance.Clear();
nowpath = null;
//BeginLineNum = 0;
//BeginLiftLineNum = 0;
//Line = null;
}
}
//private void OnSpeedChangeEvent(SpeedChangeEventArgs e)
//{
// if (e.speed == 0)
// return;
// MultipleSpeed = e.speed;
//}
private void SetCloneInfo(GameObject game)
{
if (game.GetComponent<CloneGameObjInfo>())
{
game.GetComponent<CloneGameObjInfo>().buildNum = gameObject.GetComponent<CloneGameObjInfo>().buildNum;
game.GetComponent<CloneGameObjInfo>().floorNum = gameObject.GetComponent<CloneGameObjInfo>().floorNum;
game.GetComponent<CloneGameObjInfo>().interlayerNum = gameObject.GetComponent<CloneGameObjInfo>().interlayerNum;
game.name = gameObject.name + "-" + game.GetComponent<CloneGameObjInfo>().gameObjType + "-" + num;
}
}
/// <summary>
/// 克隆管线并赋值信息
/// </summary>
/// <param name="tempPos"></param>
private void InstanceLine(Vector3 tempPos)
{
num++;
cloneObj = Instantiate(Line, tempPos, Quaternion.identity) as GameObject;
SetCloneInfo(cloneObj);
cloneObj.transform.parent = prlineObj.transform;
cloneObj.transform.forward = (cloneObj.transform.position - placementPos).normalized;//改变线条的朝向
float distance = Vector3.Distance(placementPos, placementPos2);//计算两点的距离
cloneObj.transform.localScale = new Vector3(24f, 24f, distance * jugelength);//延长线条,连接两点。
cloneObj.GetComponent<DrawLinMessage>().Linelength = distance;
cloneObj.GetComponent<DrawLinMessage>().AllLength = getDrawLine() + distance;
Record(cloneObj.GetComponent<DrawLinMessage>(), false, true);
Allpath.Add(placementPos2);
AllLine.Add(cloneObj.name);
AllLineDistance.Add(distance);
}
/// <summary>
/// 克隆/删除/放下管线 事件记录
/// </summary>
/// <param name="mess"></param>
/// <param name="IsEndDraw"></param>
/// <param name="IsCreat"></param>
public void Record(DrawLinMessage mess, bool IsEndDraw, bool IsCreat)
{
DrawLineRecordData data = new DrawLineRecordData();
data.myTransform.setMyPosition(mess.transform.localPosition);
data.myTransform.setMyRotation(mess.transform.localRotation);
data.myTransform.setMyScale(mess.transform.localScale);
data.objectName = mess.name;
data.gameObjType = mess.GetComponent<CloneGameObjInfo>().gameObjType;
data.IsCreat = true;
data.linelength = mess.Linelength;
data.alllength = mess.AllLength;
data.floorNum = gameinfo.floorNum;
data.buildNum = gameinfo.buildNum;
data.interlayerNum = gameinfo.interlayerNum;
data.parentobjname = mess.transform.parent.name;
data.clonepos = mess.transform.position;
data.IsEndDraw = IsEndDraw;
data.IsCreat = IsCreat;
if (ReplaySetting.PlayStatus == PlayStatus.isEditor && RecordManager.Instance.recordStatus == RecordStatus.normal)
{
var eventData = new EventData();
eventData.time = RecordManager.Instance.RecordTimer;
eventData.cloneObjType = CloneObjType.None;
eventData.eventType = RecordEventType.DrawLine;
string json = JsonUtility.ToJson(data);
eventData.json = json;
RecordManager.Instance.jsonData.eventDataList.Add(eventData);
}
if (IsCreat)
{
mess.Recorddata = data;
}
}
public List<DrawLineRecordData> GetmessageList()
{
List<DrawLineRecordData> list = new List<DrawLineRecordData>();
for (int i = 0; i < prlineObj.transform.childCount; i++)
{
list.Add(prlineObj.transform.GetChild(i).GetComponent<DrawLinMessage>().Recorddata);
}
return list;
}
public void RecordInit()
{
CreatParent();
if (prlineObj)
{
if (prlineObj.transform.childCount > 0)
{
for (int i = 0; i < prlineObj.transform.childCount; i++)
{
Destroy(prlineObj.transform.GetChild(i).gameObject);
}
}
}
}
public void CreatParent()
{
string name_ = "drawline-" + this.name;
if (!GameObject.Find(name_))
{
prlineObj = Instantiate(nullobject) as GameObject;
prlineObj.name = name_;
prlineObj.transform.parent = GameObject.Find("P_DrawLine").transform;
// prlineObj.AddComponent<DestroyObj>();//用来记录删除消防管线
}
else
{
prlineObj = GameObject.Find(name_);
}
}
}