Значение Unity, назначенное в инспекторе, обнуляет в коде - PullRequest
0 голосов
/ 14 февраля 2019

Я новичок в Unity с проблемой, из-за которой мне не удалось найти ответ ни на одной из плат.Создавая очень простой сценарий Unity C #, в моей функции Awake() есть следующие строки кода:

Assert.IsNotNull(sfxJump);
Assert.IsNotNull(sfxDeath);
Assert.IsNotNull(sfxCoin);

Третье утверждение "Assert.IsNotNull(sfxCoin) выбрасывает как null, хотя монета AudioClip установлен в Инспекторе:

Значения сценария Инспектора:

enter image description here

Однако - и это часть, которая меня озадачила - по некоторым причинам sfxCoin - это , а не null, когда он вызывается в том же скрипте из OnCollisionEnter() подпрограммы

Так что, похоже, Unity регистрирует объект с кодом - в конце концов - но утвержденияошибка с начальными Awake(), Start() и Update() методами.

И это происходит только с sfxCoin. sfxJump и sfxDeath, у которых нет этой проблемы.

Буду признателен за любую помощь

Весь скрипт ниже:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Assertions;

public class Player : MonoBehaviour
{
    [SerializeField] private float jumpForce = 100f;
    [SerializeField] private float forwardMomentum = 5f;
    [SerializeField] private AudioClip sfxJump;
    [SerializeField] private AudioClip sfxDeath;
    [SerializeField] private AudioClip sfxCoin; 

    private Animator anim;
    private Rigidbody Rigidbody;
    private bool jump = false;
    private AudioSource audioSource;  

    private void Awake()
    {
        Assert.IsNotNull(sfxJump);
        Assert.IsNotNull(sfxDeath);
        Assert.IsNotNull(sfxCoin);
    }

    // Start is called before the first frame update
    void Start()
    {
        anim = GetComponent<Animator>();
        Rigidbody = GetComponent<Rigidbody>();
        audioSource = GetComponent<AudioSource>();        
    }

    // Update is called once per frame
    void Update()
    {
        if (!GameManager.instance.GameOver() && GameManager.instance.GameStarted())
        { 
            if (Input.GetMouseButton(0))
            {
                GameManager.instance.PlayerStartedGame();

                anim.Play("Jump");
                audioSource.PlayOneShot(sfxJump);
                Rigidbody.useGravity = true;
                jump = true;
            }
        }
    }

    private void FixedUpdate()
    {
        if (jump)
        {
            jump = false;
            Rigidbody.velocity = new Vector2(0, 0);
            Rigidbody.AddForce(new Vector2(forwardMomentum, jumpForce), ForceMode.Impulse);
        }
    }

    private void OnCollisionEnter(Collision collision)
    {
        switch (collision.gameObject.tag)
        {
            case "obstacle":
                Rigidbody.AddForce(new Vector2(-50, 20), ForceMode.Impulse);
                Rigidbody.detectCollisions = false;
                audioSource.PlayOneShot(sfxDeath);
                GameManager.instance.PlayerCollided();
                break;
            case "coin":

                audioSource.PlayOneShot(sfxCoin);
                GameManager.instance.Score(1);
                print("GOT COIN");
                break;

        }
    }
}

1 Ответ

0 голосов
/ 19 февраля 2019

извините, я выяснил, в чем проблема.

Был второй экземпляр игрового объекта, который также использовал тот же скрипт, для которого не был установлен sfxCoin.Он был скрыт под узлом в иерархии, поэтому я его не видел.

Как я уже сказал, я новичок в этом.

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