C# 如何在具有不同材质的对象上光线投射特定材质?

C# 如何在具有不同材质的对象上光线投射特定材质?,c#,unity3d,C#,Unity3d,我想改变一个物体上的精确材质的颜色,它有超过1个材质。。。我有一个网格碰撞器的对象,我附加到它的脚本。。。这似乎有点奏效,但并不完美。当我点击物体的任何材质时,它会改变材质的颜色。我希望只有在我单击要更改的材质时才会发生这种情况 void Update() { if (Input.GetMouseButtonDown(0)) { Ray ray = camera.ScreenPointToRay(Input.mousePosition);

我想改变一个物体上的精确材质的颜色,它有超过1个材质。。。我有一个网格碰撞器的对象,我附加到它的脚本。。。这似乎有点奏效,但并不完美。当我点击物体的任何材质时,它会改变材质的颜色。我希望只有在我单击要更改的材质时才会发生这种情况

void Update()
     {
     if (Input.GetMouseButtonDown(0))
     { 
            Ray ray = camera.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit) )
            {
                 foreach (Material material in materialsArray)
                 {
                       if (material.name == "Square (Instance)")
                       {
                          material.SetColor("_Color", Random.ColorHSV());
                       }
                       else if(material.name == "Circle (Instance)")
                       {
                          Debug.Log("circle clicked");
                       }

我希望当我只单击正方形时,可以在正方形上更改颜色。

这是我发现的,可以更改子页面的颜色

        RaycastHit hit;
        if (Physics.Raycast(cam.ScreenPointToRay(Input.mousePosition), out hit))
        {
            MeshCollider meshCollider = hit.collider as MeshCollider;
            if (meshCollider != null || meshCollider.sharedMesh != null)
            {
                mesh = meshCollider.sharedMesh;
                Vector3[] vertices = mesh.vertices;
                int[] triangles = mesh.triangles;

                int[] hittedTriangle = new int[]
                {
                        mesh.triangles[hit.triangleIndex * 3],
                        mesh.triangles[hit.triangleIndex * 3 + 1],
                        mesh.triangles[hit.triangleIndex * 3 + 2]
                };

                for (int i = 0; i < mesh.subMeshCount; i++)
                {  
                    int[] subMeshTris = mesh.GetTriangles(i);
                    for (int j = 0; j < subMeshTris.Length; j += 3)
                    {

                        if (subMeshTris[j] == hittedTriangle[0] &&
                            subMeshTris[j + 1] == hittedTriangle[1] &&
                            subMeshTris[j + 2] == hittedTriangle[2])
                        {

                            GetComponent<MeshRenderer>().materials[i].color = Color.cyan;
                        }
raycastthit;
if(Physics.Raycast(cam.ScreenPointToRay(Input.mousePosition),out-hit))
{
MeshCollider MeshCollider=hit.collider作为MeshCollider;
if(meshCollider!=null | | meshCollider.sharedMesh!=null)
{
mesh=meshCollider.sharedMesh;
Vector3[]顶点=网格顶点;
int[]三角形=网格三角形;
int[]hittedTriangle=新int[]
{
网格.三角形[hit.triangleIndex*3],
网格.三角形[hit.triangleIndex*3+1],
网格.三角形[hit.triangleIndex*3+2]
};
对于(int i=0;i
这是我发现的更改子页面颜色的方法

        RaycastHit hit;
        if (Physics.Raycast(cam.ScreenPointToRay(Input.mousePosition), out hit))
        {
            MeshCollider meshCollider = hit.collider as MeshCollider;
            if (meshCollider != null || meshCollider.sharedMesh != null)
            {
                mesh = meshCollider.sharedMesh;
                Vector3[] vertices = mesh.vertices;
                int[] triangles = mesh.triangles;

                int[] hittedTriangle = new int[]
                {
                        mesh.triangles[hit.triangleIndex * 3],
                        mesh.triangles[hit.triangleIndex * 3 + 1],
                        mesh.triangles[hit.triangleIndex * 3 + 2]
                };

                for (int i = 0; i < mesh.subMeshCount; i++)
                {  
                    int[] subMeshTris = mesh.GetTriangles(i);
                    for (int j = 0; j < subMeshTris.Length; j += 3)
                    {

                        if (subMeshTris[j] == hittedTriangle[0] &&
                            subMeshTris[j + 1] == hittedTriangle[1] &&
                            subMeshTris[j + 2] == hittedTriangle[2])
                        {

                            GetComponent<MeshRenderer>().materials[i].color = Color.cyan;
                        }
raycastthit;
if(Physics.Raycast(cam.ScreenPointToRay(Input.mousePosition),out-hit))
{
MeshCollider MeshCollider=hit.collider作为MeshCollider;
if(meshCollider!=null | | meshCollider.sharedMesh!=null)
{
mesh=meshCollider.sharedMesh;
Vector3[]顶点=网格顶点;
int[]三角形=网格三角形;
int[]hittedTriangle=新int[]
{
网格.三角形[hit.triangleIndex*3],
网格.三角形[hit.triangleIndex*3+1],
网格.三角形[hit.triangleIndex*3+2]
};
对于(int i=0;i
你可以得到射线击中的三角形的索引,然后确定该三角形的材质。这是一个关于它的论坛帖子,可能会有所帮助。上一篇帖子似乎很成功,但不幸的是它是用UnityScript编码的。如果你能确定如何将其更改为C#,这可能会帮助你达到目的。谢谢,我会尝试一下的天哪!如果你能弄明白,你可以在这里,也许可以得到一些投票!你可以得到射线击中的三角形的索引,然后确定三角形的材质。这是一个关于它的论坛帖子,可能会有所帮助。上一篇帖子似乎很成功,但不幸的是它是用UnityScript编码的。如果你能确定如何将其更改为C#,那可能会帮助你到达那里。谢谢,我会试试的。祝你好运!如果你能弄明白,你可以在这里,也许会得到一些赞成票!