N1ckGreek N1ckGreek - 29 days ago 15
C# Question

Change Material of one game object only using Ray cast and Mouse click

I created the following code to see which game object i click but i cant find how to change the material of the object i click only, it changes the material of all objects which have the script.

//Public

public int TileGroup = 0; //Indicates the Tile Group Number.

//Private

public Rigidbody myRigidbody;
public Renderer myRenderer;
public Material tileDefaultMaterial;
public Material tileSelectedMaterial;
public Material tileSameGroupMaterial;

void Start () {
myRigidbody = GetComponent<Rigidbody> ();
myRenderer = GetComponent<Renderer> ();
tileDefaultMaterial = Resources.Load ("TileDefault", typeof(Material)) as Material;
tileSelectedMaterial = Resources.Load ("TileSelected", typeof(Material)) as Material;
tileSameGroupMaterial = Resources.Load ("TileSameGroup", typeof(Material)) as Material;
}

void Update () {
if (Input.GetMouseButtonDown (0)) {
TileClick ();
}
}

void TileClick (){

RaycastHit hitInfo = new RaycastHit ();
bool hit = Physics.Raycast (Camera.main.ScreenPointToRay (Input.mousePosition), out hitInfo);

if (hit) {
Debug.Log ("Hit: " + hitInfo.transform.gameObject.name);
}

if (hitInfo.transform.gameObject.tag == "Tile") {
Debug.Log ("Hit a Tile!");
myRenderer.material = tileSelectedMaterial;
} else {
Debug.Log ("Hit Empty Space!");
}
}

Answer

As you are running

void Update()
{
    if(Input.GetMouseButtonDown(0))
    {
        TileClick();
    }
}

Whenever you click (no matter where), Input.GetMouseButton(0) will be true in all instances of scripts. So you end up changing color of all the objects. Instead you can try the OnMouseDown() method.

void OnMouseDown() 
{
    TileClick();
}