【Unity】外部リソース読み込みのお話

こんにちは。
最近休日なのに大学に来ることに何の抵抗も感じなくなってきていてやばいと感じている浅野です。

今回はフランスで開発してる時に「ぐえっ」ってなったUnityの外部リソース読み込みの話をしたいと思います。

ことの成り行き

フランスで開発している際にフランス語の音声とテキストデータを現地で調達しようという話になって、そのために外部ファイルからリソースを読み込むように設計する必要がありました。
そのため、テキストデータはC#のSystem.IOを使ってCSVファイルを読み込み、音声データはResources.Loadを使用して読み込んでいました。
この時点で何が起きたか分かる方は分かると思うのですが、ビルドして_DataフォルダにResouecesフォルダを作って音声ファイルを放り込んでも再生してくれませんでした。
しかもそのことに気付いたのが展示中で「フランス語版音声再生されないよ!?どうするの!?」となり、急遽ユニティエディターを立ち上げてなんとか対処しました。

原因の考察

原因として以下の2つの理由が挙げられます。

  • Assetフォルダ内のResourcesファイルの中身と_DataフォルダのResourcesファイルの中身を同じにしていた。
  • そもそもResoueces.Loadはビルドインデータからしか読み込まない。

1つ目のファイルの中身が同じだったというのは確認作業の時に音再生できているしいいだろうとなってしまい、どのフォルダからロードしているのかを確認をしていませんでした。
2つ目の「Resoueces.Loadはビルドインデータからしか読み込まない」は、公式に記述されていて驚きました。

Unityマニュアルより なってこった!

対処法

調べてみたら対処法として、バイナリデータとして読み込むやWWWクラスを使うが候補として出てきました。
バイナリーデータを扱うのは難しそうだったので今回はWWWを使用して実装しました。

//WWW===================================
www = new WWW("file:///" + Application.dataPath + "/Resources/Japan_/" + count.ToString() + ".wav");
while (!www.isDone)//ロードが完了するまで次に進んでほしくないため
{
Debug.Log("チョットマッテネ");
}
Narration[count] = www.audioClip;
Debug.Log(count+" : "+www.isDone);
/*======================================
//Resources.Load************************
Narration[count] = Resources.Load("Japan_/" + count.ToString());
if (Narration[count] == null)
{
Debug.Log("ぬるりJ" + count);
}
//**************************************
*/

一応比較としてResources.Loadでの実装も並べておきます。
WWWのほうのWhile文はロードが終わっていないのに再生しようとしていたので、ロードが完了するまで処理を止めるようにしています。

こんな感じで実装することができました。もうこんな危ない橋を渡ることが無いと思うので、使う機会はないと信じたいですね…

ベイビーフランス遠征

こんにちは。
最近目、肩、腰が辛くなってきている浅野です。
今回はLavalVirtualの展示でフランスに行ってきたのでそのことについてまとめたいと思います。
日程は3月16日から3月28日(29日帰国)でパリで5泊して、その後ラヴァルで6泊ぐらいして最後にレンヌで1泊という怒涛のスケジュールでした。

パリにいる間はルーブル美術館に行ったりマルシェに行ったり(ハコスコで)凱旋門に行ったり(ハコスコで)エッフェル塔に行ったりしました。

モナリザ…ちっちゃい!

というのも実はLavalVirtualでの展示用の実装が終わってなくて凱旋門とエッフェル塔に行く余裕が無く、メンバーにThetaSを渡して「これで写真を撮ってきてくれ! したら俺も観光にいける!」なんてバカなことをやりながら生活しました。
凱旋門とエッフェル塔にいけなかったのでRexさんにお土産のコインを貰いました。とてもうれしかったのですが、一緒に来ているのにお土産を貰うなんて「あれ?」ってなりました。料理も自分たちで作ったりして色々あったけど楽しい5日間でした。Monoprix様ばんざ~い!

Lavalに来てからは毎日のように食事会があってまったく気が休まりませんでした。
基本的に内向的なので他人との食事は落ち着かず味もよく覚えていないみたいな事がほとんどなのでなかなかに辛かったです。
そんでもってまだ展示用の機能追加が終わってなかったりしていて胃へのダメージが半端なかったです。
ただ、シーフードタワーはおいしかったです。

稲見先生にオマール海老半身頂きました! ありがとうございます!

展示の方はなかなかに盛況で黒山の人だかり状態(髪の色が黒だけではないので黒山ではない)になっていました。

展示中のお客さんの様子

展示中に実行ファイルをUnityエディターからexe切り替えたり、フランス語のローカライズ版を作成したりなど今考えると頭おかしいこともしていました。
休憩中は他の展示を見ずに外の公園でヤギを見たりベンチで寝たりとまったりしていました。ちょっと勿体無い気もしましたが、へとへとだったのでこれはこれでよかったと思います。

公園なのにヤギが…

あとACM SIGGRAPH賞を受賞しました。次の海外は7月末からロサンゼルスで展示です。行くかどうかは未定ですが…

レンヌに行ってからはどたばたしながらモン・サン=ミシェルに行きました。
ここではドラクエよろしくマッピングしながらThetaSを使ってバシバシ写真を撮りました。が、時間が無く全部を見て回ることはできませんでした…悲しみ…
帰国してからどれぐらい写真を撮ったのか見てみたのですが150枚しか撮ってませんでした。こんなんじゃVR作れないよ…と思っていたらThetaS君の中から写真が続々と出てきてなんだかんだで600枚近く撮ってました。これを整理してハコスコで見れるようなアプリケーションを作りたいですね!

モンサン!

全体を通して英語がかなり通じたのでそこまで苦労することが無く、フランス人の方もみんな優しくて特に不便なところも無く、色々ありましたが快適で楽しいフランス旅行でした。

ベイビーチームもひと段落着いてそれぞれが別の方向へと歩いていくと思います。が、まだ終わりではないのでこれからも応援の方よろしくお願いします。

第2回ゼミ進捗報告

こんにちは、最近ますます笑いのつぼが広く深くなってきて困っている浅野です。
さて、今回のブログですが、多重化の引継ぎ、ゲークリ個人製作最終課題、ゲークリチーム開発の闇、就活進捗について書きたいと思います。
まず始めに就活の進捗報告からです。2月20日にあさがく主催のゲーム×IT業界フォーラムに行って来ました。正直自分が何をやりたいのか分かっていなかったのですが、企業の話を聞いてなんかやりたい事と違うな…って思ううちに自分がやりたいことが見えてきたので非常に行ってよかったなと思います。興味のある企業もいくつかあったので履歴書を早々に仕上げてエントリーしたいと思います。

次に多重化のWeb化の引継ぎを行いました。PlayCanvasを使って実装するのですが、PlayCanvasというかJavaScriptが思っていた以上に曲者でだいぶ苦戦しました。あと初めてシェーダーを書いたのですが思っていたよりも簡単でした。過去にOpenGLという名のシェーダーっぽい何かを授業でやったのですが、その授業よりは遥かにわかりやすかったです。JSも授業でやってはいるのですが相変わらずちんぷんかんぷんでした。
あと意外だったのは多重化の実装は割と少ないコードで動いていることです。研究を引き継がなかったとしても実装はできるようにしておきたいですね。

多重化成功!

次にゲークリの個人製作最終課題ですね。ゲークリは授業とチーム開発の2つがあってこれは授業のほうにあたります。授業ではUnityについてやっていました。ただ結構マニアックな内容が多く去年の授業とはまた違った勉強をすることができて非常に良かったです。
で、この授業の最終制作がTPSゲームを作るというものなのですが、課題の提出2日前からの時間が非常に有意義というか効率的だったのでメモとして残しておこうと思います。
まず2日前の時点での状態がこんな感じになっています。

驚きの白さ!
この時点でできていることは

  • 敵(スフィア)がスポーンする
  • 敵がナビメッシュで移動する
  • プレイヤーが操作できる
  • クリックすると放物線が現れ、離すとその弾道に沿った弾が飛んでいく
  • しゃがみながら移動すると雪だまを転がせて一定以上大きくなると雪壁になる
  • 敵はこの雪壁を障害物として認識する
  • 雪が降る+積もる
  • 雪の上を歩くと雪がへこむ

ぐらいでした。
これをあと2日でゲームにもっていくために行ったことは

  1. 時間の使い方を考える
    要は戦略を練る段階ですね。2日あったので1日目に大まかな残りタスクの把握と素材を集めて2日目に組み立てるという手段をとりました。残りタスクの把握はWindowsのアクセサリの付箋を使いました。
    とにかくそこに書き出していって終わったら消すを繰り返しました。
  2. 素材を集める
    残りタスクから必要な素材を考えひたすら背景素材や敵キャラのモデル、SEなど集めました。
  3. 組み立てる
    タスクの把握はある程度できているのでひたすらそれをつぶしていく作業になります。新しいタスクの当然出てきますがあわてず付箋に書いて取っておきます。また、足りない素材もここで補充しています。

こんな感じで作ったものがこちらになります。

正直な感想としては「よく間に合ったな」ですね。戦略を練るのとタスクを細かく細かく分けていく事の重要性を再認識しました。というか本来であればこうならないようにこつこつとやっていけって話ですよね。
公開するかどうかは未定ですがちょっとづつ手直ししていけたらなと思います。

最後にゲークリチーム開発の闇ですね。今回僕はサポートチームとしての参加で、開発にはがっつリ参加していないのですが、先生の要望で集中制作期間にマネージャーみたいな感じで参加することになりました。第三者としての参戦なので客観的にゲークリを観察できてなかなか面白い体験でした。
この1年で結構成長したなぁ…
文章が長くなってしまったので今回はこのへんにして、この件はまた別の記事にまとめたいと思っているのでそこでがっつり書きたいと思います。

Hello World!

こんにちは、正式に白井研に配属されました浅野隆弥です。
セミナーベイビーチームに何回か登場しているのですが、改めてどんなことができるのか自己紹介したいと思います。
できること

Untiyの基本的なこと
C,C++,Javaの基本的なこと

できるけどできればやりたくないこと

Arduino
センサープログラミング

できないけどやりたいこと

モデリング
絵を描く
Raspberry Pi
Unityを使ったネットワーク対戦
Androidゲーム制作
AR開発

できないこと

視覚デザイン

という感じです。結構移り気が激しいのでやりたいことがどんどん出てきて手が足りない!なんて事がよく起こります。しかも余り長続きしないので性質が悪い。

 

今まではベイビーチームとして居候みたいな形で勝手に占拠していて肩身が狭い(物理的にも)と感じていたのですが、これからは研究室を広々と使えますね。やったぜ!

ブログ名の由来ですがベイビーチームで物事を理解した時に使われていたネタをそのまま使いました。ドラクエのステータス上昇みたいな感じで成長しているのが読み取れていいんじゃないでしょうか。
まあでもアホ丸出しのタイトルなのでもしかしたら変更するかもしれないです。

このブログは研究のこととかUnityのこととか技術的なことを書いていければなと思います。
研究テーマはまだほとんど決まっていないのですがARをやりたいという希望をうっすらと抱いています。

しかし、セミナーやベイビーの時と違って記事のタイトルを考えるのがめんどくさいですね…
まぁどうにかこうにかがんばっていこうと思いますのでお付き合いのほどよろしくお願いします。