C# 如何使用unity中的脚本创建新层
我需要的功能,通过所有现有的层名称,并找到我的层是否存在,如果没有,然后代码需要添加到层列表给定的层 我试过这个密码C# 如何使用unity中的脚本创建新层,c#,unity3d,C#,Unity3d,我需要的功能,通过所有现有的层名称,并找到我的层是否存在,如果没有,然后代码需要添加到层列表给定的层 我试过这个密码 void CreateLayer() { SerializedObject tagManager=新的SerializedObject(AssetDatabase.LoadAllAssetPath(“ProjectSettings/tagManager.asset”)[0]); SerializedProperty layers=tagManager.FindProperty(“
void CreateLayer()
{
SerializedObject tagManager=新的SerializedObject(AssetDatabase.LoadAllAssetPath(“ProjectSettings/tagManager.asset”)[0]);
SerializedProperty layers=tagManager.FindProperty(“层”);
if(layers==null | |!layers.isArray)
{
LogWarning(“无法设置层。层和标记数据的格式可能在此版本的Unity中已更改。”);
LogWarning(“层为空:”+(层==null));
返回;
}
对于(int i=8;i<31;i++)
{
SerializedProperty layerSP=层。GetArrayElementIndex(i);
if(layerSP.stringValue==“MyLayer”)
{
返回;
}
}
对于(int i=8;i<31;i++)
{
SerializedProperty layerSP=层。GetArrayElementIndex(i);
如果(layerSP.stringValue!=“”)
{
layerSP.stringValue=“MyLayer”;
打破
}
}
tagManager.ApplyModifiedProperties();
}
但这对我不起作用
顺便说一下,我使用的是unity 5.6.3
如果有人知道答案,请分享我发现这个答案只在编辑器中有效,在构建中不起作用
创建一个新的c#脚本并将此代码添加到其中
using UnityEngine;
using System.Collections;
public class Layers
{
private static int maxTags = 10000;
private static int maxLayers = 31;
/////////////////////////////////////////////////////////////////////
public void AddNewLayer(string name)
{
CreateLayer(name);
}
public void DeleteLayer(string name)
{
RemoveLayer(name);
}
////////////////////////////////////////////////////////////////////
/// <summary>
/// Adds the layer.
/// </summary>
/// <returns><c>true</c>, if layer was added, <c>false</c> otherwise.</returns>
/// <param name="layerName">Layer name.</param>
public static bool CreateLayer(string layerName)
{
// Open tag manager
SerializedObject tagManager = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/TagManager.asset")[0]);
// Layers Property
SerializedProperty layersProp = tagManager.FindProperty("layers");
if (!PropertyExists(layersProp, 0, maxLayers, layerName))
{
SerializedProperty sp;
// Start at layer 9th index -> 8 (zero based) => first 8 reserved for unity / greyed out
for (int i = 8, j = maxLayers; i < j; i++)
{
sp = layersProp.GetArrayElementAtIndex(i);
if (sp.stringValue == "")
{
// Assign string value to layer
sp.stringValue = layerName;
Debug.Log("Layer: " + layerName + " has been added");
// Save settings
tagManager.ApplyModifiedProperties();
return true;
}
if (i == j)
Debug.Log("All allowed layers have been filled");
}
}
else
{
//Debug.Log ("Layer: " + layerName + " already exists");
}
return false;
}
public static string NewLayer(string name)
{
if (name != null || name != "")
{
CreateLayer(name);
}
return name;
}
/// <summary>
/// Removes the layer.
/// </summary>
/// <returns><c>true</c>, if layer was removed, <c>false</c> otherwise.</returns>
/// <param name="layerName">Layer name.</param>
public static bool RemoveLayer(string layerName)
{
// Open tag manager
SerializedObject tagManager = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/TagManager.asset")[0]);
// Tags Property
SerializedProperty layersProp = tagManager.FindProperty("layers");
if (PropertyExists(layersProp, 0, layersProp.arraySize, layerName))
{
SerializedProperty sp;
for (int i = 0, j = layersProp.arraySize; i < j; i++)
{
sp = layersProp.GetArrayElementAtIndex(i);
if (sp.stringValue == layerName)
{
sp.stringValue = "";
Debug.Log("Layer: " + layerName + " has been removed");
// Save settings
tagManager.ApplyModifiedProperties();
return true;
}
}
}
return false;
}
/// <summary>
/// Checks to see if layer exists.
/// </summary>
/// <returns><c>true</c>, if layer exists, <c>false</c> otherwise.</returns>
/// <param name="layerName">Layer name.</param>
public static bool LayerExists(string layerName)
{
// Open tag manager
SerializedObject tagManager = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/TagManager.asset")[0]);
// Layers Property
SerializedProperty layersProp = tagManager.FindProperty("layers");
return PropertyExists(layersProp, 0, maxLayers, layerName);
}
/// <summary>
/// Checks if the value exists in the property.
/// </summary>
/// <returns><c>true</c>, if exists was propertyed, <c>false</c> otherwise.</returns>
/// <param name="property">Property.</param>
/// <param name="start">Start.</param>
/// <param name="end">End.</param>
/// <param name="value">Value.</param>
private static bool PropertyExists(SerializedProperty property, int start, int end, string value)
{
for (int i = start; i < end; i++)
{
SerializedProperty t = property.GetArrayElementAtIndex(i);
if (t.stringValue.Equals(value))
{
return true;
}
}
return false;
}
}
我发现这个答案只在编辑器中有效,在构建中不起作用
创建一个新的c#脚本并将此代码添加到其中
using UnityEngine;
using System.Collections;
public class Layers
{
private static int maxTags = 10000;
private static int maxLayers = 31;
/////////////////////////////////////////////////////////////////////
public void AddNewLayer(string name)
{
CreateLayer(name);
}
public void DeleteLayer(string name)
{
RemoveLayer(name);
}
////////////////////////////////////////////////////////////////////
/// <summary>
/// Adds the layer.
/// </summary>
/// <returns><c>true</c>, if layer was added, <c>false</c> otherwise.</returns>
/// <param name="layerName">Layer name.</param>
public static bool CreateLayer(string layerName)
{
// Open tag manager
SerializedObject tagManager = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/TagManager.asset")[0]);
// Layers Property
SerializedProperty layersProp = tagManager.FindProperty("layers");
if (!PropertyExists(layersProp, 0, maxLayers, layerName))
{
SerializedProperty sp;
// Start at layer 9th index -> 8 (zero based) => first 8 reserved for unity / greyed out
for (int i = 8, j = maxLayers; i < j; i++)
{
sp = layersProp.GetArrayElementAtIndex(i);
if (sp.stringValue == "")
{
// Assign string value to layer
sp.stringValue = layerName;
Debug.Log("Layer: " + layerName + " has been added");
// Save settings
tagManager.ApplyModifiedProperties();
return true;
}
if (i == j)
Debug.Log("All allowed layers have been filled");
}
}
else
{
//Debug.Log ("Layer: " + layerName + " already exists");
}
return false;
}
public static string NewLayer(string name)
{
if (name != null || name != "")
{
CreateLayer(name);
}
return name;
}
/// <summary>
/// Removes the layer.
/// </summary>
/// <returns><c>true</c>, if layer was removed, <c>false</c> otherwise.</returns>
/// <param name="layerName">Layer name.</param>
public static bool RemoveLayer(string layerName)
{
// Open tag manager
SerializedObject tagManager = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/TagManager.asset")[0]);
// Tags Property
SerializedProperty layersProp = tagManager.FindProperty("layers");
if (PropertyExists(layersProp, 0, layersProp.arraySize, layerName))
{
SerializedProperty sp;
for (int i = 0, j = layersProp.arraySize; i < j; i++)
{
sp = layersProp.GetArrayElementAtIndex(i);
if (sp.stringValue == layerName)
{
sp.stringValue = "";
Debug.Log("Layer: " + layerName + " has been removed");
// Save settings
tagManager.ApplyModifiedProperties();
return true;
}
}
}
return false;
}
/// <summary>
/// Checks to see if layer exists.
/// </summary>
/// <returns><c>true</c>, if layer exists, <c>false</c> otherwise.</returns>
/// <param name="layerName">Layer name.</param>
public static bool LayerExists(string layerName)
{
// Open tag manager
SerializedObject tagManager = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/TagManager.asset")[0]);
// Layers Property
SerializedProperty layersProp = tagManager.FindProperty("layers");
return PropertyExists(layersProp, 0, maxLayers, layerName);
}
/// <summary>
/// Checks if the value exists in the property.
/// </summary>
/// <returns><c>true</c>, if exists was propertyed, <c>false</c> otherwise.</returns>
/// <param name="property">Property.</param>
/// <param name="start">Start.</param>
/// <param name="end">End.</param>
/// <param name="value">Value.</param>
private static bool PropertyExists(SerializedProperty property, int start, int end, string value)
{
for (int i = start; i < end; i++)
{
SerializedProperty t = property.GetArrayElementAtIndex(i);
if (t.stringValue.Equals(value))
{
return true;
}
}
return false;
}
}
你一定是在玩一个老游戏:)。。。为什么不直接使用?你一定是在玩一个旧游戏:)。。。任何人为什么不直接使用?
new Layers().AddNewLayer("PP");