Дверь автоматически закрывается, когда персонаж отходит.
Настройка сцены:
Объект с анимацией. Дверь.
Empty с триггером. На нем висит скрипт. В скрипте надо указать дверь с анимацией (перетащить из Hierarchy)
1. Надо сделать анимацию закрывания двери. Это новая анимация, но ключевые кадры такие же, что в анимации открытия, поэтому имеет смысл скопировать ключи со старой анимации и вставить новые ключи и поменять их местами.
2. Не забудьте у анимации открывания и закрывания убрать галочку Loop Time. Чтобы анимация не была цикличной.
3. Настройка аниматора. Аниматор двери (объекта с анимацией). Окно настроек аниматора можно найти по пути Windows -> Animator. Аниматор можно найти в Project или выделив объект с Аниматором.
Настройки стрелочки перехода из состояния покоя в открытие двери
Настройки стрелочки перехода из открытого состояния в анимацию закрытия.
4. Написание кода. Событие входа в триггер мы уже знаем. По аналогии мы используем Функцию, которая вызывается при выходе из триггера.
(имей ввиду, что “open” в коде должен писаться также, как ты назвал параметр в аниматоре (у меня это, действительно open) См. пункт 3
Текст:
private void OnTriggerExit(Collider other)
{
if (other.tag == "Player")
{
anim.SetBool("open", false);
}
}
Дверь открывается при нажатии на кнопку “E” и если персонаж находится у двери (на триггере, на котором висит скрипт)
Здесь просто редактируем скрипт. Читай комменты. Помни, что при содании скрипта, название файла, должно совпадать с название класса (первая строчка public class НазваниеКласса)
Текст:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DoorScript: MonoBehaviour {
public GameObject door; // переменная объекта в котором анимация. Указывается в unity
Animator anim;//переменная, хранящая аниматор объекта с анимацией
bool enter=false;//переменная определяющая в триггере персонаж или нет
void Start () {//функция вызывается один раз при запуске, тут обычно инициализируют необходимые переменные
anim = door.GetComponent<Animator>();//инициализация аниматора, записываем аниматор объекта в переменную
}
void Update () {//функция вызывается каждый кадр, то есть постоянно и очень часто
if (Input.GetKeyDown (KeyCode.E) && enter && Inventory.key1 == true)//проверка, нажата ли кнопка E (Input.GetKeyDown (KeyCode.E))
// и (&&) равен ли enter true (enter) и (&&) есть ли ключ. Запись &&Inventory.key1 == true не нужна, если ключ не предусмотрен
{
anim.SetBool("open", true); // если условия выполнены, то меняем значение параметра в аниматоре.
}
}
private void OnTriggerEnter(Collider other) // функция вызывается при входе персонажа в триггер.
//Триггер висит на Empty под дверью
{
if (other.tag=="Player")//если в триггер зашел персонаж (объект с тегом "Player")
enter = true; //то enter true
}
private void OnTriggerExit(Collider other)// функция вызывается при выходе персонажа из триггера.
{
if (other.tag == "Player")//если в триггер зашел персонаж (объект с тегом "Player")
{
enter = false; //то enter false
anim.SetBool("open", false);//меняем значение параметра в аниматоре.
}
}
}
Для ключа
Персонажу создаем скрипт Inventory (инвентарь)
Код скрипта:
Настройки для ключа. Для него тоже надо создать скрипт keyScr
Текст скрипта
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class keyScr: MonoBehaviour {
void OnTriggerEnter (Collider col)
{
if (col.tag == "Player")
{
Inventory.key1=true;
Destroy (gameObject);
}
}
}