Monthly Archives: 7月 2014

[Unity] スクリプトからメッシュ(ポリゴン)を生成する

描画するメッシュをスクリプトから動的に生成する方法のメモ書きです。
これを行うことで、スクリプトから好きな図形のメッシュを作成できるようになります。

まず、以下の手順を踏んでメッシュを描画するための準備を行います。

1.ゲームオブジェクトを生成する
2.Mesh Filterを1.で作成したゲームオブジェクトにアタッチする
3.Mesh Rendererを1.で作成したゲームオブジェクトにアタッチする

以上ができたら本題のスクリプト作成に入ります。

メッシュ情報はMeshクラスで管理されます。
Meshのインスタンス化はnewで行います。

作成したら、Meshインスタンスに以下情報を指定する必要があります。

 ・頂点
 ・頂点のUV座標
 ・頂点インデックス

これらはDirectXやOpenGLでも登場します。
描画の詳しい仕組みはあえてここでは説明しません。

今回は長方形のポリゴンをRectを元に作成してみます。

頂点はその名のとおりメッシュの頂点を構成するための座標です。
長方形では4つ頂点が必要になるので、4つの頂点座標をVector3で指定しています。
頂点は反時計回りとします。

UV座標はテクスチャを張るとき、画像のどこが頂点に来るかを示す情報です。
画像の左下が(0, 0)、右上が(1, 1)となります。

頂点インデックスはいわゆるポリゴンを構成する情報です。
3点で1つの三角形ポリゴンとなります。
今回は反時計回りのポリゴンを(0, 1, 2)、(0, 2, 3)2つ定義して長方形を作成しています。

必要な情報をすべて指定したら、以下処理で法線およびバウンディングボックスを再計算します。

最後に、MeshインスタンスをMeshFilterに指定して完了です。

上記をまとめたスクリプトを以下に記しておきます。

デフォルトで用意されているメッシュが足りないと思ったらスクリプトで作るのも手だと思います。

■参考サイト
ポリゴンメッシュの作成

[Unity] GameObjectが消えても効果音が鳴り続けるようにする

UnityでAudioSourceを使って効果音を鳴らすとき、AudioSource自体が破棄されてしまうとこのAudioSourceから鳴っている効果音も同時に止まります。
たとえばオブジェクトが破棄されるときに爆発音を鳴らそうとすると、鳴った瞬間に音が止まってしまうためまったく音が聞こえなくなってしまいます。
また、GUIの操作音が途中で消えてしまうなんてこともありえます。

これを回避するには、AudioSourceをシーン中にひとつだけ持たせ、そこで一元管理すればできます。
この方法は3D音源を扱う場合には適さないですが、2DゲームやGUIの効果音を鳴らす場合には十分だと思います。

手順は以下のとおり。

1.空のゲームオブジェクトを作成する

2.AudioSourceコンポーネントをオブジェクトに追加

3.効果音再生処理を希望のタイミングで実行(下記参照)

以上です。
上記の方法では、任意の効果音を重ねて鳴らすことも可能です。
同時に爆発が起こったときも最初の音が止まらずにちゃんと再生できます。

今回の場合、AudioSourceはSingletonになるため、以下のような管理クラスから効果音再生できるようにしても良いでしょう。

3Dサウンドの場合、この方法では1箇所だけから音が鳴るようになってしまうため、AudioSourceを持った効果音再生用のゲームオブジェクトを生成してここから鳴らすようにするなど工夫が必要です。

[お知らせ] GitHubアカウント作りました

ゲーム制作などの電子創作物の生成過程で生まれた副産物をオープンソースとして公開して少しでもお役に立てていただきたいという趣旨の元、from the voidのGitHubアカウントを公開しました。
アカウントは以下URLから。

https://github.com/ftvoid

今はまだ空っぽな状態ですが、少しずつコミットしていきたいと思います。
当分の間はUnityのスクリプトがメインになると思います。
今後はブログに載せるサンプルソースもGitHub上にコミットしていけたらと思います。

まだ右も左もわからない状態ですが、有効な使い方を模索していきたいです。

[Departure from the Void] Webブラウザ版制作中

昨日で2周年を向かえたということで、公開中のゲームをWebブラウザ上で遊べるような形にしようということで移植作業を行っています。

dpv-unity

まだタイトル画面を実装している途中です。
スプライトがちゃんと表示されてサウンドが鳴るようになったかな?というレベルです。

開発環境はBlock ShooterのWeb版と同様、Unityで開発しています。
Unityを使えばネイティブな環境で開発してたのとは桁違いで効率良く作業が進みますね。
また、あらゆるプラットフォームで動かせてしまうのも凄いです。

今は無料版しかもっていないためUnityのロゴが入ってしまいますが、後々ロゴが入らないように有料版を買うかあるいは別のIDEにUnityのプロジェクトをコンバートするかで対応したいですね。
(時間をとるかお金をとるか・・・)
現状は無料版で制作を進め、完成間際になったら追々考えたいと思います。

祝!Webサイト2周年

今日でWebサイト「from the void」が2周年を迎えました。

ここ1年間で行ったことを振り返ってみます。

 ・Departure from the Voidの不具合修正・バージョンアップ
 ・Block Shooterの公開
 ・技術系ブログ運用

上2つは主にゲームの公開作業、最後はこのブログに不定期ながら書き続けている備忘録コンテンツとなります。
自作ゲームに関しては際立った成果を残せませんでした。

技術系ブログのほうは今年の3月から初め、これまでに100記事以上投稿してきました。
こちらはWebサイトのアクセス数アップに大きく貢献しました。

以上から得た教訓は、訪問者にとって役立つ・訪問者がほしいと思えるようなコンテンツを提供しない限りはアクセスを稼げる見込みは無いということです。
これは紛れも無い事実だと実感しました。

そのため、これからも技術系ブログは時間の許す限り随時更新していきたいです。
ゲーム制作のほうはまだ日の目の見る成果を残せていないため、もっと相手が楽しめるコンテンツを模索していかなければと考えている次第です。(そもそもコンテンツが少ない!)
ダウンロード型ゲームはなかなか遊んでもらえなくなっているため、今後はWebブラウザゲームの制作にシフトしていきたいと考えています。

実は、今日Block ShooterのWebブラウザ版を公開しました。
もうひとつ公開しているDeparture from the Voidも同様にWebブラウザで遊べるようにしようと移植作業に取り掛かっているところです。

それから、2周年ということもあり新しいアプリ開発に着手しました。
そのアプリ名はvoide
声を意味する「voice」とサイト名の「from the void」の「void」を掛けた造語で音声合成アプリとなります。
音声合成アプリといえば人の発話を模倣するものとして既にに多種多様のものが世の中で実用されていますが、今回私が開発しようと考えているのは猫の鳴き声をシミュレートするものです。
猫の声を合成するアプリはあまり例を見ないのではないでしょうか。
最終的に自分の部屋でバーチャルな猫を飼えるアプリを開発し、これに組み込もうと考えています。
このためにOculus DK2を予約しようかと迷っているところです。

話がまとまらなくなってしまいましたが、具体的な制作状況はまた個別の記事で紹介します。
一歩一歩着実に成果を出しながら次の道を模索していこうと思います。

[Block Shooter] Webブラウザゲーム版を公開しました!

サイトに公開中の自作ゲーム「Block Shooter」のWebブラウザ版を公開しました。
以下URLからプレイできます。

http://ftvoid.com/game/blockshooter/web.html

落下してくるブロックを地面に到達しないように破壊するゲームです。
プレイにはUnity Web Playerが必要です。
ブラウザにインストールされていない場合はインストールの旨のメッセージが表示されるため、指示に従ってインストールしてください。

いままで公開していたWindows版からの変更点は以下のとおりです。

 ・難易度を若干下げる
 ・Twitterにスコアを投稿する機能を追加

ほかにもハイスコアを記録する機能も実装しようかと考えていましたが、DB周りの実装が必要になり時間がかかりそうでしたので、現状のようになりました。
色々と至らぬ点がありますが、気が向いたら何か新しい機能を追加したいと思います。

[C++] C++でC#っぽいdelegateを実装してみる(任意クラスの任意メソッド実行)

昨日に引き続いてC++によるC#のようなDelegateを扱うメモです。
boost.signals2を使えばDelegateクラスをわざわざ実装せずともDelegateのような扱いができることを書きました。
しかし、C#のような任意クラスの任意メソッドを指定することはできませんでした。

結局は関数しか扱えないのか・・・

実はboost.bindを使えば任意クラスの任意メソッドをsignalに指定して実行できるのです。
以下にその使用例を示します。

■実行結果

今回の肝となる部分は以下のboost.bindを使った部分です。

通常、関数ポインタにメソッドのポインタを代入することはできません。
また、staticでないメソッドを呼び出すには呼び出し元のインスタンスが存在している必要があります。
しかし、signal.connect()に指定するのは関数ポインタです。

この問題はboost.bindを用いることで解決できます。
boost.bindを用いると、関数の呼び出し時に引数の一部を固定化できるようになります。
たとえば、func(a, b, c)の呼び出しがあるとして、引数aのみを固定させてfunc(b, c)と呼び出すことができます。

C++のメソッド呼び出しは、呼び出し元のインスタンスがメソッドに指定する第1引数の前に隠れて存在しています。
すなわち、obj.method(a, b, c)呼び出しはmethod(obj, a, b, c)と同じ意味になるということです。
このメソッド呼び出しのobj引数を固定化できればmethod(a, b, c)として呼び出すことができ、関数ポインタとして代入できるようになります。

boost::bind()の第1引数にメソッドのポインタ、第2引数に呼び出し元インスタンスのポインタを指定します。
第3引数以降には登録した関数の実行時に指定する引数のフォーマットを指定します。
_1, _2, _3 … というふうにアンダーバー+数字というシンボルをかならず_1から順に個数分だけ指定します。
上のサンプルソースでは、int, floatと引数が2つあるため、_1, _2を指定しています。

固定化できる引数の型は任意であるため、まさに今回の目的には打って付けの道具ですね。
唯一のデメリットはコンパイルエラーが発生したときに意味不明なエラーが出てしまうところです。
何か自作クラスでラップして使えれば問題は回避できそうです。

■参考サイト
シグナル/スロット
【C++ / Boost】boost::bindについての適当まとめ

[C++] C++でC#っぽいdelegateを実装してみる(boost.signals2を使う)

C#のdelegateをC++で実現できないかと考え、こちらの記事にその方法を書きました。
上記を実現するために、C++でC#っぽく使えるDelegateクラスを実装しました。
しかし、boost.signals2でほぼ同様のことができることを知りました。

以下にそのboost.signals2を用いて書き直したソースを記します。

■実行結果

いとも簡単にDelegateの動作が実現できてしまいます。
今回も前回同様、任意クラスのメソッドは登録できませんが実行結果はまったく一緒です。

boost.signals2の詳細な使い方はマニュアルをご参照ください。
これで任意クラスのメソッド実行ができたらC#のdelgateと引けをとらないくらいに便利なものになるでしょう。

[WebGL] WebGLを使ってみる

今回から実際にWebGLを使って何らかのオブジェクトを描画してみたいと思います。

まずは、サンプルを記します。

上記を正しく動作させるためには、webgl-utils.jsというJavascriptファイルを同階層に配置する必要があります。
これは下記サイトからダウンロードできます。

http://code.google.com/p/webglsamples/source/browse/book/webgl-utils.js?r=41401f8a69b1f8d32c6863ac8c1953c8e1e8eba0

リンク先のソースコードをwebgl-utils.jsというファイルにコピー&ペーストして配置します。
上記Javascriptは以下のようにインクルードします。

これでWebGLの使用準備は完了です。

次に、WebGLの初期化を行います。
HTML5ではキャンバス要素をIDで取得し、キャンバスから描画用のコンテキストを取得してそこに文字や図形などを描画していました。
WebGLではキャンバスからWebGL専用の描画コンテキストを取得してこれに描画します。

キャンバスにさまざまなオブジェクトを動的に描画していくためには、キャンバス内を随時クリアしていかなくてはなりません。
今回はこのクリアのみ行う処理を書いています。

gl.clearColor()でクリア色を指定し、gl.clear()でクリアを実行しています。
次回からは図形を実際に描画してみたいと思います。

今月の今後の活動予定

今回は書くネタがまだまとまっていないので、今月のfrom the voidの活動予定について記しておきます。

今月は以下の自作ゲームをサイトに公開する予定です。

 ・Web版「Block Shooter」
 ・「Ball’n’Roll」

上記ゲームはいずれもWebサイトのブラウザ上で遊べる形を考えています。
スコアをTwitterにする機能も備えているため、腕試しもできる仕様になっています。
どちらも最終的な動作確認を行っている段階なので、近々公開できると思います。

また、制作以外の個人的な目標は、WebGLについてマスターすることです。
後にWebサイトに動的なコンテンツを公開していきたいという狙いがあるためです。
こちらはまだまだ道のりが長いですが、焦らずにブログに備忘録を残しつつ勉強に励んでいきたいです。

以上、簡単ですがご報告でした。