西蒙说游戏-当X按钮(随机选择)亮起时激活光X

时间:2019-07-06 20:39:04

标签: c# unity3d

我是一名游戏设计专业的学生,​​作为我的最后一份工作,我们的教授要求我们根据我国的历史事件制作一款简单的游戏。我选择建造“基督救世主”雕像。该项目的规则是我们只能使用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 :(得分:0)

正如您所说,您不知道按下哪个按钮,但是如果您使用枚举然后使用开关而不是直接使用按钮索引,那么这应该不成问题,因此我留下一些指导代码,希望对您有所帮助

    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;
        }
    }