Compare commits

...

5 Commits

  1. 9
      Assets/Unity-Tools/Core/Util/ProfilerUtil.cs
  2. 3
      Assets/Unity-Tools/Core/Util/ProfilerUtil.cs.meta
  3. 17
      Assets/Unity-Tools/ExcelResolver/Editor/Core/Util/ExcelResolverUtil.Cell.cs
  4. 14
      Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.ReadExcel.cs
  5. 118
      Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteDataSO.cs
  6. 0
      Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteDataSO.cs.meta
  7. 80
      Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOData.cs
  8. 48
      Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteUtilSO.cs
  9. 3
      Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteUtilSO.cs.meta
  10. 2
      Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.cs
  11. BIN
      Assets/_Project/ExcelResolver/Excel/hero.xlsx
  12. 6
      Assets/_Project/ScriptableObject/Excel/Hero/Hero_1.asset
  13. 2
      Assets/_Project/ScriptableObject/Excel/Hero/Hero_1.asset.meta
  14. 2
      Assets/_Project/ScriptableObject/Excel/Hero/Hero_2.asset
  15. 2
      Assets/_Project/ScriptableObject/Excel/Hero/Hero_2.asset.meta
  16. 4
      Assets/_Project/ScriptableObject/Excel/Hero/Hero_3.asset
  17. 2
      Assets/_Project/ScriptableObject/Excel/Hero/Hero_3.asset.meta
  18. 132
      Assets/_Project/ScriptableObject/Excel/Hero/Hero_4.asset
  19. 8
      Assets/_Project/ScriptableObject/Excel/Hero/Hero_4.asset.meta
  20. 95
      Assets/_Project/ScriptableObject/Excel/Hero/_HeroUtil.asset
  21. 8
      Assets/_Project/ScriptableObject/Excel/Hero/_HeroUtil.asset.meta

9
Assets/Unity-Tools/Core/Util/ProfilerUtil.cs

@ -0,0 +1,9 @@
using Unity.Profiling;
namespace Tools
{
public static class ProfilerUtil
{
public static readonly ProfilerMarker MyMarker = new ProfilerMarker("MyCustomCode");
}
}

3
Assets/Unity-Tools/Core/Util/ProfilerUtil.cs.meta

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: ab28fc99e92b409aadd67ec27519c3cc
timeCreated: 1737917311

17
Assets/Unity-Tools/ExcelResolver/Editor/Core/Util/ExcelResolverUtil.Cell.cs

@ -8,6 +8,7 @@ namespace Tools.ExcelResolver.Editor
{ {
internal static partial class ExcelResolverUtil internal static partial class ExcelResolverUtil
{ {
/*
/// <summary> /// <summary>
/// 读取指定行的数据 /// 读取指定行的数据
/// </summary> /// </summary>
@ -35,6 +36,19 @@ namespace Tools.ExcelResolver.Editor
values.Add(value); values.Add(value);
} }
return values; return values;
}*/
internal static Dictionary<int, string> ReadColumn(ExcelWorksheet worksheet, int col)
{
var endRow = worksheet.Dimension.End.Row;
var values = new Dictionary<int, string>(endRow);
for (int row = 1; row <= endRow; row++)
{
// 跳过注释行
if (worksheet.Cells[row, 1].Text == "##" || string.IsNullOrEmpty(worksheet.Cells[row, col].Text)) continue;
string value = worksheet.Cells[row, col].Text.Trim();
values.Add(row, value);
}
return values;
} }
/// <summary> /// <summary>
@ -71,6 +85,7 @@ namespace Tools.ExcelResolver.Editor
$"Text: '<color=cyan>{cell.Text}</color>' "); $"Text: '<color=cyan>{cell.Text}</color>' ");
} }
/*
/// <summary> /// <summary>
/// 通用的单元格 -> C# 对象转换 /// 通用的单元格 -> C# 对象转换
/// </summary> /// </summary>
@ -169,6 +184,6 @@ namespace Tools.ExcelResolver.Editor
? boolValue ? boolValue
: (value == "1" || value.Equals("true", StringComparison.OrdinalIgnoreCase)) }, : (value == "1" || value.Equals("true", StringComparison.OrdinalIgnoreCase)) },
{ "string", value => value ?? string.Empty } { "string", value => value ?? string.Empty }
}; };*/
} }
} }

14
Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.ReadExcel.cs

@ -32,7 +32,7 @@ namespace Tools.ExcelResolver.Editor
using MD5 md5 = MD5.Create(); using MD5 md5 = MD5.Create();
byte[] hash = md5.ComputeHash(stream);// 转换为十六进制字符串 byte[] hash = md5.ComputeHash(stream);// 转换为十六进制字符串
var m = BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant(); var m = BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant();
if (excelResolverConfig.md5Dict.GetValueOrDefault(excelFile.FullName) == m) if (excelResolverConfig.md5Dict.GetValueOrDefault(excelFile.FullName) == m && useMD5)
{ {
Debug.Log($"'{excelFile.Name}' 文件未发生变化,跳过"); Debug.Log($"'{excelFile.Name}' 文件未发生变化,跳过");
continue; continue;
@ -73,7 +73,7 @@ namespace Tools.ExcelResolver.Editor
else else
{ {
Debug.Log("未更改过字段,开始写入SO数据"); Debug.Log("未更改过字段,开始写入SO数据");
WriteSOData(); WriteDataSO();
} }
} }
@ -92,7 +92,7 @@ namespace Tools.ExcelResolver.Editor
{ {
isCompilationFinished = false; isCompilationFinished = false;
Debug.Log("Assembly-CSharp加载完成,开始写入SO数据"); Debug.Log("Assembly-CSharp加载完成,开始写入SO数据");
WriteSOData(); WriteDataSO();
} }
} }
@ -109,6 +109,14 @@ namespace Tools.ExcelResolver.Editor
Assert.IsTrue(configs.Length >= 2, $"'{classCodeData.className}'配置错误,SingleKeyTable只能有一个主键"); Assert.IsTrue(configs.Length >= 2, $"'{classCodeData.className}'配置错误,SingleKeyTable只能有一个主键");
var key = configs[1]; var key = configs[1];
classCodeData.keyField = classCodeData.fields.Where(f => f.Value.varName == key).Select(p => p.Value).ToArray(); classCodeData.keyField = classCodeData.fields.Where(f => f.Value.varName == key).Select(p => p.Value).ToArray();
Assert.IsTrue(classCodeData.keyField.Length == 1, $"'{classCodeData.className}'配置错误,主键字段不存在或重复");
var keyDict = ExcelResolverUtil.ReadColumn(worksheet, classCodeData.keyField[0].colIndex);
var duplicateValues = keyDict.GroupBy(x => x.Value).Where(g => g.Count() > 1);
foreach (var duplicateValue in duplicateValues)
{
throw new Exception($"'{classCodeData.className}'主键字段存在重复值:'<color=cyan>{duplicateValue.Key}</color>' " +
$"行号:{string.Join(",", duplicateValue.Select(g => g.Key))}");
}
} }
else if (config.Contains("UnionMultiKeyTable")) else if (config.Contains("UnionMultiKeyTable"))
{ {

118
Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteDataSO.cs

@ -0,0 +1,118 @@
using System;
using System.Collections.Generic;
using System.Reflection;
using OfficeOpenXml;
using Sirenix.OdinInspector;
using UnityEditor;
using UnityEngine;
namespace Tools.ExcelResolver.Editor
{
public sealed partial class ExcelResolverEditorWindow
{
[FoldoutGroup("Hide Setting")]
[ShowInInspector] private Dictionary<ExcelWorksheet, ClassCodeData> classCodeDataDict = new();
private void WriteDataSO()
{
foreach (var classCodeDataDictPair in classCodeDataDict)
{
var worksheet = classCodeDataDictPair.Key;
var classCodeData = classCodeDataDictPair.Value;
var dataName = $"{classCodeData.className}";
var path = $"{excelResolverConfig.SOPathRoot}/{classCodeData.className}/";
string[] assetGuids = AssetDatabase.FindAssets($"t:{dataName}", new[] { path });
Dictionary<string, ScriptableObject> originAssets = new();
for (int i = 0; i < assetGuids.Length; i++)
{
string assetPath = AssetDatabase.GUIDToAssetPath(assetGuids[i]);
ScriptableObject scriptableObject = AssetDatabase.LoadAssetAtPath<ScriptableObject>(assetPath);
originAssets.Add(scriptableObject.name, scriptableObject);
}
var result = new List<ScriptableObject>();
for (int row = 1; row <= worksheet.Dimension.End.Row; row++)
{
// 跳过注释行
if (worksheet.Cells[row, 1].Text.StartsWith("##")) continue;
var assetName = getAssetName(worksheet, row, classCodeData);
var fullPath = $"{path}{assetName}.asset";
if (originAssets.ContainsKey(assetName))
{
set(originAssets[assetName], worksheet, row, classCodeData);
EditorUtility.SetDirty(originAssets[assetName]);
Debug.Log($"刷新:{assetName}", originAssets[assetName]);
result.Add(originAssets[assetName]);
originAssets.Remove(assetName);
}
else
{
ScriptableObject instance = ScriptableObject.CreateInstance(dataName);
set(instance, worksheet, row, classCodeData);
AssetDatabase.CreateAsset(instance, fullPath);
Debug.Log($"创建:{assetName}", instance);
result.Add(instance);
}
}
foreach (var value in originAssets.Values)
{
Debug.LogError($"删除:{value.name}", value);
AssetDatabase.DeleteAsset(AssetDatabase.GetAssetPath(value));
}
WriteUtilSO(path, result, classCodeData);
}
AssetDatabase.SaveAssets();
GC.Collect();
GC.WaitForPendingFinalizers();
void set(ScriptableObject instance, ExcelWorksheet worksheet, int row, ClassCodeData classCodeData)
{
foreach (var pair in classCodeData.fields)
{
var col = pair.Key;
var fieldData = pair.Value;
var cell = worksheet.Cells[row, col];
object convertedValue = ExcelResolverUtil.ConvertCellValue(cell, fieldData.type, classCodeData.className);
FieldInfo fieldInfo = instance.GetType().GetField(fieldData.varName);
if (fieldInfo == null) throw new Exception($"{classCodeData.className}中不存在字段:{fieldData.varName}");
fieldInfo.SetValue(instance, convertedValue);
}
}
string getAssetName(ExcelWorksheet worksheet, int row, ClassCodeData classCodeData)
{
switch (classCodeData.tableType)
{
case TableType.SingleKeyTable:
var keyColIndex = classCodeData.keyField[0].colIndex;
var key = worksheet.Cells[row, keyColIndex].Text;
if (!string.IsNullOrEmpty(key))
return $"{classCodeData.className}_{key}";
break;
// case TableType.UnionMultiKeyTable:
// return $"{classCodeData.className}_{classCodeData.keyField[0].varName}";
// case TableType.MultiKeyTable:
// return $"{classCodeData.className}_{classCodeData.keyField[0].varName}";
// case TableType.NotKetTable:
// return classCodeData.className;
// case TableType.ColumnTable:
// return $"{classCodeData.className}_{classCodeData.fields[2].Value.varName}";
}
throw new Exception($"无法定义资产名称 " +
$"className: '<color=cyan>{classCodeData.className}</color>' " +
$"FullAddress: <color=cyan>{row}</color> ");
}
}
}
}

0
Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOData.cs.meta → Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteDataSO.cs.meta

80
Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOData.cs

@ -1,80 +0,0 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using OfficeOpenXml;
using Sirenix.OdinInspector;
using UnityEditor;
using UnityEngine;
namespace Tools.ExcelResolver.Editor
{
public sealed partial class ExcelResolverEditorWindow
{
[FoldoutGroup("Hide Setting")]
[ShowInInspector] private Dictionary<ExcelWorksheet, ClassCodeData> classCodeDataDict = new();
private void WriteSOData()
{
foreach (var classCodeDataDictPair in classCodeDataDict)
{
var worksheet = classCodeDataDictPair.Key;
var classCodeData = classCodeDataDictPair.Value;
Type soType = ExcelResolverUtil.GetOrCacheTypeByName(classCodeData.className);
if (soType == null)
{
Debug.LogError($"Class '{classCodeData.className}SO' not found. Please generate classes first (or check namespace).");
return;
}
var path = $"{excelResolverConfig.SOPathRoot}/{classCodeData.className}/";
for (int row = 1; row <= worksheet.Dimension.End.Row; row++)
{
var assetName = $"{classCodeData.className}_{row}";
var fullPath = $"{path}{assetName}.asset";
// 跳过注释行
if (worksheet.Cells[row, 1].Text.StartsWith("##"))
{
if (File.Exists(fullPath))
{
AssetDatabase.DeleteAsset(fullPath);
Debug.LogError($"删除:{assetName}");
}
continue;
}
ScriptableObject instance;
if (File.Exists(fullPath))
{
instance = AssetDatabase.LoadAssetAtPath<ScriptableObject>(fullPath);
Debug.Log($"刷新:{assetName}", instance);
}
else
{
instance = ScriptableObject.CreateInstance(soType);
AssetDatabase.CreateAsset(instance, fullPath);
AssetDatabase.SaveAssets();
Debug.Log($"创建:{assetName}", instance);
}
foreach (var pair in classCodeData.fields)
{
var col = pair.Key;
var fieldData = pair.Value;
var cell = worksheet.Cells[row, col];
object convertedValue = ExcelResolverUtil.ConvertCellValue(cell, fieldData.type, classCodeData.className);
FieldInfo fieldInfo = soType.GetField(fieldData.varName);
if (fieldInfo == null) throw new Exception($"目标类中不存在字段:{fieldData.varName}");
fieldInfo.SetValue(instance, convertedValue);
}
EditorUtility.SetDirty(instance);
}
AssetDatabase.SaveAssets();
}
GC.Collect();
GC.WaitForPendingFinalizers();
}
}
}

48
Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteUtilSO.cs

@ -0,0 +1,48 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
namespace Tools.ExcelResolver.Editor
{
public sealed partial class ExcelResolverEditorWindow
{
private void WriteUtilSO(string path, List<ScriptableObject> assets, ClassCodeData classCodeData)
{
var utilName = $"{classCodeData.className}Util";
var utilPath = $"{path}/_{utilName}.asset";
var instance = AssetDatabase.LoadAssetAtPath<ScriptableObject>(utilPath);
if (instance == null)
{
instance = ScriptableObject.CreateInstance(utilName);
AssetDatabase.CreateAsset(instance, utilPath);
}
switch (classCodeData.tableType)
{
case TableType.SingleKeyTable:
var keyField = classCodeData.keyField[0];
var dict = (IDictionary)Activator.CreateInstance(typeof(Dictionary<,>).MakeGenericType(keyField.type.RealType, assets[0].GetType()));
foreach (var asset in assets)
{
var key = asset.GetType().GetField(keyField.varName).GetValue(asset);
dict[key] = asset;
}
instance.GetType().GetField("Data").SetValue(instance, dict);
break;
case TableType.UnionMultiKeyTable:
break;
case TableType.MultiKeyTable:
break;
case TableType.NotKetTable:
break;
case TableType.ColumnTable:
break;
}
EditorUtility.SetDirty(instance);
}
}
}

3
Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteUtilSO.cs.meta

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 3b78262c18a44a04af02c750d7628d02
timeCreated: 1737914896

2
Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.cs

@ -14,6 +14,8 @@ namespace Tools.ExcelResolver.Editor
[FoldoutGroup("Hide Setting"), LabelText("导表前是否清空Console")] [FoldoutGroup("Hide Setting"), LabelText("导表前是否清空Console")]
[SerializeField] private bool isClearConsole = true; [SerializeField] private bool isClearConsole = true;
[FoldoutGroup("Hide Setting"), LabelText("是否使用MD5跳过未修改的表格")]
[SerializeField] private bool useMD5 = true;
[MenuItem("\u272dExcelResolver\u272d/ExcelResolverEditorWindow")] [MenuItem("\u272dExcelResolver\u272d/ExcelResolverEditorWindow")]

BIN
Assets/_Project/ExcelResolver/Excel/hero.xlsx

Binary file not shown.

6
Assets/_Project/ScriptableObject/Excel/Hero/Hero_7.asset → Assets/_Project/ScriptableObject/Excel/Hero/Hero_1.asset

@ -10,7 +10,7 @@ MonoBehaviour:
m_Enabled: 1 m_Enabled: 1
m_EditorHideFlags: 0 m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: e8aa3c1560079b84cafbabe4bc0d2c8d, type: 3} m_Script: {fileID: 11500000, guid: e8aa3c1560079b84cafbabe4bc0d2c8d, type: 3}
m_Name: Hero_7 m_Name: Hero_1
m_EditorClassIdentifier: m_EditorClassIdentifier:
serializationData: serializationData:
SerializedFormat: 2 SerializedFormat: 2
@ -118,11 +118,11 @@ MonoBehaviour:
id: 1 id: 1
name: "\u9053\u58EB" name: "\u9053\u58EB"
icon: hero_1 icon: hero_1
has: 0 has: 1
hp: 100 hp: 100
atk: 20 atk: 20
speed: 1.2 speed: 1.2
pos: {x: 0, y: 1, z: 4} pos: {x: 0, y: 1, z: 9}
ches: {x: 0, y: 1} ches: {x: 0, y: 1}
attack_target: attack_target:
- {x: 1, y: 2} - {x: 1, y: 2}

2
Assets/_Project/ScriptableObject/Excel/Hero/Hero_8.asset.meta → Assets/_Project/ScriptableObject/Excel/Hero/Hero_1.asset.meta

@ -1,5 +1,5 @@
fileFormatVersion: 2 fileFormatVersion: 2
guid: f68d13699cf81a14a8e10092094b0f8d guid: 3b98756cd197195498b14b5e67935cbe
NativeFormatImporter: NativeFormatImporter:
externalObjects: {} externalObjects: {}
mainObjectFileID: 11400000 mainObjectFileID: 11400000

2
Assets/_Project/ScriptableObject/Excel/Hero/Hero_8.asset → Assets/_Project/ScriptableObject/Excel/Hero/Hero_2.asset

@ -10,7 +10,7 @@ MonoBehaviour:
m_Enabled: 1 m_Enabled: 1
m_EditorHideFlags: 0 m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: e8aa3c1560079b84cafbabe4bc0d2c8d, type: 3} m_Script: {fileID: 11500000, guid: e8aa3c1560079b84cafbabe4bc0d2c8d, type: 3}
m_Name: Hero_8 m_Name: Hero_2
m_EditorClassIdentifier: m_EditorClassIdentifier:
serializationData: serializationData:
SerializedFormat: 2 SerializedFormat: 2

2
Assets/_Project/ScriptableObject/Excel/Hero/Hero_9.asset.meta → Assets/_Project/ScriptableObject/Excel/Hero/Hero_2.asset.meta

@ -1,5 +1,5 @@
fileFormatVersion: 2 fileFormatVersion: 2
guid: acae57c5032fca54685e664fb60872d6 guid: cdde19489f16dce429041c1d6e207864
NativeFormatImporter: NativeFormatImporter:
externalObjects: {} externalObjects: {}
mainObjectFileID: 11400000 mainObjectFileID: 11400000

4
Assets/_Project/ScriptableObject/Excel/Hero/Hero_9.asset → Assets/_Project/ScriptableObject/Excel/Hero/Hero_3.asset

@ -10,7 +10,7 @@ MonoBehaviour:
m_Enabled: 1 m_Enabled: 1
m_EditorHideFlags: 0 m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: e8aa3c1560079b84cafbabe4bc0d2c8d, type: 3} m_Script: {fileID: 11500000, guid: e8aa3c1560079b84cafbabe4bc0d2c8d, type: 3}
m_Name: Hero_9 m_Name: Hero_3
m_EditorClassIdentifier: m_EditorClassIdentifier:
serializationData: serializationData:
SerializedFormat: 2 SerializedFormat: 2
@ -79,7 +79,7 @@ MonoBehaviour:
- Name: - Name:
Entry: 8 Entry: 8
Data: Data:
id: 2 id: 3
name: "\u5973\u5DEB" name: "\u5973\u5DEB"
icon: hero_3 icon: hero_3
has: 0 has: 0

2
Assets/_Project/ScriptableObject/Excel/Hero/Hero_7.asset.meta → Assets/_Project/ScriptableObject/Excel/Hero/Hero_3.asset.meta

@ -1,5 +1,5 @@
fileFormatVersion: 2 fileFormatVersion: 2
guid: 031f6bc6b7884a54da49033ea61073a7 guid: 934bc10c06f0592419baf474987cc0a7
NativeFormatImporter: NativeFormatImporter:
externalObjects: {} externalObjects: {}
mainObjectFileID: 11400000 mainObjectFileID: 11400000

132
Assets/_Project/ScriptableObject/Excel/Hero/Hero_4.asset

@ -0,0 +1,132 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: e8aa3c1560079b84cafbabe4bc0d2c8d, type: 3}
m_Name: Hero_4
m_EditorClassIdentifier:
serializationData:
SerializedFormat: 2
SerializedBytes:
ReferencedUnityObjects: []
SerializedBytesString:
Prefab: {fileID: 0}
PrefabModificationsReferencedUnityObjects: []
PrefabModifications: []
SerializationNodes:
- Name: nihao
Entry: 7
Data: 0|System.Collections.Generic.Dictionary`2[[System.Int32, mscorlib],[System.Single,
mscorlib]], mscorlib
- Name: comparer
Entry: 7
Data: 1|System.Collections.Generic.GenericEqualityComparer`1[[System.Int32,
mscorlib]], mscorlib
- Name:
Entry: 8
Data:
- Name:
Entry: 12
Data: 2
- Name:
Entry: 7
Data:
- Name: $k
Entry: 3
Data: 2
- Name: $v
Entry: 4
Data: 2.3
- Name:
Entry: 8
Data:
- Name:
Entry: 7
Data:
- Name: $k
Entry: 3
Data: 5
- Name: $v
Entry: 4
Data: 4.6
- Name:
Entry: 8
Data:
- Name:
Entry: 13
Data:
- Name:
Entry: 8
Data:
- Name: attribute
Entry: 7
Data: 2|System.Collections.Generic.Dictionary`2[[Tools.ExcelResolver.Attribute,
Assembly-CSharp],[System.Int32, mscorlib]], mscorlib
- Name: comparer
Entry: 7
Data: 3|System.Collections.Generic.EnumEqualityComparer`1[[Tools.ExcelResolver.Attribute,
Assembly-CSharp]], mscorlib
- Name:
Entry: 12
Data: 0
- Name:
Entry: 13
Data:
- Name:
Entry: 8
Data:
- Name:
Entry: 12
Data: 2
- Name:
Entry: 7
Data:
- Name: $k
Entry: 3
Data: 0
- Name: $v
Entry: 3
Data: 500
- Name:
Entry: 8
Data:
- Name:
Entry: 7
Data:
- Name: $k
Entry: 3
Data: 1
- Name: $v
Entry: 3
Data: 300
- Name:
Entry: 8
Data:
- Name:
Entry: 13
Data:
- Name:
Entry: 8
Data:
id: 4
name: "\u9053\u58EB"
icon: hero_1
has: 1
hp: 100
atk: 20
speed: 1.2
pos: {x: 0, y: 1, z: 9}
ches: {x: 0, y: 1}
attack_target:
- {x: 1, y: 2}
- {x: 1, y: 2}
- {x: 1, y: 2}
- {x: 1, y: 2}
color: 1

8
Assets/_Project/ScriptableObject/Excel/Hero/Hero_4.asset.meta

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 4f9da86093404c6449ad6f21e1207cb0
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

95
Assets/_Project/ScriptableObject/Excel/Hero/_HeroUtil.asset

@ -0,0 +1,95 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 0b8ec7437f31db141b138472f0c2a3aa, type: 3}
m_Name: _HeroUtil
m_EditorClassIdentifier:
serializationData:
SerializedFormat: 2
SerializedBytes:
ReferencedUnityObjects:
- {fileID: 11400000, guid: 3b98756cd197195498b14b5e67935cbe, type: 2}
- {fileID: 11400000, guid: cdde19489f16dce429041c1d6e207864, type: 2}
- {fileID: 11400000, guid: 934bc10c06f0592419baf474987cc0a7, type: 2}
- {fileID: 11400000, guid: 4f9da86093404c6449ad6f21e1207cb0, type: 2}
SerializedBytesString:
Prefab: {fileID: 0}
PrefabModificationsReferencedUnityObjects: []
PrefabModifications: []
SerializationNodes:
- Name: Data
Entry: 7
Data: 0|System.Collections.Generic.Dictionary`2[[System.Int32, mscorlib],[Tools.ExcelResolver.Hero,
Assembly-CSharp]], mscorlib
- Name: comparer
Entry: 7
Data: 1|System.Collections.Generic.GenericEqualityComparer`1[[System.Int32,
mscorlib]], mscorlib
- Name:
Entry: 8
Data:
- Name:
Entry: 12
Data: 4
- Name:
Entry: 7
Data:
- Name: $k
Entry: 3
Data: 1
- Name: $v
Entry: 10
Data: 0
- Name:
Entry: 8
Data:
- Name:
Entry: 7
Data:
- Name: $k
Entry: 3
Data: 2
- Name: $v
Entry: 10
Data: 1
- Name:
Entry: 8
Data:
- Name:
Entry: 7
Data:
- Name: $k
Entry: 3
Data: 3
- Name: $v
Entry: 10
Data: 2
- Name:
Entry: 8
Data:
- Name:
Entry: 7
Data:
- Name: $k
Entry: 3
Data: 4
- Name: $v
Entry: 10
Data: 3
- Name:
Entry: 8
Data:
- Name:
Entry: 13
Data:
- Name:
Entry: 8
Data:

8
Assets/_Project/ScriptableObject/Excel/Hero/_HeroUtil.asset.meta

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 05ad337119e018146aff00aa4e9e09b5
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
Loading…
Cancel
Save