Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

(Unity 3D C#) Все двери открываются одновременно

Иван Курочкин Ученик (234), на голосовании 4 месяца назад
Создал скрипт для открытия двери с анимацией, переменной и т. д. Перед открытием скрипт проверяет тег (DoorT), наличие касания луча из камеры (Ray) и нажатие клавиши (Е). Когда добавил вторую дверь, заметил, что они открываются одновременно. Как можно дифференцировать одинаковые объекты? Для каждой отдельной двери писать одинаковый код неохота. Заранее предупреждаю, что я новичок и с программой плохо знаком. Я даже не знаю, как загуглить решение. Прошу не писать решение абстрактно, а с конкретными функциями.
Вот код:
 using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;

public class Door : MonoBehaviour
{

// НАЧАЛЬНЫЕ ПАРАМЕТРЫ/ОБЪЕКТЫ
[SerializeField] private Animator anim;
public LayerMask lay;
public float dist = 15f;
public GameObject cam;
public TMP_Text TextInt;

// ПРИСВАИВАНИЕ АНИМАЦИИ
void Start(){
anim = GetComponent();
}
private void Update()
{
// ЛУЧ ИЗ КАМЕРЫ
RaycastHit hit;
Ray ray = new Ray(cam.transform.position, cam.transform.forward);
// ОТОБРАЖЕНИЕ ТЕКСТА ВЗАИМОДЕЙСТВИЯ "Е"
if(Physics.Raycast(ray, out hit, dist) && (hit.transform.tag == "DoorT")){
TextInt.text = "E";}
else{TextInt.text = " ";}
// ОТКРЫТИЕ ДВЕРИ
if(Physics.Raycast(ray, out hit, dist) && Input.GetKeyDown(KeyCode.E) && (hit.transform.tag == "DoorT"))
anim.SetBool("isOpen", !anim.GetBool("isOpen"));
}
}
Заранее большое спасибо.
Дополнен 5 месяцев назад
По-хорошему, мне было бы полезно узнать, как применить анимацию только к предмету, к которому применён скрипт.
Голосование за лучший ответ
MvC Просветленный (36650) 5 месяцев назад
using UnityEngine;

public class DoorOpener : MonoBehaviour
{
public GameObject doorToOpen; // Перетащите сюда конкретную дверь в инспекторе

private void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player")) // Проверка, что в триггер вошел игрок
{
doorToOpen.SetActive(false); // Открыть дверь
}
}
}


doorToOpen - это переменная, в которую вы должны перетащить конкретный объект двери в инспекторе Unity.
OnTriggerEnter - это метод, который срабатывает, когда в триггер входит другой коллайдер. В этом случае, если объект с тегом "Player" входит в триггер, указанная дверь будет открыта.

Убедитесь, что у каждой двери в вашей сцене есть свой собственный экземпляр скрипта DoorOpener, и что в каждом из них в поле doorToOpen перетащена соответствующая дверь. Таким образом, каждый скрипт будет открывать только свою дверь.

А так легче и быстрее исп готовый шаблон для дверей.
Иван КурочкинУченик (234) 5 месяцев назад
Этот способ решает проблему, но есть ли вариант, чтобы дверь не просто становилась неактивной, а использовать анимации с bool переменной?
MvC Просветленный (36650) Иван Курочкин, Я использовал всегда готовый ассет для дверей. (сам я никогда двери с 0 - ля не делал, так что тонкостей, как сделать лучше, я не знаю).
Xttx Мыслитель (9002) 5 месяцев назад
Когда ты смотришь в одну дверь, то скрипты на ВСЕХ дверях проходят проверку, потому, что ты проверяешь хит по тэгу, и прверка проходит (ты же на дверь смотришь), но у тебя нет проверки _на_какую_именно_ дверь ты смотришь, соответственно по Е они открываются все.
Попробуй добавить после первого рейкаста (кстати, зачем рейкастить два раза подряд?):
if (hit.collider.gameObject != gameObject) return;
creakdowndeadly Мастер (1091) 5 месяцев назад
Крайне странное использование рейкастов для открытия дверей. Я такое ещё не делал, но не легче лишь делать проверку игрока с "воображаемым" радиусом двери для открытия дверей?
Похожие вопросы