Open and close a drawer with raycast

Hi, I’m currently using this script, but it don’t work. :\
I don’t know why, please help me :cry:

var GuiText : GUIText;
var hit: RaycastHit;
var canOpenClose : boolean;
var drawerObject : GameObject;
var drawerPos1 : Transform;
var drawerPos2 : Transform;
var movePosition : Transform;


var smoothTime : float = 0.1;
private var velocity = Vector3.zero;
var maxSpeed = 8; 
   
function Start () {

 movePosition = drawerObject.transform;
 
}
 
function Update () {

//open drawer text

drawerObject.transform.position = Vector3.SmoothDamp(drawerObject.transform.position, movePosition.position,velocity, smoothTime, maxSpeed);

if(Physics.Raycast(transform.position,transform.forward,hit,5)){
 
    if(hit.collider.gameObject.tag=="drawer"){ //add collider reference otherwise you can't access gameObject!
 
       GuiText.text = "Press E to open";
       
       }
    }
    
else { //text clear

GuiText.text = "";
 
}    

//open drawer

if(Input.GetKeyDown("e") && canOpenClose){

if(Physics.Raycast(transform.position,transform.forward,hit,5)){

if(hit.collider.gameObject.tag=="drawer"){

canOpenClose=true;

		if(Vector3.Distance(drawerObject.transform.position, drawerPos1.position)<0.2){
			movePosition=drawerPos2;
			
		}else{
			movePosition=drawerPos1;
			canOpenClose=false;
		}
		
	}
}
}

}

I attached the script to the main camera (FPS camera).
The drawer doesn’t move, when the “press E to open” text appears, I click E but the drawer doesn’t move.

mmm if I put Debug.LogError or other in random places of the code it tell me I have to fix errors before enter in the play mode. :\

It seems your code is more complex than it needs to be.

Also you should have a separate script for the drawers to keep the drawers state and update the drawer position.

Create a new script Drawer.js with this code, and attach it to all your drawer objects

public class Drawer : MonoBehavior{

	var smoothTime : float = 0.1;
	var maxSpeed = 8;

	var origin : Vector3;
	var opening : bool = false;
	
	var velocity = Vector3.zero;
	
	function Start (){
		origin = transform.position;
	}
	
	function Update (){

		if(opening){
			drawerObject.transform.position = Vector3.SmoothDamp(origin,
																 origin + transform.forward * 0.2, //open drawer 20cm
																 velocity, smoothTime, maxSpeed);
		}
	}
}

Then update your camera script :

var GuiText : GUIText;

function Start () {

}
     
function Update () {
     
	 var hit: RaycastHit;

    //open drawer text
    if(Physics.Raycast(transform.position,transform.forward,hit,5)){
     
		GameObject hitObject = hit.collider.gameObject;
		
		if(hitObject.tag=="drawer"){ //add collider reference otherwise you can't access gameObject!

			GuiText.text = "Press E to open";
			
			//open drawer
			if(Input.GetKeyDown("e")){
			
				var Drawer = hitObject.GetComponent(Drawer);
				Drawer.opening = true;
			}

		}
    }
    else { //text clear

		GuiText.text = "";
    } 
}

I have not tested the code, and the syntax may be incorrect as I usually code in C#, but it should work.