using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.IO; using ChivaXR; using ChivaXR.Op; using UnityEngine; using Sirenix.OdinInspector; //using UnityEditor.Build.Content; using ExcelDataReader; /// /// 快速生成操作 /// public class FastGenerationOperation : MonoBehaviour { [BoxGroup("基础数据设定")] [Title("指定文件路径(Excel文件)")] [LabelText("文件路径")] [FilePath(ParentFolder = "", Extensions = "xlsx", AbsolutePath = true)] [InlineButton("Clear", "清除")] [SerializeField] private string m_FilePath; [BoxGroup("基础数据设定")] [Title("读取数据设定")] [LabelText("忽略行数")] [SerializeField] private int m_IgnoreRows; [BoxGroup("基础数据设定")] [LabelText("加载列数(第一列为默认)")] [SerializeField] private int m_SpecifiedNumOfCol; [BoxGroup("基础数据设定")] [Title("设定读取当前表格的工作表索引(默认第一张表,即0)")] [LabelText("工作表索引")] [SerializeField] private int m_WorksheetIndex; [BoxGroup("基础数据设定")] [Title("根节点设定(为空时表示当前节点为根节点)")] [LabelText("根节点")] [SerializeField] private GameObject m_RootGameObject; [LabelText("是否自定义名称")] [InfoBox("默认:num_name,例:001_拧开螺丝")] [SerializeField] private bool m_IsCustomName; [LabelText("是否禁用生成判定")] [SerializeField] private bool m_IsDisableDecision; [ShowIfGroup("m_IsCustomName")] [BoxGroup("m_IsCustomName/名称设定")] [InfoBox("范例:第{i}步:")] [SerializeField] private string m_NodeName = "第{i}步:"; [Button("清除所有数据(慎用)", ButtonSizes.Large), GUIColor(1, 0, 0)] private void ClearAllData() { Transform targetTransform = GetTargetTransform(); if (targetTransform == null) { return; } if (targetTransform.GetComponent() != null) { ClearAllChild(targetTransform, 1); } else { ClearAllChild(targetTransform, 0); } } [Button("开始生成", ButtonSizes.Large), GUIColor(0, 1, 0)] private void StartGeneration() { if (string.IsNullOrEmpty(m_FilePath)) { Debug.Log("指定文件不能为空"); return; } Transform targetTransform = GetTargetTransform(); if (targetTransform == null) { return; } CreateNode(targetTransform); } /// /// 获取目标Transform /// /// 返回目标Transform,若条件不满足则返回null private Transform GetTargetTransform() { Transform targetTransform = m_RootGameObject != null ? m_RootGameObject.transform : transform; if (!m_IsDisableDecision) { if (targetTransform.GetComponent() == null && targetTransform.GetComponent() == null) { return null; } } return targetTransform; } /// /// 创建节点 /// /// private void CreateNode(Transform _parentNode) { List allData = ParseReadData(); if (allData.Count <= 0) { return; } for (int i = 0; i < allData.Count; i++) { string[] lineData = allData[i].Split('|'); if (lineData.Length < m_SpecifiedNumOfCol) { return; } GameObject tempGameObject = new GameObject(); tempGameObject.name = (!m_IsCustomName ? lineData[0].PadLeft(3, '0') + "_" : m_NodeName.Replace("{i}", (i + 1).ToString())) + lineData[m_SpecifiedNumOfCol - 1]; tempGameObject.transform.SetParent(_parentNode); if (_parentNode.GetComponent() != null) { AniData tmpData = tempGameObject.AddComponent(); tmpData.aniName = tempGameObject.name; tmpData.aniDescriptioin = lineData[m_SpecifiedNumOfCol - 1]; } else if (_parentNode.GetComponent() != null) { OpTrigger_ToolPack toolPack = tempGameObject.AddComponent(); toolPack.operationName = tempGameObject.name; toolPack.operationDescription = lineData[m_SpecifiedNumOfCol - 1]; } else { } } } /// /// 清除路径信息 /// private void Clear() { if (string.IsNullOrEmpty(m_FilePath)) { return; } m_FilePath = String.Empty; } /// /// 清除所有子对象 /// /// 根节点 /// 忽略索引 private void ClearAllChild(Transform _rootNode, int _ignoreIndex) { for (int i = _rootNode.childCount - 1; i >= _ignoreIndex; i--) { DestroyImmediate(_rootNode.GetChild(i).gameObject); } } #region Excel文件处理 /// /// 解析读取到的数据 /// /// /// /// 表头数,即不需要进行解析的表头行总数 /// 默认是第一张表 /// 返回总体数据集合,数据的连接符为'|' private List ParseReadData() { DataSet dataSet = null; using (FileStream fileStream = File.Open(m_FilePath, FileMode.Open, FileAccess.Read)) { using (IExcelDataReader dataReader = ExcelReaderFactory.CreateReader(fileStream)) { // 获取整张表数据 dataSet = dataReader.AsDataSet(); } } DataTable dataTable = dataSet.Tables[m_WorksheetIndex]; if (dataTable == null) { return null; } return ParsingTable(dataTable); } /// /// 解析表格 /// /// /// /// 文件类型 /// private List ParsingTable(DataTable _dataTable) { if (_dataTable == null) { return null; } List result = new List(); // 获取行数 int rows = _dataTable.Rows.Count; // 获取列数 int cols = _dataTable.Columns.Count; string recordRowData = String.Empty; for (int i = m_IgnoreRows; i < rows; i++) { recordRowData = string.Empty; for (int j = 0; j < cols; j++) { recordRowData += _dataTable.Rows[i][j].ToString() + "|"; } if (!string.IsNullOrEmpty(recordRowData)) { // 剔除每一行的最后一个分隔符 recordRowData = recordRowData.Remove(recordRowData.Length - 1); result.Add(recordRowData); } } return result; } #endregion }