I want to apply a given material to any object being directly looked at, and then have it reset back to it's original material when it is no longer being directly looked at.
I can handle the change to new material OK by doing a Physics.Raycast forward from the player camera, and setting rayHit.transform.renderer.material.
The problem is in reverting back to the original material. I have hundreds of game objects using any one of 10 materials. Obviously I want to avoid having to keep arrays of these objects to check they're no longer being looked at.
Is there a way to somehow know what just the penultimate object looked at was, so I only have to revert that single object's material?
Before you change the material, have a GameObject variable and Material variable set up to "capture" the material and game object you hit with a ray before you do anything else to it. Then when you leave it, you can tell the game object to revert back to the stored material value.
This is Jessy's C# code changed to Javascript. (No advantage, I just needed to integrate it within an existing .js)
To recap, attach this script to a camera and it will temporarily change the material of the object you're looking at (in the centre of screen)
to the one you assign to newMaterial
(Thanks again Jessy, as a C# newbie I learned a lot from studying your code)
var newMaterial : Material;
private var screenCenter : Vector3;
private var raycastHit : RaycastHit;
private var theRenderer : Renderer;
private var originalMaterial : Material;
function Start () {
screenCenter = Vector3(.5F, .5F, 0);
}
function Update () {
var ray : Ray = camera.ViewportPointToRay(screenCenter); // creates a ray going from camera to viewport center
if (Physics.Raycast(ray, raycastHit)) { // get what that ray hits
var hitRenderer : Renderer = raycastHit.transform.renderer; //get the renderer of the hit object
if (hitRenderer) {
if (theRenderer != null){ //if we've already assigned a renderer
if (theRenderer == hitRenderer) return; //if this the same renderer do nothing
else theRenderer.material = originalMaterial; // if it's a different one, put the original material back
}
theRenderer = hitRenderer;
originalMaterial = hitRenderer.sharedMaterial;
hitRenderer.material = newMaterial;
}
}
else if (theRenderer != null) { // if we didn't hit anything and there exists a changed renderer, put the original material back
theRenderer.material = originalMaterial;
theRenderer = null;
}
}