Trying to make sliding doors. With transform, but it jumps to position. What am I doing wrong?
Hello.
Like my subject says. I am no coder, still learning. Trying to make sliding doors, but at the moment, it just jumps between the cordinates i have set. I want it to move smoothly to position, can anyone give me a hand with this? I have tried to read documentation, and searched around on google, without any luck.
Thanks in advance. (Let me know if you need any more info);
public class SliderDoor : MonoBehaviour {
[Header("Speed and new position")]
public float SlideSpeed = 1.0f;
public float moveSpeed; // FOR TESTING, CHANGE TO PRIVATE - Value changes from 0.0.007408588 to 0.0165667 - is this right?
public Vector3 MoveTo;
[Space(15)]
[Header("GUI Text")]
public string OpenText = "Click E to open door";
public string CloseText = "Click E to close door";
// PRIVATE VARIABLES
// VECTOR 3
private Vector3 OldPosition;
// BOOL
private bool _isInsideTrigger = false;
private bool isDoorOpen = false;
void Start()
{
OldPosition = transform.localPosition;
}
void OnTriggerEnter(Collider other)
{
if (other.tag == "Player")
{
_isInsideTrigger = true;
Debug.Log("PLAYER IS INSIDE TRIGGER AREA - _isInsideTrigger = " + _isInsideTrigger);
}
}
void OnTriggerExit(Collider other)
{
if (other.tag == "Player")
{
_isInsideTrigger = false;
Debug.Log("PLAYER EXITED TRIGGER AREA - _isInsideTrigger = " + _isInsideTrigger);
}
}
void Update()
{
moveSpeed = SlideSpeed * Time.deltaTime; // CAN I SET THIS IN START? - Test when door is sliding
if (!isDoorOpen && _isInsideTrigger)
{
if (Input.GetKeyDown(KeyCode.E))
{
SlideDoorOpen();
}
}
else if (isDoorOpen && _isInsideTrigger)
{
if (Input.GetKeyDown(KeyCode.E))
{
SlideDoorClose();
}
}
}
void SlideDoorOpen()
{
isDoorOpen = true;
transform.localPosition = Vector3.MoveTowards(OldPosition, MoveTo, moveSpeed);
}
void SlideDoorClose()
{
isDoorOpen = false;
transform.localPosition = Vector3.MoveTowards(MoveTo, OldPosition, moveSpeed);
}
void OnGUI()
{
if (_isInsideTrigger && !isDoorOpen)
{
GUI.BeginGroup(new Rect(Screen.width / 2 - 200, 100, 450, 420));
GUI.Box(new Rect(0, 0, 330, 80), "");
GUI.Label(new Rect(15, 30, 400, 23), OpenText);
GUI.EndGroup();
}
else if (_isInsideTrigger && isDoorOpen)
{
GUI.BeginGroup(new Rect(Screen.width / 2 - 200, 100, 450, 420));
GUI.Box(new Rect(0, 0, 330, 80), "");
GUI.Label(new Rect(15, 30, 400, 23), CloseText);
GUI.EndGroup();
}
}
}
Answer by Positive7 · Sep 23, 2017 at 03:38 PM
private void Update()
{
if (Input.GetKeyDown(KeyCode.E) && _isInsideTrigger)
{
isDoorOpen = !isDoorOpen;
moveSpeed = 0f;
}
if (isDoorOpen && _isInsideTrigger)
{
transform.position = Vector3.MoveTowards(transform.localPosition, MoveTo, moveSpeed);
moveSpeed += Time.deltaTime / SlideSpeed;
}
else
{
transform.position = Vector3.MoveTowards(transform.localPosition, OldPosition, moveSpeed);
moveSpeed += Time.deltaTime / SlideSpeed;
}
}
Thank you for your answer. Tried to copy paste the code in, it moves smoothly, but it dosnt stop at "$$anonymous$$oveTo" cordinates, and starts moving once i enter play mode. Dont get the chance to get inside trigger, and click "E".
Updated the answer! maybe a second check is needed to see if transform.localPosition equals with $$anonymous$$oveTo
if (isDoorOpen && _isInsideTrigger)
{
if (transform.localPosition != $$anonymous$$oveTo)
{
transform.position = Vector3.$$anonymous$$oveTowards(transform.localPosition, $$anonymous$$oveTo, moveSpeed);
moveSpeed += Time.deltaTime / SlideSpeed;
}
}
else if (!isDoorOpen)
{
if (transform.localPosition != OldPosition)
{
transform.position = Vector3.$$anonymous$$oveTowards(transform.localPosition, OldPosition, moveSpeed);
moveSpeed += Time.deltaTime / SlideSpeed;
}
}