LemonteaのUnity部屋

LemonteaのUnity部屋

Unityの使い方とかです~

Unity Resource内のtextファイルを読み込む

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

以前、音ゲーの作り方で、ファイルの読み込み方を紹介した時、
File.ReadAllText(Filepath)を使いましたよね。
sawalemounity.hatenablog.com


しかし、Android向けにビルドすると…
なぜかこれが動いてくれなかったんですよ。

ファイル読み込みとかビルドの知識がないので
そのへんはまた調べておきますが、

とりあえずResourcesファイルを使うことで
解決できるので、
今回はその方法を書きます。


そもそもResourcesファイルとは…

docs.unity3d.com

ここ↑にあるように、
Resourcesという名前のフォルダを作って
そこに素材を入れておけば
それを簡単に読み込めるというものです。


たとえば

Resourceフォルダ内のMusicフォルダにある
Lemonという名前のAudioClipを取得したい場合は

AudioClip L = Resources.Load<AudioClip>("Music\\Lemon");

のように書きます。

Resources.Load<型>(ファイルパス);

というわけですね。

別の例として
Resourceフォルダ内のMusicフォルダにある
全てのAudioClipを取得したい場合は

AudioClip[] ACs = Resources.LoadAll<AudioClip>("Music");


のように書きます。


で、肝心のテキストファイルですが
これも当然他の素材とまったく同じように取得できます。

困るのは、最初は型がわからないことくらいです笑
テキストファイルの型は「TextAsset」なのですが…知らんわ!!!って感じですよね笑
私はそこでちょっとつまりました笑


例えば
SaveDataという名前のテキストファイルを読み込むときは

TextAsset SaveData = Resources.Load<TextAsset>("SaveData");

となるわけです。

ということで、json形式で書かれたテキストを読み込んで
シリアライズしたいときは

string json = Resources.Load<TextAsset>("SaveData").ToString();

みたいにしてテキストファイルの中身をstring型で受け取ってから
シリアライズすればOKというわけですね。
ちなみにデシリアライズはコチラ↓
sawalemounity.hatenablog.com


ということで、テキストファイルの読み込み方法でした~
これでAndroid向けにビルドしてもパソコンと同じように動きます。

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



関連


sawalemounity.hatenablog.com

Unity 音ゲー記事の組み合わせでつくったコンギョ

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

今まで音ゲーを作りながら
それについての記事をたらたら書いていましたが
想定していた発表機会がおじゃんになったので
ここに~↓

youtu.be


使っているのはこれらの記事の内容です

sawalemounity.hatenablog.com
sawalemounity.hatenablog.com
sawalemounity.hatenablog.com
sawalemounity.hatenablog.com
sawalemounity.hatenablog.com
sawalemounity.hatenablog.com
sawalemounity.hatenablog.com


背景はここです
jp.freepik.com

Unity パーティクル(9) 光るライン キラキラと控えめの直線

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

最近光る立体の直線をつくりたいことがありました。
キューブとかを光ってみせてもいいのかもしれませんが
せっかく綺麗なモノなので、パーティクルで
光る直線のエフェクトをつくったら良い感じになるのではないかと思い
やってみました。

シンプルな光の直線と
キラキラ光の強さが変わるまばらなやつ
の2種類です

f:id:sawalemontea:20171003173912p:plain

f:id:sawalemontea:20171003173922p:plain

まずシンプルな直線をつくります

Rendererモジュールでマテリアルを設定します。
f:id:sawalemontea:20171003174011p:plain

次に大きさの調節です。
コチラ向きなのでだんだん太くしてます
f:id:sawalemontea:20171003174037p:plain

コチラ向きにするため
スピードはマイナスです。
(プラスにすれば向こうへ行く感じになりますが
その場合はだんだん細くします)
f:id:sawalemontea:20171003174244p:plain

最後にEmissionとShapeを調整します。
f:id:sawalemontea:20171003174122p:plain



続いてキラキラのほうをつくります


Rendererモジュールで
さっきの普通のラインと同じマテリアルを設定します

次に、色と大きさを調整します。
f:id:sawalemontea:20171003174732p:plain

EmissionとShapeを調整です。
f:id:sawalemontea:20171003174802p:plain

メインを調整します。
f:id:sawalemontea:20171003174823p:plain


これで冒頭のようになったと思います。

StartLifetimeを操作すれば長さが変えられます。

キラキラする直線とか使い勝手よさそうですよね~

ただ、ラインという直線専用の機能があるのにこれをやるのは
邪道かもしれませんのでそのへんは後で調べておきます。


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


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

Unity SkyBoxでパーティクルが狂って芸術になった

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

今日、何気なく
本来はスカイボックスではないマテリアルを
スカイボックスに指定してみました
(ちなみにスカイボックスについてはコチラ)
Unity 空と単色背景 ClearFlagsとSkyBox - LemonteaのUnity部屋



すると…
パーティクルの表示がいかれて
逆に芸術みたいになったので
いままで記事でかいてきたパーティクル達を
この状態で撮ってみました

f:id:sawalemontea:20170930235125p:plain

これは波紋だったものです
(元
Unity パーティクル(1) 波紋 改善版 - LemonteaのUnity部屋

f:id:sawalemontea:20170930235144p:plain

文字の雨だったものですよ

Unity パーティクル(6) 緑の文字列の雨 SF・サイバーっぽいタイトル画面 - LemonteaのUnity部屋

f:id:sawalemontea:20170930235211p:plain

元斬撃です
これはわかる
(
Unity パーティクル(5) 斬撃のエフェクト - LemonteaのUnity部屋
)

f:id:sawalemontea:20170930235246p:plain

元は炎です
これもわかりやすいですね
(
Unity パーティクル(2) 炎のエフェクト 松明風と某悪魔風 - LemonteaのUnity部屋
)

f:id:sawalemontea:20170930235312p:plain

これは元炎属性つき打撃です
太陽みたくなってます
(
Unity パーティクル(4) 炎の属性付き打撃 - LemonteaのUnity部屋
)



いや~
これって仕様なんですかね?
私にはよくわかりません…

今回はここまでです。

Unity GetSpectrumDataで音ゲーの譜面を自動生成(2)

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

前回、思いつきで適当な自動譜面作成をやりましたよね。
sawalemounity.hatenablog.com

あれが意外と進化しそうだったので、
今回はレベルメータの転用ではなく
普通に作ってみました。

やり方としては
・GetSpectrumDataでデータを取得
・今鳴ってる一番強い音の強さをとる
・前フレームの最強音と比較して、ある程度以上強くなっていたら1音と認定

って感じです。

それではやってみます。



・GetSpectrumDataでデータを取得

 AS.GetSpectrumData(spectrum, 0, FFTWindow.Blackman);

これで配列Spectrumにデータが入ります
詳しくはここで
sawalemounity.hatenablog.com



・今鳴ってる一番強い音の強さをとる

 NowMax = 0;
        for (int k = 0; k < 1024; k++)
        {
            if (spectrum[k] >= NowMax)
            {
                NowMax = spectrum[k];
            }
        }

こんな感じにしました。

また、比較のために
Updateの最後に

 PreMax = NowMax;

こんな感じにしてます



・前フレームの最強音と比較して、ある程度以上強くなっていたら1音と認定

そして比較して記録します
このへんはここに~
sawalemounity.hatenablog.com

 if (NowMax >= PreMax + MinimamDifference)
        {
            if (intv <= 0)
            {
                sms.Timing[i] = timecount;
                i++;
                Array.Resize(ref sms.Timing, i + 1);
                intv = Interval;
            }
        }

あちゃ~なことにミニマムの綴り間違えてますね笑笑笑

そのアホそうな変数が
前フレームの音からどれくらい強くなれば
音譜を作るかを決める大切な変数なのです笑

最適な値は曲によりけりだと思うのでpublicなやつです。
今回は15くらい。
(この直前にNowMaxを100倍しているためで、そのままだと0.01とかの世界です)


また、Intervalというのは
最小の音の間隔のことです

そのままだと音がユラッてなった時に
0.0何秒間隔くらいでババババ~っと音譜ができちゃうので
それを抑えてます


さあ、簡易的ですができたので
さっそくいつもの魔王魂さんの曲で
試してみましょう

youtu.be



おお、音が抜けて中盤の精度はやや下がりましたが
全体的にはずいぶんよくなったのではないでしょうか

もうちょっと良くなったら
長押しとかも組み込んでみたいですね

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


関連

音ゲーの記事初回
sawalemounity.hatenablog.com

Unity GetSpectrumDataで音ゲーの譜面を自動生成

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



__________





この記事のすこし改善版↓の方を推奨します


sawalemounity.hatenablog.com






__________



今朝、GetSpectrumDataを使って
レベルメータもどきをつくりましたが…
Unity GetSpectrumData でレベルメータをつくる - LemonteaのUnity部屋

あれをなにかに使えないかな~
と思って、今回は試しに
音ゲーの譜面を自動でつくれないか
ちょっと試してみました。

ちょうどこの記事で
音ゲーの譜面を手動で作ったばかりでしたが…
sawalemounity.hatenablog.com
なんせこれ、ちゃんと作ろうとするとかなり難しいです。
適当に作るには最適なんですけどね笑



今回はお試しということで、
朝のレベルメーターの上にブロックを置き、
ぶつかった瞬間を記録するという
モロ朝のレベルメーターを流用した原始仕様です。

ぶっちゃけ閾値以上を判定するのと同じことなので
うっかりレベルメーターをつくっちゃった人以外は
スクリプトだけでやったほうがよさそうです笑

装置はこんなです
f:id:sawalemontea:20170927175840p:plain

さあ、この簡易音楽家はどんな譜面を書いてくれるでしょうか

youtu.be



うーん…?
全体的には残念な感じかな…

荒削りながら、中盤は
まあまあ合ってますね。

隣と時間差で当たったときは
1音なのにいっぱいでちゃってますが
この辺は記録するときに
前の音譜からn秒たたないと記録しない
みたいにすればどうにでもなりそうです
…それこそコルーチンとかで笑

なんか適当な思いつきにしては
未来に希望がありそうな結果になりました笑

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



↑で未紹介の音ゲー関連記事
sawalemounity.hatenablog.com
sawalemounity.hatenablog.com
sawalemounity.hatenablog.com

Unity GetSpectrumData でレベルメータをつくる

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

今回は、以前チラッとつかったっきりだった
GetSpectrumDataをもうちょっと弄ってみようと思います。

この前は一番大きい音の音程をとりましたが、
その逆を見つけました。

こちら↓の記事では
y9uni.hatenablog.com
複数の周波数帯の音の強さをとって
閾値以上の大きさなら光らせるということをやっています。

そこで今回は、
私も強さの方でキューブを変形させて
レベルメータのようなものをつくってみました。

こんなです↓
youtu.be


やり方は、このまえ↓の方法から
Unity GetSpectrumDataで音程で上下動するキューブ - LemonteaのUnity部屋
音程をとる行程を削除して
大きさの最大値を使う感じです。

そのままだと0.02とかなので200倍して
こんな感じにしています

    public AudioSource AS;
    public int Min, Maximam;
    float[] spectrum = new float[1024];
    void Start()
    {
        StartCoroutine(MoovTest());
    }
    IEnumerator MoovTest()
    {
        yield return new WaitForSeconds(0.5f);
        AS.GetSpectrumData(spectrum, 0, FFTWindow.Blackman);
        float Max = 0;
        for (int i = Min; i < Maximam; i++)
        {
            if (spectrum[i] >= Max)
            {
                Max = spectrum[i];
            }
        }
        float y = Max * 200;
        transform.localScale = new Vector3(1, y, 1);
        StartCoroutine(MoovTest());
    }

前回0.5秒に一回にした名残でコルーチンにぶち込まれたままですが
気にしないでUpdataに書いて大丈夫だと思います。


今回は気が狂っていたので
これをオブジェクトに付け、MinとMaximamにそれぞれ
手動で周波数の範囲を入力するという馬鹿行為に及びました。

眠かったんだと思います。

ちなみに、ここで言うオブジェクトとは
y方向の大きさ2の空オブジェクトです。

なんせそのままだとキューブが両方向に伸びるので、
キューブがy方向の大きさ2の空オブジェクトの
上半分を占めるように配置して

空オブジェクトを伸び縮みさせてください。

そうすれば動画のように上にだけ伸びます。


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


関連
Audio系
sawalemounity.hatenablog.com
sawalemounity.hatenablog.com