единство пользовательского интерфейса и collider2d - PullRequest
0 голосов
/ 23 декабря 2018

это довольно длинный код для простой функции, но я не могу понять, как его сократить.Любой совет?

это простой скрипт, который я создал для начинающего проекта, и я поместил скрипт в объект игрока с обоих элементов solidbody2d и boxcollider2d, и да, это работает, и все, он переключает оба игровых объекта кнопки, который являетсято, что я собирался в некотором смысле, но я хотел, чтобы он использовал только одну кнопку.если вы можете помочь с этим, я был бы признателен.

//different button objects
public GameObject smithbutton;
public GameObject innbutton;

private void OnTriggerEnter2D(Collider2D col)
{
//debugs which collider player is in
    if (col.gameObject.name == "Blacksmith")
    {
        Debug.Log("This is the Blacksmith");
    }
    if (col.gameObject.name == "Inn")
    {
        Debug.Log("This is the Inn");
    }
}

private void OnTriggerStay2D(Collider2D col)
{
//once playerobject stays, button will toggle till player leaves
    if (col.gameObject.name == "Blacksmith")
    {
        Debug.Log("still on the Blacksmith's door");
        smithbutton.SetActive(true);
    }
    if (col.gameObject.name == "Inn")
    {
        Debug.Log("still on the Inn's door");
        innbutton.SetActive(true);
    }
}

private void OnTriggerExit2D(Collider2D col)
{
//once playerobject exits, button will toggle and disappear
    if (col.gameObject.name == "Blacksmith")
    {
        smithbutton.SetActive(false);
    }
    if (col.gameObject.name == "Inn")
    {
        innbutton.SetActive(false);
    }
}

Ответы [ 2 ]

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

Вы ничего не можете сделать, так как функция довольно проста.Вы могли бы сделать это лучше, и при этом уменьшить количество строк.Использование тега вместо имени будет в будущем, если вы создадите больше гостиниц или больше кузнецов.Использование метода коллайдера позволит вам с легкостью расширить функциональность.Я обычно добавляю каждую из этих проверок в гостиницу и кузнецов самостоятельно, и они будут искать игрока.

//different button objects
[SerializeField] private GameObject smithbutton;
[SerializeField] private GameObject innbutton;

private void OnTriggerEnter2D(Collider2D col)
{
//debugs which collider player is in
    if (col.gameObject.tag == "Blacksmith")
    {
        ButtonActivationToggle(smithbutton, col);
    }
    if (col.gameObject.tag == "Inn")
    {
        ButtonActivationToggle(innbutton, col);
    }
}

private void OnTriggerExit2D(Collider2D col)
{
//once playerobject exits, button will toggle and disappear
    if (col.gameObject.tag == "Blacksmith")
    {
        ButtonActivationToggle(smithbutton, col);
    }
    if (col.gameObject.tag == "Inn")
    {
        ButtonActivationToggle(innbutton, col);
    }
}

public void ButtonActivationToggle(GameObject button, Collider2D collider)
{
    bool tmp = false;
    tmp = button.activeInHierarchy ? false : true;
    button.SetActive(tmp);
    if (button.activeInHierarchy)
    {
        Debug.Log("This is the " + gameObject.collider.tag)
    }
}  
0 голосов
/ 24 декабря 2018

вам не нужен OnTriggerStay, вы можете сделать это в OnTriggerEnter и избавиться от функции Stay.

public Button mybtn;
bool isBlacksmith; // keep track of where you are (you can later make it an enum if there are more than 2 places and check that)

void Start()
{
    //when the button is clicked buttonFunction will be called
    mybtn.onClick.AddListener(buttonFunction);
}
private void OnTriggerEnter2D(Collider2D col)
{
    if (col.gameObject.name == "Blacksmith")
    {
        Debug.Log("Entered Blacksmith's door");
        mybtn.gameObject.SetActive(true);
        isBlacksmith = true;
    }
    if (col.gameObject.name == "Inn")
    {
        Debug.Log("Entered Inn's door");
        mybtn.gameObject.SetActive(true);
        isBlacksmith = false;
    }
}

private void OnTriggerExit2D(Collider2D col)
{
    //once playerobject exits, button will toggle and disappear
    if (col.gameObject.name == "Blacksmith" || col.gameObject.name == "Inn")
    {
        smithbutton.SetActive(false);
    }
}

public void buttonFunction()
{
    if (isBlacksmith)
        Debug.Log("In Blacksmith");
    else
        Debug.Log("In Inn");

}
...