
文件描述
数据代码
| GameLayer | 存储LayersSettingPanel一致的常量,方便其他代码调用 |
| GameTag | 存储TagsSettingPanel一致的常量,方便其他代码调用 |
| GameSortingLayer | 存储SortingLayerSettingPanel一致的枚举,方便其他代码调用 |
编辑器代码
| GameLayer_Editor | 导入,导出Layer Setting |
| GameTag_Editor | 导入,导出Tag Setting |
| GameSortingLayer_Editor | 导入,导出SortingLayer Setting |
Assets/Game/Script/Unity/GameLayer.cs
namespace Games
{
public partial class GameLayer
{
#region Unity Default Lock
public const int Default = 1 << 0;
public const int TransparentFX = 1 << 1;
public const int Ignore_Raycast = 1 << 2;
public const int Layer3 = 1 << 3;
public const int Water = 1 << 4;
public const int UI = 1 << 5;
public const int Layer6 = 1 << 6;
public const int Layer7 = 1 << 7;
#endregion
public const int War_Terrain = 1 << 8;
public const int War_Unit = 1 << 9;
public const int War_Obstacle = 1 << 10;
public const int Layer11 = 1 << 11;
public const int Layer12 = 1 << 12;
public const int Layer13 = 1 << 13;
public const int Layer14 = 1 << 14;
public const int Layer15 = 1 << 15;
public const int Layer16 = 1 << 16;
public const int Layer17 = 1 << 17;
public const int Layer18 = 1 << 18;
public const int Layer19 = 1 << 19;
public const int Layer20 = 1 << 20;
public const int Layer21 = 1 << 21;
public const int Layer22 = 1 << 22;
public const int Layer23 = 1 << 23;
public const int Layer24 = 1 << 24;
public const int Layer25 = 1 << 25;
public const int Layer26 = 1 << 26;
public const int Layer27 = 1 << 27;
public const int Layer28 = 1 << 28;
public const int Layer29 = 1 << 29;
public const int Layer30 = 1 << 30;
public const int Layer31 = 1 << 31;
public static int customBeginIndex = 8;
public static string[] customLayers = {"War_Terrain","War_Unit","War_Obstacle","Layer11","Layer12","Layer13","Layer14","Layer15","Layer16","Layer17","Layer18","Layer19","Layer20","Layer21","Layer22","Layer23","Layer24","Layer25","Layer26","Layer27","Layer28","Layer29","Layer30","Layer31"};
}
}
Assets/Game/Script/Unity/GameLayer_Editor.cs
#if UNITY_EDITOR
using UnityEngine;
using System.Collections;
using UnityEditor;
using System.IO;
using System.Collections.Generic;
namespace Games
{
public partial class GameLayer
{
[MenuItem("Edit/Game/SetEditorLayer")]
public static void SetEditorTag ()
{
SerializedObject tagManager = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/TagManager.asset")[0]);
SerializedProperty it = tagManager.GetIterator();
while (it.NextVisible(true))
{
if(it.name == "layers")
{
int end = Mathf.Min(customBeginIndex + customLayers.Length, it.arraySize);
for (int i = customBeginIndex; i < end; i++)
{
SerializedProperty dataPoint = it.GetArrayElementAtIndex(i);
dataPoint.stringValue = customLayers[i - customBeginIndex];
}
tagManager.ApplyModifiedProperties();
if (customBeginIndex + customLayers.Length > 32)
{
Debug.LogFormat("<color=red>Layer不能超过31</color>");
}
break;
}
}
}
[MenuItem("Edit/Game/Generate GameLayer.cs")]
public static void GenerateGameLayer ()
{
SerializedObject tagManager = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/TagManager.asset")[0]);
SerializedProperty it = tagManager.GetIterator();
while (it.NextVisible(true))
{
if(it.name == "layers")
{
StringWriter sw = new StringWriter();
sw.WriteLine("namespace Games");
sw.WriteLine("{");
sw.WriteLine("\tpublic partial class GameLayer");
sw.WriteLine("\t{");
sw.WriteLine("\t\t#region Unity Default Lock");
for (int i = 0; i < 8; i++)
{
SerializedProperty dataPoint = it.GetArrayElementAtIndex(i);
string fieldname = string.IsNullOrEmpty(dataPoint.stringValue) ? "Layer" + i : dataPoint.stringValue.Replace(" ", "_");
sw.WriteLine(string.Format("\t\tpublic const int {0}\t\t\t=\t1 << {1};", fieldname , i ));
}
sw.WriteLine("\t\t#endregion");
sw.WriteLine("\n");
List<string> fieldnames = new List<string>();
for (int i = 8; i < it.arraySize; i++)
{
SerializedProperty dataPoint = it.GetArrayElementAtIndex(i);
string fieldname = string.IsNullOrEmpty(dataPoint.stringValue) ? "Layer" + i : dataPoint.stringValue.Replace(" ", "_");
sw.WriteLine(string.Format("\t\tpublic const int {0}\t\t\t=\t1 << {1};", fieldname , i ));
fieldnames.Add(string.Format("\"{0}\"", fieldname));
}
string fieldnameStr = "";
string gap = "";
for(int i = 0; i < fieldnames.Count; i ++)
{
fieldnameStr += gap;
fieldnameStr += fieldnames[i];
gap = ",";
}
sw.WriteLine("\n");
sw.WriteLine("\t\tpublic static int customBeginIndex = 8;");
sw.WriteLine("\t\tpublic static string[] customLayers = {"+fieldnameStr+"};");
sw.WriteLine("\t}");
sw.WriteLine("}");
File.WriteAllText(Application.dataPath + "/Game/Scripts/Unity/GameLayer.cs", sw.ToString(), System.Text.Encoding.UTF8);
AssetDatabase.Refresh();
break;
}
}
}
}
}
#endif
Assets/Game/Script/Unity/GameTag.cs
namespace Games
{
public partial class GameTag
{
#region Unity Default Lock
public const string Untagged = "Untagged";
public const string Respawn = "Respawn";
public const string Finish = "Finish";
public const string EditorOnly = "EditorOnly";
public const string MainCamera = "MainCamera";
public const string Player = "Player";
public const string GameController = "GameController";
#endregion
public const string UICamera = "UICamera";
public const string War_Terrain = "War_Terrain";
public const string War_Unit = "War_Unit";
public static int customBeginIndex = 0;
public static string[] customTags = {"UICamera","War_Terrain","War_Unit"};
}
}
Assets/Game/Script/Unity/GameTag_Editor.cs
#if UNITY_EDITOR
using UnityEngine;
using System.Collections;
using UnityEditor;
using System.IO;
using System.Collections.Generic;
namespace Games
{
public partial class GameTag
{
[MenuItem("Edit/Game/SetEditorTag")]
public static void SetEditorTag ()
{
SerializedObject tagManager = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/TagManager.asset")[0]);
SerializedProperty it = tagManager.GetIterator();
while (it.NextVisible(true))
{
if(it.name == "tags")
{
it.ClearArray();
int end = customBeginIndex + customTags.Length;
if(it.arraySize < end)
{
it.arraySize = end;
}
for (int i = customBeginIndex; i < end; i++)
{
SerializedProperty dataPoint = it.GetArrayElementAtIndex(i);
dataPoint.stringValue = customTags[i - customBeginIndex];
}
tagManager.ApplyModifiedProperties();
break;
}
}
}
[MenuItem("Edit/Game/Generate GameTag.cs")]
public static void GenerateGameTag ()
{
SerializedObject tagManager = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/TagManager.asset")[0]);
SerializedProperty it = tagManager.GetIterator();
while (it.NextVisible(true))
{
if(it.name == "tags")
{
StringWriter sw = new StringWriter();
sw.WriteLine("namespace Games");
sw.WriteLine("{");
sw.WriteLine("\tpublic partial class GameTag");
sw.WriteLine("\t{");
sw.WriteLine("\t\t#region Unity Default Lock");
sw.WriteLine("\t\tpublic const string Untagged = \"Untagged\";");
sw.WriteLine("\t\tpublic const string Respawn = \"Respawn\";");
sw.WriteLine("\t\tpublic const string Finish = \"Finish\";");
sw.WriteLine("\t\tpublic const string EditorOnly = \"EditorOnly\";");
sw.WriteLine("\t\tpublic const string MainCamera = \"MainCamera\";");
sw.WriteLine("\t\tpublic const string Player = \"Player\";");
sw.WriteLine("\t\tpublic const string GameController = \"GameController\";");
sw.WriteLine("\t\t#endregion");
sw.WriteLine("\n");
string fieldnameStr = "";
string gap = "";
for (int i = 0; i < it.arraySize; i++)
{
SerializedProperty dataPoint = it.GetArrayElementAtIndex(i);
string fieldname = string.IsNullOrEmpty(dataPoint.stringValue) ? "Tag" + i : dataPoint.stringValue.Replace(" ", "_");
sw.WriteLine(string.Format("\t\tpublic const string {0} = \"{1}\";", fieldname, dataPoint.stringValue));
fieldnameStr += gap;
fieldnameStr += string.Format("\"{0}\"", dataPoint.stringValue);
gap = ",";
}
sw.WriteLine("\n");
sw.WriteLine("\t\tpublic static int customBeginIndex = 0;");
sw.WriteLine("\t\tpublic static string[] customTags = {"+fieldnameStr+"};");
sw.WriteLine("\t}");
sw.WriteLine("}");
File.WriteAllText(Application.dataPath + "/Game/Scripts/Unity/GameTag.cs", sw.ToString(), System.Text.Encoding.UTF8);
AssetDatabase.Refresh();
break;
}
}
}
}
}
#endif
Assets/Game/Script/Unity/GameSortingLayer.cs
namespace Games
{
public enum GameSortingLayer
{
War_Terrain = -2,
War_Shadow = -1,
Default = 0,
War_Unit = 1,
}
}
Assets/Game/Script/Unity/GameSortingLayer_Editor.cs
#if UNITY_EDITOR
using UnityEngine;
using System.Collections;
using System;
using UnityEditor;
using System.IO;
namespace Games
{
public class GameSortingLayerEditor
{
public static bool IsUseBitIndex = true;
[MenuItem("Edit/Game/SetEditorSortingLayer")]
public static void SetEditorTag ()
{
SerializedObject tagManager = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/TagManager.asset")[0]);
SerializedProperty it = tagManager.GetIterator();
while (it.NextVisible(true))
{
if(it.name == "m_SortingLayers")
{
int[] ids ;
string[] names ;
EnumUtil.GetValuesAndFieldNames<GameSortingLayer>(out ids, out names);
it.ClearArray();
int length = ids.Length;
if(it.arraySize < length)
{
it.arraySize = length;
}
for (int i = 0; i < length; i++)
{
SerializedProperty dataPoint = it.GetArrayElementAtIndex(i);
SerializedProperty namePoint = dataPoint.FindPropertyRelative("name");
SerializedProperty uniqueIDPoint = dataPoint.FindPropertyRelative("uniqueID");
namePoint.stringValue = names[i];
uniqueIDPoint.intValue = IsUseBitIndex ? 1 << (ids[i] - 1) : ids[i];
}
tagManager.ApplyModifiedProperties();
break;
}
}
}
[MenuItem("Edit/Game/Generate GameSortingLayer.cs")]
public static void GameSortingLayer ()
{
SerializedObject tagManager = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/TagManager.asset")[0]);
SerializedProperty it = tagManager.GetIterator();
while (it.NextVisible(true))
{
if(it.name == "m_SortingLayers")
{
StringWriter sw = new StringWriter();
sw.WriteLine("namespace Games");
sw.WriteLine("{");
sw.WriteLine("\tpublic enum GameSortingLayer");
sw.WriteLine("\t{");
int bitIndex = 0;
for (int i = 0; i < it.arraySize; i++)
{
SerializedProperty dataPoint = it.GetArrayElementAtIndex(i);
SerializedProperty namePoint = dataPoint.FindPropertyRelative("name");
SerializedProperty uniqueIDPoint = dataPoint.FindPropertyRelative("uniqueID");
Debug.Log(namePoint.stringValue + " = " + uniqueIDPoint.intValue);
if(uniqueIDPoint.intValue == 0)
{
bitIndex = i;
break;
}
}
Debug.Log(bitIndex);
for (int i = 0; i < it.arraySize; i++)
{
SerializedProperty dataPoint = it.GetArrayElementAtIndex(i);
SerializedProperty namePoint = dataPoint.FindPropertyRelative("name");
SerializedProperty uniqueIDPoint = dataPoint.FindPropertyRelative("uniqueID");
sw.WriteLine(string.Format("\t\t{0}\t\t\t=\t{1},", namePoint.stringValue.Replace(" ", "_"), IsUseBitIndex ? i - bitIndex : uniqueIDPoint.intValue ));
}
sw.WriteLine("\t}");
sw.WriteLine("}");
File.WriteAllText(Application.dataPath + "/Game/Scripts/Unity/GameSortingLayer.cs", sw.ToString(), System.Text.Encoding.UTF8);
AssetDatabase.Refresh();
break;
}
}
}
}
}
#endif
EnumUtil.cs
using UnityEngine;
using System.Collections;
using System.Reflection;
using System;
using System.Collections.Generic;
public class EnumUtil
{
public static void GetValuesAndFieldNames<T>(out int[] ids, out string[] names)
{
Type type = typeof(T);
T[] valueArr =(T[]) Enum.GetValues(type);
List<T> valueList = new List<T>(valueArr);
valueList.Sort();
names = new string[valueList.Count];
ids = new int[valueList.Count];
for(int i = 0; i < valueList.Count; i ++)
{
ids[i] = Convert.ToInt32(valueList[i]);
names[i] = Enum.GetName(type, valueList[i]);
}
}
}