LemonteaのUnity部屋

UnityとかC#のおはなしです~

Unity 音ゲー 長押しノートを作る

こんにちは。レモンティーです。

最近の記事で、Json形式で譜面を作りましたよね。
あのやり方では、自分が曲に合わせてボタンを押すことで
譜面を作りました。
Unity JsonUtilityでつくった音ゲーの譜面を読みこんで音符を流す - LemonteaのUnity部屋
Unity 音ゲーの譜面をJsonUtilityで作成 - LemonteaのUnity部屋

これで普通にタップするだけのノートは
そのまま作れます。

今回は、このやり方の場合に
長押しノートを作る方法です。

やり方は
・譜面作成時に押し始めと押し終りの時間をとる
・押し始めで生成して伸すandずらす
・判定

です。

さっそくやっていきます。




・譜面作成時に押し始めと押し終りの時間をとる


まずは、譜面を作成するシーンに
長押しノートを記録するボタンをつくります。

もし
Unity 音ゲーの譜面をJsonUtilityで作成 - LemonteaのUnity部屋
これを見てやった人は、すでに三つボタンがあると思います。
ちょうど良いので、その二つ目を長押し用にしました。


普通のノートの時は押した瞬間の時間だけをとっていましたが、
今回は押し始めと押し終りの両方の時間をとります。

EventTriggerの、PointerDownとPointerUpでやると簡単ですね。
EventTriggerでオブジェクトのタップ(クリック)判定 - LemonteaのUnity部屋

せっかくなのでMonoBehaviorの関数でやってもよさそうです。
Unity 知らなくて損していた MonoBehaviourの関数 - LemonteaのUnity部屋

…なんだか今回、過去記事の内容をよくつかいますね笑

なお、押し始めと押し終りでは、NoteKind(ノートの種類を記録する配列)に
異なる値1,3を入れました。同じでもできますが今回は変えるやり方です。



・押し始めで生成して伸すandずらす

さて、無事譜面に長押しノートを記録したら、
生成するほうを弄ります。

そのために、まずは長さを計算します。

これは、長押しの時間に、1秒間に長押しブロックが落下する距離(落下速度)を
かけ算して求めます。

 float CubeLength = (mk.MusicScore[i + 1] - mk.MusicScore[i])*speedf;

こんな感じですね。

これでプレイヤーは作者と同じ時間長押しすることになります。

あとは生成してからノートの長さをこれに変更するのですが、
その際、そのままスケールを変えると、
タップし始めが作者の押し始めより早いタイミングになってしまいます。

スケールを伸すと両方向にビヨンとなるからです。

なのでいつもノーツを出している場所よりも

CubeLength / 2 だけ遠い場所に生成します。

これで押し始めが一致しました。

そしてtransform.localScaleの一方向を
先ほどのCubeLengthに変更します。

これで、長押し時間も一致し、
晴れてプレイヤーと作者が同じ時間の長押しをすることになりました。



・判定

途中で指が逸れたり離れたり…なミスは
EventTriggerのPointerExitでまとめて検出できます。


もしピ○ノタイルのように
長押しは一瞬でもタップすればとりあえずセーフで、
長く押せるとスコアがお得…にするなら、
PointerDownで判定しつつ、PointerUpまでの
タップしていた時間をはかればいいです。
記録の時と同じですね。
ちなみにPointerDownだと、時間は押した瞬間ってことになりますが、
実際に処理がはじまるのは指を離してからなので
普段はやっかいですが今回は都合がいいですね。
(なんか書いてて間違ってる気がしてきたので後で確認しておきます)


ずっと押してないとアウトにする場合も
やることは一緒で、
最後に押した時間によって判定すればよさそうです。


ちょっとリアルの色々な事情で、作っている実際のものを
見せるのが好ましくないので、音ゲーの記事が
具体的な画像やスクリプトの少ないものになってしまって残念です。

今回はこれでおしまいです。


関連

初回
sawalemounity.hatenablog.com