如何使用光线投射从网格渲染器获取特定的 material

how to get a specific material from a meshrenderer using raycasts

我有一个 Meshrenderer,上面有 9 个 materials,我想检测其中哪一种颜色面向前方,但我不知道它会是哪一种,所以我可以'不要只使用 Meshrenderer.materials[number].color

这是我目前所拥有的

    public GameObject Shot1pos;

            RaycastHit hit;
            if (Physics.Raycast(Shot1pos.transform.position, Shot1pos.transform.TransformDirection(Vector3.forward), out hit, Mathf.Infinity))
            {
                Debug.DrawRay(Shot1pos.transform.position, Shot1pos.transform.TransformDirection(Vector3.forward) * hit.distance, Color.yellow);
                Wheel1Color = hit.collider.gameObject.GetComponent<MeshRenderer>().material.color;
                Debug.Log(Wheel1Color);
            }

但这只是returns第一个material,以面向前方的为准

我找到了解决办法。首先你需要根据 hit.triangleIndex 获取网格索引,并根据它获取主要 material 索引。

对于第一个,只需将此脚本复制到 class:

public static int GetSubMeshIndex(Mesh mesh, int triangleIndex)
{
    if (!mesh.isReadable) return 0;
    
    var triangleCounter = 0;
    for (var subMeshIndex = 0; subMeshIndex < mesh.subMeshCount; subMeshIndex++)
    {
        var indexCount = mesh.GetSubMesh(subMeshIndex).indexCount;
        triangleCounter += indexCount / 3;
        if (triangleIndex < triangleCounter) return subMeshIndex;
    }
    
    return 0;
}

然后用这部分检测合适的material:

public void DetectMaterial(RaycastHit hit)
{
    if (hit.transform == null) return;

    var materials = hit.transform.GetComponent<MeshRenderer>().materials;

    var index = hit.triangleIndex;

    var mesh = hit.transform.GetComponent<MeshFilter>().mesh;
    
    var subMeshIndex = GetSubMeshIndex(mesh, index);
    
    UnityEngine.Debug.Log(materials[subMeshIndex]);
}

请记住,您的文件模型必须启用 Read / Write Enabled 选项并仅使用 Mesh Collider