ローディング


Unityでローディングをする際のテスト。基本的にはWWWクラスで簡単に処理ができる。FlashでいうURLLoaderのような感じだけどもう少し簡易的に扱える。
今回は画像ならGUI.Boxで画像を表示し、音ならAudioSourceで音を鳴らし、それ以外であればGUI.TextFieldにてテキストを表示させるようにしてみた。
音についてはUnityはmp3を外から取ってきて鳴らすというのはサポートされていないそうで非圧縮音源かoggフォーマットのみ。

基本的な部分はすごく簡単で

[unitycsharp]
/**
* データのロード。
*/
private IEnumerator LoadData(string url) {
this.www = new WWW(url);

yield return this.www;

// ダウンロード後の処理
}
[/unitycsharp]

こんなメソッドを用意してあげて、あとは呼び出すだけ。
ローディング状況はWWW.progressで取れる。
エラーについてはWWW.errorがnullでなければエラーが発生している。
Flashと同様に別のドメインのファイルを見にいくときにはcrossdomain.xmlの設置が必要になってくる。

全体のソースは
[unitycsharp]
using UnityEngine;
using System.Collections;
using System.IO;

/**
* WWWによるロードのテスト。
*/
public class LoadingTest : MonoBehaviour {
/**
* 入力テキスト。
*/
private string inputTxt = "http://farm5.static.flickr.com/4147/5222317796_f5533d3b16_o.jpg";

/**
* ローディング中かどうか。
*/
private enum LoadingStatus {
NONE,
LOADING,
LOADED,
ERROR
};

private LoadingStatus loading = LoadingStatus.NONE;

/**
* 読み込みを行う。
*/
private WWW www;

/**
* ダウンロードされたファイルタイプ。
*/
private enum FileType {
NONE,
TXT,
IMAGE,
SOUND
}

private FileType downloadType;

/**
* AudioSource.
*/
private AudioSource audioSource;

/**
* エラー待ちフラグ。
*/
private bool errorWaitFlag = false;

/**
* Awake.
*/
public void Awake() {
this.audioSource = this.GetComponent<AudioSource>();
}

/**
* OnGUI.
*/
public void OnGUI() {
// ダウンロード開始前
if (this.loading == LoadingStatus.NONE) {
this.inputTxt = GUI.TextField(new Rect(Screen.width / 2 – 250, Screen.height / 2 – 15, 500, 30), this.inputTxt);

if (GUI.Button(new Rect(Screen.width / 2 – 50, Screen.height / 2 + 50 – 15, 100, 30), "Load")) {
StartCoroutine(this.LoadData());
}
}
// ダウンロード中
else if (this.loading == LoadingStatus.LOADING) {
GUI.Label(new Rect(Screen.width / 2 – 50, Screen.height / 2 – 15, 100, 30), "Loading…");
GUI.Label(new Rect(Screen.width / 2 – 50 + 20, Screen.height / 2 + 30 – 15, 100, 30), (int)(this.www.progress * 100) + "%");
}
// ダウンロード完了
else if (this.loading == LoadingStatus.LOADED) {
// 画像
if (this.downloadType == FileType.IMAGE) {
GUI.Box(new Rect(0, 0, Screen.width, Screen.height – 50), this.www.texture);
}
// サウンド
else if (this.downloadType == FileType.SOUND) {
if (!this.audioSource.isPlaying) {
if (GUI.Button(new Rect(Screen.width / 2 – 50, Screen.height /2 – 15, 100, 30), "Play Sound")) {
this.audioSource.Play();
}
}
else {
if (GUI.Button(new Rect(Screen.width / 2 – 50, Screen.height /2 – 15, 100, 30), "Stop Sound")) {
this.audioSource.Stop();
}
}
}
// その他
else {
string outTxt = this.www.text;
if (outTxt.Length > 1000) {
outTxt = outTxt.Substring(0, 1000);
}

GUI.TextField(new Rect(0, 0, Screen.width, Screen.height – 50), outTxt);
}
// リセットボタン
if (GUI.Button(new Rect(Screen.width / 2 – 50, Screen.height – 40, 100, 30), "Reset")) {
this.Reset();
}
}
// ダウロードエラー
else if (this.loading == LoadingStatus.ERROR) {
GUI.Label(new Rect(Screen.width / 2 – 300, Screen.height / 2 – 15, 600, 30), this.www.error);

if (!this.errorWaitFlag) {
StartCoroutine(this.WaitAndReset());
}
}
}

/**
* データのロード。
*/
private IEnumerator LoadData() {
this.loading = LoadingStatus.LOADING;

this.www = new WWW(this.inputTxt);

// 拡張子からタイプ決定
string ext = Path.GetExtension(this.www.url);

// 画像
if (ext == ".jpg" || ext == ".jpeg" || ext == ".png" || ext == ".gif" || ext == ".bmp") {
this.downloadType = FileType.IMAGE;
}
// サウンド
else if (ext == ".wav" || ext == ".aif" || ext == ".aiff" || ext == ".ogg") {
this.downloadType = FileType.SOUND;
}
// その他
else {
this.downloadType = FileType.TXT;
}

yield return this.www;

if (this.www.error != null) {
this.loading = LoadingStatus.ERROR;
return false;
}

// サウンド割り当て
if (this.downloadType == FileType.SOUND) {
this.audioSource.clip = this.www.audioClip;
}

this.loading = LoadingStatus.LOADED;
}

/**
* エラー待ち。
*/
private IEnumerator WaitAndReset() {
this.errorWaitFlag = true;

yield return new WaitForSeconds(2.0f);

this.Reset();
}

/**
* リセット。
*/
private void Reset() {
if (this.downloadType == FileType.SOUND) {
this.audioSource.Stop();
this.audioSource.clip = null;
}

this.www = null;
this.loading = LoadingStatus.NONE;
this.downloadType = FileType.NONE;
this.errorWaitFlag = false;
}
}
[/unitycsharp]

こんな感じ。

>>プロジェクトファイルダウンロード

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です