我是一名游戏设计专业的学生,作为我的最后一份工作,我们的教授要求我们根据我国的历史事件制作一款简单的游戏。我选择建造“基督救世主”雕像。该项目的规则是我们只能使用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();
}
}
使用我尝试过的所有方法,游戏仍然可以玩,尽管无法选择按钮,因此无法继续游戏。 (并且指示灯不会亮起)
答案 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;
}
}