So, I have a script that works but, there is a problem. I attached this script to a cube that triggers a door to rotate, and if I use this as an “OnTriggerEnter” it works fine, but not as an OnMouseUp function:
var door : Transform;
var angleOpen : int;
var angleClose : int;
var speedOpen : int;
var closed : boolean = true;
function OnMouseUp(){
if(door.transform.localEulerAngles.y < angleOpen){
door.transform.Rotate(Vector3(0,speedOpen,0) * Time.deltaTime);
closed = false;
}
}
When I use this, it very minimally rotates the door, and it requires me to click it several times to open it completely. I believe this is because it only moves for that split second the mouse is up. If I was triggering an animation, this would be fine, but I am not. Is there a way I could complete this on a mouse click for it to go all the way through? Put this script on a cube and try it out yourself to see what I am talking about.
I’m posting my door opener / closer. When the door is clicked it opens if it was closed or closing and closes if it was open or opening.
There’s one nasty hack in the door closed condition because Euler angles wrap around at 0… i.e 0 -1 = 359 degrees I simply assume that on closing any value between 350’ and 0 represent closed. A better implementation would likely involve a quaternion or non-wrapping variable which I’ll leave for you to implement if needed.
Good luck.
#pragma strict
public var door : Transform;
public var angleOpen : float;
public var angleClose : float;
public var speedOpen : float;
public var doorState : DoorStates = DoorStates.Closed;
enum DoorStates
{
Open = 0,
Opening = 1,
Closing = 2,
Closed = 3
}
function OnMouseUp()
{
ToggleDoorState();
}
function Update()
{
ProcessDoor();
}
function ToggleDoorState()
{
switch(doorState)
{
case doorState.Open :
doorState=DoorStates.Closing;
break;
case doorState.Opening :
doorState=DoorStates.Closing;
break;
case doorState.Closing :
doorState=DoorStates.Opening;
break;
case doorState.Closed :
doorState=DoorStates.Opening;
break;
}
}
function ProcessDoor()
{
//if the door is fully open or closed don't do anything
if((doorState == DoorStates.Open) || (doorState == DoorStates.Closed))
{
return;
}
//setup this frame movement conditions for a closing door
var doorStopAngle : float = angleClose;
var doorDirection : float = -1.0f;
//if the door is opening reverse the frame movement condition variables
if(doorState == DoorStates.Opening)
{
doorStopAngle = angleOpen;
doorDirection = 1.0f;
}
door.transform.Rotate(Vector3(0,doorDirection*speedOpen,0) * Time.deltaTime);
var currentDoorAngle : float = door.transform.localEulerAngles.y;
if(doorState == DoorStates.Opening)
{
if(currentDoorAngle >= doorStopAngle)
{
door.transform.eulerAngles.y = doorStopAngle;
doorState = DoorStates.Open;
return;
}
}
if(doorState == DoorStates.Closing)
{
//check to see if the door has reached closed take into account wrap around at 360'
if((currentDoorAngle <= doorStopAngle) || (currentDoorAngle >= 350))
{
door.transform.eulerAngles.y = doorStopAngle;
doorState = DoorStates.Closed;
return;
}
}
}
Thanks, that worked! I’m going to have to analyze the script… Thanks again!