Unity Как обнаружить спрайт mssing?или ноль? - PullRequest
1 голос
/ 23 сентября 2019

Я хочу обнаружить, что спрайт изображения "Отсутствует" или "Нет"

  1. enter image description here
  2. enter image description here

Когда я получаю этот спрайт, все они становятся "нулевыми", вот так. Как я узнаю, что это "отсутствует" или "нет"?enter image description here

PS: Я хочу знать, что это отсутствует или нет, для меня это разные ситуации.

1 Ответ

4 голосов
/ 23 сентября 2019

Unity выдает различные исключения по разным причинам, почему при попытке доступа к ним используется ссылка null!

Это также причина, по которой вам следует строго избегать someObject == null проверок.Unity имеет перезаписанное поведение == null для типа Object (в основном, родительский класс большинства встроенных типов Unity), и даже если объект выглядит как null, он все равно хранит некоторую информациюнапример, как только что упомянуто, причина, по которой это null.

Так что вы можете использовать небольшую «хитрость» и просто попытаться получить доступ к полю и проверить, какое именно исключение вы получите в пределах блоков try - catch:

public void CheckReference(Object reference)
{
    try
    {
        var blarf = reference.name;
    }
    catch (MissingReferenceException) // General Object like GameObject/Sprite etc
    {
        Debug.LogError("The provided reference is missing!");
    }
    catch (MissingComponentException) // Specific for objects of type Component
    {
        Debug.LogError("The provided reference is missing!");
    }
    catch (UnassignedReferenceException) // Specific for unassigned fields
    {
        Debug.LogWarning("The provided reference is null!");
    }
    catch (NullReferenceException) // Any other null reference like for local variables
    {
        Debug.LogWarning("The provided reference is null!");
    }
}

Пример

public class Example : MonoBehaviour
{
    public Renderer renderer;
    public Collider collider;

    private void Awake()
    {
        renderer = GetComponent<Renderer>();
        Destroy(renderer);
    }

    private void Update()
    {
        if (!Input.GetKeyDown(KeyCode.Space)) return;

        CheckReference(renderer); // MissingComponentException
        CheckReference(collider); // UnassignedReferenceException

        Sprite sprite = null;

        CheckReference(sprite);   // NullReferenceException

        sprite = Sprite.Create(new Texture2D(1, 1), new Rect(0, 0, 1, 1), Vector2.zero);
        DestroyImmediate(sprite);
        CheckReference(sprite);   // MissingReferenceException
    }

    public void CheckReference(Object reference)
    {
        try
        {
            var blarf = reference.name;
        }
        catch (MissingReferenceException) // General Object like GameObject/Sprite etc
        {
            Debug.LogError("The provided reference is missing!");
        }
        catch (MissingComponentException) // Specific for objects of type Component
        {
            Debug.LogError("The provided reference is missing!");
        }
        catch (UnassignedReferenceException) // Specific for unassigned fields
        {
            Debug.LogWarning("The provided reference is null!");
        }
        catch (NullReferenceException) // Any other null reference like for local variables
        {
            Debug.LogWarning("The provided reference is null!");
        }
    }
}

enter image description here

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