Skip to content

TBPOTW/DoorScript

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

13 Commits
 
 
 
 
 
 

Repository files navigation

DoorScript

Скрипт двери для Unity 3D

КАК ИСПОЛЬЗОВАТЬ?

  1. Создайте объект, который будет выступать за роль двери
  2. Добавьте ему этот скрипт
  3. Добавьте анимации открытия и закрытия

КАК НАСТРОИТЬ АНИМАТОР?

  1. Добавьте анимации открытия и закрытия в поле аниматора
  2. Создайте пустую анимацию (ПКМ -> Create state -> Empty)
  3. Назовите её Wait
  4. Сделайте её основной
  5. Добавьте параметр Bool "isOpen"
  6. Добавьте переход от Wait к анимации открытия двери
  7. В Conditions приравняйте состоянию "isOpen" True
  8. Прировняйте полю "Has exit time" False
  9. Добавьте переход от анимации открытия к анимации закрытия двери
  10. Настройте их также как в пункте 7, 9

ДОПОЛНИТЕЛЬНАЯ НАСТРОЙКА

  1. Добавьте Box collider объекту двери
  2. Создайте новый тег door и добавьте его к ней

КАКИЕ ЕСТЬ ПЕРЕМЕННЫЕ И ЗА ЧТО ОНИ ОТВЕЧАЮТ?

  1. isOpen отвечает за состояние двери: открыта или закрыта в данный момент
  2. isLocked отвечает за состояние двери: заперта ли дверь в данный момент

КАК РАБОТАЕТ СМЕНА СОСТОЯНИЯ?

public void setState()
{
  if (!isLocked) // Если дверь не заперта
  {
    isOpen = !isOpen; // Меняем состояние на противоположное
    anim.SetBool("isOpen", isOpen); // Проигрываем нужную анимацию
    transform.GetComponent<BoxCollider>().enabled = false; // отключаем BoxCollider, чтобы дверь не двигала игрока
    Invoke("SetBox", 0.27f); // Возвращаем BoxCollider спустя 0.27 секунд
    if (isOpen) // Проигрываем звук открывания
      playSound(sounds[0], volume: 0.7f, p1: 1f, p2: 1.25f);
    else // Проигрываем звук закрывания
      playSound(sounds[1], volume: 0.7f, p1: 1f, p2: 1.25f);
  } 
  // Если дверь заперта
  else
    Debug.Log("It is locked!"); // можете добавить свою логику
}

КАК ОТКРЫВАТЬ И ЗАКРЫВАТЬ ДВЕРЬ ЧЕРЕЗ ДРУГИЕ СКРИПТЫ?

Покажу на примере скрипта игрока используя RayCast

private void Update()
{
  // Создаем RayCast и пускаем его из центра камеры
  RaycastHit hit; 
  Ray ray = Camera.main.ScreenPointToRay(new Vector2(Screen.width / 2, Screen.height / 2));
  if (Physics.Raycast(ray, out hit, 2f)) // Если луч столкнется с чем-либо на расстоянии 2
  {
    if (hit.collider.tag == "door") { // Если этим объектом окажется дверь
      if (Input.GetKeyDown(KeyCode.E)) // Если в этот момент игрок нажмет 'E' на клавиатуре
	hit.collider.transform.GetComponent<Door>().setState(); // Меняем состояния двери
    }
  }
}

Благодаря GetComponent<Door>().setState(); можно обратится к компоненту Door и вызвать функцию setState().

ВАЖНО

Если setState() окажется типа private, то обратится к нему из других скриптов вы не сможете. Он обязательно должен быть типа public.

About

Simple door system for unity

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages