Взять ключ из открытого ящика - PullRequest
0 голосов
/ 04 декабря 2018

Итак, у меня есть ящик, который анимирован скриптом, показывающим панель, которая предлагает игроку открыть / закрыть ящик, используя триггер.У меня также есть ключ с похожим скриптом, но вместо этого он предлагает игроку подобрать ключ также с помощью панели и триггеров.Я хотел бы поместить ключ в ящик, поэтому, когда игрок нажимает «E», чтобы открыть ящик, он также может нажать «E», чтобы забрать ключ.Я попытался уменьшить коллайдер ящика, а также увеличил коллайдер ключа, но это означает, что игрок может взять ключ, не открывая ящик.Что является более эффективным способом достижения этого?При необходимости я также приложу свой код.

DrawerScript:

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Events;

public class DrawerScript : MonoBehaviour
{

UnityEvent Event = new UnityEvent();

public GameObject OpenPanel = null;

private bool _isInsideTrigger = false;

public Animator _animator;

public string OpenText = "Press 'E' to open drawer";

public string CloseText = "Press 'E' to close drawer";

private bool _isOpen = false;

private void Start()
{
    OpenPanel.SetActive(false);
}


void OnTriggerEnter(Collider other)
{
    if (other.tag == "Player")
    {
        _isInsideTrigger = true;
        OpenPanel.SetActive(true);
        UpdatePanelText();
        Event.Invoke();
    }
}

private void UpdatePanelText()
{
    Text panelText = OpenPanel.transform.Find("Text").GetComponent<Text>();
    if (panelText != null)
    {
        panelText.text = _isOpen ? CloseText: OpenText;
    }
}

void OnTriggerExit(Collider other)
{
    if (other.tag == "Player")
    {
        _isInsideTrigger = false;
        OpenPanel.SetActive(false);
    }
}

private bool IsOpenPanelActive
{
    get
    {
        return OpenPanel.activeInHierarchy;
    }
}

// Update is called once per frame
void Update()
{
    if (IsOpenPanelActive && _isInsideTrigger)
    {
        if (Input.GetKeyDown(KeyCode.E))
        {
            _isOpen = !_isOpen;

            Invoke ("UpdatePanelText", 1.0f);

            _animator.SetBool("open", _isOpen);
        }
      }
   }
}

Сценарий раскладки клавиш:

 using UnityEngine.UI;
 using UnityEngine;

 public class PickUp : MonoBehaviour
 {

public Collider Collider;

public GameObject OpenPanel = null;

private bool _isInsideTrigger = false;


public string PickUpText = "Press 'E' to pick up";

private void Start()
{
    if (OpenPanel != null)
    {
        OpenPanel.SetActive(false);
    }
    Collider = GetComponent<Collider>();
}


void OnTriggerEnter(Collider other)
{
    if (other.tag == "Player")
    {
        _isInsideTrigger = true;
        OpenPanel.SetActive(true);
        UpdatePanelText();
    }
}

private void UpdatePanelText()
{
    Text panelText = OpenPanel.transform.Find("Text").GetComponent<Text>();
    if (panelText != null)
    {
        panelText.text = PickUpText;
    }
}

void OnTriggerExit(Collider other)
{
    if (other.tag == "Player")
    {
        _isInsideTrigger = false;
        OpenPanel.SetActive(false);
    }
}

private bool IsOpenPanelActive
{
    get
    {
        return OpenPanel.activeInHierarchy;
    }
}

1 Ответ

0 голосов
/ 05 декабря 2018

Вы можете использовать UnityEvent API.

Это не лучшее решение, и есть несколько способов сделать это, но если вы пытаетесь решить проблему быстро, вы можете, например, создать UnityEvent в своем ящикеclass.

Вам необходимо добавить пространство имен:

using UnityEngine.Events;

и в качестве переменной:

UnityEvent event = new UnityEvent();

Это, вероятно, создаст новое событие (очень похоже накнопка) на вашем ящике класса.Следующим шагом является создание метода, который будет включать или отключать коллайдер внутри вашего класса ключей.Метод должен быть публичным.

После этого просто перейдите в свой ящик GameObject, нажмите на знак «+», перетащите в него свой Key GameObject и выберите класс и открытый метод, который вы только что создали.Это подпишет этот метод на событие.

Наконец, в вашем методе «открыть ящик» вы просто вызываете:

event.Invoke();

И все «слушающие» его будут выполняться, включаяваш класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...