Как сделать лифт в игре?

Несмотря на казалось бы простоту вопроса, для начинающего магистра игровой индустрии, данная проблема может создать некоторые трудности. С одной стороны, можно просто сделать анимацию от точки А и до точки Б, всё это делается достаточно легко в пару кликов, останется лишь как-нибудь переключать клипы анимации, и лифт будет ходить по расписанию. Но, что если в процессе разработки необходимо будет изменить позицию лифта? Правильно, придется заново перезаписывать анимацию. Поэтому лучше всего, управление организовать через скрипт. Основные задачи: движение от стартовой позиции, до конечной и переход в режим ожидания, затем обратно; закрытие выхода во время движения, чтобы игрок не выпал; контроль звука.

Прежде чем продолжить, у вас уже должен быть готов сам лифт. Не важно какой у него дизайн, важно то что на платформу лифта, то есть поверхность на которую будет заходить игрок, нужно повесить небольшой скрипт, чтобы было возможно нормальное взаимодействие с объектом, например:


Еще, добавим что-то наподобие двери, по сути просто коллайдер, который будет перекрывать выход, чтобы игрок не выпал из лифта. Назовем его Lock.


Далее, все объекты из которых собран лифт, нужно сделать дочерними пустому объекту. Теперь у нас есть родитель.

На родителя цепляем скрипт LiftGame:

using UnityEngine;
using System.Collections;

[RequireComponent(typeof(AudioSource))]
[RequireComponent(typeof(SpriteRenderer))]

public class LiftGame : MonoBehaviour {

	public float speed = 1.5f;
	public GameObject _lock;
	public Vector3 point;
	public Collider collIn;
	public Collider collOut;
	public AudioSource _audioSource;
	private Vector3 defPos;
	private Vector3 tmp;
	private bool sw = false;
	private bool move = false;
	private float curTimeout;
	
	void Start () 
	{
		_lock.SetActive(false);
		defPos = transform.position;
		collIn.enabled = true;
		collOut.enabled = false;
	}

	void OnTriggerEnter(Collider coll) 
	{
		if(coll.tag == "Player")
		{
			if(!collOut.enabled)
			{
				_audioSource.volume = 0;
				collIn.enabled = false;
				_lock.SetActive(true);
				move = true;
				if(!sw) tmp = point; else tmp = defPos;
			}
			else
			{
				collIn.enabled = true;
				collOut.enabled = false;
			}
		}
	}

	void OnBecameVisible() 
	{
		enabled = true;
	}
	
	void OnBecameInvisible() 
	{
		enabled = false;
	}
	
	void Update () 
	{
		if (move) 
		{
			curTimeout += Time.deltaTime;
			if(curTimeout > 2)
			{
				float dis = Vector3.Distance(transform.position, tmp);

				if(dis < 0.5f) _audioSource.volume = Mathf.Lerp(_audioSource.volume, 0, 5 * Time.deltaTime); 
				else _audioSource.volume = Mathf.Lerp(_audioSource.volume, 1, 5 * Time.deltaTime);

				if(!_audioSource.isPlaying) _audioSource.Play();

				transform.position = Vector3.Lerp(transform.position, tmp, speed * Time.deltaTime);

				if(dis < 0.05f) Reset();
			}
		}
	}

	void Reset()
	{
		_audioSource.Stop();
		collOut.enabled = true;
		_lock.SetActive(false);
		curTimeout = 0;
		transform.position = tmp;
		move = false;
		sw = !sw;
	}
}

Скрипт добавит Audio Source в который мы добавляем сэмпл звука, который будет проигрываться во время движения, в самом компоненте отключаем параметр Play On Awake и ставим галочку Loop. Скрипт так же добавит Sprite Renderer, с ним делать ничего не надо, этот компонент будет использоваться для оптимизации, то есть чтоб скрипт отключался если он не в поле зрения камеры, и включался если наоборот.

Итак, переменные:

speed - скорость движения лифта.

_lock - здесь объект с коллайдером, который закрывает выход из лифта.

point - точка назначения. А стартовой будет считаться текущая позиция.

_audioSource - тут добавляем наш Audio Source.

collIn - внутренний триггер, запускает лифт.

collOut - триггер за приделами модели лифта, переключает его в режим ожидания.


Логика в том, что изначально будет включен триггер Coll In, когда игрок заходит в лифт, то скрипт переключается на внешний триггер Сoll Out и начинает движение. По прибытию на место, выходя из лифта, игрок активирует внешний триггер и скрипт обратно переходит в режим ожидания, пока игрок снова в него не зайдет.

Стоит отметить, что тут сделан плавный контроль звука, поэтому щелчков не должно быть. И кстати, чтобы всё работало у персонажа или того кто заходит в лифт, должен быть установлен тег Player, не забываем эту деталь и при необходимости меняем. Еще одна деталь, скрипт должен быть выключен по умолчанию, как показано на скриншоте выше, это надо сделать вручную. Суть в том что когда сцена стартует, работать скрипт не будет, тем самым экономя ресурсы системы, но если игрок подойдет к лифту, скрипт запустится, а потом снова отключится, когда игрок отправится дальше по своим делам.

Как-то так, пробуем...
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
  • Яндекс.Метрика