<?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</title>
	<atom:link href="http://geoquake.jp/blog/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>CSS3でゲームっぽいメニューを作ってみる</title>
		<link>http://geoquake.jp/blog/2012/04/17/css3gamemenu/</link>
		<comments>http://geoquake.jp/blog/2012/04/17/css3gamemenu/#comments</comments>
		<pubDate>Tue, 17 Apr 2012 10:22:03 +0000</pubDate>
		<dc:creator>k0rin</dc:creator>
				<category><![CDATA[雑記]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[ゲーム制作]]></category>

		<guid isPermaLink="false">http://geoquake.jp/blog/?p=2465</guid>
		<description><![CDATA[UnityのNGUIというGUIツールキットのアセットがおすすめだそうなので試していたのですが、その中のかっこいいサンプルのひとつを見て、CSS 3D TransformsとCSS Transitionsで同じようなこと [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://geoquake.jp/experimental/HTML5/CSS3GameMenu/"><img src="http://geoquake.jp/blog/wp-content/uploads/2012/04/gamemenu1.png" alt="" title="gamemenu" width="500" height="281" class="alignnone size-full wp-image-2467" /></a></p>
<p>Unityの<a href="http://www.tasharen.com/?page_id=140">NGUI</a>というGUIツールキットのアセットがおすすめだそうなので試していたのですが、その中の<a href="http://www.tasharen.com/ngui/example8.html">かっこいいサンプルのひとつ</a>を見て、CSS 3D TransformsとCSS Transitionsで同じようなことがやれるのではと思ったので真似してみました（思いっきり脱線……）。iPadでも動きます。IEとOperaでは動作しません。</p>
<ul>
<li><a href="http://geoquake.jp/experimental/HTML5/CSS3GameMenu/">CSS3 Game Menu</a></li>
</ul>
<p>HTMLでゲームのUIを作るのは流行りっぽいんでしょうか。<a href="http://engineering.imvu.com/2011/03/20/html5-new-ui-library-for-games-annotated-slides/">ブラウザをゲームのUI用に組み込んでいる話</a>など聞きますし、Unityでも<a href="http://www.slideshare.net/ppcchan/unityhtmliphone">HTMLでUIを作った</a>とか、<a href="http://labs.gree.jp/blog/2012/04/4737/">WebViewのプラグインが公開される</a>とか。十分にパフォーマンスが出るようなら便利そうです。</p>
<p>HTML5のブラウザゲームでも、例えばメッセージウィンドウなどは頑張ってCanvasで描画するよりもDOMエレメントをオーバーレイするほうが適材適所かもしれません。jQueryのプラグインなども利用できると思いますし。要は通常のウェブページを作るノリでUIが作れるわけですからね。</p>
<p>ブラウザだと互換性の問題が大変ですけど。こんなシンプルなものでも片っ端からPCや端末を立ち上げて確認してまわらないといけなくて（Flashならまず大丈夫なのに、なんてつい思ってしまいます）。特にAndroidは個人で検証するのは不可能に近いような……。</p>
<p>とりあえずベンダープリフィックスだけでもなんとかして欲しいです（笑）。</p>
]]></content:encoded>
			<wfw:commentRss>http://geoquake.jp/blog/2012/04/17/css3gamemenu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dartの演算子オーバーロードを使ってみる</title>
		<link>http://geoquake.jp/blog/2012/04/02/dartoperatoroverloading/</link>
		<comments>http://geoquake.jp/blog/2012/04/02/dartoperatoroverloading/#comments</comments>
		<pubDate>Mon, 02 Apr 2012 11:42:51 +0000</pubDate>
		<dc:creator>k0rin</dc:creator>
				<category><![CDATA[雑記]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[ゲームプログラミング]]></category>

		<guid isPermaLink="false">http://geoquake.jp/blog/?p=2418</guid>
		<description><![CDATA[たまにはブログも更新しないと、ということで。以前Flashで作ったものをDart＋HTML5 Canvasに移植したものです。ドラッグでポイントを動かせます（Operaで動かないのは……なんででしょう？）。リンク先にソー [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://geoquake.jp/experimental/DartCanvasTest/"><img src="http://geoquake.jp/blog/wp-content/uploads/2012/04/DartCanvasTest.png" alt="" title="DartCanvasTest" width="500" height="400" class="alignnone size-full wp-image-2419" /></a></p>
<p>たまにはブログも更新しないと、ということで。<a href="http://wonderfl.net/c/mEpx">以前Flashで作ったもの</a>をDart＋HTML5 Canvasに移植したものです。ドラッグでポイントを動かせます（Operaで動かないのは……なんででしょう？）。リンク先にソースコードも置いてあります。</p>
<ul>
<li><a href="http://geoquake.jp/experimental/DartCanvasTest/">Dart Canvas Test</a></li>
</ul>
<p>これはもともと、ActionScriptに演算子オーバーロードがなく、ベクトルの計算などが書きづらいのをどうしようかと試行錯誤したものだったんですが、例えばpositionとvelocityがVector2クラスのインスタンスだとして、</p>
<pre>position = add(position, mul(velocity, deltaTime));</pre>
<p>とでもするしかないかなという感じでした（詳しくは省きますが、実際にはこれじゃダメでしょう）。DartならVector2クラスにoperatorを定義すれば、</p>
<pre>position += velocity * deltaTime;</pre>
<p>のように直感的に書けます。</p>
<p>演算子オーバーロードというと、そんなもの要らないよと言う人も多いのですが、ベクトルや行列の計算にはあるととても便利なのです。ゲームプログラム（とりわけ3Dの）でC++が使われる理由のひとつとして、演算子オーバーロードで幾何学計算が素直に書けて、しかもコンパイラの最適化で十分に速いアセンブリコードが出力されるというのが大きいと思います。UnityのJavaScriptも、ベクトル等の計算が普通に書けるよう独自に拡張されています。</p>
<p>そんなわけで、Dartに演算子オーバーロードが入ってきたのは嬉しいです。……が、上の例がfrogcでJavaScriptにどう変換されるか見てみると……いちいち型チェックしてるんですか、これ。オーバーヘッドがかなり大きそうで不安ｗ　DartネイティブのVMに期待って感じでしょうか。</p>
<pre class="brush: jscript; title: ; notranslate">
position = $add$(position, ($mul$(velocity, deltaTime)));

...

function $add$complex$(x, y) {
  if (typeof(x) == 'number') {
    $throw(new IllegalArgumentException(y));
  } else if (typeof(x) == 'string') {
    var str = (y == null) ? 'null' : y.toString();
    if (typeof(str) != 'string') {
      throw new Error(&quot;calling toString() on right hand operand of operator &quot; +
      &quot;+ did not return a String&quot;);
    }
    return x + str;
  } else if (typeof(x) == 'object') {
    return x.$add(y);
  } else {
    $throw(new NoSuchMethodException(x, &quot;operator +&quot;, [y]));
  }
}

function $add$(x, y) {
  if (typeof(x) == 'number' &amp;&amp; typeof(y) == 'number') return x + y;
  return $add$complex$(x, y);
}

...
</pre>
<p>ついでに、演算子オーバーロードは必要なんだ、という他の方の証言を。</p>
<ul>
<li><a href="http://blog.thejit.org/2009/01/27/why-not-operator-overloading-in-javascript/">Why not Operator Overloading in JavaScript?</a></li>
<li><a href="http://www.irrlicht3d.org/pivot/entry.php?id=887">Irrlicht3d.org &#8211; Operator Overloading, please</a></li>
</ul>
<p>JavaScriptになかなかつかない理由。いずれはなんとかなりそう？</p>
<ul>
<li><a href="http://www.quora.com/Why-hasnt-operator-overloading-been-added-to-ECMAScript">Why hasn&#8217;t operator overloading been added to ECMAScript? &#8211; Quora</a></li>
</ul>
<p>余談ですが、Dartといえば<a href="https://gist.github.com/1277224">Hello, WorldをJavaScriptに変換したら17000行になった</a>というのが話題になりましたけど、今はだいぶ小さくなってます。このサンプルの出力（<a href="http://geoquake.jp/experimental/DartCanvasTest/CanvasTest.dart.js">CanvasTest.dart.js</a>）が150KBくらいです。Closure Compilerを通すと55KBくらいになるんですが、動かなくなるので、ちょっと調べないといけなさそうです。</p>
<p>（追記）ちなみにCoffeeScriptでも<a href="https://github.com/jashkenas/coffee-script/issues/727">演算子オーバーロードの要望が何度も挙がって都度却下されている</a>ようなのですが、どうも、動的型言語からJavaScriptへのトランスレートでは非効率な変換結果にならざるを得ないようです。a + bという式があったときに、aとbの型が実行時まで決まらないので、関数の呼び出しに変換するべきかどうか分からないと……。</p>
<p>C#からJavaScriptに変換する<a href="http://jsil.org/">JSIL</a>の<a href="http://hildr.luminance.org/Raytracer/Raytracer.html">Raytracer Demo</a>を見ると、演算子オーバーロードが素直に変換できているので気になります。ただ、こちらは出力が結構大きくなってしまうようですが。</p>
]]></content:encoded>
			<wfw:commentRss>http://geoquake.jp/blog/2012/04/02/dartoperatoroverloading/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>AIR＋FlashDevelopでブラウザ・PC・Android・iPhone一挙開発</title>
		<link>http://geoquake.jp/blog/2011/06/27/airtemplate/</link>
		<comments>http://geoquake.jp/blog/2011/06/27/airtemplate/#comments</comments>
		<pubDate>Mon, 27 Jun 2011 12:39:23 +0000</pubDate>
		<dc:creator>k0rin</dc:creator>
				<category><![CDATA[雑記]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://geoquake.jp/blog/?p=1297</guid>
		<description><![CDATA[そもそもAIRって何なんでしょうか？（芸術以外で） Adobeのページを読むと、Adobe Integrated Runtimeの略称で、&#8221;a cross-operating system runtime&# [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://geoquake.jp/blog/wp-content/uploads/2011/06/multiplatform.png" alt="" title="multiplatform" width="600" height="338" class="alignnone size-full wp-image-1595" /></p>
<p>そもそもAIRって何なんでしょうか？（芸術以外で）</p>
<p>Adobeのページを読むと、Adobe Integrated Runtimeの略称で、&#8221;a cross-operating system runtime&#8221;などと書いてあるんですが、どうやら最近のAdobeの方針として、Flash等で作ったものがアプリケーションとしてどこでも動く、いわゆるWrite Once, Run Anywhereな実行環境を整備しようとしているようです。そのためのランタイムがAIRという理解でいいのかなと。自分の印象だと、どうもFlash自体がJavaに近い方向に向かってるみたいですね。</p>
<p>ちなみにAdobeはゲーム方面にも力を入れはじめているようで、Flash 11以降で、GPUを用いた3D描画や、ゲームコントローラのサポートが予定されているようです。</p>
<p>さて、AIRでは、以下のようなアプリケーションを開発できます。</p>
<ul>
<li>iOS（iPhone, iPod touch, iPad）アプリ</li>
<li>Androidアプリ</li>
<li>WindowsやMacにインストールするアプリケーション</li>
</ul>
<p>ActionScriptで書いたプログラムが、ブラウザで表示するFlashとしてだけでなく、各プラットフォームのアプリケーションとして配布できるのはすごくお得そうに見えます。あちらではAndroid SDKでJava、こちらではiOS SDKでObjective-Cというのは大変ですから。JavaScriptは？　というのはちょっと今回は置いといて（笑）。</p>
<p>要は、<span style="color:#f00;font-weight:bold;">FlashでiPhoneアプリだろうがPCゲームだろうが作れるよ！</span>ってことです。</p>
<p>AIRアプリケーションは、Adobeが無料で配布しているFlex SDKとAIR SDKを使って作成できます。今回の趣旨ですが、フリーのActionScript用統合開発環境である<a href="http://flashdevelop.jp/">FlashDevelop</a>と、ちょっとしたバッチファイル群を使って、ひとつのソースコード群から各プラットフォームのアプリケーションを手軽にビルドできないものかと試行錯誤してみました。</p>
<p>前置きが長くなりました。動くものをということで、こちらが今回のサンプルです。まだ癖が強い環境ですので、いろんなAPIを軽くテストするような感じになっています。</p>
<p><a href="http://geoquake.jp/experimental/AIRTemplate/"><img src="http://geoquake.jp/blog/wp-content/uploads/2011/06/screenshot.png" alt="" title="screenshot" width="600" height="449" class="alignnone size-full wp-image-1712" /></a></p>
<ul>
<li><a href="http://geoquake.jp/experimental/AIRTemplate/">Flash版</a></li>
<li><a href="http://geoquake.jp/experimental/AIRTemplate/AIRTemplate.apk">Android野良アプリ（AIRTemplate.apk）</a></li>
<li><a href="http://geoquake.jp/experimental/AIRTemplate/AIRTemplate.exe">Windows用インストーラ（AIRTemplate.exe）</a></li>
</ul>
<p>さしあたって、Flash版をクリックして見ていただくのがいいかと思います。この気楽さがウェブアプリのいいところですね。</p>
<p>iOS版については、配布するにはApp Storeに登録するしかなく、こんなテスト用プログラムでは審査を通りませんので公開できません。代わりにiPhone 4で動かしている様子を撮影しましたのでご覧ください。</p>
<p><iframe width="599" height="341" src="http://www.youtube.com/embed/UuwSOSqeiRA?hd=1" frameborder="0" allowfullscreen></iframe></p>
<p>FlashDevelopプロジェクトはこちらです。</p>
<ul>
<li><a href="http://geoquake.jp/experimental/AIRTemplate/AIRTemplate.zip">AIRTemplate.zip</a></li>
</ul>
<p>FlashDevelopは4.0.0以降を使用します。2011-06現在、4.0.0はまだベータ版なのですが、3.3.4では駄目なので……不具合など不安な場合は正式版になるまで待ってください。ベータ版は<a href="http://www.flashdevelop.org/community/viewtopic.php?f=9&#038;t=3529">こちら</a>で配布されています。また、iOS版のパッケージングには<a href="http://developer.apple.com/jp/programs/ios/">iOS Developer Program</a>への加入が必要です（<a href="http://help.adobe.com/ja_JP/air/build/WS5b3ccc516d4fbf351e63e3d118666ade46-7ff0.html#WSfffb011ac560372f284e44b012cd1e700c0-8000">ここ</a>を読むと、もしかしてMacがなくてもなんとかなるんでしょうか？）。</p>
<p>プロジェクトの簡単な説明と、そのあとAIRの所感にも触れたいと思いますが、その前に回り道になる人が出ないよう２点ほど。</p>
<p>ここではフリーソフトのFlashDevelopを使っていますが、Adobeの<a href="http://www.adobe.com/jp/products/flash.html">Flash Professional CS 5.5</a>や<a href="http://www.adobe.com/jp/products/flash-builder.html">Flash Builder 4.5</a>では正式にマルチプラットフォーム書き出しができます。高価ですが、なにしろ公式サポートなのでずっと楽です。Flash Builderの体験版を試してみたところ、インストールして数分でiPhoneとAndroid実機での実行までできました。</p>
<p><a href="http://clockmaker.jp/blog/2011/06/adcmeetup-01/">ADC MEETUP ROUND 01 発表資料「Flashによるマルチデバイスアプリ開発ワークフロー」 | ClockMaker Blog</a></p>
<p>また、iOSやAndroidのパッケージングについて、すでにエントリを書いている方々がいらっしゃいます。Adobe公式のドキュメントなども非常に詳しいです。まずこちらで基本的な手順を確認したほうがいいかもしれません。</p>
<p><a href="http://ton-up.net/blog/archives/668">AIR2.7でAIR for iOSを試してみた | ton-up blog &#8211; とんぶろ</a><br />
<a href="http://blog.alt-scape.com/archives/409">FlashDevelop4ビルド版でAIR for Android(ver 2.7)のセットアップメモ | alt</a></p>
<p><a href="http://help.adobe.com/ja_JP/air/build/index.html">Adobe AIR * Adobe AIR® アプリケーションの構築</a><br />
<a href="http://help.adobe.com/ja_JP/air/build/WSfffb011ac560372f-5d0f4f25128cc9cd0cb-8000.html">Adobe AIR * モバイルデバイス向けの AIR アプリケーションの開発</a></p>
<p><a href="http://www.atmarkit.co.jp/fsmart/articles/airaios01/01.html">iPhone/iPadアプリ開発の扉を開くAdobe AIR 2.6とは（1/3） &#8211; ＠IT</a></p>
<p style="text-align:center;">*</p>
<p>というところで、ようやくプロジェクトファイルについてです。通常のFlashDevelopプロジェクトにいくらか手を加えてあります。使いかたとしては、</p>
<ol>
<li>FlashDevelop上でSWFファイルをビルドする</li>
<li>証明書などを用意</li>
<li>build.batまたはbuild.bat debugを実行してAIRアプリケーションとしてパッケージング（ipa、apk、air、exeファイルの作成）</li>
</ol>
<p>となります。なお、Androidプロジェクトでは、FlashDevelopのビルドで実機での実行・デバッグまでできるようにしてあります。それぞれ詳しい手順については、README.txtをご覧ください。</p>
<p><strong>ソースコードの共有</strong></p>
<p>FlashDevelopでは通常ひとつしかないプロジェクトファイル（*.as3proj）ですが、複数用意することで、ひとつのソースコードからそれぞれのプラットフォーム向けのビルドを行っています。プロジェクトは、Projectパネルでas3projファイルをダブルクリックして簡単に切り替えられます。当然ですが、プロジェクトのプロパティやライブラリの登録などはそれぞれ独立していますので、変更した場合に忘れないよう注意が必要です。as3projファイルはXMLファイルですので、どんな情報を保持するファイルなのか、テキストエディタなどで見ておいたほうがいいでしょう。</p>
<p><strong>条件付きコンパイル</strong></p>
<p>プラットフォームによってコンパイルされるソースコード内容を変更するために、ActionScriptの条件付きコンパイルを用いています。</p>
<p><a href="http://cuaoar.jp/2010/10/actionscript-30.html">ActionScript 3.0 の条件付きコンパイル &#8211; akihiro kamijo</a></p>
<p>FlashDevelopでコンパイル定数を設定するには、プロジェクトのプロパティ、Compiler OptionsタブのCompiler Constantsを開きます。MY_CONFIG::PLATFORMとMY_CONFIG::AIRを設定し、以下のようにビルド・実行するコードを変更しています。</p>
<pre class="brush: jscript; title: ; notranslate">
config namespace MY_CONFIG;

MY_CONFIG::AIR {
	...
}

if (MY_CONFIG::PLATFORM == &quot;iOS&quot;) {
	...
}
</pre>
<p>条件付きコンパイルではなく、Capabilitiesなどの参照でなんとかなることも多いかもしれません。</p>
<p><strong>アプリケーション記述ファイル</strong></p>
<p><a href="http://help.adobe.com/ja_JP/AIR/1.1/devappshtml/WS5b3ccc516d4fbf351e63e3d118666ade46-7ff1.html">Adobe AIR * AIR アプリケーションプロパティの設定</a><br />
<a href="http://help.adobe.com/ja_JP/air/build/WSfffb011ac560372f-5d0f4f25128cc9cd0cb-7ffe.html">Adobe AIR * モバイルアプリケーションプロパティの設定</a></p>
<p>AIRアプリケーションをパッケージングするときに必要な設定ファイルです。プロジェクトのルートにapplication.xmlを配置するとFlashDevelopのProjectパネルのボタンから設定ウィンドウを開けるので、ここに配置して全部のプラットフォームで共有しています。</p>
<p>アプリケーションアイコンについては、全部のプラットフォームで使用するサイズのアイコンをまとめて設定してしまっています。</p>
<pre class="brush: xml; title: ; notranslate">
	&lt;icon&gt;
		&lt;image16x16&gt;icon16.png&lt;/image16x16&gt;
		&lt;image32x32&gt;icon32.png&lt;/image32x32&gt;
		&lt;image36x36&gt;icon36.png&lt;/image36x36&gt;
		&lt;image48x48&gt;icon48.png&lt;/image48x48&gt;
		&lt;image72x72&gt;icon72.png&lt;/image72x72&gt;
		&lt;image57x57&gt;icon57.png&lt;/image57x57&gt;
		&lt;image114x114&gt;icon114.png&lt;/image114x114&gt;
		&lt;image128x128&gt;icon128.png&lt;/image128x128&gt;
	&lt;/icon&gt;
</pre>
<p>こうすると、使用されないアイコンまでパッケージに含まれ、パッケージの容量がやや増えてしまいますが、まあ気にしないでいいのではないかと（富豪的パッケージング）。各サイズのアイコンは、バッチファイルで<a href="http://www.imagemagick.org/script/index.php">ImageMagick</a>を使用してひとつのicon.pngからまとめて作成しています。</p>
<p>*</p>
<p>モバイル版AIRを試してみて気づいたことです。</p>
<p><strong>解像度</strong></p>
<p>スマートフォンのディスプレイ解像度は多種多様です。が、デフォルトでは、Flashがアスペクト比を保ったまま画面の内側からフィットするようにステージをスケーリングしてくれますので、ゲームなどではこれに任せて、物理的な解像度についてはあまり気にしなくてもいいのかなと思います。Flashが元来ベクターグラフィックスに強いのも幸いしています。ただし、ディスプレイのアスペクト比の違いが問題になります。たとえば、iPhone向けにステージサイズを640&#215;960に設定したSWFを、Galaxy Sの480&#215;800の画面で表示すると、ステージの上下が余分に表示されてしまいます。</p>
<p>この対策は３つ考えられると思います。</p>
<ul>
<li>DisplayObject.maskでステージ内のみ描画するようマスクを設定する</li>
<li>ステージの外部をオブジェクトで覆い隠す</li>
<li>アスペクト比にあわせて表示要素を外にずらす</li>
</ul>
<p>マスクを使うのが楽なのですが、やはり描画にマスク判定が入ると重いのか、端末や描画モードによってはパフォーマンスがかなり落ちてしまいます。iOSのCPUモードではフレームレートが半減することもありました。２番目、３番目の組みあわせになるでしょうか。</p>
<p>なお、StageScaleMode.NO_SCALEを設定すると、物理解像度の座標系で描画できるようになります。詳しくはこちらのページに解説があります。</p>
<p><a href="http://www.adobe.com/jp/devnet/flash/articles/authoring_for_multiple_screen_sizes.html">複数の画面サイズ向けのモバイルFlashコンテンツのオーサリング | デベロッパーセンター</a></p>
<p>StageScaleMode.NO_BORDERというものもあります。こちらは外側から画面にフィットしてくれます。</p>
<p><strong>CPUモードとGPUモード</strong></p>
<p>モバイル版AIRには、CPUモードとGPUモードの２つの描画モードがあり、アプリケーション記述ファイルのrenderModeでどちらを使用するか指定します。GPUモードのほうが速そうに思えますが、端末や描画内容によってまちまちで、正直よくわかりません。AIR 2.6と2.7で特性が大きく変わったりもしているようですし、各種ベンチマークをまとめて取るプログラムを作る必要があるかもしれません。サンプルではAndroid版はGPUモード、iOS版はCPUモードでパッケージしています。</p>
<p>GPUモードではDisplayObjectのフィルタが使えない等いろいろな制限があります。制限事項がこちらのページにあります。</p>
<p><a href="http://help.adobe.com/ja_JP/air/build/WSfffb011ac560372f-5d0f4f25128cc9cd0cb-7ffd.html">Adobe AIR * 一般設定</a></p>
<p>ちなみに今後、モバイル版AIRでもMolehillのハードウェア3D APIが使えるようになるそうですので、そうなるとGPUモードを重用するようになってくるのかなと思います。</p>
<p>あと、このエントリを書いている最中に、AndroidのGPUモードに不具合らしいものを見つけました。cacheAsBitmapをtrueにすると、アプリを中断して復帰するときに表示が化けるようです。フィルタを設定しただけでもtrueになるので要注意です。</p>
<p><strong>互換性と実行速度</strong></p>
<p>実際、ActionScriptコードがどれくらい動いてくれるのかですが、こいつ、動くぞ！って感じです（笑）。<a href="http://www.libspark.org/wiki/keim/SiON">SiON</a>でMMLが演奏できたり、<a href="http://away3d.com/comments/away3d-lite-v1-0-fastest-and-smallest-3d-engine-in-flash">Away3D Lite</a>で3Dモデルが表示されたりするほどですから、大抵の処理は問題ないんじゃないでしょうか。つまり、ActionScriptの豊富なコード資産がそのまま使えるということです。</p>
<p>ただ、パフォーマンスについてはスマートフォンのCPUパワーなりです。<a href="http://geoquake.jp/experimental/AIRTemplate/">サンプル</a>の「Sound (SiON)」でLoad Complex MMLで呼び出せる曲（超手前味噌ですみません……）がGalaxy Sではほぼ正常に鳴ってますが、iPhone 4では処理が追いつきませんでした。上の動画で音が途切れている様子がわかりますのでご覧ください。</p>
<p>また、描画についてはかなり軽い描画内容でしか高フレームレートが維持されず、すぐ30fps以下になってしまいます。個人的には60fps大好き人間なのでつらいところですが、このあたりについてはランタイムの最適化が進むか、あるいは時間が解決するというやつで、今後数年でスマートフォンの性能が上がれば大丈夫なんじゃないでしょうか。</p>
<p><a href="http://geoquake.jp/blog/wp-content/uploads/2011/06/Uncompiled-AcionScript.png"><img src="http://geoquake.jp/blog/wp-content/uploads/2011/06/Uncompiled-AcionScript-200x300.png" alt="" title="Uncompiled AcionScript" width="200" height="300" class="alignleft size-medium wp-image-1341" /></a></p>
<p>あと、細かな制限があるようで、例えばiOSではActionScriptを含んだSWFをLoaderやEmbedで読み込めないようです。ipa-debugターゲットで読み込もうとすると、&#8221;Uncompiled ActionScript&#8221;というエラーメッセージが出ます。</p>
<p>また、ipa-app-storeターゲットでは何も表示されず、以後の読み込みがすべて失敗します。うっかりActionScript入りSWFを読み込んでしまうことは多そうですから、割と地雷の予感……。</p>
<p style="clear:both;">
<p>それからGalaxy SでMP3の再生開始に間があります。「Sound (MP3)」でSEボタンを押して確認できますが、ゲームの効果音の再生に支障がありそうです。iOSでは瞬時に鳴ります。</p>
<p><strong>タッチパネルの判定</strong></p>
<p>スマートフォンの小さい画面にウェブページと同じサイズでボタンを表示すると、なかなかタップできないことがあります。ボタンを大きくしてもいいですが、当たり判定だけを大きくする方法もあります。実際、サンプルではBackボタンの反応が悪かったので、タッチパネルの場合だけひとまわり大きい透明な矩形をaddChildして判定を広げてみました。このテクニックは使いでがあるんじゃないかと思いました。</p>
<pre class="brush: jscript; title: ; notranslate">
// タッチパネルなら当たり判定を広げる
if (Capabilities.touchscreenType == TouchscreenType.FINGER) {
	var rect:Rectangle = backButton.getBounds(backButton);
	rect.inflate(10, 10);

	var touchArea:Shape = new Shape();
	var g:Graphics = touchArea.graphics;
	g.beginFill(0xFF0000, 0);
	g.drawRect(rect.x, rect.y, rect.width, rect.height);
	g.endFill();

	backButton.addChild(touchArea);
}
</pre>
<p><strong>リモートデバッグ</strong></p>
<p>最初、実機でのデバッグのやり方がわからなかったのですが、</p>
<ul>
<li>SWFをDebugビルド</li>
<li>Androidではapplication.xmlでandroid.permission.INTERNET権限を許可しておく</li>
<li>adtでパッケージングするときに -connect [FlashDevelopが動いているPCのIPアドレス] オプションをつける</li>
<li>FlashDevelopのデバッガを Debug > Start Remote Session で待機させてから</li>
<li>実機でアプリを起動</li>
</ul>
<p>というようにすればいいようです。iPhone、AndroidともにFlashDevelopのデバッガでステップ実行が可能です。</p>
<p><strong>iOSでのテストが手間</strong></p>
<p>iOSのパッケージングがとにかく遅いです。SandyBridgeのCore-i5 2500K機で、今回のサンプルのパッケージングに1分30秒かかっています。また、パッケージしたアプリを実機に転送するのにiTunesを使うのですが、「同期」ボタンを押して、転送が完了するまでさらに1分30秒近くかかります。ビルドの間にラーメンができます。パッケージングのほうは、最適化をしないipa-debug-interpreterターゲットを使えば数秒で終わるんですが（実行速度がだいぶ遅くなります）、実機への転送はiOSがクローズドなため改善されるとも思えず、困ったものです。Flash Builderでもipaファイルを自分で転送するように指示する表示が出ます。</p>
<p>Androidならパッケージング、転送、起動全部込みで10秒かかりませんので、Androidでのテストが基本になりそうです。</p>
<p>それと、アプリケーション記述ファイルのversionNumberを変更しなければiTunesでアプリを更新できません。どうしても変更を忘れてしまうので、versionNumberを0.0.1増やすPerlスクリプトを作ってパッケージングの際に自動的に呼び出すようにしています。</p>
<p><strong>Flexフレームワーク</strong></p>
<p>まだFlashDevelopでは試していないのですが、モバイル版のFlexフレームワークを使えば、一般的なスマートフォンのアプリケーションのようなユーザーインターフェースを作成できるようです。<a href="http://www.appcelerator.com/">Titanium</a>や<a href="http://jquerymobile.com/">jQuery Mobile</a>みたいな感じですかね。</p>
<p><a href="http://www.atmarkit.co.jp/fsmart/articles/fb4_5_android/01.html">Flash Builder 4.5でAndroidアプリを作ってみた &#8211; ＠IT</a><br />
<a href="http://codezine.jp/article/detail/5895">Android女子部が初体験 Flash Builder 4.5で作るAIR for Androidアプリ（1/4）：CodeZine</a></p>
<p><a href="http://opensource.adobe.com/wiki/display/flexsdk/View+and+ViewNavigator">View and ViewNavigator &#8211; Flex SDK &#8211; Adobe Open Source</a><br />
<a href="http://corlan.org/2011/01/12/understanding-flex-mobile-views-and-viewnavigator/">Understanding Flex Mobile View and ViewNavigator : Mihai Corlan</a></p>
<p><strong>制限事項</strong></p>
<p>AIRの制限ですが、現状ではスマートフォン固有のAPIにアクセスできないため、アプリ内課金や、iOSのGameCenterなどが使えません。といっても、この辺は公式フォーラムでどうにかしてと言ってる人が大勢いるので、すぐになんとかなるんじゃないかと思います（笑）。現時点でも、かなりトリッキーな方法で実現している方もいるようですが。</p>
<p>こちらのエントリで、AIR for Android/iOSでできないことが簡単にまとめられています。</p>
<p><a href="http://hi-posi.jp/?p=1050">hi-posi  Blog Archive  AIR for Androidでできない事。</a></p>
<p><strong>Androidへのインストール</strong></p>
<p><img src="http://geoquake.jp/blog/wp-content/uploads/2011/06/device-180x300.png" alt="" title="device" width="180" height="300" /><img src="http://geoquake.jp/blog/wp-content/uploads/2011/06/air-180x300.png" alt="" title="air" width="180" height="300" style="margin-left:10px;"/></p>
<p>AndroidでのAIRアプリケーションの実行にはランタイムが必要です。</p>
<p>AIRアプリケーションを初めてダウンロードして起動するとき、ランタイムがないということで上のようなダイアログが出て、「インストール」をタップするとマーケットのAIRダウンロードページにジャンプします。このとき最初のAIRアプリケーションは終了してしまいますので、AIRをインストールしてから再度起動する必要があります。一度入れれば問題ないのですが、ちょっとしょっぱいなーと思います。</p>
<p>そして、「250,000超件のダウンロード」ということで、これがAIR for Androidの現在の利用状況ということですかね？</p>
<p><strong>パッケージの正体</strong></p>
<p>パッケージングして完成したairファイル、ipaファイル、apkファイルは、実はどれもZIPアーカイブです。拡張子をzipに変更すれば展開できますので、最終的にいったいどういうファイルが作られたのか、のぞいてみるといいかもしれません。</p>
<p><img src="http://geoquake.jp/blog/wp-content/uploads/2011/06/zip.png" alt="" title="zip" width="518" height="284" class="alignnone size-full wp-image-1627" /></p>
<p>いまさら情報かもしれませんが、バイナリの先頭に「PK」が見えたらたぶんZIPです。</p>
<p><strong>コード署名証明書</strong></p>
<p>WindowsにAIRアプリケーションをインストールしようとすると出てくるおなじみの警告ダイアログ。最近はネイティブアプリケーションへの風当たりが厳しいですね。</p>
<p><img src="http://geoquake.jp/blog/wp-content/uploads/2011/06/install.png" alt="" title="install" width="512" height="327" class="alignnone size-full wp-image-1747" /></p>
<p>発行元不明をなんとかしたければ、自己署名ではなく、ちゃんとしたコード署名証明書が必要です。国内で個人を対象に発行してもらえるのは<a href="http://jp.globalsign.com/service/codesign/">グローバルサイン</a>だけのようですが、高すぎるんですがどうにかなりませんか……。ちなみにインストールするときだけでなく、「プログラムのアンインストールまたは変更」でも発行元がUNKNOWNになってしまって結構目立ちます。</p>
<p><strong>困ったら</strong></p>
<p>やはりまだまだ発展途上の環境なので、謎の現象がいろいろ起きます。特にスマートフォンで疑わしい挙動に出くわしたら、Adobeのフォーラムやバグデータベースに当たるといいのではと思います。</p>
<ul>
<li><a href="http://forums.adobe.com/community/air/development/mobile?view=overview">Adobe Forums: Forum: Mobile Development</a></li>
<li><a href="http://bugs.adobe.com/">Adobe Bug Reporting System</a></li>
</ul>
<p><strong>まとめ</strong></p>
<p>さて、下準備にだいぶ手間がかかりましたし、今のところ人柱度も相当高めですが、これで一応、ブラウザだろうがデスクトップだろうがiPhoneだろうがAndroidだろうが、APIを調べまわったりせず、同じ手順で何かを動かせるわけです。自分としてはかなり気が楽になったなと思います。必要が生じればネイティブなSDKに切り替えればいいわけですしね。タッチパネルで何か実験しようと思ったらすぐActionScriptで書けますし、比較的パフォーマンス要求のないアプリなら、全プラットフォームで同時リリースなんてこともできるかもしれません。</p>
<p>これからのFlashのアップデート、特にゲームコントローラのサポートにも夢が膨らみます。最近はJavaScriptがトレンドですが、個人的にはFlashとももう少し長いつきあいになりそうな気がしています。</p>
<p>今後の課題としては、どうすればモバイルで描画パフォーマンスが出るか、あと今回はAndroiｄ MarketやApp Storeでリリースするところまで行ってませんので、そのためのアプリを何か考えないといけないなと。</p>
<p>そうそう、デスクトップ版AIRで、簡単に透明ウィンドウにできるのも面白いです。application.xmlのtransparent周りを変更してみてください。</p>
<p>久しぶりのエントリが思いもかけず長くなりました。日頃ウェブの情報にお世話になりっぱなしですし、こういうアウトプットもしておかないとということで。ひとまず置いて実制作に戻りたいなと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://geoquake.jp/blog/2011/06/27/airtemplate/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>iPhone/iPad用ピアノアプリを作りました</title>
		<link>http://geoquake.jp/blog/2010/04/02/ipadapp/</link>
		<comments>http://geoquake.jp/blog/2010/04/02/ipadapp/#comments</comments>
		<pubDate>Fri, 02 Apr 2010 08:17:33 +0000</pubDate>
		<dc:creator>k0rin</dc:creator>
				<category><![CDATA[雑記]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[音楽制作]]></category>

		<guid isPermaLink="false">http://geoquake.jp/blog/?p=1210</guid>
		<description><![CDATA[どうもApp Storeが混乱しているようで状況がさっぱりわからないんですが、もう公開状態だと考えていいんでしょうか、これ……。 というわけで、このところ作っていたiPhone/iPad用のピアノアプリ「Live Pia [...]]]></description>
			<content:encoded><![CDATA[<p>どうもApp Storeが混乱しているようで状況がさっぱりわからないんですが、もう公開状態だと考えていいんでしょうか、これ……。</p>
<p><a href="http://geoquake.jp/iphone/livepiano/"><img src="http://geoquake.jp/iphone/livepiano/images/LivePiano512.png" width="512" height="264"/></a></p>
<p>というわけで、このところ作っていたiPhone/iPad用のピアノアプリ「Live Piano」がon saleとなったようですのでお知らせします。ダンパーペダル、リバーブ搭載です。矩形波も鳴るのでゲーム音楽にも好適です。詳細およびApp Storeへのリンクは<a href="http://geoquake.jp/iphone/livepiano/">こちら</a>。</p>
<p>鍵盤については、iPadよりも、むしろ小さいiPhoneできちんと演奏できるようにと調整しました。たとえば当たり判定の大きい黒鍵などです。それについては演奏デモ動画を作らなければ……こんなに早く公開されると思わなかったので、準備がまだできてません。Stay tuned!って感じでひとつ。</p>
<p>（追記）やっとというか、<a href="http://geoquake.jp/iphone/livepiano/">専用ページ</a>にデモ動画を公開しました。動画制作に慣れてなかったり、アプリに不具合が見つかって修正版の審査がなかなか通らなかったりで時間がかかってしまいました。開発の経緯なども書いてありますので、よろしければどうぞ。</p>
]]></content:encoded>
			<wfw:commentRss>http://geoquake.jp/blog/2010/04/02/ipadapp/feed/</wfw:commentRss>
		<slash:comments>3</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>あけおめ</title>
		<link>http://geoquake.jp/blog/2010/01/05/happynewyear/</link>
		<comments>http://geoquake.jp/blog/2010/01/05/happynewyear/#comments</comments>
		<pubDate>Tue, 05 Jan 2010 12:22:32 +0000</pubDate>
		<dc:creator>k0rin</dc:creator>
				<category><![CDATA[雑記]]></category>

		<guid isPermaLink="false">http://geoquake.jp/blog/?p=1147</guid>
		<description><![CDATA[なんだか最近はTwitterにばかり書き込んでいて、久しぶりのブログ更新です。サイト自体を作り直そうかと考えていることもあって、更新しづらくなってた感じ。いずれ移転したりするかもしれませんが、とりあえず書きながら考えよう [...]]]></description>
			<content:encoded><![CDATA[<p>なんだか最近は<a href="http://twitter.com/k0rin">Twitter</a>にばかり書き込んでいて、久しぶりのブログ更新です。サイト自体を作り直そうかと考えていることもあって、更新しづらくなってた感じ。いずれ移転したりするかもしれませんが、とりあえず書きながら考えようと思います。</p>
<p>今年はいろいろリリースしたいなと思っています（確定的なことは言えないのですが……）。どうぞよろしくお願いします。</p>
]]></content:encoded>
			<wfw:commentRss>http://geoquake.jp/blog/2010/01/05/happynewyear/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

