如何通过统一的 C# 脚本将游戏对象完美地放置在网格上?

How to perfectly place a gameObject on a mesh through C# script in unity?

总结: 我有一个具有岩石网格的游戏对象。然而,网底空洞且丑陋。我想把它放在一个看起来像小山的网格上,这样玩家就看不到游戏对象的丑陋和空洞的底部。

我有一个使用光线投射来放置岩石的脚本。光线投射在网格上方。当我向下投射光线时,我在山上得到了一个看起来像网格的 Vector3。我把那块石头放在那个点上,我可以看到它的底部!如何避免使用 C# 代码?

这是我的完整问题:

如何: 旋转并移动一个 GameObject,它有一个 "mesh" 作为它的组件,这样它就位于另一个网格 "perfectly" 上,而不会通过 Unity 中的 c# 脚本看到 GameObject 的底部。

现在的样子

我想达到的目标

感谢任何形式的帮助!!

下面是一段代码,它使用光线投射命中的法线值来旋转岩石网格。

法线是顶点之间的网格几何体向外(垂直)的矢量:

https://en.wikipedia.org/wiki/Vertex_normal#/media/File:Vertex_normals.png

如果将此脚本放在岩石网格上,它会告诉岩石网格它的向上矢量与光线投射点所在的法线相同。

using UnityEngine;

public class StickToTerrain : MonoBehaviour
{
    void Update()
    {
        if (Input.GetMouseButton(0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

            if (Physics.Raycast(ray, out RaycastHit terrainHit))
            {
                transform.up = terrainHit.normal;
            }
        }
    }
}