スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[Unity備忘録] アセットをResourcesフォルダに入れるかどうかの判断基準

わりと当たり前な機能にいまさら気づきました;

えーっと、まず

結論1
スクリプトから読み込むファイルは Resources フォルダに入れる。
スクリプトから読み込まないファイルは Resources フォルダに入れない。

そんで

結論2
シーンで使用していないアセットは Resources フォルダに入れていなければビルド時に除外される。

っていうことを学習したのでメモメモ“φ( ̄ ̄*)



先日、Unityのチュートリアル を読んでたら以下の記述が目に止まった。

ビルドの内部工程について
ビルドプロセスではまず、指定された場所にゲームアプリケーションの空のコピーを置きます。
次にビルド設定にあるシーンリストを順にたどりながら、エディターで一旦ひとつずつ開き、最適化し、アプリケーションパッケージとして統合していきます。
そして、シーンごとに必要なアセットを算出し、パッケージにそれぞれ格納していくわけです。


おお!そうだったのか!
そうとは知らず必死こいて制作末期に余計なアセット削除していたよ・・・
無駄な努力だったとは

アセット参照の素敵っぷりの威力を考えれば当然の機能なのでしょう;
想像力が足りなかった世・・・


っというわけで!
べつに疑ってるわけではないのですが、一応確認しておきたい挙動もあるので何パターンか実験してみました。



▼実験手順
1.適当なプロジェクトを作成

2.50MB の wav ファイルを一つ用意して AudioClip として Assets フォルダにインポート

3.その AudioClip を BGM(AudioSource)としてシーンで使用したり使用しなかったりしながら PC(Windows)用に何パターンかビルド

4.***_Data フォルダのサイズを確認して比較



▼実験パターン
(A)→ BGM のないシーンを作成してビルド

(B)→ BGM があるシーンを作成してビルド

(C)(A)のシーンと(B)のシーンを両方 Scenes in Build に追加した状態でビルド
  ※(A),(B)の順番で登録(最初のシーンは(A)
  ※(B)へは遷移しない(コーディングしていない)

(D)(B)のシーンのみを Scenes in Build に追加した状態でビルド
  ※(A)との違いは Scenes in Build を使用してることと Assets フォルダ内に(B)のシーンが存在していること

(E)(D)の状態で BGM の AudioClip を Resources フォルダに移動してビルド



▼実験結果
(A)→ BGM のないシーンを作成してビルド
9MB

(B)→ BGM があるシーンを作成してビルド
59MB

(C)(A)のシーンと(B)のシーンを両方 Scenes in Build に追加した状態でビルド
59MB

(D)(B)のシーンのみを Scenes in Build に追加した状態でビルド
9MB

(E)(D)の状態で BGM の AudioClip を Resources フォルダに移動してビルド
59MB



とまあ(A)(D)までは対象のアセット(BGM)が使用されているシーンがビルドされると 50MB しっかり増えてます。

「使用」というのはもちろん「参照」という意味です。
(C)については今回 Application.LoadLevel などを使用していないので、事実上は BGM を使用するシーンが読み込まれる事はありません。
が、前述の記事では

ビルド設定にあるシーンリストを順にたどりながら、エディターで一旦ひとつずつ開き、最適化し


と書かれていますから Scenes in Build に登録されたシーンは全てチェックされているものと思われます。
((A)と(B)は登録してないけどシーンリストが空の場合は開いていたシーンをデフォルトで選択されたものと思われます)
逆に言えば Scenes in Build に登録されていなければシーンデータ自体は存在していてもチェックされることはないと言えます。

(D)がそれの実例です。
BGMが使用されているシーンを Scenes in Build から除外しただけですが 50MB 減っています。

テスト用のシーンで色々実験に使ったデータだけど本編では使用しなかった、みたいなケースでもテストシーン自体が登録されていないのであれば、パッケージに含まれないので安心して運用できますね。

重要なのは(E)の結果です。
BGM の AudioClip を Resources フォルダに移動しただけで使用されているシーンがないのに 50MB 増えてしまいました。
なぜかと言うと Resources フォルダに入っているアセットはスクリプトから Resources.Load で読み込まれる可能性があるためです。(詳しくはこちら

っと言うより、スクリプトから読み込むアセットをビルド時に除外させないために Resources フォルダがあるんでしょうね^^;

そう言ったわけで冒頭の結論になります。
Resources フォルダに入れるとスクリプトで管理できるので取り回し良さげですが、パッケージサイズを抑えたい場合はなるべく Resources フォルダの使用を控えて、不要なアセットの最適化を Unity に任せてみるのがいいかと思いました。


ちなみに・・・非アクティブな GameObject や無効化された Component に関連付けられたアセットもビルドには含まれるようです。
スクリプトやアニメーションからON/OFFできるからだと思います。
含めたくない場合はシーンから削除するしかありませぬね・・・(・ω・)


この記事の内容はUnity4.5.3で確認したものです。
スポンサーサイト

テーマ : Unityゲーム制作
ジャンル : コンピュータ

[Unity備忘録] UnityでサウンドON/OFFを実装する方法

「くるくる迷路」 v1.1.0 に更新しました!

内容はパフォーマンス改善とバグ修正・・・
あと知人に指摘されたのでサウンドのON/OFFを実装しました。

というわけで今回やったサウンドON/OFFの実装方法を備忘録としてメモメモφ(.. )

具体的には2点

AudioListenerで全てのオーディオを消音(ミュート)
音声のON/OFF状態をPlayerPrefsに保存

▼AudioListenerで全てのオーディオを消音(ミュート)
Unityで全てのオーディオのボリュームを0(消音)にする手っ取り早い方法は AudioListener(オーディオリスナー)を使用すると楽そうです。

// リスナーのボリュームを 0 に設定
AudioListener.volume = 0f;

上記の1行はゲーム全体の音量を0に設定しています。
いわゆるマスターボリュームってやつですね!

上記の値は AudioListener コンポーネントの static なプロパティーです。
AudioListener のインスタンスは必要ありませんので注意してください。

AudioListener ってのはコンポーネントですがシーン上に一つしか配置してはいけません。
自前で作成しておく必要はなく、カメラオブジェクトを作成すると自動的にコンポーネントとして追加されています。

AudioListener(オーディオリスナー)とはその名のとおり音声の聞き手(リスナー)配置するためのコンポーネントです。
Unityのユーザーマニュアルでは「マイクのような機器」と表現されています。

ようは音声を拾ってくれる存在ですね。
2Dゲームだとわかりずらいですが3Dゲームでは音声も3D空間のあらゆる方向から聞こえるようになるため、カメラのようにどの位置で音声を聞くかが重要になってきます。
映像ではカメラを使いますが、音声(オーディオ)ではリスナーを使います。

音源がリスナーに対して左側にあれば音声は左から聞こえますし、リスナーからかなり遠くにあれば音声はとても小さく聞こえます。
カメラが「目」とするならリスナーは「耳」というわけです。

リスナーは特性上、位置と方向のパラメーターを持ちますが、これもカメラと同じ概念です。
そのためかUnityではシーン上にカメラを配置すると自動的にこの AudioListener コンポーネントが追加されて作成されるようです。

実はこの AudioListener 3D専用ってわけでもありません。
2D音源もこいつを使って音を拾われてるわけですが当然ながら位置やら方向やらっていうものには影響されません(されないと思いますたぶん;
とはいえ役にたつパラメーターもあります。先ほどのリスナーボリュームです。

てわけで無理やりまとめると AudioListener.volume を 0 にするとゲーム上で「耳」を完全に塞いだ状態になるということですね。(きっと
ちなみに AudioListener.volume の設定は AudioListener コンポーネントのインスタンスが破棄されてもリセットされません。
ON/OFFで使用する場合はどこかのタイミングで一回設定すればOKです。


▼音声のON/OFF状態をPlayerPrefsに保存
お次はON/OFFの状態をアプリを再起動しても継続させる方法ですが。
これには PlayerPrefs が最適かなと思いました。

詳しくは紹介されてるページが沢山あるので割愛します。
 ■[Unity][Unity3d]ゲームのスコア情報などを簡単に保存出来るPlayerPrefsクラス

気になるのはユーザーから丸見えの場所に保存されてしまううえ、テキストファイルなので閲覧可能、編集可能?ってところですが、今回のような環境設定情報にはデメリットでもなんでもありません(そもそもが環境設定用の機能っぽいですね・・・名称的にも

こいつを使ってさっきのリスナーボリュームを煮込むとこちら!

using UnityEngine;
using System.Collections;

public class AudioSwitch : MonoBehaviour
{
    void Awake()
    {
        if (PlayerPrefs.GetInt("Mute", 0) == 0)
        {
            AudioListener.volume = 1f;
        } else
        {
            AudioListener.volume = 0f;
        }
    }

    void OnGUI()
    {
        if (GUI.Button(new Rect(30, 30, 200, 30), "サウンドON/OFF"))
        {
            if (PlayerPrefs.GetInt("Mute", 0) == 0)
            {
                AudioListener.volume = 0f;
                PlayerPrefs.SetInt("Mute", 1);
            } else
            {
                AudioListener.volume = 1f;
                PlayerPrefs.SetInt("Mute", 0);
            }
        }
    }
}

こいつを適当なオブジェクトにスクリプトとして追加すればOK。
画面に消音ON(or OFF)というボタンが表示されているはずです。

これでサウンドのON/OFFが可能になりました。

ボタンが押されると PlayerPrefs から "Mute" の名前で保存してある数値を取得して・・・

Mute が 0(無効)なら 1(有効)に変更してリスナーボリュームを 0(消音)
Mute が 1(有効)なら 0(無効)に変更してリスナーボリュームを 1(発音)

にしてあります。

アプリを起動し直しても前回の設定が引き継がれておりますヤッター(゚∀゚)

ちなみにON/OFFではなくリスナーボリュームの値そのものを保存すれば・・・
// マスターボリュームを取得
AudioListener.volume = PlayerPrefs.GetFloat("MasterVolume", 1f);
// マスターボリュームを保存
PlayerPrefs.SetFloat("MasterVolume", AudioListener.volume);
ミュートではなくゲームの音量調整にも応用できそうですね(あんま需要ないかな??

以上です!・・・なんか関係ないことグダグダ書いてしまった;;
次はもっとシンプルなメモを取ろうorz

目指せ自分で読み返したくなる文章!!(´▽`;)

※注意※
ちなみに・・・上記のソースコードでは Awake で PlayerPrefs を読み込んで最初にリスナーボリュームを初期化しています。
このスクリプトが起動後の最初の画面にないとデフォルトで音声は鳴ってしまうので注意..._〆(・∀・@)

この記事の内容はUnity4.3.4で確認したものです。

テーマ : Unityゲーム制作
ジャンル : コンピュータ

timeline
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。