Остановить анимацию из массива в Unity и C# - PullRequest
0 голосов
/ 06 февраля 2020

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

Start_Script.cs

//Steps for Level 01:
public static GameObject Step001, Step011, Step012;    

//Each animation will play in Level 01:
public static Animation AnimationStep001, AnimationStep011, AnimationStep012;  

int levelCounter;

void Awake()
{
    levelCounter = 1;

    Step001 = GameObject.Find("Step001");
    Step011 = GameObject.Find("Step011");
    Step012 = GameObject.Find("Step012");

    AnimationStep001 = Step001.GetComponent<Animation>();
    AnimationStep011 = Step011.GetComponent<Animation>();
    AnimationStep012 = Step012.GetComponent<Animation>();
}

//Method is assigned to "Next Level" Button.
public void nextLevel()
{
    switch(levelCounter) 
    {
        case 1:
            for(int i = 0; i == Array_Lists.animStrings.Length; i++)
            {
                Array_Lists.animAnimation[i].Stop(Array_Lists.animStrings[i]);
            }
            break;
    }
    levelCounter += 1;
}

Array_Lists.cs

// My Array for the animations name:
public static string[] animStrings = {"animStep1", "animStep1.1", "animStep1.2"};

// My Array for the animation objects:
public static Animation[] animAnimation = {
    Start_Script.AnimationStep001,
    Start_Script.AnimationStep011,
    Start_Script.AnimationStep012
};

Но, к сожалению, я всегда получаю NullReferenceException: Object reference not set to an instance of an object для Array_Lists.animAnimation[i].Stop(Array_Lists.animStrings[i]);

Таким образом, мне нужно остановить все анимации, когда я нажимаю кнопку «Следующий уровень».

Редактировать

После моего первого NullReferenceException: я добавил следующее к моему public void nextLevel() методу:

public void nextLevel()
{
    switch(levelCounter)
    {
        case 1:
            for(int i = 0; i == Array_Lists.animStrings.Length; i++)
            {
                Debug.Log("Array Animations = " + Array_Lists.animAnimation[i];

                Debug.Log("Array anim Name = " + Array_Lists.animStrings[i];
                Array_Lists.animAnimation[i].Stop(Array_Lists.animStrings[i]);
            }
            break;
    }
    levelCounter += 1;
}

Это был мой вывод:

Array Animations = null
Array anim Name = animStep1

Array Animations = null
Array anim Name = animStep1.1

Array Animations = null
Array anim Name = animStep1.2

Ответы [ 2 ]

2 голосов
/ 06 февраля 2020

Ваши массивы имеют статус c, поэтому они создаются до Awake.

Ваш animAnimation заполнен нулями, и он не изменяется, когда вы устанавливаете компоненты в Start_Script.AnimationStep001 и другие. Вам нужно заполнить animAnimation компонентами после Awake. И ваши сценарии взаимосвязаны, это не очень хорошо. Попробуйте создать и заполнить animAnimation из Start_Script.

UPD: добавьте это в конце вашего Start_Script.Awake:

Array_Lists.animAnimation = new [] {
    AnimationStep001,
    AnimationStep011,
    AnimationStep012
};
2 голосов
/ 06 февраля 2020
i == Array_Lists.animStrings.Length

, а не

i < Array_Lists.animStrings.Length

Я подозреваю, что вы никогда не введете цикл for.

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