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");