ZeroVR/ZeroPacientVR/Assets/CodeRespawn/DungeonArchitect/Scripts/Builders/Grid/LevelStreaming/GridDungeonItemGroup.cs

100 lines
3.3 KiB
C#

//$ Copyright 2015-22, Code Respawn Technologies Pvt Ltd - All Rights Reserved $//
using UnityEngine;
using System.Collections.Generic;
using DungeonArchitect.LevelStreaming;
namespace DungeonArchitect.Builders.Grid
{
public class GridDungeonItemGroup : DungeonItemGroup
{
public override void OnPostDungeonBuild(Dungeon dungeon, DungeonModel model)
{
base.OnPostDungeonBuild(dungeon, model);
GridDungeonModel gridModel = dungeon.ActiveModel as GridDungeonModel;
var _groupInfoArray = GameObject.FindObjectsOfType<DungeonItemGroupInfo>();
Dictionary<int, DungeonItemGroupInfo> groupObjectByCellId = new Dictionary<int, DungeonItemGroupInfo>();
foreach (var groupInfo in _groupInfoArray)
{
if (groupInfo.dungeon == dungeon)
{
var cellId = groupInfo.groupId;
var cell = gridModel.GetCell(cellId);
if (cell == null || cell.CellType == CellType.Unknown)
{
continue;
}
string objectNamePrefix = "";
if (cell.CellType == CellType.Room)
{
objectNamePrefix = "Room_";
}
else
{
groupObjectByCellId[cell.Id] = groupInfo;
objectNamePrefix = (cell.CellType == CellType.Corridor) ? "CorridorBlock_" : "CorridorPad_";
}
if (objectNamePrefix.Length == 0)
{
objectNamePrefix = "Cell_";
}
string groupName = objectNamePrefix + cell.Id;
groupInfo.gameObject.name = groupName;
}
}
var visited = new HashSet<int>();
int clusterCounter = 1;
var oldGroupsToDelete = new List<GameObject>();
foreach (var groupInfo in groupObjectByCellId.Values)
{
var cellId = groupInfo.groupId;
if (visited.Contains(cellId))
{
continue;
}
var clusters = GridBuilderUtils.GetCellCluster(gridModel, cellId);
var itemsToGroup = new List<GameObject>();
// Mark all cluster cells as visited
foreach (var clusterItemId in clusters)
{
visited.Add(clusterItemId);
if (groupObjectByCellId.ContainsKey(clusterItemId))
{
var clusterItemGroupInfo = groupObjectByCellId[clusterItemId];
for (int i = 0; i < clusterItemGroupInfo.transform.childCount; i++)
{
var childObject = clusterItemGroupInfo.transform.GetChild(i);
itemsToGroup.Add(childObject.gameObject);
}
oldGroupsToDelete.Add(clusterItemGroupInfo.gameObject);
}
}
int clusterId = clusterCounter++;
GroupItems(itemsToGroup.ToArray(), "Corridor_" + clusterId, dungeon, clusterId);
}
groupObjectByCellId.Clear();
// Destroy the inner group info objects
foreach (var itemToDestory in oldGroupsToDelete)
{
EditorDestroyObject(itemToDestory);
}
}
}
}