LemonteaのUnity部屋

C#とかのお話です~

Unity パーティクル(8) 核的なキノコ雲のエフェクト

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

ギャグ要素の強い漫画などで、
たまに爆発を大げさに表現するのに
キノコ雲が使われていたりしますよね。

シュールなゲームなどでも
ゲームオーバーシーンのバックなどで
あれが使えるのでは…?
と思ったので、UnityのParticlesystemで
キノコ雲のエフェクトを作ってみました。

f:id:sawalemontea:20170926230011p:plain

こんな感じになりました。

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

まず、Rendererモジュールでマテリアルをば…
f:id:sawalemontea:20170926231636p:plain


傘のところで急に膨らむように
Size Over Lifetimeを変更
f:id:sawalemontea:20170926231906p:plain


ShapeとEmissionを微調整します。
f:id:sawalemontea:20170926232043p:plain

そしてメインの調整です
今回は普通にサイズを変えると
変だったので3方向別々です。
f:id:sawalemontea:20170926232051p:plain


リングはこれの白です
sawalemounity.hatenablog.com


これで冒頭の写真みたいになります。


それにしてもテポドンがこんな雲をつくる日が
来なければいいですね…

Noコンギョ!(゜Д゜)

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


前回
sawalemounity.hatenablog.com

初回
sawalemounity.hatenablog.com

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

Unity JsonUtilityでつくった音ゲーの譜面を読みこんで音符を流す

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

前回、Json形式で音ゲーの楽譜を作成しました。
sawalemounity.hatenablog.com

今回は、それを読み込んで、
実際に音譜を生成してみます。

やり方は

・ファイルを読み込む
・音を流しながら時間をはかる
・タイミングがきたら音譜を生成

です

さっそくやってみます。


・ファイルを読み込む

ここで紹介したようにして、ファイルを読み込みます
Unity Json形式とファイルへの書き出し・読み込み - LemonteaのUnity部屋

MakeNote mk = new MakeNote()

としておいて

string json = File.ReadAllText(FilePath);
        JsonUtility.FromJsonOverwrite(json, mk);

で読み込んだ内容がmkに反映されます。


・音を流しながら時間をはかる

楽譜のBGMを流します
初めてのスクリプト(9) BGM・効果音の再生 - LemonteaのUnity部屋

そして、Update内で時間をカウントします。

TimeCount += Time.deltaTime;


・タイミングがきたら音譜を生成

時間をカウントしながら、
楽譜に記録された時間になったかどうか判定します。

 if (TimeCount >= mk.MusicScore[i])

そして、タイミングがきたら音譜を生成します。
今回は、あらかじめNotesという配列に
音譜のオブジェクトを取得しておき

Instantiate(Notes[mk.NoteKind[i]], CubePos, Quaternion.identity);

このようにして3種類の音譜をだしています

これで自分が記録したタイミングに合わせて
音譜が生成されるようになりました。


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

関連

前回
sawalemounity.hatenablog.com
JsonUtilityとファイルの読み書き
sawalemounity.hatenablog.com

Unity 音ゲーの譜面をJsonUtilityで作成

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

今日は音ゲー記事の続きです。
前回↓説明したJson形式でファイルを読み書きする方法を使い、
sawalemounity.hatenablog.com

自分の好きなタイミングで好きな種類の音符を流すように
楽譜をつくってみたいと思います。

もしかしたら曲から音符のタイミングをとってこれたり
するのかもしれませんが、今回はタイミングは自分しだいです。

前回のこれですね
f:id:sawalemontea:20170922120424p:plain


やり方は
・記録用の変数を用意
・曲を流しながら時間をカウント
・任意のタイミングでボタンを押し、
 そのタイミングとボタンの種類を用意した変数に記録
・記録をJson形式で書き出して楽譜完成

というものです。

さっそくやってみます。


・記録用の変数を用意

前回説明したような感じで記録用の変数をつくります
Unity Json形式とファイルへの書き出し・読み込み - LemonteaのUnity部屋

今回はこんな感じ。
using System が要ります

[Serializable]
public class MakeNote
{
   public float[] MusicScore;
   public int[] NoteKind;
}

・曲を流しながら時間をカウント

これは普通にTimecountという変数を作ってUpdate内に

TimeCount += Time.deltaTime;

と書きました。


・任意タイミングでボタンを押し、
 そのタイミングとボタンの種類を用意した変数に記録

シーンに音符の種類分のボタンをつくります
この例では、ノーマル・長押し・フリックみたいな
3種類の場合です。

それにセーブボタンもつけます
f:id:sawalemontea:20170924114324p:plain

スクリプトでは

MakeNote mk = new MakeNote();

としてインスタンスをつくり
適当に配列を要素数1とかで初期化します。

そしてボタンを押した時に

        mk.NoteKind[i] = n;
        mk.MusicScore[i] = TimeCount;

こんな感じで記録します。
あとはiを+1し、配列の要素数を増やせばOKです
(iは最初0で、ボタンを押すと1増やす変数)

素数を増やすには↓を使います

Array.Resize(ref 配列, 増加後の要素数);


・記録をJson形式で書き出して楽譜完成

最後に、mkの変数の内容を記録します。
Saveボタンが押されたときに呼び出すメソッドで

 string json = JsonUtility.ToJson(mk);
        File.WriteAllText(FilePath, json);

こんな感じで記録します。
ファイルの書き出しには
using System.IO が要ります。

これで簡易的ですが楽譜は完成です。
もっといいやり方あったら教えてくださいщ(゜д゜щ)

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


関連
音楽の再生関連
sawalemounity.hatenablog.com
sawalemounity.hatenablog.com