これはなに?
一部のUIのRaycastTargetをごっそり一括で変更したいときがありませんか?あります。あるんです。
同じComponentだと。複数選択→トグルでいいのですが、違うComponentのものも変えたくなったので書きました。
あと、Prefabビューなら最初からオフにするものを書いていたりします。
kakovail.info
使い方
スクリプトを好きなところに配置、変更したいオブジェクトを複数選択→右クリックからメニューでToggleできます。
2019.4.18で書いていますが、TryGetComponentを使わなかったので2018.1以降なら確実に動くと思います。
コード
|
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 |
<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="synStatement">using</span> UnityEngine.UI; <span class="synType">public</span> <span class="synType">class</span> SelectedRaycastChanger : EditorWindow { <span class="synType">private</span> <span class="synType">static</span> <span class="synType">int</span> _currentCount; <span class="synType">private</span> <span class="synType">static</span> List<GameObject> _cachedObjects = <span class="synStatement">new</span> List<GameObject>(); [MenuItem(<span class="synConstant">"GameObject/KEditorExtensions/SelectedRaycastChanger/Toggle : true"</span>, <span class="synConstant">false</span>, <span class="synConstant">20</span>)] <span class="synType">public</span> <span class="synType">static</span> <span class="synType">void</span> ToggleRaycastTargetTrue() { var tmp = Selection.gameObjects; ToggleRaycastTarget(tmp, <span class="synConstant">true</span>); _currentCount++; <span class="synStatement">if</span> (_currentCount == tmp.Length) _cachedObjects.Clear(); } [MenuItem(<span class="synConstant">"GameObject/KEditorExtensions/SelectedRaycastChanger/Toggle : false"</span>, <span class="synConstant">false</span>, <span class="synConstant">20</span>)] <span class="synType">public</span> <span class="synType">static</span> <span class="synType">void</span> ToggleRaycastTargetFalse() { var tmp = Selection.gameObjects; ToggleRaycastTarget(tmp, <span class="synConstant">false</span>); _currentCount++; <span class="synStatement">if</span> (_currentCount == tmp.Length) _cachedObjects.Clear(); } <span class="synType">private</span> <span class="synType">static</span> <span class="synType">void</span> ToggleRaycastTarget(GameObject[] selected, <span class="synType">bool</span> isActive) { <span class="synStatement">foreach</span> (var obj <span class="synStatement">in</span> selected) { <span class="synStatement">if</span> (_cachedObjects.Contains(obj)) <span class="synStatement">continue</span>; _cachedObjects.Clear(); _cachedObjects = <span class="synStatement">new</span> List<GameObject>(selected); _currentCount = <span class="synConstant">0</span>; <span class="synStatement">break</span>; } <span class="synStatement">foreach</span> (var cachedObject <span class="synStatement">in</span> _cachedObjects) { var target = cachedObject.GetComponent<Graphic>(); <span class="synStatement">if</span> (target == <span class="synConstant">null</span>) <span class="synStatement">continue</span>; <span class="synComment">// you can use TryGetComponent</span> target.raycastTarget = isActive; Debug.Log($<span class="synConstant">"{cachedObject.name} 's raycast target is toggle {isActive.ToString()}"</span>, cachedObject); } } } <span class="synPreProc">#endif</span> |
