如何使用光线投射从网格渲染器获取特定的 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
。
我有一个 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
。