CCCPaste

Object Grabber

using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
using System.Collections.Generic;
#endif

[ExecuteAlways]
public class WireframeCubeDrawer : MonoBehaviour
{
[SerializeField] private Color selectedColor = Color.green;
[SerializeField] private Color unselectedColor = new Color(0f, 0.5f, 0.5f, 0.6f); // corretto: verde scuro trasparente
[SerializeField, Range(0f, 25f)] private float lineThickness = 2f;

[SerializeField, HideInInspector] private Vector3 cubeSize;
[Header("Use the context menu\n (right mouse button on the title)\n to select or parent the objects inside the cube")]
[SerializeField] private string parentName = "GroupedObjects";

private BoxCollider _boxCollider;

private void OnEnable()
{
EnsureBoxColliderExists();
}

private void OnValidate()
{
EnsureBoxColliderExists();
}

private void EnsureBoxColliderExists()
{
_boxCollider = GetComponent<BoxCollider>();
if (_boxCollider == null)
{
_boxCollider = gameObject.AddComponent<BoxCollider>();
_boxCollider.isTrigger = true;
}
}

private void OnDrawGizmos()
{
if (_boxCollider == null)
EnsureBoxColliderExists();

if (_boxCollider == null) return;

Vector3 worldCenter = transform.TransformPoint(_boxCollider.center);
Vector3 size = _boxCollider.size;
cubeSize = size;

Color drawColor = GetDrawColor();
DrawWireCube(worldCenter, size, drawColor, lineThickness);
}

private Color GetDrawColor()
{
#if UNITY_EDITOR
if (Selection.activeGameObject == gameObject)
return selectedColor;
#endif
return unselectedColor;
}

void DrawWireCube(Vector3 center, Vector3 size, Color color, float thickness)
{
Vector3 half = size * 0.5f;

Vector3[] corners = new Vector3[8]
{
center + new Vector3(-half.x, -half.y, -half.z),
center + new Vector3( half.x, -half.y, -half.z),
center + new Vector3( half.x, -half.y, half.z),
center + new Vector3(-half.x, -half.y, half.z),
center + new Vector3(-half.x, half.y, -half.z),
center + new Vector3( half.x, half.y, -half.z),
center + new Vector3( half.x, half.y, half.z),
center + new Vector3(-half.x, half.y, half.z)
};

int[,] edges = new int[,]
{
{0,1}, {1,2}, {2,3}, {3,0},
{4,5}, {5,6}, {6,7}, {7,4},
{0,4}, {1,5}, {2,6}, {3,7}
};

for (int i = 0; i < edges.GetLength(0); i++)
{
DrawThickLine(corners[edges[i, 0]], corners[edges[i, 1]], color, thickness);
}
}

void DrawThickLine(Vector3 start, Vector3 end, Color color, float thickness)
{
#if UNITY_EDITOR
Handles.color = color;
Handles.DrawAAPolyLine(thickness, new Vector3[] { start, end });
#endif
}

#if UNITY_EDITOR
[ContextMenu("Select Active Objects Inside Trigger")]
void SelectActiveObjectsInTrigger()
{
if (_boxCollider == null)
{
Debug.LogWarning("No BoxCollider found!");
return;
}

List<GameObject> activeObjects = new List<GameObject>();

Collider[] overlapping = Physics.OverlapBox(transform.TransformPoint(_boxCollider.center),
_boxCollider.size * 0.5f,
transform.rotation,
~0,
QueryTriggerInteraction.Collide
);

foreach (var col in overlapping)
{
GameObject go = col.gameObject;
// Ignora self e oggetti disattivati
if (go == gameObject) continue;
if (!go.activeInHierarchy) continue;

activeObjects.Add(go);
}

if (activeObjects.Count == 0)
{
Debug.Log("No active objects found inside the trigger.");
Selection.objects = new Object[0];
}
else
{
Selection.objects = activeObjects.ToArray();
Debug.Log($"Selected {activeObjects.Count} active object(s).");
}
}

[ContextMenu("Group Selected Objects Under New Parent")]
void GroupSelectedObjects()
{
GameObject[] selected = Selection.gameObjects;
if (selected.Length == 0)
{
Debug.LogWarning("No objects selected.");
return;
}

string name = string.IsNullOrEmpty(parentName) ? "GroupedObjects" : parentName;

GameObject parent = new GameObject(name);

Undo.RegisterCreatedObjectUndo(parent, "Create Group Parent");

foreach (GameObject go in selected)
{
Undo.SetTransformParent(go.transform, parent.transform, "Parent Selected Objects");
}

Selection.activeObject = parent;
}
#endif
}