同じ親ならGetSiblingIndex()で比較すれば良いのですが、そうでないときのパターンが見つからなかったので書きます。
GetComponentsInParentでTransformを取得すると、[0]に自身のTransformが入り、[1]に1つ上の親Transformが入ります。
2つ上以降も順に格納されるので、2つのオブジェクトのTransformを配列末尾から見ていけば、分岐する親オブジェクトが判明します。
そこでGetSiblingIndex()を使い、受け取ったインデックスを比較することで、どちらが下位にあるかが分かります。
ただし同じシーンに存在するオブジェクト同士であること
int CompareHierarchy(Transform l, Transform r)
{
if (l == r)
{
return 0;
}
var lTransforms = l.GetComponentsInParent<Transform>();
var rTransforms = r.GetComponentsInParent<Transform>();
var loop = UnityEngine.Mathf.Min(lTransforms.Length, rTransforms.Length);
for (var i = 0; i < loop; ++i)
{
var lTransform = lTransforms[lTransforms.Length - i - 1];
var rTransform = rTransforms[rTransforms.Length - i - 1];
if (lTransform != rTransform)
{
return rTransform.GetSiblingIndex() - lTransform.GetSiblingIndex();
}
}
return 0;
}
uGUIであればヒエラルキーの並びがそのまま表示順になりますが、カメラやキャンバスを複数使っている場合は、先にそれらの要素でソートする必要があることに注意して下さい。
上記ができれば、同じシーンでないオブジェクト同士でなければならない問題もほぼ解決でしょう