質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

3548閲覧

音ゲーの良判定の仕方がわからない

rinkis

総合スコア13

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

1グッド

5クリップ

投稿2018/12/20 18:14

編集2018/12/21 08:43

前提・実現したいこと

unityで音ゲーを作っているのですが、譜面に合わせてボタンを押したときに良、可といった判定が出来るように、判定線の近くにボックスコライダーを設置しました。
ですが、指定のボックスコライダがオンになっている時のif文をどう書けばいいかわかりません。
教えてください。

void OnTriggerStay(Collider colobj)

この中だとすべてのボックスコライダに適用されてしまうので…

それか他に良い判定の作り方があれば教えていただければと思います。
中傷はきついっす。

【補足】
現在はMIDIファイルを使って音ゲーを制作しています。
ノーツが流れるレーンは一つです。
SmfLiteというソースを参考にして、スクリプトを作りました。

譜面スクリプト

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using SmfLite;

public class Tester : MonoBehaviour
{
// Source MIDI file asset.
public TextAsset sourceFile;

// Test settings. public float bpm; public GameObject o36; public GameObject o37; public GameObject o38; public GameObject o39; public GameObject o40; // MIDI objects. MidiFileContainer song; MidiTrackSequencer sequencer; // Start function (MonoBehaviour). IEnumerator Start () { // Load the MIDI song. song = MidiFileLoader.Load (sourceFile.bytes); var tempo = 120f; // テンポはすでに読み込み済みとする // Wait for one second to avoid stuttering. yield return new WaitForSeconds (1.0f); // Start sequencing. ResetAndPlay (0); } // Reset and start sequecing. void ResetAndPlay (float startTime) { // Play the audio clip.

// audio.Play ();
// audio.time = startTime;

// Start the sequencer and dispatch events at the beginning of the track. sequencer = new MidiTrackSequencer (song.tracks [1], song.division, bpm); DispatchEvents (sequencer.Start (startTime)); } // Update function (MonoBehaviour). void Update () { if (sequencer != null && sequencer.Playing) { // Update the sequencer and dispatch incoming events. DispatchEvents (sequencer.Advance (Time.deltaTime)); } } // Dispatch incoming MIDI events. void DispatchEvents (List<MidiEvent> events) { if (events != null) { foreach (var e in events) { if ((e.status & 0xf0) == 0x90) { Debug.Log (e.data1); if (e.data1 == 44) { Instantiate (o36); //イントロ //ノーツをずらす方法 } if (e.data1 == 43) { Instantiate (o37); //イントロ } if (e.data1 == 41) { Instantiate (o38); //イントロ } if (e.data1 == 24) { Instantiate (o40); //jamp } if (e.data1 == 48) { Instantiate (o39); } //仮の譜面 } } } }

}

ノーツスクリプト
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Notes : MonoBehaviour {

public float lifetime; public GameObject o1; public float vector; // Use this for initialization void Start () { Destroy(gameObject, lifetime); } // Update is called once per frame void Update () {//ノーツの移動(仮) //等速アニメーション this.transform.position += new Vector3(0, 0, vector); } void OnTriggerStay(Collider colobj)//範囲内、右矢印キーを押すとノーツがデリートされる。 { if (Input.GetKeyDown (KeyCode.RightArrow)) { Destroy (this.o1); } }

}

Destroyしているのですがなぜかノーツは消えてくれない状況に陥っています。

bochan2👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bochan2

2018/12/20 23:27

シーンの配置(hierarchy view)の画像と主要なコードを上げることは出来ますか?
rinkis

2018/12/21 08:45

スクリプトを追加しました。よろしくお願いします。
guest

回答2

0

ベストアンサー

音ゲーをBoxColliderを使うのはおすすめしません
なぜなら、今のゲームは大体譜面速度を変えられるし、判定位置も変えられるからです。

Time.deltaTimeを足して現在の時刻を参照できるようにして、
オブジェクトが曲再生から3.5s位置にあり、
ボタンを押したタイミングが3.42sなら100ms以内だからGreat、みたいに作るべきです。

また、細かいことを言えば、Time.deltaTimeの加算ではずれます。
現在の時刻はメインで再生しているBGMの現在再生位置から取ってくるほうがいいです。

追記
1.0s, 1.2s, 1.4s の3つのノーツに対し、1.15s, 1.35sにボタンを押した場合、
Good,Good,Missとするのか、Miss,Great,Greatとするのか迷います。
ただ、前者の判定だと、途中からタイミングを合わせても前のノーツに判定が吸われるという問題があり、
後者の判定にするほうが親切のように思います
こういうきめ細やかな判定ロジックを組むためにも、BoxColliderは向いていません

投稿2018/12/21 03:22

編集2018/12/21 05:32
izmktr

総合スコア2856

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rinkis

2018/12/21 08:53

申し訳ございません。Unityについての知識が乏しく、Time.deltaTimeへの理解が難しい状況にあります。もう少し詳しく教えていただくことは可能でしょうか。
rinkis

2018/12/21 14:31

自己解決しました!すごくわかりやすい回答でした、ありがとうございます
guest

0

概ねizmktrさんと同意見です。
回答というよりかは補足情報です

UnityではなくUE4ですが考え方は流用できるので
こちらのリンクを提示しておきます
http://dfkfuturelab.hatenablog.com/entry/2017/12/03/234741

こちらは更にちょっとだけ高度な内容になります
http://www.charatsoft.com/develop/otogema/

投稿2018/12/21 06:16

MMashiro

総合スコア2378

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問