diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5656b63..0b5e657 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -20,6 +20,7 @@
- X10D.Unity: Added `GameObject.LookAt(GameObject[, Vector3])`
- X10D.Unity: Added `GameObject.LookAt(Transform[, Vector3])`
- X10D.Unity: Added `GameObject.LookAt(Vector3[, Vector3])`
+- X10D.Unity: Added `GameObject.SetLayerRecursively(int)`
- X10D.Unity: Added `GameObject.SetParent(GameObject[, bool])`
- X10D.Unity: Added `GameObject.SetParent(Transform[, bool])`
- X10D.Unity: Added `Random.NextColorArgb()`
diff --git a/X10D.Unity.Tests/Assets/Tests/GameObjectTests.cs b/X10D.Unity.Tests/Assets/Tests/GameObjectTests.cs
index 9e4636c..79e649e 100644
--- a/X10D.Unity.Tests/Assets/Tests/GameObjectTests.cs
+++ b/X10D.Unity.Tests/Assets/Tests/GameObjectTests.cs
@@ -61,6 +61,30 @@ namespace X10D.Unity.Tests
yield break;
}
+ [UnityTest]
+ public IEnumerator SetLayerRecursively_ShouldSetLayerRecursively()
+ {
+ var parent = new GameObject();
+ var child = new GameObject();
+ var grandChild = new GameObject();
+
+ child.transform.SetParent(parent.transform);
+ grandChild.transform.SetParent(child.transform);
+
+ int layer = LayerMask.NameToLayer("UI");
+ Assert.AreNotEqual(layer, parent.layer);
+ Assert.AreNotEqual(layer, child.layer);
+ Assert.AreNotEqual(layer, grandChild.layer);
+
+ parent.SetLayerRecursively(layer);
+
+ Assert.AreEqual(layer, parent.layer);
+ Assert.AreEqual(layer, child.layer);
+ Assert.AreEqual(layer, grandChild.layer);
+
+ yield break;
+ }
+
[UnityTest]
public IEnumerator SetParent_ShouldSetParent()
{
diff --git a/X10D.Unity/src/GameObjectExtensions.cs b/X10D.Unity/src/GameObjectExtensions.cs
index 095ab7b..8d2b9d8 100644
--- a/X10D.Unity/src/GameObjectExtensions.cs
+++ b/X10D.Unity/src/GameObjectExtensions.cs
@@ -171,6 +171,44 @@ public static class GameObjectExtensions
gameObject.transform.LookAt(target, worldUp);
}
+ ///
+ /// Sets the new layer of this game object and its children, recursively.
+ ///
+ /// The game object whose layer, and that of its children recursively, to change.
+ /// The new layer.
+ /// is .
+ public static void SetLayerRecursively(this GameObject gameObject, int layer)
+ {
+ if (gameObject == null)
+ {
+ throw new ArgumentNullException(nameof(gameObject));
+ }
+
+ gameObject.layer = layer;
+
+ if (gameObject.transform.childCount == 0)
+ {
+ return;
+ }
+
+ var children = new Stack(gameObject.transform.Cast());
+ while (children.Count > 0)
+ {
+ Transform child = children.Pop();
+ child.gameObject.layer = layer;
+
+ if (child.childCount <= 0)
+ {
+ continue;
+ }
+
+ foreach (Transform grandChild in child)
+ {
+ children.Push(grandChild);
+ }
+ }
+ }
+
///
/// Sets the parent of this game object.
///