これはなに?
多分標準機能であるんじゃないかな、と思っているんですが、どうしても見つからなかったので書きました。
複数Objectに何かしらちょっとルール決めて、一括でPrefabを生成します
使い方
MultiPrefabGenerator.cs をどこかにおいて、MultiPrefabGenerator/MainWindowを選択。
保存したい先のPathをコピって、Prefixつけたければつけて、数字つけたりObjectの名前を変えたいか選び、D&Dの後にボタンを押します。ボタンが最後でさえあればほかは適当に埋めてOKです。
本体
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
<span class="synComment">// Copyright (c) 2021 Hiroyuki Kako</span> <span class="synComment">// This software is released under the MIT License, see LICENSE.</span> <span class="synPreProc">#if UNITY_EDITOR</span> <span class="synStatement">using</span> System.Collections.Generic; <span class="synStatement">using</span> UnityEditor; <span class="synStatement">using</span> UnityEngine; <span class="synType">public</span> <span class="synType">class</span> MultiPrefabGenerator : EditorWindow { [MenuItem(<span class="synConstant">"KEditorExtensions/MultiPrefabGenerator"</span>)] <span class="synType">private</span> <span class="synType">static</span> <span class="synType">void</span> Open() { GetWindow<MultiPrefabGenerator>(<span class="synConstant">"Generate multi prefab."</span>); } <span class="synType">public</span> List<GameObject> _targetObjectsInEditor; <span class="synType">private</span> <span class="synType">static</span> <span class="synType">string</span> _path; <span class="synType">private</span> <span class="synType">static</span> <span class="synType">string</span> _objectPrefix; <span class="synType">private</span> <span class="synType">static</span> <span class="synType">string</span> _objectName; <span class="synType">private</span> <span class="synType">static</span> <span class="synType">bool</span> _wannaCount; <span class="synType">private</span> <span class="synType">static</span> <span class="synType">bool</span> _wannaNaming; <span class="synType">public</span> <span class="synType">void</span> OnGUI() { <span class="synStatement">using</span> (<span class="synStatement">new</span> GUILayout.HorizontalScope()) { _path = EditorGUILayout.TextField(<span class="synConstant">"Enter target path"</span>, _path); } <span class="synStatement">using</span> (<span class="synStatement">new</span> GUILayout.HorizontalScope()) { _objectPrefix = EditorGUILayout.TextField(<span class="synConstant">"Enter prefix when needed"</span>, _objectPrefix); } <span class="synStatement">using</span> (<span class="synStatement">new</span> GUILayout.HorizontalScope()) { _wannaCount = EditorGUILayout.Toggle(<span class="synConstant">"Use count"</span>, _wannaCount); } <span class="synStatement">using</span> (<span class="synStatement">new</span> GUILayout.HorizontalScope()) { _wannaNaming = EditorGUILayout.Toggle(<span class="synConstant">"Use original name"</span>, _wannaNaming); <span class="synStatement">if</span> (_wannaNaming) { _objectName = EditorGUILayout.TextField(<span class="synConstant">"Enter name"</span>, _objectName); } } <span class="synStatement">using</span> (<span class="synStatement">new</span> GUILayout.HorizontalScope()) { ScriptableObject target = <span class="synStatement">this</span>; SerializedObject so = <span class="synStatement">new</span> SerializedObject(target); SerializedProperty stringsProperty = so.FindProperty(<span class="synConstant">"_targetObjectsInEditor"</span>); EditorGUILayout.PropertyField(stringsProperty, <span class="synConstant">true</span>); so.ApplyModifiedProperties(); } <span class="synStatement">if</span> (GUILayout.Button(<span class="synConstant">"GeneratePrefab"</span>)) { <span class="synStatement">if</span> (!_path.EndsWith(<span class="synConstant">"/"</span>)) _path += <span class="synConstant">"/"</span>; <span class="synStatement">foreach</span> (GameObject target <span class="synStatement">in</span> _targetObjectsInEditor) { <span class="synType">string</span> prefab = _path + _objectPrefix + (_wannaNaming ? _objectName : target.name) + (_wannaCount ? _targetObjectsInEditor.IndexOf(target).ToString() : <span class="synConstant">""</span>) + <span class="synConstant">".prefab"</span>; var result = PrefabUtility.SaveAsPrefabAsset(target, prefab); var newObject = PrefabUtility.InstantiatePrefab(result, target.transform.parent) <span class="synStatement">as</span> GameObject; newObject.transform.SetSiblingIndex(target.transform.GetSiblingIndex()); DestroyImmediate(target); } _targetObjectsInEditor.Clear(); } } } <span class="synPreProc">#endif</span> |
言い訳か説明かなにか
|
1 2 |
<span class="synType">string</span> prefab = _path + _objectPrefix + (_wannaNaming ? _objectName : target.name) + (_wannaCount ? _targetObjectsInEditor.IndexOf(target).ToString() : <span class="synConstant">""</span>) + <span class="synConstant">".prefab"</span>; |
ここが本当に無理やりですが、条件で名前を書き換えてます。はい。
最後に
楽しかったですが、標準とかであると思うので、なんかあれだなって。
追加機能等ほしい部分あればお気軽にどうぞ!書くの楽しい。
