Unity에서 코드로 Layer 및 Tag 레이어 추가
5011 단어 Unity
인터넷에서 다른 사람이 쓴 레이어를 추가한 글을 봤지만 그 안의 코드는 현재 버전의 유닛에 맞지 않는다.우송모모 같아.
의 Unity3D 연구원 스크립트에 tag 및 Layer가 자동으로 추가됩니다.유닛 버전에 일찍 줬어요.다양한 버전이 통합되어 테스트에 사용할 수 있으며 코드는 다음과 같습니다.
장면 속의 물체의layer는 코드로 설정해야 합니다.그렇지 않으면 레이어가 추가되었음에도 불구하고 일치하지 않을 수 있습니다.Tag 값은 이 문제를 일으키지 않습니다.
생각해 보니 유닛이 태그와 일치할 때 TagList를 훑어보고 해당하는 태그 설정을 찾는 것이다.유닛은 Layer층을 설정할 때 등급을 통해 설정한다. 등급에 대응하는 이름이 정확하지 않아도.그래서 가장 좋은 것은 코드를 통해 물체의layer 등급을 설정하는 것이다.
private static string[] _testLayerArr = { "LayerOne", "LayerTwo", "LayerThree" };
private static string[] _testTagArr = { "TagOne", "TagTwo", "TagThree" };
private static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths)
{
foreach (string s in importedAssets)
{
if (s.Equals("Assets/Test/LayerTest/ExportLayer.cs"))
{
foreach (string tag in _testTagArr)
{
AddTag(tag);
}
foreach (string layer in _testLayerArr)
{
AddLayer(layer);
}
return;
}
}
}
static bool IsHasLayer(string layer)
{
SerializedObject tagManager = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/Tagmanager.asset"));
SerializedProperty it = tagManager.GetIterator();
while (it.NextVisible(true))
{
if (it.name == "layers")
{
for (int i = 0; i < it.arraySize; i++)
{
SerializedProperty sp = it.GetArrayElementAtIndex(i);
if (!string.IsNullOrEmpty(sp.stringValue))
{
if (sp.stringValue.Equals(layer))
{
sp.stringValue = string.Empty;
tagManager.ApplyModifiedProperties();
}
}
}
}
}
for (int i = 0; i < UnityEditorInternal.InternalEditorUtility.layers.Length; i++)
{
if (UnityEditorInternal.InternalEditorUtility.layers[i].Contains(layer))
return true;
}
return false;
}
static bool IsHasTag(string tag)
{
for (int i = 0; i < UnityEditorInternal.InternalEditorUtility.tags.Length; i++)
{
if (UnityEditorInternal.InternalEditorUtility.tags[i].Contains(tag))
return true;
}
return false;
}
///
/// layer
///
///
private static void AddLayer(string layer)
{
if (!IsHasLayer(layer))
{
SerializedObject tagManager = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/TagManager.asset")[0]);
SerializedProperty it = tagManager.GetIterator();
while (it.NextVisible(true))
{
if (it.name == "layers")
{
for (int i = 0; i < it.arraySize; i++)
{
if (i == 3||i==6||i==7)
{
continue;
}
SerializedProperty dataPoint = it.GetArrayElementAtIndex(i);
if (string.IsNullOrEmpty(dataPoint.stringValue))
{
dataPoint.stringValue = layer;
tagManager.ApplyModifiedProperties();
return;
}
}
}
}
}
}
///
/// tag
///
///
private static void AddTag(string tag)
{
if (!IsHasTag(tag))
{
SerializedObject tagManager = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/TagManager.asset")[0]);
SerializedProperty it = tagManager.GetIterator();
while (it.NextVisible(true))
{
if (it.name == "tags")
{
for (int i = 0; i < it.arraySize; i++)
{
SerializedProperty dataPoint = it.GetArrayElementAtIndex(i);
if (string.IsNullOrEmpty(dataPoint.stringValue))
{
dataPoint.stringValue = tag;
tagManager.ApplyModifiedProperties();
return;
}
}
}
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
photonnetwork.instantiate에서 gamepobject 유형을 생성 한 다음 상태 및 값을 참조하는 방법주로 마지막 기사에서 일어난 일의 수정입니다. 지난번↓ 그럼 주제입니다. (타이틀이 정리되어 없어서 죄송합니다) 우선 전회의 Illegal view ID:0입니다만 photonnetwork.instantiate를 사...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.