Unity несколько кнопок переключения - PullRequest
0 голосов
/ 16 января 2020

Я делаю проект единства. Ситуация такова, что у меня есть две кнопки переключения (на самом деле более двух) toggle1 и toggle2 и два игровых объекта cube1 и cube2. При запуске оба переключателя не проверяются, а игровые объекты имеют SetActive (false). То, что я хочу, это если обе кнопки toggle1.isOn && toggle2.isOn затем cube1 SetActive, а если toggle2.isOn && toggle1.isOn, то cube2 SetActive в соответствии с порядком переключения, т. Е. Какой переключатель выбирается первым. Теперь проблема в том, что когда я проверил toggle1, то toggle2 в порядке появления обоих кубов, а когда я проверил toggle2, то toggle1, а затем снова оба куба ....

using System.Collections;
using UnityEngine;
using UnityEngine.UI;


public class ToggleToggle : MonoBehaviour {

    public Toggle toggle1;
    public Toggle toggle2;
    public GameObject cube;
    public GameObject cube2;

    // Use this for initialization
    void Start () {
        cube.SetActive (false);
        cube2.SetActive (false);
    }

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


        // Toggle1 Selected First then Toggle2
        if (toggle1.isOn && toggle2.isOn) {
            cube.SetActive (true);
        }

        // Toggle2 Selected First then Toggle1
        if (toggle2.isOn && toggle1.isOn) {
            cube2.SetActive (true);
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 16 января 2020

Если я правильно понимаю, вы хотите включить только один GameObject на основе нескольких Toggle с. Первый тик определяет, какой GameObject.

Таким образом, вы должны сохранить первый тик Toggle.

Вот пример:

public class ToggleToggle : MonoBehaviour {
/*
    public Toggle toggle1;
    public Toggle toggle2;
    public GameObject cube;
    public GameObject cube2;
*/

    public Toggle[] toggles;
    public GameObject[] cubes;

    public static Toggle firstTickedToggle;

    void Start ()
    {
        for (int i = 0; i < cubes.Length; i++)
        {
            cubes[i].SetActive(false);
        }
    }

    public void OnToggleClick(Toggle toggle)
    {
        if (toggle.enabled)
        {
            if (firstTickedToggle == null)
                firstTickedToggle = toggle;

            int toggleIndex = 0; // Index of the first clicked toggle

            // Check if all toggles are ticked
            for (int i = 0; i < toggles.Length; i++)
            {
                // If one is not ticked
                if (!toggles[i].enabled)
                    return;
                if (toggles[i] == firstTickedToggle)
                    toggleIndex = i;
            }

            // Here all toggles are ticked
            cubes[toggleIndex].SetActive(true);
        }


        else
        {
            for (int i = 0; i < toggles.Length; i++)
            {
                // If one toggle is still ticked, don't do anything
                if (toggles[i].enabled)
                    return;
            }

            // If all toggles are unticked, remove the reference to the first ticked
            firstTickedToggle = null;
        }
    }
}

Все переключатели нуждаются в OnValueChanged

0 голосов
/ 16 января 2020

Ошибка в вашей программе - вы забыли уведомить первую нажатую кнопку:

public int first;
void Start () {
    cube.SetActive (false);
    cube2.SetActive (false);
    first = 0;
}

    // Update is called once per frame
void Update () {
    if (!toggle1.isOn && !toggle2.isOn) {
        first = 0;
    }

    if (first == 0 && toggle1.isOn) {
        first = 1;
    }        

    if (first == 0 && toggle2.isOn) {
        first = 2;
    } 

    if (first == 1 && toggle2.isOn) {
        cube.SetActive (true);
    }

    if (first == 2 && toggle1.isOn) {
        cube2.SetActive (true);
    }
}
...