我正在制作2D钢琴演奏者游戏。我大部分时间都已完成,但我是Unity新手并使用C#进行编程,我不知道如何进行下一部分。我该怎么做才能当我按下录音按钮时,它会记录音符,然后在按下播放按钮时播放它?我的脚本在下面。提前感谢您的帮助
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NotePlay : MonoBehaviour {
Animator anim;
public AudioClip noteA;
public AudioClip noteB;
public AudioClip noteC;
public AudioClip noteD;
public AudioClip noteE;
public AudioClip noteF;
public AudioClip noteG;
public AudioSource audio;
public string[] store;
private KeyCode lastHitKey;
// Use this for initialization
void Start() {
anim = gameObject.GetComponent<Animator>();
audio = GetComponent<AudioSource>();
}
// Update is called once per frame
void Update() {
if (Input.GetKeyDown(KeyCode.A)) {
anim.SetTrigger("A");
audio.PlayOneShot(noteA);
}
if (Input.GetKeyDown(KeyCode.B)) {
anim.SetTrigger("B");
audio.PlayOneShot(noteB);
}
if (Input.GetKeyDown(KeyCode.C)) {
audio.PlayOneShot(noteC);
anim.SetTrigger("C");
}
else if (Input.GetKeyDown(KeyCode.D)) {
anim.SetTrigger("D");
audio.PlayOneShot(noteD);
}
else if (Input.GetKeyDown(KeyCode.E)) {
anim.SetTrigger("E");
audio.PlayOneShot(noteE);
}
if (Input.GetKeyDown(KeyCode.F)) {
anim.SetTrigger("F");
audio.PlayOneShot(noteF);
}
if (Input.GetKeyDown(KeyCode.G)) {
anim.SetTrigger("G");
audio.PlayOneShot(noteG);
}
}
}
答案 0 :(得分:0)
您应该为每个密钥运行一个方法,这样您就不必一遍又一遍地重复相同的代码。 想法是将给定的密钥存储在列表中。使用字典将修复选择
private List<KeyCode> keys = new List<KeyCode>();
private IDictionary<KeyCode, Note> dict;
struct Note
{
public string keyName;
public AudioClip clip;
public Note(string keyName, AudioClip clip)
{
this.keyName = keyName;
this.clip = clip;
}
}
void Start()
{
this.dict = new Dictionary<KeyCode, Note>()
{
{ KeyCode.A, new Note("A", noteA) },
{ KeyCode.B, new Note("B", noteB) },
// Same for all notes
};
}
void Update()
{
foreach(KeyCode kcode in Enum.GetValues(typeof(KeyCode)))
{
if (Input.GetKeyDown(kcode))
{
if( PlayKey(kCode) == true){ this.keys.Add(KeyCode); }
}
}
}
bool PlayKey(KeyCode key)
{
Note note;
if(this.dict.TryGetValue(key, out note) == true)
{
anim.SetTrigger(note.keyName);
audio.PlayOneShot(note.clip);
return true;
}
return false;
Debug.Log("Note is not registered");
}
void PlayAllKeys()
{
StartCoroutine(PlayAllKeysAsync);
}
IEnumerator PlayAllKeysAsync()
{
foreach(KeyCode key in this.keys)
{
PlayNote(key);
yield return new WaitForSeconds(1f); // Play note every 1s
}
}
现在你有了一个Note结构,你可以在以后添加更多内容,比如它在歌曲中被点击以及如何按住它(这需要更多关于Input和deltaTime的计算)。
字典存储所有已知的笔记。在更新中,检查所有KeyCode,您可以创建一个KeyCode列表来缩小它。然后它检查PlayNote是否合法,然后播放并存储它。
协程将一个接一个地重放它们,并且延迟一秒钟。