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

时间:2019-06-27 04:53:38

标签: c# unity3d rotation mesh calculation

摘要: 我有一个带有岩石网格物体的游戏对象。但是,网格的底部是神圣且丑陋的。我想将其放置在看起来像小山的网格上,以使玩家无法看到游戏对象的丑陋和神圣的底部。

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

这是我的完整问题:

如何: 旋转并移动一个具有“网格”作为其组件的GameObject,以使其“完全”位于另一个网格上,而不会通过Unity中的c#脚本看到GameObject的底部。

现在的样子

我想实现的目标

感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

这是一段代码,该代码使用射线投射的正常值旋转岩石网格。

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

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;
            }
        }
    }
}

Normal stick