Скрипт двери для Unity 3D
- Создайте объект, который будет выступать за роль двери
- Добавьте ему этот скрипт
- Добавьте анимации открытия и закрытия
- Добавьте анимации открытия и закрытия в поле аниматора
- Создайте пустую анимацию (ПКМ -> Create state -> Empty)
- Назовите её Wait
- Сделайте её основной
- Добавьте параметр Bool "isOpen"
- Добавьте переход от Wait к анимации открытия двери
- В Conditions приравняйте состоянию "isOpen" True
- Прировняйте полю "Has exit time" False
- Добавьте переход от анимации открытия к анимации закрытия двери
- Настройте их также как в пункте 7, 9
- Добавьте Box collider объекту двери
- Создайте новый тег door и добавьте его к ней
isOpenотвечает за состояние двери: открыта или закрыта в данный момент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.