public static void CreateNPCGroup(SceneMap map, int delayTime) { int groupId = AutoIncrementGenerator.Get(map.GetComponentsInChildren <SceneNPCGroup>()); var go = new GameObject("组-" + groupId); var group = go.AddComponent <SceneNPCGroup>(); group.groupId = groupId; group.delayTime = delayTime; go.transform.SetParent(map.transform); go.transform.position = selectionPosition; go.transform.localScale = Vector3.one; go.transform.rotation = Quaternion.identity; Selection.activeGameObject = go; _isUpdated = true; }
public static void ExportMap(string path, SceneMap map) { Example.MapUnit mapUnit = new Example.MapUnit(); mapUnit.Id = map.sceneId; mapUnit.ResID = map.resId; List <Example.NPCUnit> npcUnits = ExportNpcList(map.npcList); mapUnit.Npcs = npcUnits; int npcGroupId = 0; int lastNpcGroupId = 0; Example.NPCGroup npcGroup = null; List <Example.NPCGroup> npcGroups = new List <Example.NPCGroup> (); foreach (var group in map.GetComponentsInChildren <SceneNPCGroup>()) { npcGroupId = group.groupId; if (npcGroupId - lastNpcGroupId > 1) { for (int i = lastNpcGroupId + 1; i < npcGroupId; ++i) { npcGroup = new Example.NPCGroup(); npcGroup.DelayTime = -1; npcGroups.Add(npcGroup); } lastNpcGroupId = npcGroupId; } npcGroup = new Example.NPCGroup(); npcGroup.DelayTime = group.delayTime; npcGroup.NextGroup = -1; List <Example.NPCPass> npcPasses = new List <Example.NPCPass> (); npcGroup.Passes = npcPasses; foreach (var wave in group.GetComponentsInChildren <SceneNPCWave>()) { Example.NPCPass pass = new Example.NPCPass(); pass.DelayTime = wave.delayTime; List <int> npcIds = new List <int> (); foreach (var npc in wave.GetComponentsInChildren <SceneNPC>()) { npcIds.Add(npc.objectId); //Debug.LogWarningFormat ("Export Group {0} Npc {1}",npcGroupId,npc.objectId); } pass.Npcs = npcIds; npcPasses.Add(pass); } npcGroups.Add(npcGroup); lastNpcGroupId = npcGroupId; } List <Example.TransmitNode> transmitNodes = new List <Example.TransmitNode> (); int nodeId = 0; int lastNodeId = 0; Example.TransmitNode transmitNode = null; foreach (var transmit in map.GetComponentsInChildren <TransmitNode>()) { nodeId = transmit.objectId; if (nodeId - lastNodeId > 1) { for (int i = lastNodeId + 1; i < nodeId; ++i) { transmitNode = new Example.TransmitNode(); transmitNode.Id = -1; transmitNodes.Add(transmitNode); } lastNodeId = nodeId; } Debug.LogFormat("transmit.nodeId={0}", transmit.objectId); transmitNode = new Example.TransmitNode(); transmitNode.Id = transmit.objectId; transmitNode.Map = transmit.mapId; transmitNode.Node = transmit.nodeId; transmitNode.Position = MapUtil.ToVector3f(transmit.transform.position); transmitNode.Rotation = MapUtil.ToVector3f(transmit.transform.rotation.eulerAngles); transmitNode.Eff = transmit.effectName; transmitNodes.Add(transmitNode); } ; List <Example.FlyingPath> flyingPaths = new List <Example.FlyingPath> (); nodeId = 0; lastNodeId = 0; Example.FlyingPath flyingPath = null; foreach (var flying in map.GetComponentsInChildren <FlyingPath>()) { nodeId = flying.objectId; if (nodeId - lastNodeId > 1) { for (int i = lastNodeId + 1; i < nodeId; ++i) { flyingPath = new Example.FlyingPath(); flyingPath.Id = -1; flyingPaths.Add(flyingPath); } lastNodeId = nodeId; } List <Example.FlyingPoint> points = new List <Example.FlyingPoint> (); foreach (var p in flying.GetComponentsInChildren <FlyingPoint>()) { List <Example.FlyingAction> actions = new List <Example.FlyingAction> (); foreach (var a in p.GetComponentsInChildren <FlyingAction>()) { List <string> args = new List <string> (); args.Add(a.arg1); args.Add(a.arg2); var action = new Example.FlyingAction(); action.Action = a.action; action.Args = args; action.Id = a.objectId; actions.Add(action); } var flyingPoint = new Example.FlyingPoint(); flyingPoint.Id = p.objectId; flyingPoint.Position = MapUtil.ToVector3f(p.transform.position); flyingPoint.Action = actions; points.Add(flyingPoint); } Debug.LogFormat("path.nodeId={0}", flying.objectId); flyingPath = new Example.FlyingPath(); flyingPath.Id = flying.objectId; flyingPath.Points = points; flyingPaths.Add(flyingPath); } ; mapUnit.TransmitNodes = transmitNodes; mapUnit.Groups = npcGroups; mapUnit.FlyingPaths = flyingPaths; //pathnode Transform pathParent = map.transform.Find("Path"); if (pathParent != null) { List <Example.ScenePathNode> list = new List <Example.ScenePathNode>(); ScenePathNode[] nodes = pathParent.GetComponentsInChildren <ScenePathNode>(); List <List <Example.ScenePathNodeContext> > prevLists = new List <List <Example.ScenePathNodeContext> >(); if (nodes != null && nodes.Length > 0) { List <Example.ScenePathNodeContext> prevList = null; for (int i = 0, count = nodes.Length; i < count; i++) { ScenePathNode node = nodes[i]; Example.ScenePathNode dataNode = new Example.ScenePathNode(); dataNode.Id = node.nodeID; dataNode.Pos = MapUtil.Vector3ToVector3f(node.transform.position); //dataNode.PrevNodes = new List<Example.ScenePathNodeContext>(); dataNode.AdjacentNodes = new List <Example.ScenePathNodeContext>(); dataNode.Type = node.type; if (dataNode.Id >= prevLists.Count) { for (int j = prevLists.Count; j <= dataNode.Id; j++) { prevLists.Add(new List <Example.ScenePathNodeContext>()); } } prevList = prevLists[dataNode.Id]; for (int j = 0, jcount = node.prevNodeIDs.Count; j < jcount; j++) { Example.ScenePathNodeContext context = new Example.ScenePathNodeContext(); context.Cid = node.prevNodeIDs[j]; //dataNode.PrevNodes.Add(context); prevList.Add(context); } for (int j = list.Count; j <= node.nodeID; j++) { Example.ScenePathNode nn = new Example.ScenePathNode(); nn.Id = -1; list.Add(nn); } list[node.nodeID] = dataNode; } } for (int i = 0, count = list.Count; i < count; i++) { Example.ScenePathNode node = list[i]; if (node != null && node.Id >= 0) { List <Example.ScenePathNodeContext> prevList = prevLists[node.Id]; //if (node.PrevNodes.Count == 0) if (prevList.Count == 0) { if (node.Id > 0) { Debug.LogError("scene path node:" + node.Id + " prev node is invalid 0"); return; } } int prevID = -1; //for (int j = 0, jcount = node.PrevNodes.Count; j < jcount; j++) for (int j = 0, jcount = prevList.Count; j < jcount; j++) { //Example.ScenePathNodeContext c1 = node.PrevNodes[j]; Example.ScenePathNodeContext c1 = prevList[j]; prevID = c1.Cid; if (prevID < 0) { if (node.Id > 0) { Debug.LogError("scene path node:" + node.Id + " prev node is invalid 1->" + prevID); return; } } if (prevID >= 0) { if (prevID >= list.Count) { Debug.LogError("scene path node:" + node.Id + " prev node is invalid 1->" + prevID + "^" + list.Count); return; } Example.ScenePathNode temp = list[prevID]; if (temp == null || temp.Id < 0) { Debug.LogError("scene path node:" + node.Id + " prev node is invalid 2"); return; } //if (temp.NextNodes == null) // temp.NextNodes = new List<Example.ScenePathNodeContext>(); Example.ScenePathNodeContext context = new Example.ScenePathNodeContext(); context.Cid = node.Id; context.Cost = Vector3.Distance(MapUtil.Vector3fToVector3(node.Pos), MapUtil.Vector3fToVector3(temp.Pos)); c1.Cost = context.Cost; //temp.NextNodes.Add(context); temp.AdjacentNodes.Add(context); } } node.AdjacentNodes.AddRange(prevList); } } /* * for (int i = 0, count = list.Count; i < count; i++) * { * Example.ScenePathNode node = list[i]; * Debug.Log("-----log node----->" + node.Id); * for (int j = 0, jcount = node.AdjacentNodes.Count; j < jcount; j++) * { * Debug.Log("adjacent->" + j + "^" + node.AdjacentNodes[j].Cid); * } * }*/ if (mapUnit.ScenePath == null) { mapUnit.ScenePath = new Example.ScenePath(); mapUnit.ScenePath.Nodes = new List <Example.ScenePathNode>(); } mapUnit.ScenePath.Nodes.AddRange(list); } //var bytes = MapInfo.SerializeToBytes (mapInfo); var bytes = Example.MapUnit.SerializeToBytes(mapUnit); FileStream fs = new FileStream(path, FileMode.Create); fs.Write(bytes, 0, bytes.Length); fs.Close(); /* * using (fs = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.None)) * { * byte[] arr = new byte[fs.Length]; * fs.Read(arr, 0, (int)fs.Length); * MemoryStream ms = new MemoryStream(arr); * Example.MapUnit m = Example.MapUnit.Deserialize(ms); * * for (int i = 0, count = m.ScenePath.Nodes.Count; i < count; i++) * { * Example.ScenePathNode node = m.ScenePath.Nodes[i]; * Debug.Log("-------------node-------------->" + node.Id); * if (node != null) * { * for (int j = 0, jcount = node.AdjacentNodes.Count; j < jcount; j++) * { * Example.ScenePathNodeContext context = node.AdjacentNodes[j]; * Debug.Log("adjacent context------------>" + context.Cid + "^" + context.Cost); * } * } * } * } */ /*var prefab = PrefabUtility.GetPrefabParent(map.gameObject); * PrefabUtility.ReplacePrefab(map.gameObject, prefab);*/ }