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# 为什么在通过另一个脚本将脚本添加到选定的游戏对象时,它';将脚本添加到列表中的每个对象两次? 使用系统; 使用系统集合; 使用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

例如,我在层次结构中选择两个游戏对象右键单击并生成GUID我使用断点,它在列表选择中的每个对象上循环两次。对象两次,因此列表中的每个对象都有两次脚本生成GUID。我希望它只向每个对象添加一次脚本

这是GenerateGuid脚本:

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