//----------------------------------------------------------------- //! @summary UIへノーツ情報を反映させる //! //! @parameter [displayNotes] 表示するノーツ //! //! @return なし //----------------------------------------------------------------- public void DisplayNotes(EditNotesController displayNotes) { // UIへ情報を反映させる if (displayNotes != null) { // ノーツデータの取得 PiarhythmDatas.NoteData notesData = displayNotes.GetNotesData(); // 音階の更新 m_musicalScaleInputField.text = notesData.m_scale; // 開始の拍数を更新 m_startBeatInputField.text = notesData.m_startBeat.ToString(); // 音符の長さを更新 m_noteLengthDropdown.value = notesData.m_noteLength; // 色の更新 if (notesData.m_color == Color.magenta) { m_colorDropdown.value = 0; } else if (notesData.m_color == Color.green) { m_colorDropdown.value = 1; } else if (notesData.m_color == Color.cyan) { m_colorDropdown.value = 2; } } }
//----------------------------------------------------------------- //! @summary 連結ノーツの生成処理(引数あり) //! //! @parameter [noteData] 連結させるノーツデータ //! //! @return なし //----------------------------------------------------------------- public void CreateConnectNote(PiarhythmDatas.NoteData noteData) { // 連結ノーツを生成する GameObject connectNote = Instantiate(m_connectNotePrefab); // コンポーネントの取得 ConnectNoteController connectNoteController = connectNote.GetComponent <ConnectNoteController>(); // NoteManagerを設定する connectNoteController.SetNoteManager(this); // キャンバスの設定 connectNoteController.SetCanvas(m_canvas); // キーボード情報 connectNoteController.SetKeyDictionary(m_keyDictionary); // OptionSheetControllerを設定する connectNoteController.SetOptionSheetController(m_optionSheetController); // MusicalScoreの子に設定する connectNote.GetComponent <RectTransform>().SetParent(m_musicalScore.GetComponent <RectTransform>()); // 連結に使用したノーツデータを登録する PiarhythmDatas.NoteData nextNoteData = noteData; while (nextNoteData != null) { connectNoteController.AddNoteData(nextNoteData); nextNoteData = nextNoteData.m_nextNoteData; } // 初期化処理 connectNoteController.Initialize(); // リストに登録する m_notesList.Add(connectNote); }
//----------------------------------------------------------------- //! @summary ノーツの移動処理 //! //! @parameter [scale] 音階 //! @parameter [positionY] Y座標 //! //! @return なし //----------------------------------------------------------------- private void MoveEditNotes(string scale, float positionY) { // ノーツの移動 m_transform.localPosition = new Vector3(m_transform.localPosition.x, positionY, 0.0f); SetNotesScale(scale); // 移動制限 Vector2 offsetMin = m_transform.offsetMin; if (offsetMin.y <= 0.0) { offsetMin.y = 0.0f; } m_transform.offsetMin = offsetMin; // 最新データの作成 PiarhythmDatas.PositionData positionData = new PiarhythmDatas.PositionData(); positionData.m_position = m_transform.offsetMin.y; positionData.m_lenght = m_transform.sizeDelta.y; // データの更新 PiarhythmDatas.NoteData notesData = m_optionSheetController.ConvertToNotesData(positionData); m_notesData.m_startBeat = notesData.m_startBeat; m_notesData.m_scale = scale; // 位置調整 positionData = m_optionSheetController.ConvertToPositionData(m_notesData.m_startBeat, m_notesData.m_noteLength); m_transform.offsetMin = new Vector2(m_transform.offsetMin.x, positionData.m_position); m_transform.offsetMax = new Vector2(m_transform.offsetMax.x, m_transform.offsetMin.y + positionData.m_lenght); }
//----------------------------------------------------------------- //! @summary ノーツの生成処理(引数あり) //! //! @parameter [notesDetas] ノーツデータの配列 //! //! @return なし //----------------------------------------------------------------- public void CreateNotes(PiarhythmDatas.NoteData noteData) { // ノーツを生成する GameObject newNotes = Instantiate(m_notesPrefab); // コンポーネントの取得 EditNotesController editNotes = newNotes.GetComponent <EditNotesController>(); // マネージャーを設定する editNotes.SetNotesManager(this); // キャンバスの設定 editNotes.SetCanvas(m_canvas); // キーボード情報 editNotes.SetKeyDictionary(m_keyDictionary); // NotesSheetControllerを設定する editNotes.SetNotesSheetController(m_notesSheetController); // OptionSheetControllerを設定する editNotes.SetOptionSheetController(m_optionSheetController); // MusicalScoreの子に設定する newNotes.GetComponent <RectTransform>().SetParent(m_musicalScore.GetComponent <RectTransform>()); // 初期化処理 editNotes.Initialize(); // ノーツデータを設定する editNotes.SetNotesData(noteData); // リストに登録する m_notesList.Add(newNotes); }
//----------------------------------------------------------------- //! @summary ノーツデータを設定する //! //! @parameter [notesData] 設定するノーツデータ //----------------------------------------------------------------- public void SetNotesData(PiarhythmDatas.NoteData noteData) { // データを設定する m_notesData = noteData; SetNotesScale(m_notesData.m_scale); SetNotesStartTime(m_notesData.m_startBeat); SetNotesLengthTime(m_notesData.m_noteLength); SetNotesColor(m_notesData.m_color); }
// メンバ関数の定義 ===================================================== #region 初期化処理 //----------------------------------------------------------------- //! @summary 初期化処理 //! //! @parameter [void] なし //! //! @return なし //----------------------------------------------------------------- private void Start() { // コンポーネントの取得 m_transform = GetComponent <RectTransform>(); m_image = GetComponent <Image>(); // 色の初期化 // #の色を変化させる m_image.color = (m_noteData.m_scale.Contains("#")) ? new UnityEngine.Color(m_noteData.m_color.r * PiarhythmDatas.SHARP_COLOR_PERCENTAGE, m_noteData.m_color.g * PiarhythmDatas.SHARP_COLOR_PERCENTAGE, m_noteData.m_color.b * PiarhythmDatas.SHARP_COLOR_PERCENTAGE, 1.0f) : new UnityEngine.Color(m_noteData.m_color.r, m_noteData.m_color.g, m_noteData.m_color.b, 1.0f); // スケールの初期化 m_transform.localScale = Vector3.one; // 音階の設定 // 座標を設定された音階の位置に移動させる m_transform.position = new Vector3(m_keyDictionary[m_noteData.m_scale].position.x, m_transform.position.y, m_transform.position.z); float width = m_keyDictionary[m_noteData.m_scale].sizeDelta.x * m_keyDictionary[m_noteData.m_scale].parent.GetComponent <RectTransform>().localScale.x; m_transform.sizeDelta = new Vector2(width, m_transform.sizeDelta.y); // 手前に持ってくる Vector3 position = m_transform.localPosition; position.z = 0.0f; m_transform.localPosition = position; // 開始時間と長さの初期化 PiarhythmDatas.PositionData positionData = m_musicController.ConvertToPositionData(m_noteData.m_startBeat, m_noteData.m_noteLength); Vector2 offsetMin = m_transform.offsetMin; offsetMin.y = positionData.m_position; m_transform.offsetMin = offsetMin; Vector2 offsetMax = m_transform.offsetMax; offsetMax.y = offsetMin.y + positionData.m_lenght; m_transform.offsetMax = offsetMax; PiarhythmDatas.NoteData noteData = m_noteData.m_nextNoteData; while (noteData != null) { positionData = m_musicController.ConvertToPositionData(noteData.m_startBeat, noteData.m_noteLength); offsetMax = m_transform.offsetMax; offsetMax.y += positionData.m_lenght; m_transform.offsetMax = offsetMax; noteData = noteData.m_nextNoteData; } }
//----------------------------------------------------------------- //! @summary 再生瞬間のノーツの処理 //! //! @parameter [elapsedTime] 経過時間 //! //! @return なし //----------------------------------------------------------------- public void PlayMomentEditNotes(float elapsedTime) { foreach (GameObject notes in m_notesList) { PiarhythmDatas.NoteData notesData = null; // コンポーネントの取得 if (notes.GetComponent <EditNotesController>()) { EditNotesController editNotesController = notes.GetComponent <EditNotesController>(); // データの取得 notesData = editNotesController.GetNotesData(); // 経過時間が既にノーツの開始時間を過ぎている float startTime = m_optionSheetController.GetStartTime(notesData.m_startBeat); if (elapsedTime > startTime) { // 音をならないようにする editNotesController.SetPlayedFlag(true); } else { editNotesController.SetPlayedFlag(false); } } else { ConnectNoteController connectNoteController = notes.GetComponent <ConnectNoteController>(); // データの取得 notesData = connectNoteController.GetNoteData(); // 経過時間が既にノーツの開始時間を過ぎている float startTime = m_optionSheetController.GetStartTime(notesData.m_startBeat); if (elapsedTime > startTime) { // 音をならないようにする connectNoteController.SetPlayedFlag(true); } else { connectNoteController.SetPlayedFlag(false); } } } }
//----------------------------------------------------------------- //! @summary ノーツの連結を解除 //! //! @parameter [void] なし //! //! @return なし //----------------------------------------------------------------- public void CuttingNote() { // 選択されているノーツが複数だった場合、処理を終了する if (m_selectNotes.Count != 1) { return; } // 選択されているノーツが連結ノーツでなければ処理を終了する ConnectNoteController connectNoteController = m_selectNotes[0].GetComponent <ConnectNoteController>(); if (connectNoteController == null) { return; } // データを取得する PiarhythmDatas.NoteData noteData = connectNoteController.GetNoteData(); while (noteData != null) { // 次のノーツを保存しておく PiarhythmDatas.NoteData nextNoteData = noteData.m_nextNoteData; // 連結を切る noteData.m_nextNoteData = null; // ノーツを生成する CreateNotes(noteData); // ノーツの更新をする noteData = nextNoteData; } // リストから削除する m_notesList.Remove(m_selectNotes[0]); // 削除する Destroy(m_selectNotes[0]); // リストをクリアする m_selectNotes.Clear(); // UIの表示を更新する SetSelectNotes(null); }
// メンバ関数の定義 ===================================================== #region 初期化処理 //----------------------------------------------------------------- //! @summary 初期化処理 //! //! @parameter [void] なし //! //! @return なし //----------------------------------------------------------------- public void Initialize() { // コンポーネントの取得 m_transform = GetComponent <RectTransform>(); m_glowImage = GetComponent <GlowImage>(); m_musicalScoreTransform = m_transform.parent.GetComponent <RectTransform>(); m_audioSource = GetComponent <AudioSource>(); // データの初期化 m_notesData = ScriptableObject.CreateInstance <PiarhythmDatas.NoteData>(); // 色の初期化 PiarhythmDatas.Color colorData = new PiarhythmDatas.Color(); colorData.r = Color.green.r; colorData.g = Color.green.g; colorData.b = Color.green.b; colorData.a = Color.green.a; m_notesData.m_color = colorData; m_glowImage.color = m_glowImage.glowColor = Color.green; // スケールの初期化 m_transform.localScale = Vector3.one; // 音階の設定 SetNotesScale("C4"); // 手前に持ってくる Vector3 position = m_transform.localPosition; position.z = 0.0f; m_transform.localPosition = position; // 開始時間と長さの初期化 PiarhythmDatas.PositionData positionData = new PiarhythmDatas.PositionData(); positionData.m_position = m_transform.offsetMin.y; positionData.m_lenght = m_transform.sizeDelta.y; PiarhythmDatas.NoteData notesData = m_optionSheetController.ConvertToNotesData(positionData); m_notesData.m_startBeat = notesData.m_startBeat; m_notesData.m_noteLength = 2; positionData = m_optionSheetController.ConvertToPositionData(m_notesData.m_startBeat, m_notesData.m_noteLength); m_transform.offsetMin = new Vector2(m_transform.offsetMin.x, positionData.m_position); m_transform.offsetMax = new Vector2(m_transform.offsetMax.x, m_transform.offsetMin.y + positionData.m_lenght); // 光彩を切る m_glowImage.glowSize = 0.0f; }
//----------------------------------------------------------------- //! @summary 連結に使用したノーツデータを保存する //! //! @parameter [noteData] 保存するノーツデータ //! //! @return なし //----------------------------------------------------------------- public void AddNoteData(PiarhythmDatas.NoteData noteData) { // 登録する m_noteList.Add(noteData); }
//----------------------------------------------------------------- //! @summary ノーツの開始座標と長さから開始拍と音符に変換する //! //! @parameter [positionData] 座標データ //! //! @return ノーツデータ //----------------------------------------------------------------- public PiarhythmDatas.NoteData ConvertToNotesData(PiarhythmDatas.PositionData positionData) { PiarhythmDatas.NoteData notesData = ScriptableObject.CreateInstance <PiarhythmDatas.NoteData>(); float elapsedBeat = 0.0f; float elapsedPosition = 0.0f; // 所属しているテンポデータを調べる PiarhythmDatas.TempoData tempoData = m_tempoDataList[0]; for (int i = 1; i < m_tempoDataList.Count; ++i) { // 一拍当たりの時間を求める float beatPerTempo = 60.0f / tempoData.m_tempo; // 時間を座標に変換する float beatPosition = PiarhythmUtility.ConvertTimeToPosition(beatPerTempo, NotesManager.NOTES_SPEED); // テンポデータの終了座標を求める float endPosition = beatPosition * ((m_tempoDataList[i].m_startMeasure - tempoData.m_startMeasure) * 4) + elapsedPosition; if (positionData.m_position >= endPosition) { // 経過座標を更新する elapsedPosition = endPosition; // 経過拍数を増やす elapsedBeat += (m_tempoDataList[i].m_startMeasure - tempoData.m_startMeasure) * 4; // 現在のテンポデータを更新する tempoData = m_tempoDataList[i]; } else { break; } } // 現在のテンポデータから正確な位置を確定させる { float beatPerTempo = 60.0f / tempoData.m_tempo; float beatPosition = PiarhythmUtility.ConvertTimeToPosition(beatPerTempo, NotesManager.NOTES_SPEED); // 残りの座標を求める float residualPosition = positionData.m_position - elapsedPosition; // 残りの拍数を求める float residualBeat = residualPosition / beatPosition; // 残りの拍数を0.25倍に丸める residualBeat = PiarhythmUtility.MRound(residualBeat, 0.25f); // 経過拍数に加算する elapsedBeat += residualBeat; // データを保存する notesData.m_startBeat = elapsedBeat; // 長さを求める float noteLength = positionData.m_lenght / beatPosition; // 0.25倍に丸める noteLength = PiarhythmUtility.MRound(noteLength, 0.25f); // 一番近い長さを元に音符を決める if (Mathf.Approximately(noteLength, PiarhythmDatas.NoteTime.WHOLE_NOTE_SEMIBREVE)) { notesData.m_noteLength = 0; } else if (Mathf.Approximately(noteLength, PiarhythmDatas.NoteTime.HALF_NOTE_MININ)) { notesData.m_noteLength = 1; } else if (Mathf.Approximately(noteLength, PiarhythmDatas.NoteTime.QUARTER_NOTE_CROCHET)) { notesData.m_noteLength = 2; } else if (Mathf.Approximately(noteLength, PiarhythmDatas.NoteTime.EIGHTH_NOTE_QUAVER)) { notesData.m_noteLength = 3; } else if (Mathf.Approximately(noteLength, PiarhythmDatas.NoteTime.SIXTEENTH_NOTE_SEMIQUAVER)) { notesData.m_noteLength = 4; } else if (Mathf.Approximately(noteLength, PiarhythmDatas.NoteTime.WHOLE_DOTTED_NOTE_SEMIBREVE)) { notesData.m_noteLength = 5; } else if (Mathf.Approximately(noteLength, PiarhythmDatas.NoteTime.HALF_DOTTED_NOTE_MININ)) { notesData.m_noteLength = 6; } else if (Mathf.Approximately(noteLength, PiarhythmDatas.NoteTime.QUARTER_DOTTED_NOTE_CROCHET)) { notesData.m_noteLength = 7; } else if (Mathf.Approximately(noteLength, PiarhythmDatas.NoteTime.EIGHTH_DOTTED_NOTE_QUAVER)) { notesData.m_noteLength = 8; } else { notesData.m_noteLength = 2; } } return(notesData); }
//----------------------------------------------------------------- //! @summary 連結可能か調べる //! //! @parameter [void] なし //! //! @return true :連結可能 //! @return false:連結不可 //----------------------------------------------------------------- private bool CheckConnectNote() { // 二つ以上ノーツが選択されていない if (m_selectNotes.Count <= 1) { return(false); } PiarhythmDatas.NoteData notesData = m_selectNotes[0].GetComponent <EditNotesController>().GetNotesData(); string scale = notesData.m_scale; PiarhythmDatas.Color color = notesData.m_color; float nextStart = notesData.m_startBeat; switch (notesData.m_noteLength) { case 0: nextStart += PiarhythmDatas.NoteTime.WHOLE_NOTE_SEMIBREVE; break; case 1: nextStart += PiarhythmDatas.NoteTime.HALF_NOTE_MININ; break; case 2: nextStart += PiarhythmDatas.NoteTime.QUARTER_NOTE_CROCHET; break; case 3: nextStart += PiarhythmDatas.NoteTime.EIGHTH_NOTE_QUAVER; break; case 4: nextStart += PiarhythmDatas.NoteTime.SIXTEENTH_NOTE_SEMIQUAVER; break; case 5: nextStart += PiarhythmDatas.NoteTime.WHOLE_DOTTED_NOTE_SEMIBREVE; break; case 6: nextStart += PiarhythmDatas.NoteTime.HALF_DOTTED_NOTE_MININ; break; case 7: nextStart += PiarhythmDatas.NoteTime.QUARTER_DOTTED_NOTE_CROCHET; break; case 8: nextStart += PiarhythmDatas.NoteTime.EIGHTH_DOTTED_NOTE_QUAVER; break; } for (int i = 1; i < m_selectNotes.Count; ++i) { // データを取得する notesData = m_selectNotes[i].GetComponent <EditNotesController>().GetNotesData(); // 音階が一致するか調べる if (notesData.m_scale != scale) { return(false); } // 次の開始位置を調べる if (!Mathf.Approximately(notesData.m_startBeat, nextStart)) { return(false); } // 色を調べる if ((!Mathf.Approximately(notesData.m_color.r, color.r)) && (!Mathf.Approximately(notesData.m_color.g, color.g)) && (!Mathf.Approximately(notesData.m_color.b, color.b))) { return(false); } // データを更新する switch (notesData.m_noteLength) { case 0: nextStart += PiarhythmDatas.NoteTime.WHOLE_NOTE_SEMIBREVE; break; case 1: nextStart += PiarhythmDatas.NoteTime.HALF_NOTE_MININ; break; case 2: nextStart += PiarhythmDatas.NoteTime.QUARTER_NOTE_CROCHET; break; case 3: nextStart += PiarhythmDatas.NoteTime.EIGHTH_NOTE_QUAVER; break; case 4: nextStart += PiarhythmDatas.NoteTime.SIXTEENTH_NOTE_SEMIQUAVER; break; case 5: nextStart += PiarhythmDatas.NoteTime.WHOLE_DOTTED_NOTE_SEMIBREVE; break; case 6: nextStart += PiarhythmDatas.NoteTime.HALF_DOTTED_NOTE_MININ; break; case 7: nextStart += PiarhythmDatas.NoteTime.QUARTER_DOTTED_NOTE_CROCHET; break; case 8: nextStart += PiarhythmDatas.NoteTime.EIGHTH_DOTTED_NOTE_QUAVER; break; } } return(true); }
//----------------------------------------------------------------- //! @summary 連結ノーツの生成処理 //! //! @parameter [void] なし //! //! @return なし //----------------------------------------------------------------- public void CreateConnectNote() { // 連結可能か調べる if (!CheckConnectNote()) { return; } // 連結ノーツを生成する GameObject connectNote = Instantiate(m_connectNotePrefab); // コンポーネントの取得 ConnectNoteController connectNoteController = connectNote.GetComponent <ConnectNoteController>(); // NoteManagerを設定する connectNoteController.SetNoteManager(this); // キャンバスの設定 connectNoteController.SetCanvas(m_canvas); // キーボード情報 connectNoteController.SetKeyDictionary(m_keyDictionary); // ConnectNoteSheetControllerを設定する connectNoteController.SetConnectNoteSheetController(m_connectNoteSheetController); // OptionSheetControllerを設定する connectNoteController.SetOptionSheetController(m_optionSheetController); // MusicalScoreの子に設定する connectNote.GetComponent <RectTransform>().SetParent(m_musicalScore.GetComponent <RectTransform>()); // 連結に使用したノーツデータを登録する for (int i = 0; i < m_selectNotes.Count; ++i) { // データを取得する PiarhythmDatas.NoteData notesData = m_selectNotes[i].GetComponent <EditNotesController>().GetNotesData(); // ノーツデータの連結先を更新する if (i + 1 < m_selectNotes.Count) { notesData.m_nextNoteData = m_selectNotes[i + 1].GetComponent <EditNotesController>().GetNotesData(); } // 登録する connectNoteController.AddNoteData(notesData); // リストから削除する m_notesList.Remove(m_selectNotes[i]); // ノーツを削除する Destroy(m_selectNotes[i]); } // リストをクリアする m_selectNotes.Clear(); // 初期化処理 connectNoteController.Initialize(); // リストに登録する m_notesList.Add(connectNote); // 生成されたノーツを選択中にする SetSelectNotes(connectNote); }
//----------------------------------------------------------------- //! @summary ノーツデータを設定する //! //! @parameter [noteData] 設定するノーツデータ //----------------------------------------------------------------- public void SetNoteData(PiarhythmDatas.NoteData noteData) { m_noteData = noteData; }