Единство 3d анимация - PullRequest
3 голосов
/ 15 мая 2019

Я новичок в Unity3d и просто играл с анимацией единства, я пытался реализовать 2 основных кнопки пользовательского интерфейса, например, при нажатии любой из них следует проверить, воспроизводится ли анимация до того, как будет доступна вторая кнопка, еслида, затем удалите этот игровой объект из сцены, используя обратную анимацию, иначе воспроизведите анимацию по умолчанию, прикрепленную к определенной кнопке.

Проблема из 6: только 4 работают, 2 из них не выполняются (помечены в коде как Дело не работает )

Animation anim;
private bool isOpen = false; 
private bool open = false;
// Start is called before the first frame update
void Start()
{
    anim = GetComponent<Animation>();
    //isOpen = false;
    //open = false;

}

// Update is called once per frame
void Update()
{

}

void OnGUI()
{
    isOpen = GUI.Toggle(new Rect(50, 50, 200, 100), isOpen, "IsOpen");
    open = GUI.Toggle(new Rect(65, 65, 200, 100), open, "Open");
}
public void ButtonControl()
{
    string name = EventSystem.current.currentSelectedGameObject.name;
    if (name == "Main Button 1")
    {
        if (isOpen == false && open == false)
        {   Debug.Log("False False 1");
            Anim1();
            isOpen = true;
        }
        else if (isOpen == false && open == true) // case not operational
        {   Debug.Log("False True 2");
            ReverseAnim_2();
            open = false;
            Anim1();
            isOpen = true;
        }
        else if(isOpen == true)
        {
            Debug.Log("True 3");
            ReverseAnim_1();
            isOpen = false;
        }
    }


    else if (name == "Main Button 2")
    {
        if (open == false && isOpen == false)
        {   Debug.Log("False False 4");
            Anim2();
            open = true;
        }
        else if(open == false && isOpen == true) // case not operational
        {   Debug.Log("False True 5");
            ReverseAnim_1();
            isOpen = false;
            Anim2();
            open = true;
        }
        else if(open == true)
        {
            Debug.Log("True 6");
            ReverseAnim_2(); 
            open = false;
        }
    }
}

void ReverseAnim_1()
{
    anim["1"].speed = -1;
    anim["1"].time = anim["1"].length;
    anim.Play();
}

void Anim1()
{
    anim["1"].speed = 1;
    anim.Play();
}

void Anim2()
{
    anim["2"].speed = 1;
    anim.Play();
}

void ReverseAnim_2()
{
    anim["2"].speed = -1;
    anim["2"].time = anim["2"].length;
    anim.Play();
}

Ответы [ 2 ]

1 голос
/ 16 мая 2019

Проблема в том, что у вас есть два Main_B2 скрипта, и каждый из них отслеживает свои собственные значения для полей isOpen и open.

Одним из решений этого может быть создание полей static, чтобы они были общими для всех экземпляров Main_B2.

Animation anim;
private static bool isOpen = false; 
private static bool open = false;

Если вы сделаете это, ваш код должен работать как задумано - каждый экземпляр Main_B2 будет ссылаться на одни и те же поля всякий раз, когда они ссылаются на isOpen или open.


С учетом вышесказанного, static поля могут быть немного неаккуратными, если вы когда-нибудь захотите попробовать и повторно использовать код, поэтому лучшим вариантом может быть только один экземпляр Main_B2 где-то еще например, Canvas вместо одного на каждой кнопке.

Тогда в нем могут быть public GameObject поля, в которые можно перетаскивать объекты кнопок, и private Animation поля для анимации .:

public GameObject button1
public GameObject button2

private Animation anim1
private Animation anim2

Затем в Start:

anim1 = button1.GetComponent<Animation>();
anim2 = button2.GetComponent<Animation>();

И тогда, куда бы вы ни ссылались на anim, вы бы ссылались на anim1 или anim2 вместо этого:

void ReverseAnim_1()
{
    anim1.["1"].speed = -1;
    anim1.["1"].time = anim1["1"].length;
    anim1.Play();
}

void Anim1()
{
    anim1["1"].speed = 1;
    anim1.Play();
}

void Anim2()
{
    anim2["2"].speed = 1;
    anim2.Play();
}

void ReverseAnim_2()
{
    anim2["2"].speed = -1;
    anim2["2"].time = anim2["2"].length;
    anim2.Play();
}
0 голосов
/ 16 мая 2019

Переменная 'anim' вашего скрипта является анимацией.Обычно для настройки параметров анимации вы устанавливаете их на Animator, а не на Animation.Но, возможно, ваше решение может работать.

Для ясности.Аниматор организует, как воспроизводятся анимации, когда, как долго и как они переходят.

Я бы лично посоветовал вам использовать аниматор с шаблонами поведения и переходами между анимациями.Вместо текущего подхода.

Либо так, либо используйте один из множества пакетов активов Tweening из хранилища активов.Они специально созданы для создания эффектов пользовательского интерфейса, подобных тому, что вы описываете.

По крайней мере, рассмотрите эти решения, если вы застряли: -)

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