Почему мой игрок невидим, когда умирает? - PullRequest
2 голосов
/ 06 мая 2020

Я новичок в Unity. Я делаю игру на Unity 2D. В этой игре у меня есть игрок, платформы и die_zone , но когда мой игрок d ie, его спрайт становится невидимым. Как я могу изменить свой сценарий, чтобы сделать спрайт видимым?

Вот сценарий:

using UnityEngine;

public class Death : MonoBehaviour
{
    public GameObject Respawn;
    public Sprite Player_;
    public GameObject Player;
    public GameObject die_zone1;
    public GameObject die_zone2;
    public GameObject die_zone3;
    public GameObject die_zone4;

    public void die()
    {
        Player.transform.position = Respawn.transform.position;
        Player.GetComponent<SpriteRenderer>().sprite = Player_;
    }

    void OnTriggerEnter2D(Collider2D deth)
    {
        if (die_zone1.tag == "Death" || die_zone2.tag == "Death" || die_zone3.tag == "Death" || die_zone4.tag == "Death")
        {
            die();
        }
    }
} 

Я буду рад любому предложению.

Спасибо!

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Давайте разберем ваш код, чтобы пройти по его точкам сбоя.

using UnityEngine;

public class Death : MonoBehaviour
{
    public GameObject Respawn;
    public Sprite Player_;
    public GameObject Player;
    public GameObject die_zone1;
    public GameObject die_zone2;
    public GameObject die_zone3;
    public GameObject die_zone4;

Объявления типа / поля, вероятно, не ваша проблема

    public void die()
    {
        Player.transform.position = Respawn.transform.position;
        Player.GetComponent<SpriteRenderer>().sprite = Player_;
    }

Подозреваю, поскольку ваша ошибка возникает, когда ты д ie. Но, может быть, выполняется другой код?

    void OnTriggerEnter2D(Collider2D deth)
    {
        if (die_zone1.tag == "Death" || die_zone2.tag == "Death" || die_zone3.tag == "Death" || die_zone4.tag == "Death")
        {
            die();
        }
    }
} 

А, выглядит достаточно безопасно. Есть условный вызов d ie (). Предположительно, ваш код может взломать sh в условном (diezonetag == ...), но это прервет дальнейшее выполнение без редактирования объекта Player. Так что, наверное, хорошо.

Хорошо, остается d ie (). Есть две линии, каждая из которых является точкой отказа. Они кажутся независимыми друг от друга (перемещение игрока, изменение его спрайта), поэтому, возможно, вы можете протестировать каждый из них по отдельности, чтобы определить своего виновника. Вы можете сделать это, прокомментировав один, запустив и проверив, не тормозит ли ваша игра. Если это сработает, закомментируйте вторую (и раскомментируйте первую), запустите, и, надеюсь, ваша игра прервется.

        Player.transform.position = Respawn.transform.position;

Хм, так каково значение Respawn.transform.position? Если это за кадром или недействительно, можно было бы заподозрить, что это сделает положение вашего игрока за кадром или недействительным.

Вы можете отладить это, посмотрев на вид сцены до / после смерти вашего игрока. Какая их позиция до / после?

        Player.GetComponent<SpriteRenderer>().sprite = Player_;

Какой Player_ установлен на? Может быть, это нуль? В качестве альтернативы, если вы изменили спрайт вашего игрока на его спрайт состояния смерти в редакторе, вы что-нибудь увидите? Может быть, ваш спрайт смерти полностью прозрачен, или комбинация вашего спрайта смерти и настроек спрайтрендера не позволяет ему отображаться на вашем экране?

Когда вы нажимаете на свой объект игрока, появляется ли поле спрайта в инспекторе, и установлено ли что-нибудь вменяемое?

Фактически, вы устанавливаете Sprite на GameObject. Как это должно работать? Вы устанавливаете Sprite на GameObject, содержащий ваш спрайт, вместо самого Sprite? Не похоже, что он должен компилироваться. Согласно документации Unity (которую я получил путем поиска unity spriterenderer sprite) здесь https://docs.unity3d.com/ScriptReference/SpriteRenderer.html тип SpriteRenderer.sprite - это Sprite, тогда как у вас есть GameObject. Что-то кажется неправильным.

0 голосов
/ 06 мая 2020

Удалите эту строку или проверьте спрайт Player_. Также дважды проверьте, невидим ли он или просто вернулся к точке возрождения.

Player.GetComponent<SpriteRenderer>().sprite = Player_;
...