<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>GEOQUAKE Backstage &#187; Unity</title>
	<atom:link href="http://geoquake.jp/blog/tag/unity/feed/" rel="self" type="application/rss+xml" />
	<link>http://geoquake.jp/blog</link>
	<description>ゲームとか鋭意制作中のブログ</description>
	<lastBuildDate>Wed, 16 May 2012 13:03:27 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Unity：Wheel Colliderで車を組み立ててみる</title>
		<link>http://geoquake.jp/blog/2012/05/16/wheelcollider/</link>
		<comments>http://geoquake.jp/blog/2012/05/16/wheelcollider/#comments</comments>
		<pubDate>Tue, 15 May 2012 22:25:22 +0000</pubDate>
		<dc:creator>k0rin</dc:creator>
				<category><![CDATA[雑記]]></category>
		<category><![CDATA[Unity]]></category>

		<guid isPermaLink="false">http://geoquake.jp/blog/?p=2534</guid>
		<description><![CDATA[UnityのWheel Colliderコンポーネントを使って車を組み立ててみる実験をしました。公式のCar Tutorialの車は動きが不自然で、実際、スクリプトを見ると妙なことをしているように見えたので（笑）自分で中 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://geoquake.jp/unity/experimental/VehicleTest/"><img src="http://geoquake.jp/blog/wp-content/uploads/2012/05/VehicleTest500.png" alt="" title="VehicleTest500" width="500" height="281" class="alignnone size-full wp-image-2537" /></a></p>
<p>Unityの<a href="http://unity3d.com/support/documentation/Components/class-WheelCollider.html">Wheel Collider</a>コンポーネントを使って車を組み立ててみる実験をしました。公式の<a href="http://unity3d.com/support/resources/tutorials/car-tutorial">Car Tutorial</a>の車は動きが不自然で、実際、スクリプトを見ると妙なことをしているように見えたので（笑）自分で中身を把握できるものを作っておこうという感じで。まだToDoをたくさん残したまま間が開いてしまっていて、ちょっと投げっぱなしなんですが……。</p>
<p>Wheel Colliderは、タイヤのスリップに対する摩擦力と、サスペンションをシミュレートしてくれます。なら、車体に４つタイヤをつけてWheel Colliderくっつければとりあえず完成？　と思ってしまうのですが、それだけでは駄目で、旋回すると遠心力でタイヤが浮いてすぐ横転してしまいます。重心をいじったり、ダウンフォースを与えてみたりとしばらく悩んだのですが、車体のロールを抑えるために<a href="http://forum.unity3d.com/threads/50643-How-to-make-a-physically-real-stable-car-with-WheelColliders">スタビライザーを組み込む</a>のがポイントのようです。車に必要不可欠なパーツだったんですね。こうしたことを体験・実感できるのは、物理エンジンに触れる面白さのひとつだと思います。まあ、重要なヒントをもらったところでやっぱり調整は難しいんですけど。</p>
<p>ちなみにいろいろ調べているうちに知ったのですが、本格的な自動車のシミュレーションのアセットがあったりします。CPUカーのAIのアセットもあるようです。</p>
<ul>
<li><a href="http://unitypackages.net/unitycar/joomla/index.php">UnityCar</a>
<li><a href="http://proracingai.com/">Pro Racing AI</a>
</ul>
<p>Unityは、せっかく頑張っても「<strong>それアセットでできるよ</strong>」となって不貞寝してしまうようなことが結構……。</p>
<p>バックミラーの左右反転描画はこんな感じで投影行列とポリゴンを反転してます。</p>
<pre class="brush: csharp; title: ; notranslate">
using UnityEngine;

public class MirrorCamera : MonoBehaviour
{
	void Start()
	{
		camera.projectionMatrix *= Matrix4x4.Scale(new Vector3(-1, 1, 1));
	}

	void OnPreRender()
	{
		GL.SetRevertBackfacing(true);
	}

	void OnPostRender()
	{
		GL.SetRevertBackfacing(false);
	}
}
</pre>
<p>コースの生成には<a href="http://www.unityterraintools.com/tools.php">EasyRoads3D</a>を使用しています。Terrain上に引いたスプラインパスから道路や縁石、ガードレールなどのメッシュを生成し、Terrainをそれに合うようにならしてくれます。便利ですが、UIなどやや癖のあるアセットです。</p>
<p>道路とTerrainがZファイティングを起こすのを回避するため、EasyRoads3D付属の道路描画用のシェーダにはOffsetの設定が入っています。が、調整が難しいのでオフにして、手っ取り早く道路の高さを7.5cmほど上げて対処しています。そのため、段差で車体が跳ねてしまってたり……。</p>
<p>まだいろいろと課題が多そうですが、Unityのおかげでこういったことをわりと手軽に試せるようになったのは嬉しいですね。</p>
]]></content:encoded>
			<wfw:commentRss>http://geoquake.jp/blog/2012/05/16/wheelcollider/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Blenderの導入ガイドを書いてみた</title>
		<link>http://geoquake.jp/blog/2011/10/22/blender/</link>
		<comments>http://geoquake.jp/blog/2011/10/22/blender/#comments</comments>
		<pubDate>Sat, 22 Oct 2011 13:40:20 +0000</pubDate>
		<dc:creator>k0rin</dc:creator>
				<category><![CDATA[雑記]]></category>
		<category><![CDATA[Unity]]></category>

		<guid isPermaLink="false">http://geoquake.jp/blog/?p=1927</guid>
		<description><![CDATA[Blender 2.60が出ましたね。最近更新ペースが速いです。12月のバージョン2.61では新しいレンダリングエンジンも入るとか。 で、つい勢いでBlender基礎最速マスターというものを書いてみました。タイトルは一時 [...]]]></description>
			<content:encoded><![CDATA[<p>Blender 2.60が出ましたね。最近更新ペースが速いです。12月のバージョン2.61では新しいレンダリングエンジンも入るとか。</p>
<p>で、つい勢いで<a href="http://geoquake.jp/unity/blender/">Blender基礎最速マスター</a>というものを書いてみました。タイトルは一時期人気になったプログラミング言語の基礎文法最速マスターシリーズにあやかっています。</p>
<p><a href="http://geoquake.jp/unity/blender/"><img src="http://geoquake.jp/blog/wp-content/uploads/2011/10/blender.png" alt="" title="Blender基礎最速マスター" width="600" height="264" class="alignnone size-full wp-image-2036" style="border: 1px solid #888;" /></a></p>
<p>Blenderはフルスペックのフリーの3DCGソフトウェアです。Unityとの連携で用いられることも増えていると思うのですが、癖がとても強いことでも知られています。できるだけ短時間でハマりポイントのうち大きなものをカバーできるようにしてみたつもりなんですが、どうでしょうねー。</p>
<p>ブログではなく通常のページにしたのは、また結構長文になってしまったのと、最近ウェブで検索したときに古い情報が出てくることが多い気がするので（数ヶ月前に書いた<a href="http://geoquake.jp/blog/2011/06/27/airtemplate/">AIRのエントリ</a>ももう時代遅れになってしまいましたし……）、固定ページとしてメンテナンスしたほうがいいんじゃないかと。</p>
<p>いざ久しぶりにページを作るとなると、URLを考えるのに困ったりするんですけどね。思い切ってunityというディレクトリを作ったので、そんな感じのものを上げていければいいなと思ってます。</p>
<p>近況としてはわりとUnity漬けですが、Flash 11も気になるところです。</p>
]]></content:encoded>
			<wfw:commentRss>http://geoquake.jp/blog/2011/10/22/blender/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Unityで１週間でミニゲームを作ってみた</title>
		<link>http://geoquake.jp/blog/2011/07/19/avoider/</link>
		<comments>http://geoquake.jp/blog/2011/07/19/avoider/#comments</comments>
		<pubDate>Mon, 18 Jul 2011 15:00:03 +0000</pubDate>
		<dc:creator>k0rin</dc:creator>
				<category><![CDATA[雑記]]></category>
		<category><![CDATA[Unity]]></category>
		<category><![CDATA[ゲーム制作]]></category>

		<guid isPermaLink="false">http://geoquake.jp/blog/?p=1786</guid>
		<description><![CDATA[最近なにかと話題のゲームエンジンUnity。ずっと前から気になっていてちょくちょくいじってはいたんですが、実際にゲームを作ってみたことはありませんでした。そんなところにIGDA日本のUnityのセミナーがありまして、面白 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://geoquake.jp/webgame/Avoider/"><img src="http://geoquake.jp/blog/wp-content/uploads/2011/07/screenshot600px.png" alt="" title="screenshot600px" width="600" height="338" class="alignnone size-full wp-image-1787" /></a></p>
<p>最近なにかと話題のゲームエンジン<a href="http://unity3d.com/">Unity</a>。ずっと前から気になっていてちょくちょくいじってはいたんですが、実際にゲームを作ってみたことはありませんでした。そんなところに<a href="http://www.igda.jp/modules/bulletin/index.php?page=article&#038;storyid=501">IGDA日本のUnityのセミナー</a>がありまして、面白そうな内容でぜひ行こうと思ったんですが、Unityをろくに触らないまま遠路出かけるのはもったいないということで、急遽ゲームを１本でっちあげてみました。</p>
<p>ゲームはこちらです。要求スペックはそこそこ高めです。</p>
<ul>
<li><a href="http://geoquake.jp/webgame/Avoider/">Avoider</a>（要Unity Web Player）</li>
</ul>
<p>ちなみにセミナーの内容については「強火で進め」さんのブログにまとめられています。</p>
<ul>
<li><a href="http://d.hatena.ne.jp/nakamura001/20110716/1310821202">IGDA日本ゲーム開発セミナー「Unityの導入と実践」に参加して来ました</a></li>
</ul>
<p>以下、メイキング的なメモ書きです。</p>
<p><img src="http://geoquake.jp/blog/wp-content/uploads/2011/07/editor600px.png" alt="" title="editor600px" width="600" height="349" class="alignnone size-full wp-image-1791" /></p>
<p>今回、時間がなかったこともあって、「リソースは自作しない」というのを絶対方針にしました。UnityにはAsset Storeという公式の素材マーケットがあるので、主にそこからフリーのものをいろいろ見つくろってきています。背景やトゲ付き鉄球など、全部既製の素材です。</p>
<p>また、プレイヤーキャラクターは<a href="http://www.mixamo.com/">Mixamo</a>を利用しました。有料ですが、3Dの人体モデルを作成したり、自作のモデルをアップロードしてモーションをつけたりできるサービスです。今回は、Mixamo本家で3Dモデルを作成して$10で購入し、Unityのプラグイン（<a href="http://www.mixamo.com/c/mixamo-unity-asset-store">Mixamo Animation Store</a>）から歩きモーションと立ちモーションをそれぞれ$10で購入しました。しめて$30です。モデリングもモーション付けも自分でやるとものすごく大変な作業ですから、とりあえずこうして解決してしまえるのはとてもありがたいです。</p>
<p><img src="http://geoquake.jp/blog/wp-content/uploads/2011/07/mixamo480px.png" alt="" title="mixamo480px" width="480" height="403" class="alignnone size-full wp-image-1869" /></p>
<p>ゲームデザインについてですが、作る直前にUnity上でラグドールの実験をしてまして、ラグドールが吹っ飛ぶのは面白いよねということで（ゲームのバグ動画などでよくありますよね）いろいろ物を投げ込んでぶつけて吹っ飛ばしてやろうと。物理エンジンも活用できるし、見栄えがするのでいいかなと思いました。</p>
<p>吹き飛ぶときの爆発は<a href="http://u3d.as/content/unity-technologies/detonator-explosion-framework/1qK">Detonator Explosion Framework</a>を使用しています。Prefabをスクリプト１行で生成するだけで派手な爆発をしてくれるアセットです。ゲームの内容的にはなぜ爆発するんだって感じですが（笑）、一度使ってみたかったので。まあ、特撮などでも意味もなく爆発しますし。このキャラがそういう体質なんでしょう、きっと。</p>
<p><iframe width="599" height="371" src="http://www.youtube.com/embed/wh-vctBPRxc" frameborder="0" allowfullscreen></iframe></p>
<p>避けゲーということで安直にAvoiderとタイトル決定。たぶん主人公の名前か何かでしょう。タイトル画面は、Adobe Fireworksで適当にプリセットのスタイルを適用して字詰めしてロゴを作成、プレイヤーキャラを配置してライトを当ててできあがり。ちょっとでも動きがないと寂しいので、トゥイーンライブラリの<a href="http://itween.pixelplacement.com/index.php">iTween</a>を使って、ライトのフェードインとロゴの明滅をさせています。ちなみにこのトゥイーンライブラリというのはFlashの世界で生まれて発展してきたもので、簡単に言うと「動き」をライブラリ化したものです。コード１行でオブジェクトをアニメーションさせたりできます。UnityにもFlashのタイムラインのようなアニメーション機能があるのですが、Flash同様、トゥイーンライブラリのほうが楽に動きをつけられる場面が往々にしてあります。iTweenのサイトの<a href="http://itween.pixelplacement.com/examples.php">Examples</a>に印象的なデモがたくさんあります。</p>
<p><img src="http://geoquake.jp/blog/wp-content/uploads/2011/07/title.png" alt="" title="title" width="600" height="338" class="alignnone size-full wp-image-1911" /></p>
<p>ただ避けて生き延びるだけではゲームとして単純すぎると思ったので、宝石を取るとスコアが加算されるようにしました。ゲームはプレイヤーに２つ以上のことを同時にさせるといいそうです（参考：<a href="http://www.nintendo.co.jp/wii/interview/smnj/vol1/">社長が訊く『New スーパーマリオブラザーズ Wii』</a>）。というか、Asset Storeに<a href="http://u3d.as/content/unity-technologies/gem-shader/1qM">Gem Shader</a>というシェーダがあって、綺麗な宝石モデルも入っていたので使ってみたというのが本当のところで、順序が逆かもしれません。ちなみにシェーダの中身をまったく見てません。ブラックボックスのまま使って（使えて）しまっています。</p>
<p>宝石を取ったときにエフェクトがないと取った感が出ないのでどうしようかと思ったんですが、標準アセットのParticlesパッケージの中にあったFireworksをもうこれでいいやとそのまま使用。あとは、せっかくなのでコンボボーナスをつけたり、宝石を２種類にしてスコアを変えたりしてよりゲームっぽくしてみました。なお、時間が経つと宝石が小さくなって消えるのもiTweenを使ってます。</p>
<p>難易度調整、実はこれが一番時間がかかったかもしれないんですが、NORMALモードとHARDモードを用意するという逃げに走りました。あとカメラアングルは最初もっと低かったんですが、フィールドの上のほうがオブジェクトに隠れて見づらくなり、下のほうばかりをうろうろするプレイになってしまって、あまりに不自然だったので、ほとんどトップビューにしてしまいました。せっかくのキャラクターがよく見えなくなってしまうので躊躇したんですが仕方なしです。タイトル画面のアップでカバーする感じですかね（笑）。それと、プレイヤーキャラの当たり判定は、胴体より下だけにしてあります。</p>
<p>BGMは、一応DTMerなので本来なら自作するべきところなんですが、CubaseのLoopMashのプリセットをちょっといじって書き出してシーンに配置して終わり。宝石を取った効果音もCubase付属音源から適当な音色を探してきて使用。オブジェクトが跳ね返る音は効果音素材CDからです。</p>
<p>と、こんな感じで作ったんですが、ゲーム内容的にも制作工程的にも相当横着してますね。とりあえず見ていただいた方々に面白いと言っていただけたので（ありがとうございます！）いいのかな？と思います。既存のアセットを使いまくってるのはバレバレでしたけど（笑）。</p>
<p style="text-align:center;">*</p>
<p>さて、こうして短期間で１本でっちあげてみて、Unityのことが以前よりもずっとよくわかったというか、正直、過小評価してたような気がしてきました。すごいゲームエンジンだとは認識していたんですが、ゲームエンジン本体よりも、周辺の文化圏こそが真価だったんじゃないかと。今回、他人のアセットの力を素直に借りようと最初に決断していたとはいえ、素材を探してぽんぽん放りこんで、ちょこちょことスクリプトを書き足すだけで、あっという間にそれっぽいものが組み上がっていくのは、いいんだろうか本当にって感じでした。ほとんどチートのような気もするんですが、実はこれが本来の使い方（のひとつ）なのかもしれません。セミナーの講演の中でもレゴブロック的という話があったように記憶しています。</p>
<p>実のところ、現状のAsset Storeはサーバがかなり重かったりして、お世辞にも使いやすいとは言えないのですが（公式フォーラムの<a href="http://forum.unity3d.com/threads/91644-Asset-store-grievances">このスレッド</a>で、Unityの中の人いわくなんとかするそうです）、そのあたりが解決されてアセットの数が増えれば、さらにとんでもないことになりそうな予感がします（なお、ゲームに使用可能な3D素材については他にも<a href="http://www.turbosquid.com/">TurboSquid</a>などがあります）。</p>
<p>あと、スクリプトについても、まだ慣れていなくてAPIがあまり身についていないのですが、何か引っかかったら<a href="http://answers.unity3d.com/index.html">Unity Answers</a>や<a href="http://forum.unity3d.com/">フォーラム</a>で検索すればすぐ答えが出てきましたし、そもそも今回自分で書いたJavaScriptコードが全部で600行ほどしかありません。流暢に書けなくてもどうにでもなる量です。</p>
<p>このスピードとこのコード量で、１人で、仮にも物理エンジンが走り、人体モデルが動くような3Dゲームをでっちあげられるというのは、今までは考えられなかったことなんじゃないでしょうか。3Dゲームを作れるのはナムコとセガくらいみたいな時代もあったと思うんですが、すごいカジュアル化です。Unityが言うには「民主化」とのことですが、ある意味、言い訳ができなくなりつつあるようで、ちょっと怖いなと……まあ、一方で、リソース作りが大変なのは基本的に変わらないとも思うんですけどね。</p>
<p>こうした至れり尽くせりのゲームエンジンに乗っかれるかというのは、特にプログラミングをする人にとって心情的に難しいところもあると思うんですが、自分の場合はどうもメリットのほうが大きそうなので、本気で乗っかってみようかなと考えはじめてます。</p>
<p>とりあえず、もう１本くらい実験作を作ってみたいですね。もうちょっとシーンやスクリプト的に凝った何か。</p>
]]></content:encoded>
			<wfw:commentRss>http://geoquake.jp/blog/2011/07/19/avoider/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Flashでジョイスティックを使う実験</title>
		<link>http://geoquake.jp/blog/2010/02/10/flashjoystick/</link>
		<comments>http://geoquake.jp/blog/2010/02/10/flashjoystick/#comments</comments>
		<pubDate>Wed, 10 Feb 2010 12:09:39 +0000</pubDate>
		<dc:creator>k0rin</dc:creator>
				<category><![CDATA[雑記]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Unity]]></category>

		<guid isPermaLink="false">http://geoquake.jp/blog/?p=1161</guid>
		<description><![CDATA[Flashはブラウザゲームのすぐれたプラットフォームですが、ジョイスティックが使えないのが欠点のひとつです。一方、新興のゲームプラットフォームにUnityがあります。こちらのプラグインはまだほとんど普及していませんが、ジ [...]]]></description>
			<content:encoded><![CDATA[<p>Flashはブラウザゲームのすぐれたプラットフォームですが、ジョイスティックが使えないのが欠点のひとつです。一方、新興のゲームプラットフォームに<a href="http://unity3d.com/">Unity</a>があります。こちらのプラグインはまだほとんど普及していませんが、ジョイスティックに対応しています。</p>
<p>FlashにもUnityにも、それぞれブラウザのJavaScriptとの連携手段が用意されています。それなら、Unityからブラウザを介してFlashにジョイスティックの状態を送れば、Flashでもジョイスティックが使えるんじゃ？　と思いついたので、実際にやってみました。</p>
<p><a href="http://geoquake.jp/experimental/UnityJoystickSensor/"><img src="http://geoquake.jp/blog/wp-content/uploads/2010/02/UnityJoystickSensorClip.png" alt="" title="UnityJoystickSensorClip" width="500" height="400" border="2" class="alignnone size-full wp-image-1163" /></a></p>
<ul>
<li><a href="http://geoquake.jp/experimental/UnityJoystickSensor/">Unity Joystick Sensor</a>（ソース一式あり）</li>
</ul>
<p>ジョイスティックの状態を送る一連のプロセスについて。まずUnity側からです。Unityでは、物理デバイスの入力を整理・抽象化して、それぞれ名前をつけて扱うようになっています。メニューの Edit > Project Settings > Input にその設定があります。今回はひとまず生データを送りたいので、レバーの軸とボタンを一通り登録します。レバーのデッドゾーン（Dead）もゼロにしておきます。</p>
<p><img src="http://geoquake.jp/blog/wp-content/uploads/2010/02/InputManagerClip.png" alt="" title="InputManagerClip" width="500" height="452" class="alignnone size-full wp-image-1190" /></p>
<p>気分の問題ですが、遅延を少なくするために、Unityの最大フレームレートを上げておきます。</p>
<pre class="brush: jscript; title: ; notranslate">
function Awake()
{
	Application.targetFrameRate = 300;
}
</pre>
<p>次に、ジョイスティックの状態の変化をブラウザに毎フレーム送信します。ブラウザとの通信については<a href="http://unity3d.com/support/documentation/Manual/Unity%20Web%20Player%20and%20browser%20communication.html">Unity Web Player and browser communication</a>に説明があります。Application.ExternalCall()でHTML内のJavaScriptを呼び出すことができます。実際のスクリプトとしては以下のようになります。</p>
<pre class="brush: jscript; title: ; notranslate">
var axes = new float[9];

function Update()
{
	for (var i = 1; i &lt;9; i++) {
		var position = Input.GetAxis(&quot;Axis&quot; + i);
		if (axes[i] != position) {
			axes[i] = position;
			turnOnLed();
			Application.ExternalCall(&quot;axisHandler&quot;, i, position);
		}
	}

	for (i = 0; i &lt; 16; i++) {
		var buttonName = &quot;Button&quot; + i;
		if (Input.GetButtonDown(buttonName)) {
			turnOnLed();
			Application.ExternalCall(&quot;buttonHandler&quot;, i, 1);
		}
		if (Input.GetButtonUp(buttonName)) {
			turnOnLed();
			Application.ExternalCall(&quot;buttonHandler&quot;, i, 0);
		}
	}
}
</pre>
<p>ちょっとしたテスト兼演出として、関数を呼び出したときにLEDが点灯するようにしました。</p>
<pre class="brush: jscript; title: ; notranslate">
function turnOnLed()
{
	GameObject.Find(&quot;Led&quot;).SendMessage(&quot;TurnOn&quot;);
}
</pre>
<p>次にHTMLです。Flashの埋め込みには<a href="http://code.google.com/p/swfobject/">SWFObject</a> 2.2を使用しています。Unityから呼び出されたJavaScriptの関数axisHandlerとbuttonHandlerが、ExternalInterfaceで登録したActionScriptの関数を呼び出します。</p>
<pre class="brush: jscript; title: ; notranslate">
var attributes = {
	id:&quot;Flash&quot;
};
swfobject.embedSWF(&quot;Game.swf&quot;, ...);
...
&lt;script type=&quot;text/javascript&quot;&gt;
	function axisHandler(no, position) {
		document.getElementById(&quot;Flash&quot;).axisHandler(no, position);
	}

	function buttonHandler(no, state) {
		document.getElementById(&quot;Flash&quot;).buttonHandler(no, state);
	}
&lt;/script&gt;
</pre>
<p>ExternalInterfaceは、ローカルファイルシステムではセキュリティのため動作しません。ローカルにApacheを立ててそこでテストするのが簡単です。また、ExternalInterfaceはいろいろ罠があって、ちょっとしたことで動かなくなることが多いようです。今回もそれでなぜかIEでだけ動かず、しばらくはまったんですが、教訓としては、SWFObjectのtest suiteから始めるのがいいと思います。</p>
<ul>
<li><a href="http://code.google.com/p/swfobject/wiki/test_suite">SWFObject 2.2 test suite</a></li>
</ul>
<p>ここの&#8221;Browser communication test page&#8221;がブラウザとの通信のサンプルです。test suiteというだけあって動くことが保証されていますので、このサンプルがサーバ上できちんと動くことを確かめてから少しずつ書き換えていくのがいいんじゃないでしょうか。</p>
<p>Flash側では、以下のようなクラスを作ってコールバック関数を登録し、メッセージを受け付けます。</p>
<pre class="brush: jscript; title: ; notranslate">
package
{
	import flash.external.ExternalInterface;

	public class Joystick
	{
		public static const AXIS_MAX:int = 9;
		public static const BUTTON_MAX:int = 16;

		private var axes:Vector.&lt;Number&gt; = new Vector.&lt;Number&gt;(AXIS_MAX);
		private var buttons:Vector.&lt;int&gt; = new Vector.&lt;int&gt;(BUTTON_MAX);

		function Joystick()
		{
			if (ExternalInterface.available) {
				ExternalInterface.addCallback(&quot;axisHandler&quot;, axisHandler);
				ExternalInterface.addCallback(&quot;buttonHandler&quot;, buttonHandler);
			}
		}

		public function axisHandler(no:int, position:Number):void
		{
			axes[no] = position;
		}

		public function buttonHandler(no:int, state:int):void
		{
			buttons[no] = state;
		}

		public function getAxis(no:int):Number
		{
			return axes[no];
		}

		public function isButtonPressed(no:int):Boolean
		{
			return (buttons[no] == 1);
		}
	}
}
</pre>
<p>これでUnityからFlashまでジョイスティックの状態が伝わるようになりました。</p>
<p>ちなみに、いったんここまで作った後で、逆の方法に思い当たりました。つまり、UnityからFlashにジョイスティックの状態を流し込むのではなく、FlashからUnityにジョイスティックの状態を問い合わせるやり方です。もしこちらができれば、通信量も間違いも少なく好ましいでしょう。が、ブラウザからUnityの関数をSendMessageで呼び出したときに、戻り値が取得できないので断念しました。</p>
<p>さて、これで、「Unityのプラグインがインストールされていればジョイスティックでも操作できるFlash」ができました。アクロバティックなやり方ですが、信じがたいことにIE8、Firefox 3.6、Google Chrome 4それぞれで<a href="http://www.amazon.co.jp/gp/product/B000CFX42E/">Xbox360コントローラ</a>などを使って普通に操作できるようです。特にアナログレバーを動かすとかなり頻繁にメッセージが送られるのでもつだろうかと心配だったんですが、レスポンスは悪くないし、CPU使用率もたいして上がりません。作る前はデータの間引きなども考えていたんですが、必要なさそうなのでやっていません。</p>
<p>で、実用性はどうかというと、微妙かなと思ってます。まず、ブラウザゲームでジョイスティックを使う文化がないですよね。それに、ジョイスティックを使いたい人はすでに<a href="http://www.vector.co.jp/soft/win95/util/se101657.html">JoyToKey</a>などを使っているはずです。アナログレバーが使えるという違いはありますが、Flashゲームはまずマウスとキーボードで遊べるように作りますから、ゲームにアナログレバーの必要な操作を持ち込むわけにはいかないでしょう。そもそも、ジョイスティックを使うゲームなら最初からFlashではなくUnityで作れよという気もします。</p>
<p>あと、１つのウェブページに２つの標準でない技術を使うことになるので、それなりにリスクがありそうです。Unityの出力するHTMLファイルも結構複雑ですし（ちなみにコメントで説明が書かれているので読んでおくのがおすすめです）、環境によっては不具合が発生するかもしれません。導入には結構ためらうものがあります。</p>
<p>もしUnityのプラグインがある程度普及すれば（20％くらい？）メリットのほうが大きくなるかもしれません。また、いずれにせよFlashでジョイスティックを使う方法ができたということで、ウェブではなく、どこかへの展示用のFlashなどでしたら役に立つかもしれません。</p>
<p>……ということで、どうもひたすら微妙な感じ。こんな<strong>変態的</strong>なことをさせる前に、そもそもAdobeがFlashでジョイスティックをサポートしてくれたらいいんですけどね……。<a href="http://jessewarden.com/2009/06/flash-player-11-gaming-platform.html">ゲーム志向にするとか考えてる</a>ならその辺検討してほしいなあ。</p>
]]></content:encoded>
			<wfw:commentRss>http://geoquake.jp/blog/2010/02/10/flashjoystick/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Unityでパーティクルの実験</title>
		<link>http://geoquake.jp/blog/2010/01/05/unityparticletest/</link>
		<comments>http://geoquake.jp/blog/2010/01/05/unityparticletest/#comments</comments>
		<pubDate>Tue, 05 Jan 2010 12:23:11 +0000</pubDate>
		<dc:creator>k0rin</dc:creator>
				<category><![CDATA[雑記]]></category>
		<category><![CDATA[Unity]]></category>
		<category><![CDATA[ゲーム制作]]></category>

		<guid isPermaLink="false">http://geoquake.jp/blog/?p=1083</guid>
		<description><![CDATA[最近Unityをいじくったりしてます。 Unityの簡単な説明をすると、米Unity Technologies社製のゲームエンジンで、PCやブラウザ、iPhone等で動く3Dアプリケーションを作ることができます。GUI環 [...]]]></description>
			<content:encoded><![CDATA[<p>最近<a href="http://unity3d.com/">Unity</a>をいじくったりしてます。</p>
<p>Unityの簡単な説明をすると、米Unity Technologies社製の<a href="http://ja.wikipedia.org/wiki/%E3%82%B2%E3%83%BC%E3%83%A0%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3">ゲームエンジン</a>で、PCやブラウザ、iPhone等で動く3Dアプリケーションを作ることができます。GUI環境に3Dモデル等の素材を放り込んで、JavaScriptやC#でスクリプトを書くだけで（割と）簡単に動かせます。Flashを触っている方は、Flash IDEの3D版だと考えればだいたい感覚的にあってるかも。ブラウザ上でGPUアクセラレーションつきの本格的な3Dが動くこと、iPhoneの3Dゲームが比較的手軽に作れること、開発環境の制限バージョンが無料になったことなどで人気が出ているようです（残念ながらまだ日本語化されていないのですが）。ブラウザのプラグインをインストールして<a href="http://unity3d.com/gallery/live-demos/index.html#tropical-paradise">公式のデモ</a>を見ると、かなりのものが動くのが分かると思います。</p>
<p>というところで、唐突ですが、<a href="http://d.hatena.ne.jp/ABA/20091220#p1">ABAさんのパーティクルテスト</a>につられて、似たような、オブジェクトをたくさん出す実験をしてみました。</p>
<p><a href="http://geoquake.jp/experimental/UnityParticleTest/"><img src="http://geoquake.jp/blog/wp-content/uploads/2010/01/UnityParticle500.png" alt="UnityParticle500" title="UnityParticle500" width="500" height="375" class="alignnone size-full wp-image-1084" /></a></p>
<ul>
<li><a href="http://geoquake.jp/experimental/UnityParticleTest/">Particle Test</a></li>
</ul>
<p>プロジェクトファイルは<a href="http://geoquake.jp/experimental/UnityParticleTest/ParticleTest.zip">こちら</a>。</p>
</p>
<p>おそらく個々のGameObjectがパーティクルを描画するのはGPU的に嫌だろうということで、GameObjectは座標を保持するだけにして、下のようなスクリプトでビルボード群のメッシュを毎フレーム作成してまとめて描画してみました。とりあえずCore 2 Duo/3.16GHz、RADEON 4550で10000個は出ているようです（上限を上げればもっと出るかもしれません）。UnityのJavaScriptは<a href="http://forum.unity3d.com/viewtopic.php?t=1140">.NET（Mono）ベースで、C++の半分の速度は出るよ</a>とのことなんですが、確かに結構な速さはあるようです。</p>
<pre class="brush: jscript; title: ; notranslate">
function LateUpdate()
{
	var particles = GameObject.FindGameObjectsWithTag(&quot;Particle&quot;);
	...

	var i = 0;
	var size = 0.5;
	for (var particle in particles) {
		var position = particle.transform.position;
		vertices[i++] = Vector3(position.x - size, position.y - size, position.z);
		vertices[i++] = Vector3(position.x - size, position.y + size, position.z);
		vertices[i++] = Vector3(position.x + size, position.y + size, position.z);
		vertices[i++] = Vector3(position.x + size, position.y - size, position.z);
	}
	...

	var mesh = GetComponent(MeshFilter).mesh;
	mesh.Clear();
	mesh.vertices = vertices;
	mesh.colors = colors;
	mesh.uv = uv;
	mesh.triangles = triangles;
}
</pre>
<p>まあ、パーティクルを多数出すだけならUnity組み込みのパーティクルシステムを使えばいいんですが、シューティングの敵弾などで自前でやる必要が出てくることもあるかなと。</p>
<p>ちなみにUnityのいいところは、開発環境がそのまま実行・デバッグ環境になることですね。下の画面のように、実行中に視点を動かして、描画が正しく行われているか確認したりというのが、何の苦労もなくできます。</p>
<p><a href="http://geoquake.jp/experimental/UnityParticleTest/UnityIDE.png"><img src="http://geoquake.jp/blog/wp-content/uploads/2010/01/UnityIDE500.png" alt="UnityIDE500" title="UnityIDE500" width="500" height="304" class="alignnone size-full wp-image-1085" /></a></p>
<p>Unityというプラットフォームがどんな感じかについてはまた後ほど（たぶん）。</p>
]]></content:encoded>
			<wfw:commentRss>http://geoquake.jp/blog/2010/01/05/unityparticletest/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Unityのマウス入力</title>
		<link>http://geoquake.jp/blog/2009/05/13/unity/</link>
		<comments>http://geoquake.jp/blog/2009/05/13/unity/#comments</comments>
		<pubDate>Tue, 12 May 2009 21:03:53 +0000</pubDate>
		<dc:creator>k0rin</dc:creator>
				<category><![CDATA[雑記]]></category>
		<category><![CDATA[Unity]]></category>

		<guid isPermaLink="false">http://geoquake.jp/blog/?p=397</guid>
		<description><![CDATA[先のブラウザゲームのマウスの話ですが、最近話題のゲームエンジンUnity。これで作った3Dゲームは、ブラウザのプラグインで動いたり、ネイティブで動いたり、追加ライセンスでiPhoneでも動いたりする超強力なエンジンらしい [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://geoquake.jp/blog/2009/05/11/warpsmash/">先のブラウザゲームのマウスの話</a>ですが、最近話題のゲームエンジン<a href="http://unity3d.com/">Unity</a>。これで作った3Dゲームは、ブラウザのプラグインで動いたり、ネイティブで動いたり、追加ライセンスでiPhoneでも動いたりする超強力なエンジンらしいですが、こっちはマウスカーソルがブラウザのプレーヤーの領域からはずれても応答しますね。</p>
<p>この辺のデモで分かります。</p>
<ul>
<li><a href="http://unity3d.com/gallery/live-demos/tropical-paradise">UNITY: Tropical Paradise Demo</a></li>
</ul>
<p>さすがにポインタを消すわけにはいかないようだけど（それとも消せるのかな）、ブラウザどころかディスプレイからはみ出すように動かしても問題ないので、FPS的な視点操作でもポインタの位置を気にせずに済んでます。やはりゲーム向けに作られたものだけあって行き届いてるなと。あ、でも今度はクリックが使えなくなるのかな。</p>
<p>Unityについては一度体験版をインストールしてじっくり調べておいたほうがいい気がするけど、正直、見るのが怖い。</p>
<p><a href="http://unity3d.com/company/">Unityの理念</a>：</p>
<blockquote><p>&#8220;Taking the pain out of game development.&#8221;<br/>（ゲーム開発から苦痛を取りのぞく）</p></blockquote>
<p>を見て、ほえーと思ったんですが、たぶん苦痛以外もいろいろごっそり持ってかれてるんじゃないかと……。</p>
]]></content:encoded>
			<wfw:commentRss>http://geoquake.jp/blog/2009/05/13/unity/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

