2.5D Phase 1 Framework: Elevator

No sweat, I did this before!

2.5D Phase 1 Framework Challenge

For today's challenge, I created a functional lift system with a 5-second delay before moving from point A to B. I went through an elevator system before as well as a moving platform system and they are mostly all the same under the hood.

What do I need?

I need the elevator to go from A to B. So two transforms with their unique position in world space. A float variable for the speed of the elevator. A float variable for the wait time before switching towards the other point. And lastly, a bool for switching.

Getting Started

In the Elevator script attached to the lift game object, I have:

[SerializeField] private Transform _pointA, _pointB;
[SerializeField] private float _speed = 3f;
[SerializeField] private float _waitTime = 5f;
private bool _switch = false;

I want the bool to control when I can switch from one point to the other. So before switching, I want there to be a 5-second delay. Using a coroutine will help me with the delay.

IEnumerator WaitBeforeSwitchingRoutine(bool _canSwitch)
{
yield return new WaitForSeconds(_waitTime);
_switch = _canSwitch;
}

After 5-seconds, switch!

In FixedUpdate, if the current position equals point A, then switch is true. Else if the current position equals point B, switch is false.

if (transform.position == _pointA.position)
StartCoroutine(WaitBeforeSwitchingRoutine(true));
else if (transform.position == _pointB.position)
StartCoroutine(WaitBeforeSwitchingRoutine(false));

If switch is false, then I want the current position to move to point A. If switch is true, then I want the current position to move to point B.

if (!_switch)
transform.position = Vector3.MoveTowards(transform.position, _pointA.position, _speed * Time.fixedDeltaTime);
else
transform.position = Vector3.MoveTowards(transform.position, _pointB.position, _speed * Time.fixedDeltaTime);

I now have a working elevator system that loops back and forth with a wait time delay!

When the player goes on it, the player jitters. The reason being is that the player is not parented to the elevator. To fix it, I attached a box collider set as a trigger and adjusted the y-positon of the collider so it can detect the player.

In the Elevator script, when the player collides with this trigger, I want to parent the player to the elevator transform.

private void OnTriggerEnter(Collider other)
{
if (other.CompareTag(“Player”))
{
other.transform.parent = transform;
}
}

And if the player exits the trigger, I want the parent of the player not to be in the elevator game object’s transform anymore.

private void OnTriggerExit(Collider other)
{
if (other.CompareTag(“Player”))
{
other.transform.parent = null;
}
}

Now it’s working like a charm!

Gabriel

--

--

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store