上海杨浦大连路地铁站单机版电子沙盘
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.
 
 
 
 

135 lines
5.3 KiB

using AX.MessageSystem;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[Serializable]
public class SpreadFireData
{
public long sourceId;
public string name;
public Vector3 position;//位置
public Vector3 eulerAngles;//旋转
public Vector3 scale;//缩放
public string buildNum;//楼号
public int floorNum;//层号
public int interlayerNum;//夹层号,0表示不是夹层,1表示第一个夹层
public int Layer;
public string UserId;
}
[Serializable]
public class SpreadFireRecordData//蔓延出来的火的帧数据
{
public List<SpreadFireData> spreadFiredataList = new List<SpreadFireData>();
}
public class SpreadFireManager : MonoBehaviour
{
public static SpreadFireManager Instance;
public GameObject firePrefab;
private void Awake()
{
Instance = this;
}
void Start()
{
MessageDispatcher.AddListener("ReplayFrame", ReplayFrameData);
MessageDispatcher.AddListener("ReplayEvent", ReplayEventData);
}
public SpreadFireRecordData GetFrameData()
{
SpreadFireRecordData recordData = new SpreadFireRecordData();
foreach (Transform item in transform)
{
SpreadFireData data = new SpreadFireData();
data.name = item.name;
data.sourceId = item.GetComponent<SpreadFire>().SourceId;
data.position = item.localPosition;
data.eulerAngles = item.localRotation.eulerAngles;
data.scale = item.localScale;
data.buildNum = item.GetComponent<CloneGameObjInfo>().buildNum;//楼号
data.floorNum = item.GetComponent<CloneGameObjInfo>().floorNum;//层号
data.interlayerNum = item.GetComponent<CloneGameObjInfo>().interlayerNum;//夹层号,0表示不是夹层,1表示第一个夹层
data.Layer = item.GetComponent<CloneGameObjInfo>().Layer;
recordData.spreadFiredataList.Add(data);
}
return recordData;
}
private void ReplayFrameData(IMessage obj)
{
var baseData = (ObjectData)obj.Data;
if (baseData.cloneObjType == CloneObjType.SpreadFireFrame)
{
ClearObject();
SpreadFireRecordData data = Newtonsoft.Json.JsonConvert.DeserializeObject<SpreadFireRecordData>(baseData.json);
if (data.spreadFiredataList.Count > 0)
{
foreach (var item in data.spreadFiredataList)
{
GameObject spreadfire = Instantiate(firePrefab, transform);
spreadfire.name = item.name;
spreadfire.transform.localPosition = item.position;
spreadfire.transform.localRotation = Quaternion.Euler
(item.eulerAngles.x, item.eulerAngles.y, item.eulerAngles.z) * Quaternion.identity;
spreadfire.transform.localScale = item.scale;
spreadfire.GetComponent<SpreadFire>().SourceId = item.sourceId;
spreadfire.GetComponent<CloneGameObjInfo>().buildNum = item.buildNum;
spreadfire.GetComponent<CloneGameObjInfo>().floorNum = item.floorNum;
spreadfire.GetComponent<CloneGameObjInfo>().interlayerNum = item.interlayerNum;
spreadfire.GetComponent<CloneGameObjInfo>().Layer = item.Layer;
}
}
}
}
private void ClearObject()
{
foreach (Transform item in transform)
{
Destroy(item.gameObject);
}
}
private void ReplayEventData(IMessage obj)
{
var baseEventData = (EventData)obj.Data;
if (baseEventData.eventType == RecordEventType.SpreadFireCreat)
{
SpreadFireCreatData data = Newtonsoft.Json.JsonConvert.DeserializeObject<SpreadFireCreatData>(baseEventData.json);
GameObject spreadfire = Instantiate(firePrefab, transform);
spreadfire.name = data.name;
spreadfire.transform.localPosition = data.position;
spreadfire.transform.localRotation = Quaternion.Euler
(data.eulerAngles.x, data.eulerAngles.y, data.eulerAngles.z) * Quaternion.identity;
spreadfire.transform.localScale = data.scale;
spreadfire.GetComponent<SpreadFire>().SourceId = data.sourceId;
spreadfire.GetComponent<CloneGameObjInfo>().buildNum = data.buildNum;
spreadfire.GetComponent<CloneGameObjInfo>().floorNum = data.floorNum;
spreadfire.GetComponent<CloneGameObjInfo>().interlayerNum = data.interlayerNum;
spreadfire.GetComponent<CloneGameObjInfo>().Layer = data.Layer;
}
else if (baseEventData.eventType == RecordEventType.SpreadFireDestory)
{
foreach (Transform item in transform)
{
if (item.GetComponent<SpreadFire>())
{
SpreadFireDestoryData data = (SpreadFireDestoryData)obj.Data;
if (item.GetComponent<SpreadFire>().SourceId == data.sourceId)
{
Destroy(item.gameObject);
}
}
}
}
}
private void OnDestroy()
{
MessageDispatcher.RemoveListener("ReplayEvent", ReplayEventData);
MessageDispatcher.RemoveListener("ReplayFrame", ReplayFrameData);
}
}