C# 为什么在通过另一个脚本将脚本添加到选定的游戏对象时,它';将脚本添加到列表中的每个对象两次? 使用系统; 使用系统集合; 使用System.Collections.Generic; 使用UnityEditor; 使用UnityEngine; 公共类GenerateAutomaticGuid:编辑器 { [MenuItem(“游戏对象/生成Guid”,false,11)] 私有静态void GenerateGuid() { foreach(Selection.objects中的游戏对象o) { o、 AddComponent(); o、 GetComponent().GenerateGuidNum(); o、 tag=“我的唯一ID”; } } }
例如,我在层次结构中选择两个游戏对象右键单击并生成GUID我使用断点,它在列表选择中的每个对象上循环两次。对象两次,因此列表中的每个对象都有两次脚本生成GUID。我希望它只向每个对象添加一次脚本 这是GenerateGuid脚本:C# 为什么在通过另一个脚本将脚本添加到选定的游戏对象时,它';将脚本添加到列表中的每个对象两次? 使用系统; 使用系统集合; 使用System.Collections.Generic; 使用UnityEditor; 使用UnityEngine; 公共类GenerateAutomaticGuid:编辑器 { [MenuItem(“游戏对象/生成Guid”,false,11)] 私有静态void GenerateGuid() { foreach(Selection.objects中的游戏对象o) { o、 AddComponent(); o、 GetComponent().GenerateGuidNum(); o、 tag=“我的唯一ID”; } } },c#,unity3d,C#,Unity3d,例如,我在层次结构中选择两个游戏对象右键单击并生成GUID我使用断点,它在列表选择中的每个对象上循环两次。对象两次,因此列表中的每个对象都有两次脚本生成GUID。我希望它只向每个对象添加一次脚本 这是GenerateGuid脚本: using System; using System.Collections; using System.Collections.Generic; using UnityEditor; using UnityEngine; public class Generate
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
public class GenerateAutomaticGuid : Editor
{
[MenuItem("GameObject/Generate Guid", false, 11)]
private static void GenerateGuid()
{
foreach (GameObject o in Selection.objects)
{
o.AddComponent<GenerateGuid>();
o.GetComponent<GenerateGuid>().GenerateGuidNum();
o.tag = "My Unique ID";
}
}
}
使用系统;
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
公共类GenerateGuid:MonoBehavior,IStateQuery
{
公共字符串uniqueGuidID;
公共储蓄存款;
公共游戏对象;
私家侦探没有;
private bool isNaviChildOfKid=false;
public void GenerateGuidNum()
{
guidID=Guid.NewGuid();
uniqueGuidID=guidID.ToString();
}
私有状态m_State=新状态();
公共Guid UniqueId=>Guid.Parse(“E0B03C9C-9680-4E02-B06B-E227831CB33F”);
私有阶级国家
{
公共图书馆;
}
公共字符串GetState()
{
返回JsonUtility.ToJson(m_状态);
}
公共无效设置状态(字符串jsonString)
{
m_state=JsonUtility.FromJson(jsonString);
if(m_state.naviInHand==true)
{
transform.GetComponent().distance=0;
transform.parent=GameObject.Find(“Navi parent”).transform;//rig\u f\u middle;
transform.localPosition=GameObject.Find(“Navi父项”).transform.localPosition;
transform.localRotation=Quaternion.identity;
transform.localScale=新矢量3(0.001f、0.001f、0.001f);
}
}
私有void更新()
{
if(transform.IsChildOf(naviParent.transform)=false&&isNaviChildOfKid==false)
{
m_state.naviInHand=真;
saveLoad.Save();
isNaviChildOfKid=true;
}
}
}
我调用GenerateGuid的所有位置的屏幕截图:
也许您执行了两次
GenerateGuid
,或者按游戏对象的数量执行?
您是否可以显示执行GenerateGuid的所有位置?您可以在foreach循环中添加空检查,查看对象是否已经有GenerateGuid组件,如果有,则跳过该过程:
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GenerateGuid : MonoBehaviour, IStateQuery
{
public string uniqueGuidID;
public SaveLoad saveLoad;
public GameObject naviParent;
private Guid guidID;
private bool isNaviChildOfKid = false;
public void GenerateGuidNum()
{
guidID = Guid.NewGuid();
uniqueGuidID = guidID.ToString();
}
private State m_state = new State();
public Guid UniqueId => Guid.Parse("E0B03C9C-9680-4E02-B06B-E227831CB33F");
private class State
{
public bool naviInHand;
}
public string GetState()
{
return JsonUtility.ToJson(m_state);
}
public void SetState(string jsonString)
{
m_state = JsonUtility.FromJson<State>(jsonString);
if (m_state.naviInHand == true)
{
transform.GetComponent<InteractableItem>().distance = 0;
transform.parent = GameObject.Find("Navi Parent").transform;//rig_f_middle;
transform.localPosition = GameObject.Find("Navi Parent").transform.localPosition;
transform.localRotation = Quaternion.identity;
transform.localScale = new Vector3(0.001f, 0.001f, 0.001f);
}
}
private void Update()
{
if(transform.IsChildOf(naviParent.transform) == false && isNaviChildOfKid == false)
{
m_state.naviInHand = true;
saveLoad.Save();
isNaviChildOfKid = true;
}
}
}
foreach(选择中的游戏对象o.objects)
{
如果(!o.GetComponent()){
o、 AddComponent();
o、 GetComponent().GenerateGuidNum();
o、 tag=“我的唯一ID”;
}
}
它不会阻止您的函数被多次调用,但可以防止重复的GenerateGuid组件。我在问题中添加了一个屏幕截图,说明我在哪里调用GenerateGuid脚本或使用它。我在两个地方使用GetComponent来获取并使用这个脚本。其他两个位置位于GenerateAutomaticGuid编辑器脚本中。我并没有调用anywhere来生成AutomaticGuid,只是在选择对象时用鼠标右键单击它。我使用了一个断点,例如,如果列表中有两个项目,它将循环4次。但是有两项。如果选择了三个对象,它会添加三个GUID吗?我已经有一段时间没有接触编辑器代码了,但我似乎记得这是一个问题;我相信上下文菜单会在每个选定对象上调用。
foreach (GameObject o in Selection.objects)
{
if(!o.GetComponent<GenerateGuid>()){
o.AddComponent<GenerateGuid>();
o.GetComponent<GenerateGuid>().GenerateGuidNum();
o.tag = "My Unique ID";
}
}