Unity Editor 脚本用指定 GameObject 的子级填充序列化数组 [关闭]

Posted

技术标签:

【中文标题】Unity Editor 脚本用指定 GameObject 的子级填充序列化数组 [关闭]【英文标题】:Unity Editor script to fill a serialized array with children of a specified GameObject [closed] 【发布时间】:2018-12-08 19:28:22 【问题描述】:

我有一个“GameObject”的序列化字段,我想自动填充我想手动指定的游戏对象的子项。

如果我无法手动更改组件上的此数组,而只能将其显示为“灰色”状态,则可以加分。

这个操作可行吗?提前致谢。

【问题讨论】:

你不能序列化一个游戏对象。 docs.unity3d.com/Manual/script-Serialization.html @Bijan 我可能误解了你的意思,但统一允许你序列化游戏对象字段 您可能会设法存储一个游戏对象,但我认为统一无法从序列化对象重建对象树。我可以确定的一件事是 Transform 不能被序列化,因为只有它的引用被序列化。 一方面,预制件是序列化的对象树。那些会起作用的。但是,如果您向我们准确展示您的需求,我们可以提供更好的帮助。 ***.com/help/how-to-ask 【参考方案1】:

会有帮助吗?

GameObject[] myArray;
GameObject parent;

void GetChildren()


    myArray=new GameObject[parent.transform.childCount];
    for (int i=0;i<parent.transform.childCount;i++)
    myArray[i]=parent.transform.GetChild(i).gameObject;


至于以不可编辑状态显示它 - 可以,但需要为该组件编写自定义编辑器/检查器。

【讨论】:

感谢您的回复!幸运的是,我已经解决了这部分问题。只需要在游戏未运行时找到一种方法即可。基本上是一个更新功能,但仅在游戏未运行时。如果更新函数在运行时根本没有执行,这也会很有帮助 如果在声明 monobehaviuour 时在行上方添加 [ExecuteInEditMode] 标签,将执行更新 是的,但我只希望它执行。我的类包含一堆其他功能,例如 OnEnable、Start 等,但我希望它只在游戏不玩时执行更新。我可以手动检查游戏是否在更新时运行,但我不想浪费帧 void Start() if (Application.isPlaying) enabled=false; 【参考方案2】:

解决方案:

[CustomEditor( typeOf( ClassYouWantToManage ) )]
class ClassYouWantToManageEditor

  ClassYouWantToManage value;

  void OnEnable()
  
   // target is the upcasted version of your managed class
   value = (ClassYouWantToManage) target;
  

  public override void OnInspectorGUI()
  
    // specifiedObject is the 'parent', with whos children you want to populate the array. has to be public
    if (value.specifiedObject == null)
    
      throw new Exception ("Specified object is null");
    

    // targetArray is the array you want to populate with children. has to be public
    // simple population alg
    value.targetArray = new GameObject[specifiedObject.transform.ChildCount];
    for (int i = 0; i < specifiedObject.transform.ChildCount; i++)
    
      value.targetArray[ i ] = specifiedObject.transform.GetChild( i ).gameObject;
     
  
  

【讨论】:

以上是关于Unity Editor 脚本用指定 GameObject 的子级填充序列化数组 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Unity-Editor按钮和菜单显示

Unity的几个特殊文件夹

Unity3D引擎中特殊的文件夹

csharp Unity Editor用于生成字体的窗口脚本。请参阅:http://gamedev.stackexchange.com/a/91936/16587

Unity Editor 检查工程Prefab(预设)中的空组件

Unity查找Editor下Project视图中特定的资源