LemonteaのUnity部屋

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

Unity Json形式とファイルへの書き出し・読み込み

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

昨日音ゲーの記事を書くと言いました。

今回は、その準備として、楽譜を書き出すのに
必要な三点の記事を書きます。

Json形式にしたり、戻したり
②ファイルへの書き出し
③ファイルの読み込み

です。

______________

Json形式

JsonとはJavaScript Object Notationの略で、データをテキストで記述する形式の一つです。
①では、↓の公式サイトを参考に、あるクラスの変数を丸ごとこの形式で表し、
stringの変数にいれてみます。

Unity - マニュアル: JSON 形式にシリアライズ


まずは、Json形式で保存したい変数をもったクラスをつくります。

この時、頭に[Serializable]とつけます。
(そのためには最初に using System; が必要)

[Serializable]
public class MusicScore
{
    public float Timing[];
    public float Notes[];
}

これをJson形式に変換するには
インスタンスを作成して…

MusicScore ms = MusicScore();

JsonUtility.ToJsonを使います。
これでできたJson形式のテキストは
stringの変数にしまいます。

なので実際に使うときはこんな感じです。
string json = JsonUtility.ToJson(ms);

これでmsの持っている変数の情報がすべてJson形式で表され、
string型の変数jsonに格納されました。


逆に、jsonファイルに書き込まれている内容を
あるインスタンスに反映させたい場合は

JsonUtility.FromJsonOverwrite(json, ms);


と書きます。

また、jsonファイルに書き込まれている内容を
新しく作ったインスタンスXに反映したい場合は
こう書きます。

X = JsonUtility.FromJson(json);



②ファイルへの書き出し

このままだと、ただstring変数に代入しただけで、
実行が終わったら消えてしまいます。

そこで、ファイルに保存してつかいます。

ファイルへの保存とかをいじるには、

using System.IO

を書く必要があります

書き出し処理は
File.WriteAllText(FilePath, json);
のように書きます。

jsonは、json形式でデータが書かれたstringの変数です。

FilePathは、ファイルの保存場所と名前です(string型)。

例えば
"Assets¥¥Test.json" なら
Assetsフォルダの中のTest.jsonというファイルに書き出されます。
(そのようなファイルが無い場合は自動で生成されます。)

"Assets¥¥ABC¥¥Test.json" なら
Assetsフォルダの中のABCフォルダの中の
Test.jsonというファイルに書き出されます。
Testファイルは自動で生成されますが、
ABCフォルダは自分でつくらないと、存在しなかった場合エラーになります。



③ファイルの読み取り

ファイルを読み取るには
File.ReadAllText(FilePath);
を使います。

先ほど同様
using System.IO
を書いておきます。

そして、string型の変数に↓のように取得します。
string json = File.ReadAllText(FilePath);

FilePathは先ほど同様、読み込むファイルの場所と名前です。

これで、保存した変数をjson形式で取得できるので、
①でやったように
JsonUtility.FromJsonOverwrite(json, ms);
インスタンスに反映すればOKです。


_________________




これをどう使うかというと
↓のように音符の流れてくるタイミングを
配列に記録して、それをJson形式で
ファイルに保存しておき、
実行時に読み込むわけです。

f:id:sawalemontea:20170922120424p:plain

なんか数字の羅列で一見使いにくそうすが
どうせインスタンスに反映するので

ms.Timing[〇] = ~;
のように完全にいつも通り使うことができます。

この例だと
赤線より上がタイミングで、下が音符の種類です。


これを使って楽譜を作っていきます。

今回はここまでです。

Unity パーティクル(7) Meshで3Dパーティクル 回転の調整

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

youtu.be


テクスチャを使えば自由な2D画像をパーティクルにできますが、
これを3Dでやりたい場合はメッシュを使います。

以前ここでチラッとやったことはあったのですが
Unity Particlesystem パーティクルを進行方向に伸ばす - LemonteaのUnity部屋
今回は自作のモデルで試してみます。


やり方はRendererモジュールの
Render ModeをMeshにして、好きなメッシュを選びます
f:id:sawalemontea:20170921154605p:plain


これでパーティクル一粒一粒がメッシュの形になりました。

しかし、向きが合っているとは限りません。

しかもパーティクルなので
Transformで回転させても粒は回らないので

メインのここで回転させます
f:id:sawalemontea:20170921154757p:plain


また、モデル用のマテリアルがある場合は
Rendererモジュールでそれを設定するといいです。

ただし、色のアルファ値を少し落としてあげげないと
見えないかもしれません。


これでモデルがパーティクルになりました。
f:id:sawalemontea:20170921155040p:plain


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



最近自分が楽しんでるだけで有益な記事がなかったですが、
Jsonで簡単な音ゲーをつくったので
次からその作りかたとか書こうと思います。

それではさようなら~


関連
sawalemounity.hatenablog.com
sawalemounity.hatenablog.com
sawalemounity.hatenablog.com

Unity 中二パーティクル祭り

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

今回は、ただただ魔法っぽいパーティクルの
画像と動画を張るだけです

実用的というよりは遊びに走っています。

f:id:sawalemontea:20170920062455p:plain

この画像が個人的に好きだったのでつくりました

f:id:sawalemontea:20170920062539p:plain

f:id:sawalemontea:20170920062547p:plain


なんか似たような感じばかりになってきたので
そろそろモデルとかメッシュとか変わったテクスチャとか
使ってみたら毛色の違うものができるかもしれませんね


youtu.be

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