Исчезать изображения всякий раз, когда я нажимаю кнопку - PullRequest
0 голосов
/ 28 февраля 2019

Я играю в игру, и у меня есть главное меню с кнопкой запуска, которая отлично работает.Единственная проблема заключается в том, что вы можете видеть фон, поэтому я добавил другое изображение, называемое «fadeImage», и я хочу, чтобы оно было таким, чтобы всякий раз, когда функция, отвечающая за обнаружение при каждом нажатии, исчезала в изображении, называемом «fadeImage».Я пытался использовать GetComponent и GetGameObject и всякий раз, когда я использую CrossFade Alpha, я получаю ошибку Object reference not set to instance of object в строке 51. Вот мой код

using UnityEngine;
using System.Collections;
using UnityEngine.Audio;
using UnityEngine.SceneManagement;
using UnityEngine.UI;


public class StartOptions : MonoBehaviour 
{
    public int sceneToStart = 1;                                        //Index number in build settings of scene to load if changeScenes is true
    public bool changeScenes;                                           //If true, load a new scene when Start is pressed, if false, fade out UI and continue in single scene
    public bool changeMusicOnStart;                                     //Choose whether to continue playing menu music or start a new music clip
    public Image fadeImage;

    [HideInInspector] public bool inMainMenu = true;                    //If true, pause button disabled in main menu (Cancel in input manager, default escape key)
    [HideInInspector] public Animator animColorFade;                    //Reference to animator which will fade to and from black when starting game.
    [HideInInspector] public Animator animMenuAlpha;                    //Reference to animator that will fade out alpha of MenuPanel canvas group
     public AnimationClip fadeColorAnimationClip;       //Animation clip fading to color (black default) when changing scenes
    [HideInInspector] public AnimationClip fadeAlphaAnimationClip;      //Animation clip fading out UI elements alpha

    private PlayMusic playMusic;                                        //Reference to PlayMusic script
    private float fastFadeIn = .01f;                                    //Very short fade time (10 milliseconds) to start playing music immediately without a click/glitch
    private ShowPanels showPanels;                                      //Reference to ShowPanels script on UI GameObject, to show and hide panels

    void Awake()
    {
        //Get a reference to ShowPanels attached to UI object
        showPanels = GetComponent<ShowPanels> ();

        //Get a reference to PlayMusic attached to UI object
        playMusic = GetComponent<PlayMusic> ();

        fadeImage = GetComponent<Image>();       
    }

    public void StartButtonClicked()
    {
        //If changeMusicOnStart is true, fade out volume of music group of AudioMixer by calling FadeDown function of PlayMusic, using length of fadeColorAnimationClip as time. 
        //To change fade time, change length of animation "FadeToColor"
        fadeImage.CrossFadeAlpha(1.0f, 1.0f, true);

        if (changeMusicOnStart) 
        {
            playMusic.FadeDown(fadeColorAnimationClip.length);
        }

        //If changeScenes is true, start fading and change scenes halfway through animation when screen is blocked by FadeImage
        if (changeScenes) 
        {
            //Use invoke to delay calling of LoadDelayed by half the length of fadeColorAnimationClip
            Invoke ("LoadDelayed", fadeColorAnimationClip.length * .5f);

            //Set the trigger of Animator animColorFade to start transition to the FadeToOpaque state.
            animColorFade.SetTrigger ("fade");
        } 

        //If changeScenes is false, call StartGameInScene
        else 
        {
            //Call the StartGameInScene function to start game without loading a new scene.
            StartGameInScene();
        }
    }

    void OnEnable()
    {
        SceneManager.sceneLoaded += SceneWasLoaded;
    }

    void OnDisable()
    {
        SceneManager.sceneLoaded -= SceneWasLoaded;
    }

    //Once the level has loaded, check if we want to call PlayLevelMusic
    void SceneWasLoaded(Scene scene, LoadSceneMode mode)
    {
        //if changeMusicOnStart is true, call the PlayLevelMusic function of playMusic
        if (changeMusicOnStart)
        {
            playMusic.PlayLevelMusic ();
        }   
    }

    public void LoadDelayed()
    {
        //Pause button now works if escape is pressed since we are no longer in Main menu.
        inMainMenu = false;

        //Hide the main menu UI element
        showPanels.HideMenu ();

        //Load the selected scene, by scene index number in build settings
        SceneManager.LoadScene (sceneToStart);
    }

    public void HideDelayed()
    {
        //Hide the main menu UI element after fading out menu for start game in scene
        showPanels.HideMenu();
    }

    public void StartGameInScene()
    {
        //Pause button now works if escape is pressed since we are no longer in Main menu.
        inMainMenu = false;

        //If changeMusicOnStart is true, fade out volume of music group of AudioMixer by calling FadeDown function of PlayMusic, using length of fadeColorAnimationClip as time. 
        //To change fade time, change length of animation "FadeToColor"
        if (changeMusicOnStart) 
        {
            //Wait until game has started, then play new music
            Invoke ("PlayNewMusic", fadeAlphaAnimationClip.length);
        }
        //Set trigger for animator to start animation fading out Menu UI
        animMenuAlpha.SetTrigger ("fade");
        Invoke("HideDelayed", fadeAlphaAnimationClip.length);
        Debug.Log ("Game started in same scene! Put your game starting stuff here.");
    }

    public void PlayNewMusic()
    {
        //Fade up music nearly instantly without a click 
        playMusic.FadeUp (fastFadeIn);
        //Play music clip assigned to mainMusic in PlayMusic script
        playMusic.PlaySelectedMusic (1);
    }
}

Кнопка запуска работает всякий раз, когда я удаляю любой код, ссылающийся на изображение, нокогда я не получаю сообщение об ошибке, и кнопка «Пуск» просто остается синей, что должно происходить только тогда, когда вы наведете на нее курсор мыши.

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Кажется, что

fadeImage = GetComponent<Image>();

просто завершается с ошибкой и возвращает null, поскольку нет компонента Image точно на том GameObject, к которому присоединен этот скрипт.

GetComponent Возвращает компонент типа Type, если к игровому объекту он прикреплен, и NULL, если этого не происходит.


Вы говорите

Я добавил изображение с именем fadeImage в кнопку

, поэтому я бы сказал, что вы скорее хотите использовать GetComponentInChildren для поиска этого Image компонент рекурсивный в иерархии в GameObject, к которому этот скрипт прикреплен

// By passing a true as parameter you make also
// Sure that the component will also be found
// if it is currently not active or disabled - otherwise it would be ignored
fadeImage = GetComponentInChildren<Image>(true);
0 голосов
/ 28 февраля 2019

Эта строка fadeImage = GetComponent<Image>(); в вашей функции Start будет работать только в том случае, если вы присоедините этот скрипт к своему изображению.Вот почему вы получаете ошибку нулевой ссылки, потому что объект, имеющий такое монобихевиоризм, не имеет компонента Image.

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