团结游戏的麻烦

时间:2018-05-06 18:02:10

标签: c# unity3d game-engine piano

我正在制作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);
        }
    }
}

1 个答案:

答案 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是否合法,然后播放并存储它。

协程将一个接一个地重放它们,并且延迟一秒钟。