Игра Simon Says - активация Light X, когда кнопка X (случайно выбранная) загорается - PullRequest
0 голосов
/ 06 июля 2019

Я студент игрового дизайна, и в качестве моей последней работы наш профессор попросил нас сделать простую игру, основанную на историческом событии нашей страны.Я выбрал постройку статуи Христа-Искупителя.Правило проекта состояло в том, что мы могли использовать только 4 цвета, поэтому я решил сделать игру, основанную на «Саймон Сэйс».

По сути, так как вы получаете правильную последовательность кнопок, частей статуипостроены.Это готово и работает.Чтобы придать остроту вещам я, я подумал, что было бы неплохо активировать несколько прожекторов под статуей, которые подсвечиваются в соответствии с их цветами на Саймонсе.Таким образом, если зеленая кнопка на Simon Says загорается, зеленый прожектор должен воспроизводить анимацию (или включать и выключать в ближайшее время) и т. Д.

Это кажется сложной задачей, поскольку кнопки воспроизводятся случайным образом,К сожалению, после нескольких дней попыток я не могу заставить это работать через триггеры, анимацию и т. Д. Я без конца пытался смотреть на youtube и google.Кто-нибудь может дать мне путеводную лампу?

https://imgur.com/a/59snC1a (я оставил свет включенным, чтобы лучше понять свою концепцию).

Я пытался сделать отдельные сценарии на лампах иотправив им сообщение для воспроизведения анимации.Я попытался активировать и деактивировать игровой объект, прикрепив подсветку к кнопкам (при нажатии включается / выключается подсветка)

[DisallowMultipleComponent]
[RequireComponent(typeof(AudioSource))]
public class Button : MonoBehaviour
{
    public int ButtonIndex { get; set;}

    [SerializeField] Color defaultColor;
    [SerializeField] Color highlightColor;
    [SerializeField] float resetDelay = .25f;
    [SerializeField] GameManager gm;
    AudioSource sound;

    private void Awake()
    {
        sound = GetComponent<AudioSource>();
    }

    private void Start()
    {
        ResetButton();
    }

    private void OnMouseDown()
    {
        gm.PlayerPick(ButtonIndex);
        PressButton();
    }

    public void PressButton()
    {
        sound.Play();
        GetComponent<MeshRenderer>().material.color = highlightColor;
        Invoke("ResetButton", resetDelay);
    }

    void ResetButton()
    {
        GetComponent<MeshRenderer>().material.color = defaultColor;
    }
}
public class GameManager : MonoBehaviour
{
    [SerializeField] Button[] button;
    [SerializeField] PlayMenu playmenu;
    [Header("Color Order")]
    [SerializeField] List<int> ButtonOrder;
    [SerializeField] float pickDelay = .4f;
    [SerializeField] int pickNumber = 0;
    [SerializeField] Score score;
    AudioSource Musica;

    void Start()
    {
        ResetGame();
        SetButtonIndex();
    }

    void SetButtonIndex()
    {
        for (int cnt = 0; cnt < button.Length; cnt++)
            button[cnt].ButtonIndex = cnt;
    }

    public void StartGame()
    {
        score.GameStarted();
        StartCoroutine("PlayGame");
    }

    public IEnumerator PlayGame()
    {
        pickNumber = 0;
        yield return new WaitForSeconds(pickDelay);
        foreach (int colorIndex in ButtonOrder)
        {
            button[colorIndex].PressButton();
            yield return new WaitForSeconds(pickDelay);
        }
        PickRandomButton();

        for (int cnt = 0; cnt < 0; cnt++)
        {
            yield return new WaitForSeconds(pickDelay);
            PickRandomButton();
        }
    }

    void PickRandomButton()
    {
        int rnd = Random.Range(0, button.Length);
        button[rnd].PressButton();
        ButtonOrder.Add(rnd);
    }

    public void PlayerPick(int pick)
    {
        Debug.Log("Jogador pickou"+ pick);
        if (pick == ButtonOrder[pickNumber])
        {
            Debug.Log("Acertou");
            pickNumber++;

            if (pickNumber == ButtonOrder.Count)
            {
                score.Set(pickNumber);
                //colocar score aqui no futuro
                StartCoroutine("PlayGame");
            }
        }
        else
        {
            Debug.Log("Errou");
            ResetGame();
            playmenu.Activate();
        }      
    }

    void ResetGame()
    {
        Debug.Log("Recomecar o jogo");
        ButtonOrder.Clear();
        score.Set();
        score.Restart();
    }
}

Со всем, что я пробовал, игра все равно будет играть,хотя кнопки становятся невыбираемыми, поэтому невозможно продолжать игровой процесс.(и свет не включится)

1 Ответ

0 голосов
/ 07 июля 2019

Как вы заявили, вы не знаете, какую кнопку вы нажимаете, но это не должно быть проблемой, если вы работаете с enum, а затем переключателем, а не работаете непосредственно с индексом кнопки, поэтому я оставляю некоторый справочный код, надеюсь, это поможет

    public enum Buttons
    {
        BLUE,
        GREEN,
        YELLOW
    }

    void PickRandomButton()
    {
        int rnd = Random.Range(0, button.Length);
        AnimateAndSavePickedButton((Buttons)rnd);
        ButtonOrder.Add(rnd);
    }

    void AnimateAndSavePickedButton(Buttons button)
    {
        switch (button)
        {
            case Buttons.BLUE:
                button[0].PressButton();
                //here your activation event for the blue light
                break;
            case Buttons.GREEN:
                button[1].PressButton();
                //here your activation event for the green light
                break;
            case Buttons.YELLOW:
                button[2].PressButton();
                //here your activation event for the yellow light
                break;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...