如何使用 unity 在 c# 中合并网格并获取相对于 main parent 的点击位置

how to combine meshes and get click location with respect to main parent in c# using unity

假设我在 Unity 中有一个 3D 塔。塔的结构使得 Transform parent 有 children,其中每个 child 代表塔的一层。 children 本身是一个空游戏 object(只有组件是一个 Transform)并且它们是许多(自定义)网格的 parent(每个 grandchild 是一个单独的自定义网格)。我如何组合这些网格,以便我可以点击塔的地板上的某个地方,然后获取该点击相对于塔的坐标作为塔中的 whole/local 位置?

我会在根上有一个专用的 class,例如

public class Tower : MonoBehaviour { }

然后你可以在所有 children 上有一个 MeshCollider(或任何 Collider 但当然你会得到对撞机上的位置而不是显示的网格)并做

// Get a ray of your click position
var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
// Shoot a raycast
if(Physics.Raycast(ray, out var hit))
{
    // Try to get the Tower component of the parent
    // bubbles up until it finds according component or returns null
    var tower = hit.gameObject.GetComponentInParent<Tower>();
    // Are we clicking at any child under a Tower component?
    if(tower)
    {
        // get the hit point in world space
        var worldPoint = hit.point;
        // Get the hit point relative to the tower's pivot
        var relativePoint = tower.transform.InverseTransformPoint(worldPoint);

        Debug.Log($"You have hit tower at {relativePoint.ToString("G9")}");     
    }
}