ObjectLocker.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. 
  2. /*WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW*\ ( ( ) )
  3. |/ \| ) ) _((_
  4. || (c) Wanzyee Studio < wanzyeestudio.blogspot.com > || ( ( |_ _ |=n
  5. |\ /| _____)) | ! ] U
  6. \.ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ./ (_(__(S) |___*/
  7. using UnityEditor;
  8. using UnityEngine;
  9. using System;
  10. using System.Linq;
  11. using Object = UnityEngine.Object;
  12. namespace WanzyeeStudio.Editrix.Toolkit{
  13. /// <summary>
  14. /// Set <c>UnityEngine.Object</c> to be locked or editable.
  15. /// </summary>
  16. ///
  17. /// <remarks>
  18. /// Set <c>UnityEngine.HideFlags</c> switch bit of <c>HideFlags.NotEditable</c> to avoid missing operation.
  19. /// Use context menu "Toggle Locked", or menu "Edit/Toggle Locked" with hotkey ALT-Shift-L for selections.
  20. /// </remarks>
  21. ///
  22. public static class ObjectLocker{
  23. #region Menu
  24. /// <summary>
  25. /// Toggle the object locked or editable.
  26. /// </summary>
  27. /// <param name="command">Command.</param>
  28. [MenuItem("CONTEXT/Object/Toggle Locked", false, 10010)]
  29. private static void ObjectToggleLocked(MenuCommand command){
  30. SetLocked(!GetLocked(command.context), command.context);
  31. }
  32. /// <summary>
  33. /// Toggle the selected objects locked or editable to the opposite of the first one, with hotkey Alt-Shift-L.
  34. /// </summary>
  35. [MenuItem("Edit/Toggle Locked &#l", false, 200)]
  36. public static void EditToggleLocked(){
  37. if(!EditToggleLockedValid()) throw new InvalidOperationException("Nothing is selected.");
  38. SetLocked(!GetLocked(Selection.objects.First(_v => null != _v)), Selection.objects);
  39. }
  40. /// <summary>
  41. /// Check if <c>EditToggleLocked()</c> valid, any <c>UnityEngine.Object</c> selected.
  42. /// </summary>
  43. /// <returns><c>true</c>, if valid.</returns>
  44. [MenuItem("Edit/Toggle Locked &#l", true)]
  45. private static bool EditToggleLockedValid(){
  46. return (null != Selection.activeObject);
  47. }
  48. #endregion
  49. #region Methods
  50. /// <summary>
  51. /// Determine if the object locked or editable.
  52. /// </summary>
  53. /// <returns><c>true</c>, if locked, <c>false</c> otherwise.</returns>
  54. /// <param name="target">Target.</param>
  55. public static bool GetLocked(Object target){
  56. if(null == target) throw new ArgumentNullException("obj");
  57. return HideFlags.NotEditable == (target.hideFlags & HideFlags.NotEditable);
  58. }
  59. /// <summary>
  60. /// Set the objects locked or editable.
  61. /// </summary>
  62. ///
  63. /// <remarks>
  64. /// Only switch <c>HideFlags.NotEditable</c>, and keep other hideFlags bit.
  65. /// Note, to set <c>GameObjcet.hideFlags</c> will also set all components on it.
  66. /// </remarks>
  67. ///
  68. /// <param name="locked">If set to <c>true</c> locked.</param>
  69. /// <param name="targets">Targets.</param>
  70. ///
  71. /*
  72. * Use Undo.RegisterCompleteObjectUndo, since Undo.RecordObject doesn't work for HideFlags.
  73. * Use Undo.RegisterFullObjectHierarchyUndo, since the above one doesn't work for Component on GameObject.
  74. */
  75. public static void SetLocked(bool locked, params Object[] targets){
  76. if(null == targets) throw new ArgumentNullException("objects");
  77. foreach(var _v in targets.Where(_o => null != _o).Distinct()){
  78. if(_v is GameObject) Undo.RegisterFullObjectHierarchyUndo(_v, "Set Locked");
  79. else Undo.RegisterCompleteObjectUndo(_v, "Set Locked");
  80. if(locked) _v.hideFlags |= HideFlags.NotEditable;
  81. else _v.hideFlags &= ~HideFlags.NotEditable;
  82. EditorUtility.SetDirty(_v);
  83. }
  84. }
  85. #endregion
  86. }
  87. }