Skip to content

Instantly share code, notes, and snippets.

@rhys-vdw
Created June 28, 2021 06:06
Show Gist options
  • Save rhys-vdw/ea2585d04ff334ae791e03d8b91918a9 to your computer and use it in GitHub Desktop.
Save rhys-vdw/ea2585d04ff334ae791e03d8b91918a9 to your computer and use it in GitHub Desktop.
Grouping utilities
using UnityEngine;
using UnityEditor;
using System.Linq;
using System;
namespace Feed {
public static class ObjectHelpers {
[MenuItem("Feed/Objects/Group parent position %g")]
public static void GroupSelected() {
if (!SelectedSiblings(out var selected)) {
return;
}
var parent = selected[0].parent;
var group = CreateGroupObject(parent);
ParentAll(group, selected);
Selection.objects = new [] { group.gameObject };
// Would be nice to set the object to rename here but it's tricky...
// see: http://answers.unity.com/answers/940887/view.html
}
[MenuItem("Feed/Objects/Group center %#g")]
public static void GroupCenter() {
if (!SelectedSiblings(out var selected)) {
return;
}
var parent = selected[0].transform.parent;
var group = CreateGroupObject(parent);
group.position = AveragePosition(selected);
ParentAll(group, selected);
Selection.objects = new [] { group.gameObject };
}
static Vector3 AveragePosition(Transform[] transforms) {
Vector3 result = transforms[0].transform.position;
for (var i = 1; i < transforms.Length; i++) {
result += transforms[i].position;
}
return result / transforms.Length;
}
static void ParentAll(Transform parent, Transform[] selected) {
for (var i = 0; i < selected.Length; i++) {
Undo.SetTransformParent(
selected[i],
parent,
"Set parent"
);
}
}
static Transform CreateGroupObject(Transform parent) {
const string name = "New group";
var group = (parent is RectTransform
? new GameObject(name, typeof(RectTransform))
: new GameObject(name)
).transform;
Undo.RegisterCreatedObjectUndo(group.gameObject, "Create group");
group.parent = parent;
group.localPosition = Vector3.zero;
group.localRotation = Quaternion.identity;
group.localScale = Vector3.one;
return group;
}
static bool SelectedSiblings(out Transform[] selected) {
if (SelectedTransforms(out var transforms)) {
for (var i = 1; i < transforms.Length; i++) {
if (transforms[i].transform.parent != transforms[0].transform.parent) {
Debug.LogWarning($"{transforms[0].name} and {transforms[i].name} do not share a parent");
selected = Array.Empty<Transform>();
return false;
}
}
selected = transforms;
return true;
}
selected = Array.Empty<Transform>();
return false;
}
public static bool SelectedTransforms(out Transform[] selected) {
selected = Selection.objects
.Select(o => o as GameObject)
.Where(go => go != null)
.Select(go => go.transform)
.ToArray();
if (selected.Length == 0) {
Debug.LogWarning("Nothing selected");
selected = Array.Empty<Transform>();
return false;
}
return true;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment