強火で進め このページをアンテナに追加 RSSフィード

整理された情報は こちら へどうぞ。

2011年07月30日

[][]Unityで簡単にTwitterに投稿が出来るライブラリ「Let's Tweet in Unity」

「Let's Tweet in Unity」を使うと簡単にTwitterにつぶやきを投稿できます。

※残念ながらWeb Playerではクロスドメインの制限の為に動作しないのでその点ご注意を!!

使い方

まずは先にTwitterのOAuthが使えるようにアプリケーションの登録を行います。登録方法は以前解説したiPhone向けと同様なのでそちらを参照下さい。

TwitterのOAuth認証を使う - 強火で進め

http://d.hatena.ne.jp/nakamura001/20100519/1274287901

次に「Let’s Tweet in Unity」をDLします。Asset Storeで「Let's Tweet in Unity」で検索してこんなアイコンを見つけて下さい。

f:id:nakamura001:20110731012639p:image

ImportしたらDemoシーンを開いて、Hierarchyの中のDemoを選択して「CONSUMER_KEY」と「CONSUMER_SECRET」にTwitterのOAuth情報ページ( https://dev.twitter.com/apps/152641/show )に表示されている情報をコピペして下さい。

f:id:nakamura001:20110731013851p:image

実行

一番上のボタンを押すとOAuthの許可を求めるページが表示されます。ここで許可をするとPINという数字が表示されます。これを「Please enter your PIN here.」と書かれているTextFieldにコピペして「Enter PIN」を押すと設定完了です。つぶやきを投稿出来るようになります。

[][]キャラクターの拡大/縮小をゲームデザインに取り入れたUnity製ゲーム「Specter Spelunker Shrinks」

Specter Spelunker Shrinks from Ken Grafals on Vimeo.

こういう個性的なゲーム、大好き!!

巨人の視点と小人の視点で遊んでる感じが良いですねぇ。

全体(背景)とのサイズの対比を上手く利用してステージをクリアして行くというのは今までのゲームで体験した事が無かったので凄く楽しかったです。

Specter Spelunker Shrinks - A Online Platformer Game | Game Jolt

http://gamejolt.com/online/games/platformer/specter-spelunker-shrinks/1865/

操作方法

キー内容
カーソルの左右移動
カーソルの上下拡大、縮小
zジャンプ

[][]Unity iPhoneで最初にやるべき3つの最適化

こちらのサイトで公開されていました。

Optimizing with Unity iPhone, the first three things I’ll do… | Cratesmith

http://www.cratesmith.com/archives/183

1. タイムスライシング

ホーミング処理を例に Update() で全ての処理を行わずに Start () で計算をし、 Update() では Lerp() を使って、2点間の移動を行うだけにする様にとの説明。

2. 頻繁に強制的なGCを行う

そうしないと最終的には自動的に行われるGCにより、強烈なスパイク(おそらく画面が一瞬止まる位のCPU負荷の事)が発生。

3. トライアングル&ドローコールのカウント

  • トライアングル(三角形ポリゴン)は7.5kトライアングル
  • draw callは20回以下にする

これらの情報はGameパネルの「Stats」をクリックすると表示される情報にて確認可能。

詳しくはサイトを参照下さい。

[][]デフォルトでインストールされているデモ(サンプル)ゲームのファイルの保存場所

Unityはインストール時にデフォルトで、結構ちゃんとしたボリュームのゲームがサンプルとして入っています。

これはソースコードも読めとても役立つサンプルとなっています。しかし、バージョンアップした時にはデフォルトで表示されないみたいで参照できませんでした。

昔の Island Demo というサンプルなどはAsset Storeで配布されているのでそちらでDLすれば良いのですが最新の AngryBots はStoreに無かったりします。

そんな感じでちょっと困ってしまったのでFacebookの「Unityユーザー助け合い所」で質問した所、即座にMacの場合は /Users/Shared/Unity/ に有るという情報を教えて貰えました。

Unityユーザー助け合い所

http://www.facebook.com/groups/unityuserj/

折角なのでWindowsの場合のフォルダ情報と一緒にまとめてメモしておきます。

Mac

/Users/Shared/Unity/

Windows XP

C:\Documents and Settings\All Users\Documents\Unity Projects\

もしくは

C:\Documents and Settings\All Users\Shared Documents\Unity Projects\

Windows Vista/Windows 7

C:\Users\Public\Documents\Unity Projects\

情報元はこちらのフォーラムでの回答。

Where is the Island Demo - Unity Answers

http://answers.unity3d.com/questions/11080/where-is-the-island-demo.html

関連情報

nakamura001 @ ウィキ - トップページ/Unity(Unity3D)/各種ファイルの保存場所

http://www32.atwiki.jp/nakamura001/pages/168.html

2011年07月29日

[][]Unity 3.4ではSceneパネルでcolliderのサイズ変更が可能に

Unityではcolliderのサイズ設定がInspectorだけなく、Sceneパネルでも可能になりました。

シーンパネルでGame Objectを選択した状態でShiftキーを押すとこの様に小さな四角が表示されます。

※見えづらいですが赤い四角で囲んだ所に表示されています。

f:id:nakamura001:20110730034301p:image


この状態でも操作は可能なのですが流石に使いづらいと思うのでQキーを押してハンドアイコンをONにした状態で調整するのをお勧めします。

f:id:nakamura001:20110730034300p:image

f:id:nakamura001:20110730034259p:image

2011年07月28日

[][]QualcommのARライブラリ、「QCAR」がiOSに対応

Qualcommが開発し、無料で提供されている「QCAR」というARライブラリが有ります。

こちらUnityにも対応してしていて中々良いライブラリなのですが対応しているのがAndroidだでした。

このライブラリがiOSの対応を果たしました。UnityでiOS向けにビルドする事も可能です。

という事で早速、Unity版をDLして軽く試してみました。以下のサイトで無料の会員登録を行うと誰でもダウンロード出来ます。

AR SDK | Qualcomm Augmented Reality

https://ar.qualcomm.at/qdevnet/

DLしたファイルには以下のサンプルが有りました。

ファイル名内容
QCAR-iOS-1.0.0beta1.unitypackageQCARの基本データ
QCAR-ImageTargets-iOS-1.0.0beta1.unitypackage画像のターゲットを使用したサンプル
QCAR-FrameMarkers-iOS-1.0.0beta1.unitypackageフレームマーカーを使用したサンプル
QCAR-MultiTargets-iOS-1.0.0beta1.unitypackageマルチターゲットの(複数のマーカーを使用した)サンプル
QCAR-VirtualButtons-iOS-1.0.0beta1.unitypackageバーチャルボタンを使用したサンプル

D

D

D

D

オリジナルのマーカーを使いたい場合はページ上部の「MY TRACKABLES」をクリックするとマーカーの作成ページに移動出来ます。

f:id:nakamura001:20110729030154p:image

色々な画像でテストしてみましたが中々良い画像を準備するのは大変そうでした。

まずは風景の画像でテストしてみました。結果の画像はこちら。

f:id:nakamura001:20110729023249p:image

マークが付いている部分がおそらく抽出された特徴点。かなりごちゃごちゃした画像なのにも関わらず、あまり特徴点が見つけられていません。

画像の解析後の画面では右側に☆でマーカーとして適切な画像かどうかの判定が行われます。スコアが良くないと最終的なマーカー情報を持ったファイルを出力する段階まで進めません。

アップロードした画像はフルカラーなのに最終的な判定画像はモノクロという事はモノクロ化した後に特徴点を抽出してるのでは?と当たりを付けて白地に黒で手描き画像を作ってテストしてみました。

f:id:nakamura001:20110729023625p:image

予想外に特徴点の数が少ない!! もっと複雑な必要が有るかも?とこんなのでチャレンジ。

f:id:nakamura001:20110729023720p:image

白と黒でくっきりとした境界だとイマイチな様なのでもっと柔らかいブラシを使ったり、灰色なども使って試した結果がこちら。

f:id:nakamura001:20110729023907p:image

左下がかなり柔らかいブラシで描き、右上は固めのブラシで描きました。右上側の方が結果が良いですね。色はRGBで(127, 127, 127)で描画したものが結果が良いみたいです。

今までの結果を元に作成したのがこちら。

f:id:nakamura001:20110729025358p:image

良い感じに沢山の特徴点が抽出されていますね。☆4つ貰って基準をクリアできました。

マーカーに使うに良い画像

結果をまとめると

  • ある程度境界のハッキリした色で描画
  • ハッキリし過ぎるとダメ
  • 色の差をハッキリさせ過ぎない
  • ブラシのぼかし具合0ではダメ
  • かといってぼかし過ぎもダメ

以上の点を気を付けてごちゃごちゃした画像を描けばOKみたいです。

正式な良い画像と悪い画像についてはスコアが悪い時に表示されるexamplesのリンクをクリックして確認して下さい。

写真を使う場合にもこの特徴が出るように加工すれば認識率が上がるかもしれません。実際、試している訳では無いですが(汗)

画像処理に詳しい人だと直ぐに最適な画像が分かるのでしょうがあまり詳しく無いので中々苦戦させられましたw

使ってみた感想

サンプルを動かしてみたところ認識率や追従性については問題なし。しかし、マーカーから外れた後に3Dモデルが消えるまでちょっと時間がかかったのが気になりました。

でもこれだけの機能が有るARライブラリが無料で提供されているとは素晴らしいと思います。

バーチャルボタンも使えるのでAR上の3DCGのボタンを押してそれをトリガーに動作させる様な作品も簡単に作成可能というのもこのQCARならでは特徴だと思います。

2011年07月27日

[][]エディタをUnity 3.3以前のUnitronに戻す方法

Unity 3.4ではデフォルトで起動するエディタがUnitron(Macの場合)からMono Developに変わった様です。

Mono Developはブレークポイントも張れて、ガッツリプログラムする時はとても役に立つのですがちょっとした物を作ったり検証したりする時は起動が遅いのが気になります。

その為、自分は基本はUnitronで作成し、ガッツリやる時はMono Developという使い分けをしていました。そういう自分にはこの変更はちょっと困るので早々にエディタ設定をUnitronに戻しました。

設定の変更はショートカット command+, で設定を開き、「External Script Editor」の項目で設定出来ます。

f:id:nakamura001:20110728012327p:image

UnitronはUnityアプリと同じフォルダ( /Applications/Unity/ )に有ります。

2011年07月26日

[][]Unity 3.4リリースされました!!

Unity 3.4リリースされました!!Unityのアプリ内でアップデートか以下のURLからインストールで、導入出来ます。

UNITY: Download and Start Creating Games

http://unity3d.com/unity/download/

以前出てたロードマップを見ながらまだか、まだかと待っていました。これから色々と試してみるのが楽しみです。

Unity Technologies Blog » Blog Archive » Unity Roadmap 2011

http://blogs.unity3d.com/2011/06/16/unity-roadmap-2011/

関連情報

UNITY: What's New in Unity 3.4

http://unity3d.com/unity/whats-new/unity-3.4

Unity Technologies Blog » Blog Archive » Unity 3.4 Released

http://blogs.unity3d.com/2011/07/26/unity-3-4-released/

2011年07月25日

[][]テクスチャの変更

publicに設定したテクスチャと差し替える場合

以下の様なプログラムとなります。Cubeなどを作成して追加して下さい。

JavaScriptプログラム】

var playerTexture1 : Texture;
var playerTexture2 : Texture;

function OnGUI () {
	GUILayout.BeginArea(Rect(5, 5, 100, Screen.height-10));
	if (GUILayout.Button("Change")) {
		if (renderer.material.mainTexture == playerTexture1) {
			renderer.material.mainTexture = playerTexture2;
		} else {
			renderer.material.mainTexture = playerTexture1;
		}
	}
	GUILayout.EndArea();
}
  • テクスチャを2つ準備し、 playerTexture1 、 playerTexture2 に設定して下さい。
  • renderer.material.mainTexture にテクスチャを代入する事で変更出来ます。

Resourcesフォルダのファイルをロードして差し替える場合

他の方法ではAssetsフォルダ内にResourcesフォルダを作成し、そこに画像ファイルを置いておくとそこから読み込む事が可能です。

以下の様なプログラムとなります。先ほどのサンプルと同様にCubeなどを作成して追加して下さい。

JavaScriptプログラム】

private var defulatTexture : Texture;

function Start () {
	defulatTexture = renderer.material.mainTexture;
}

function OnGUI () {
	GUILayout.BeginArea(Rect(5, 5, 100, Screen.height-10));
	if (GUILayout.Button("Change")) {
		if (renderer.material.mainTexture == defulatTexture) {
			renderer.material.mainTexture = Instantiate(Resources.Load("PlayerTexture2"));
		} else {
			renderer.material.mainTexture = defulatTexture;
		}
	}
	GUILayout.EndArea();
}

Instantiate(Resources.Load("PlayerTexture2")) でロードとインスタンスの生成を行っています。

テクスチャファイルの設定を一部変更しておかないと実行した時に以下の様なエラーが発生します。

Instantiating a non-readable 'PlayerTexture2' texture is not allowed! Please mark the texture readable in the inspector or don't instantiate it.
UnityEngine.Object:Instantiate(Object)

テクスチャのInspectorの Texture Type を Advanced に切り替え、 Read/Write Enabled にチェックを付けるとこのエラーは発生しなくなります。

f:id:nakamura001:20110726043329p:image

[][]見下ろし型のガンアクションゲーム「EVAC-CITY」

f:id:nakamura001:20110726015535p:image

空から見下ろす型の視点で操作するガンアクションゲームです。

f:id:nakamura001:20110726015536p:image

途中から仲間が増えます。仲間は自動的に敵を攻撃します。

EVAC-CITY - Fast paced top down alien shooter, which plays on a suspenseful horde survival mechanic

http://www.wooglie.com/playgame.php?gameID=85

仲間の処理まで作るのは大変ですがこのゲームの簡易版の様なものであれば気楽に作ってみる題材として良さそうですね。

[]Google Tool BarはFirefox 5以降はサポートしないらしい

Firefox 5がリリースされてからずっと対応されるのを待っていたのですが正式に対応しない事が発表されました。

GoogleツールバーFirefox 5以降はサポートせず - ねとらぼ

http://nlab.itmedia.co.jp/nl/articles/1107/22/news034.html

確かにFirefoxでそのまま使える機能も多いのですが自分は「翻訳」をかなり使うのでこのボタンが使えなくなるのは困るでFirefox 4のまま使っていたのですがもう諦めて代替案を探す事にしました。

そこで見つけたのがこちらのページ、Googleが配布しているブックマークレット

翻訳ブラウザ ボタン

http://translate.google.com/translate_buttons?hl=ja

取り敢えずこいつを導入すればなんとかなりそうです。

ブックマークレットを使った事の無い人は以下を参照下さい。

ブックマークレットの設定方法 - 強火で進め

http://d.hatena.ne.jp/nakamura001/20110529/1306674413

2011年07月24日

[]UQ WiMaxの端末を買い増ししてURoad-8000を購入

自分は以前、ビックカメラが販売しているUQ WiMaxのサービス「BIC WiMAX サービス」に加入してeggでUQ WiMaxを使っていました。

Try WiMAXUQ WiMAXの速度を体験してみた - 強火で進め

http://d.hatena.ne.jp/nakamura001/20100728/1280324001

この時点では契約はいつ解約しても違約金が発生しないタイプのものでした。しかし、現在では1年しばりが有る代わりに月額費用が割り引かれるタイプのものも出てきました。

しかし、解約して再度そちら側に契約変更すると事務手数料を考えると結構長い間使わないと総合的に安くは成らないので変更はしないでいました。

そういう状態でいたのですが最近になって8月で月額費用が値上がる(実際には一定期間の割引き期間が終了)するみたいなので遂に契約を変更する事にし、有楽町のビックに向かいました。

せっかくなので端末を最近のものに変更したかったので現在の契約とは別に追加で契約を行い、その後に現在の解約という形を取りました。

念の為、「契約をそのまま変更するだけでは端末は安く購入出来ません?」と店員さんに尋ねた所やはり新規契約しないと安く成らないとの事。メンドクサイですけどまぁ、しょうがないですね。

そういう形にするともちろん、「Wi2 300」や「Wi-Fi プラス」は再度、契約し直さないといけないとの事でした。

ちなみに「Wi2 300」や「Wi-Fi プラス」は以下の様なサービス。無料で使えます。

Wi2 300

マクドナルやルノアールで使える公衆無線LANサービスが使えます。BBモバイルポイントライブドアワイヤレス、UQ_Wi-Fiなどが使えます。

Wi-Fi プラス

UQ WiMaxが提供している公衆無線LANサービス。空港や新幹線、地下鉄などで使えます。詳細な提供エリアは以下のページを参照。

UQ Wi-Fi(ユーキューワイファイ) | UQ WiMAX −高速モバイル通信、高速モバイルインターネットのデータ通信カードを提供

http://www.uqwimax.jp/service/price/option01.html

特徴

以前使っていたeggも130グラムと携帯電話程度の重さなので気にならない重さだったのですがURoad-8000は約98グラムとeggよりもちょっとだけですが軽いみたいです。

最大10台同時に接続出来るというのも良いですね。普段はそんなに沢山同時に接続出来る必要は無いのですがたまに勉強会で無線環境が提供されてない時などに役立ちそうです。

WPSボタン付き。WPSに対応しているPSPやDSなどだと同時にボタンを押すことで簡単に設定が出来ます。

充電はUSB経由またはUSBの付属の反対側が電源のコネクタになっているタイプのアダプタにて行います。店員さんの話によるとUSBケーブルでの充電だと充電しつつネットワーク接続も行う事は出来ないとの事。反対側が電源のコネクタになっているやつだと

連続通信約9時間という長時間使用が可能。こちらのサイトによると実際にテストした所、9時間27分通信出来たとの事。これは実際に長時間使ってみるのが楽しみ!!

ちょっと贅沢を言えばNECのルータの様に使用してない時間が一定期間発生したら自動的に切れる機能が付いてたら完璧だったのですがそこまで望むのは欲張り過ぎすかね?うーん、でも欲しかった。

無線LANの規格がIEEE802.11b/gのみ。nは無し。

解約

解約は店頭では出来ないみたいです。こちらのページから必要なPDFを2つDLして印刷。1つは宛先用で封筒に貼り、もう1つは解約書類となります。

宛先用のものは着払いの記載も有り、封筒には切手を貼らずに送付できます。

設定画面

「Web設定画面(ネットワーク設定やパスワードの変更を行うページ)」に入るには以下のURLへアクセス。

http://192.168.100.254/

ユーザ名 : admin

パスワード : admin

詳しいヘルプはこちら。

URoad-8000 Webマニュアル

http://www.shinseicorp.com/wimax/URoad-8000WM/index.html

関連情報

シンセイコーポレーション│ WiMAX URoad-8000

http://www.shinseicorp.com/wimax/wimax06.html

BIC WiMAX SERVICE

http://www.bic-ws.net/

2011年07月23日

[][]階段を登る処理

f:id:nakamura001:20110724013517p:image

階段を登る処理。指定の高さより段差が高い場合には登れない様に設定したサンプル。

実際の動作はこちらで試せます。ソースコードこちら

階段の高さは 0.5 で作成し、最後の段だけ 1.0 で作成。 0.5 の段は登れるけど 1.0 の段は登れない設定で作成しています。

f:id:nakamura001:20110724013518p:image

今回は「Character Controller」をImportして使用しました。Character Controllerではこの部分で設定出来ます。

f:id:nakamura001:20110724013519p:image

Slope Limitでどの位の傾斜の面まで登れるかを指定します。今回は階段なので90°を設定します。

Step Offsetでどの位の段差まで登れるを設定します。今回は 0.5 を設定しました。

階段を登る時にはそれっぽいアニメーションが欲しい所では有りますが今回使ったモデルではその様なアニメーションが無いので省いて有ります。

[] 「南東京iPhone開発者勉強会 9回目」に参加しました

南東京iPhone開発者勉強会 9回目 : ATND

http://atnd.org/events/18085

@sin_jintan さんのTogetterまとめ。

Togetter - 「南東京iPhone開発者勉強会 #9」

http://togetter.com/li/165025

角様:iOSアプリの広告による収益化 〜各アドネットワークの傾向、SmAddによる収益最大化〜

※遅刻してしまったのでこの講演は最後の方しか見れてません。

  • スライド

http://www.slideshare.net/SumiKoichiro/ios-smadd

  • SmAdd

http://www.smadd.net/

yuumi3様:EvernoteAPI

  • 最初のキーでアクセス出来るのはSoundbox内だけ
  • ここで新たにアカウントを登録する
  • テスト用データを作る
  • 専用クライアントからはアクセス出来ない
  • 本来のデータにアクセス出来る様にアクティベーションを依頼するページ。見つけるのが大変らしい

Evernote API Key Activation

http://www.evernote.com/about/developer/api/activate.php

  • 主なデータとして、User Store、Note Storeが有る
  • ノートのデータ形式はENML。XML、ほぼHTML
  • 実際のデータはen-mediaなど独自のタグ内に格納
  • Webkitで表示するとおかしな事になる
  • APIには認証で戻るトークンを渡す
  • エラー時には例外が発生する。Objective-Cの時にも…
  • 関連データを取得する、しないが出来る

サンプル

https://github.com/yuumi3/EvernoteTest

  • NoteにはGUIDが振って有る。それを使ってアクセスする
  • リファレンスに記載されている型の情報はstringやi32など言語に依存しない形で記載されている。ヘッダで実際の型を確認
  • データ取得の数を1000など指定してもネットワークやメモリの関係なのか実際に1000個は取得出来ない。実際に取得したい数に達するまで繰り返しアクセスして取得する

吉川様:便利なカテゴリ

最初に吉川さん作のPDFを電子書籍(iOS)アプリ化出来るMacアプリの紹介。データはサーバに設置、データの暗号化にも対応。

kyoshikawa/ZUtilities - GitHub

https://github.com/kyoshikawa/ZUtilities

  • 以下の様なカテゴリが有る
    • SHA1MD5にしたNSDataを返す
    • uintやintをArrayにappendする
    • uintやintをread,writeする
    • 色関連の変換。RGBやHSV、CGColorなどに対応
    • Rectをアスペクト比を保ったまま、拡大/縮小
    • NSCharacterSet関連

akisute様:Three20かCore Dataのネタ

  • Core Dataは多分やらないとの事
  • Highly Specialized for Web(HTML)
  • 出来る事は何か→Webの真似事をするライブラリ
  • 非同期でリソースをロード
  • URLベースのナビゲーション
  • スタイルシート
  • URL(scheme URL)とViewControllerのマッピングが可能
  • TTViewControllerから派生したクラスを使用してViewControllerを作るのが基本。それ以外でも作成出来るけどとても大変
  • Tab BarやModalでの動作が不安定。公式には対応と書いて有るが信用しない方が良い
  • TTImageView は神。非同期でイメージを呼ぶ
  • TTImageViewの為だけにでも使う価値が有る
  • TTStyledTextLabel。本文のテキストなどを処理。リンク、Bタグなどに対応
  • TTStyleSheet。シングルトンで実装された1つのプロパティを変更するとアプリ全体のスタイルが変更される
  • TTTableViewController。固定のTableViewを表示させる時に便利
  • dataSourceに配列でタイトルと遷移先のURLを記載するだけで使える。他にも使えるものが有るがThree20に最初から有るものだけ
  • TTPhotoViewController。拡大/縮小やフリップによるページ遷移、サムネイルによる一覧表示、スライドショーなどが可能。
  • 問題点
    • ドキュメントが存在しない

http://three20.info/

    • Webから探すのが大変
    • クラス定義が記載 & 解説2行程度のドキュメント
  • 既存のアプリをThree20を使ったアプリに変更するのはほぼ無理
  • FaceBookアプリを作る為に作られたライブラリなので色々と落とし穴有り
  • HTTPのタイムアウト時間を設定するにはソースを変更する必要有り

岸川様:(未定)

  • Auto-Renewable Subscriptions 自動更新購読
  • 最近追加されたアプリ Network Link Conditioner → ネットワーク速度が遅い環境をシミュレーションしてくれる。実行すると「システム環-境設定」に追加される。現在のバージョンは起動すると落ちる。使えない
  • 参考資料
    • In App Purchaseプログラミングガイド
    • セッションビデオ Session 510 - In App Purchase for iOS and Mac OS X
    • iTunes Connect Developer Guide
  • 資料やコードは変わっている事が多いのでWeb上の情報を見る前に上記の資料を見ておくのが良いのでは…
  • 4つの課金タイプ
    • Consumable(消耗型)
      • 必要なら何度でも購入する
      • ゲーム内のアイテムなどに使用
    • Non-consumable(非消耗型)
      • 購入は一度キリ
      • 再購入は課金されない
      • 購入履歴を管理する必要はない
      • 購入すると広告を消せる、新しいステージを追加などの時に使用
      • 購入したものは永続的に使用出来るものに使用
    • Auto-renewable subscriptions(自動更新購読)
      • キャンセルしない限りは自動的に更新
      • 有効期間内の再購入は課金されない
      • 購入履歴を管理する必要はない
    • Subscriptions(定期購読)
      • 昔使われていた。今はAppleもAuto-renewable subscriptions(自動更新購読)を使う様にと言っている
  • Auto-renewable subscriptionsのメリット
      • 非消耗型とほぼ同じ処理
      • 組み込みタイプの商品ならアプリケーション単体で実現出来る
      • 課金は自動だが、コンテンツのダウンロードはアプリ側で行う必要が有る
      • 現実の雑誌の定期購読は自動的に送られてくるけど、アプリの場合は有効期間は過去のものも読める様にしておいた方が良い
      • 1ヶ月アプリを起動しなかった場合にコンテンツを入手出来なかったとう事も発生する
  • 値段はソースにハードコーディングしないでStore Kit経由で取る
  • 昔はハードコーディングされていたらリジェクトされた。現在は審査時に見てないっぽい
  • priceLocaleを使って金額の前にユーロやドル記号を付けるなどのLocale対応を行う
  • iTunes Connect登録しても反映されない事が有る。全サーバーに反映されない場合などに発生する可能性有り
  • リストア処理。非消耗型だと再購入しても課金されないがその数が多くなると大変なのでちゃんとリストアボタンを設置する事
  • 定期購読のものをもう一度購入しようとするとエラーになる為、定期購読の場合にもリストアボタンは必須
  • 何らかのバグでレシートの保存に失敗した時などの対策にも成る
  • リストアで取得出来るデータは有効期間が切れたものも含まれる。サーバーに問い合わせて有効期間を確認する
  • 自動更新は期限が切れるちょっと前(数時間前)に更新される
  • 値段を上げたら自動更新はオフになり、ユーザにはメールで通知
  • 自動更新の期間はアプリから分からないので fm.i-radio.monthly などProductIDに含めると良い
  • 購入情報はKeyChainに保存するのが確実
  • オフライン時の処理
    • レシートが検証出来ない
    • 一時的に機能をオフにする、expires_dateとデバイスの時刻を比較するなど
  • サンドボックス環境はたまにおかしくなる
  • ユーザ情報(メールアドレスや郵便番号など)を提供する代わりに無料でサブスクリプションを使えるなどの設定も可能
  • ユーザが課金を禁止設定している事もあり得るのでそのチェックを行う。まぁ、途中でエラーになるでしょうけど…
  • 購入をキャンセルされたときはレスポンスがちゃんと来る。キャンセルされたかどうかはエラーコードで判定可能
  • 定期購読を検証する時にはShared Secretを使う

2011年07月22日

[][]クリックしたオブジェクトの方を向く

f:id:nakamura001:20110723042809p:image

以下の様なイメージで構成。

黄色のCubeの組合せ → Player(砲台的なもの)

赤、緑、青のCube → ターゲット

ターゲットをクリックするとPlayerがその方向を向きます。

実際の動作はこちらで試せます。ソースコードこちら

ターゲットには以下のJavaScript

【ClickBehaviourScript.js】

private var playerBehaviourScript: PlayerBehaviourScript;

function Start () {
  var playerObj : GameObject = GameObject.FindWithTag("Player");
  playerBehaviourScript = playerObj.GetComponent(PlayerBehaviourScript);
}

function OnMouseDown () {
  var ray : Ray;
  var hit : RaycastHit;
  ray = Camera.main.ScreenPointToRay(Input.mousePosition);
  if (Physics.Raycast(ray, hit, 100)) {
    print(hit.collider.gameObject);
    playerBehaviourScript.TargetLookAt(hit.collider.gameObject.transform);
  }
}

Playerには以下のJavaScriptを設定

【PlayerBehaviourScript.js】

function TargetLookAt (target : Transform) {
	transform.LookAt(target);
}

ターゲットをクリックしたら OnMouseDown イベントが発生し、その中でPlayerのJavaScriptの TargetLookAt () を呼び、Playerを自分(ターゲット)の方を向かせます。

[][]Unityの中の人のスライド「How to Scale Your Tech」

Unityの中の人、Aras Pranckevičius(@aras_p)さんのスライド「How to Scale Your Tech」。

細かい文字の部分は置いとくとして22,29,36,37ページ辺りのキャプチャや写真が中々、興味深いですね。Unityではこんな環境でテストしてるんですね。

こちらの「Develop Conference in Brighton」というイベントで使われたスライドみたいです。

Develop Conference in Brighton - All Sessions

http://www.developconference.com/page.cfm/action=Seminars/SeminarID=17

2011年07月21日

[]人形にポーズを取らせる事で3DCGのポーズを設定出来る「QUMA(クーマ)」

D

昔は現在の様に人間型では無く、名前の通りクマ型だったりします。

3Dキャラの動きをぬいぐるみで操作、個人用モーションキャプチャ -INTERNET Watch

http://internet.watch.impress.co.jp/docs/news/20091030_325592.html

Make: Tokyo Meeting 04で見かけた事があり、出展されてた方に「これ良いですねぇ。是非、販売して下さい」と言った事を覚えているくらい印象に残った作品でした。

他の方のものですがMake:に出展されてたものを撮影されたものがYoutubeに上げられていたので紹介します。こんな感じで展示されていました。

D

関連情報

未来のデッサン人形? 3Dモデルのポージングができる人型装置、ソフトイーサが開発 - ITmedia +D PC USER

http://plusd.itmedia.co.jp/pcuser/articles/1107/21/news023.html

報道発表資料 - 開発中の「QUMA」技術を応用した 3D モーションキャプチャ装置を公開

http://www.softether.co.jp/jp/news/110721.aspx

[][]ARなガンシューティングゲーム「On-Rails Shooter」

D

Interactive Augmented Video – On-Rails Shooter Tech Demo | AlmostLogical.com

http://blog.almostlogical.com/2011/07/21/interactive-augmented-video-on-rails-shooter-tech-demo/

2011年07月20日

[][]FPSの値を変更する方法

FPS(1秒間に描画が呼ばれる数。フレームレート)を変更する方法。

以下の様な記述で変更出来ます。

Application.targetFrameRate = 60;

実際にちゃんと切り替わっているを確認する為に以下の様なJavaScriptのプログラムを作りました。

var count: int = 0;
var t: float = 0;
var info: String = '';

function Awake () {
	Application.targetFrameRate = 60;
}

function Update () {
	t += Time.deltaTime;
	count++;
	if (t >= 1.0) {
		info = t+' : '+count+' count';
		t = 0.0;
		count = 0;
	}
}

function OnGUI () {
	GUILayout.Label(info);
}

こちらは Update () が呼ばれるたびにカウントアップを行い、1秒経過した後に何カウントされたかを表示するプログラムとなっています。

空のGameObjectなどに追加し、スタンドアローンアプリなどを作成して動作させ、ちゃんと反映されているか確認してみて下さい。

※なお、何故かエディタ(IDE)上で実行した時はFPSの設定は反映されないという制約が有るのでエディタ上では確認出来ません。

FPSを高い値に設定した場合はマシンスペックによっては実際にその値が出ない場合も有ります。その場合は数値を低くして確認するか起動時の「画面サイズ」や「グラフィッククオリティ」の設定を下げて実行してみて下さい。

f:id:nakamura001:20110721014308p:image

また、iPhoneの場合にはこの方法では変更出来ません。iPhoneの場合は以前紹介した様に AppController.mm ファイルの以下の数値を変更して下さい。

#define kFPS 30 

関連情報

Unity Script Reference – Application.targetFrameRate

http://unity3d.com/support/documentation/ScriptReference/Application-targetFrameRate.html

2011年07月19日

[][]PC向けに作成していたものをiOSへ移植する時のTips

Rope Racket - Unity3D iOS Porting Tips

http://roperacket.tumblr.com/post/2544450508/unity-ios-porting

「急なCPUの負荷発生を避ける為に System.GC.Collect(); を定期的に呼ぶこと」というTipsはまったく想定外だったのでとても参考になりました。

Monoで実装されているのでそういう面についても気を付けないといけないんですね。

2011年07月18日

[][]キャラクターの全アニメーションを確認するスクリプト

f:id:nakamura001:20110719015618p:image

実際の動作はこちらで試せます。ソースコードこちら

アニメーションの一覧がボタンで表示されるので再生したいアニメーションのボタンを押してください。

JavaSriptのプログラムにて作成。ソースコードは以下

var CharAni : Animation;
private var aniList : Array;
private var scrollPosition : Vector2;

function Start () {
	CharAni.animation.Stop ();
	aniList = Array();
	for (var state : AnimationState in CharAni.animation) {
		aniList.Push(state);
	}
}

function OnGUI () {
	scrollPosition = GUILayout.BeginScrollView (
	        scrollPosition, GUILayout.Width (Screen.width/3), GUILayout.Height (Screen.height));
	for(var state : AnimationState in aniList)
	{
		if ( GUILayout.Button(state.name) ) {
			CharAni.animation.Stop ();
			CharAni.animation.Play (state.name);
		}
	}
	GUILayout.EndScrollView ();
}

使い方

  • 空のGameObjectに付けて使用
  • Inspectorの CharAni にアニメーションを確認したいキャラクターをドラッグ。

Amazonでの定期購入物品メモ

その時の気分や在庫によって購入するものを変える。野菜ジュース。

富永貿易 神戸居留地 16種の野菜と果物 190g×30本

富永貿易 神戸居留地 16種の野菜と果物 190g×30本

伊藤園 1日分の野菜 200ml×24本

伊藤園 1日分の野菜 200ml×24本

カゴメ 野菜一日 これ一本 200ml×24本

カゴメ 野菜一日 これ一本 200ml×24本

ドクペ

コカ・コーラ ドクターペッパー 缶 350ml×24本

コカ・コーラ ドクターペッパー 缶 350ml×24本

ブリタ浄水器の交換用カートリッジ

ボディソープの詰め替え

アックス(AXE) ボディソープ エッセンス つめかえ用 250ml

アックス(AXE) ボディソープ エッセンス つめかえ用 250ml

入浴剤の詰め替え


こちらのカバンも数年毎に買ってるのでメモしとく。

[asin:B004V2EBTE:detail]

ルノアール新小岩店は他の店舗とはちょっと違うみたい

今まで色々な場所のルノアールに入った事が有りますが今日入った新小岩店はちょっと他の店舗とは様子が違いました。

普通の店舗だとドリンク類以外はトーストやケーキ程度しか無いのですがこの店舗ではこの充実具合!!

f:id:nakamura001:20110718160100j:image

f:id:nakamura001:20110718160059j:image

f:id:nakamura001:20110718160101j:image

f:id:nakamura001:20110718160103j:image

f:id:nakamura001:20110718160102j:image

コーヒーに関してもちょっと特別仕様。

f:id:nakamura001:20110718160058j:image

こちらの健康ドリンクについては店舗によっては有るんですが他の店舗だとここまで充実して無いです。

f:id:nakamura001:20110718160441j:image

その他、環境に関しては電源はもちろん使えるのですがSoftbanklivedoorの無線スポットはまだ導入されて無いみたいなのでそれ目当ての人はご注意を…

Edyによる会計にも対応してませんでした。

後、この店舗ルノアールの店舗情報のページに載ってないのは何でなんだろ?お茶が出て来る所、おしぼり置きやお茶の湯のみのデザイン、崩したRenoirの文字なんかが同じ所を見ると同名の関連ないお店って訳ではなさそうなんだけどなぁ?

喫茶室ルノアール--銀座ルノアール

http://www.ginza-renoir.co.jp/renoir/index.htm

2011年07月17日

[]glBlendFuncの設定による描画結果の違いをオンラインで簡単に確認出来るツール「Visual glBlendFunc Tool」

Visual glBlendFunc Tool

http://www.andersriggelsen.dk/OpenGL/

以前、Javaアプリのものを紹介した事が有りましたがこちらはより簡単に確認できますね。

ブレンド関数のパラメータ組み合わせがテストできるツール - 強火で進め

http://d.hatena.ne.jp/nakamura001/20090315/1237123336

f:id:nakamura001:20110718042247p:image

2011年07月16日

[][]IGDA日本ゲーム開発セミナー「Unityの導入と実践」に参加して来ました

IGDA Japan chapter - IGDA日本ゲーム開発セミナー「Unityの導入と実践」【7月16日(土)13:00-】

http://www.igda.jp/modules/bulletin/index.php?page=article&storyid=501

「Unityの導入と実践」に参加して来たのでまとめを書こうかと思ったのですが既にTogetterにまとめられている方がおられたのでそちらを紹介。

Unityのそもそも : チュートリアル101

大前広樹(Unity リージョナルディレクター)

「Life in Shadow」 http://globalgamejam.org/2011/life-shadows

Togetter - 「「Unityのそもそも : チュートリアル101」のまとめ〜IGDA日本ゲーム開発者セミナー「Unityの導入と実践」講演より〜」

http://togetter.com/li/162064

Unity登場の歴史的背景、ケーススタディ、Global Game Jam

新清士(ゲームジャーナリスト)

Togetter - 「「Unity登場の歴史的背景、ケーススタディ、Global Game Jam」のまとめ〜IGDA日本ゲーム開発者セミナー「Unityの導入と実践」講演より〜」

http://togetter.com/li/162072

発表時に使われていたマインドマップ

IGDAセミナー資料_新_Unity登場の歴史的背景.pdf - Powered by Google ドキュメント

https://docs.google.com/viewer?a=v&pid=explorer&chrome=true&srcid=0B9H18RxteWSCNGIwZTcwNjgtZjQ3YS00MTgyLTllMTctN2M5NmQ0NDdkMWUw&hl=ja&pli=1

Unityでのプロトタイプ開発の実践「Life in Shadow」メイキング

Togetter - 「「Unityでのプロトタイプ開発の実践「Life in Shadow」メイキング」のまとめ〜IGDA日本ゲーム開発者セミナー「Unityの導入と実践」講演より〜」

http://togetter.com/li/162099

バンダイナムコゲームスにおけるUnityへの取り組み

湊 和久(株式会社バンダイナムコゲームス プログラム1部 プログラム1課 シニアプログラマ

Togetter - 「「バンダイナムコゲームスにおけるUnityへの取り組み」のまとめ〜IGDA日本ゲーム開発者セミナー「Unityの導入と実践」講演より〜」

http://togetter.com/li/162111

バンナムさんの所で教科書に使われてた本はこちら。うーん、是非その和訳資料を使って日本語訳版を出して欲しい所です。

Game Development with Unity, 1st Edition

Game Development with Unity, 1st Edition

Unity上でのARアプリケーション開発

林 建一(株式会社コンセプト 取締役)

http://qoncept.jp/

Togetter - 「「Unity上でのARアプリケーション開発」のまとめ〜IGDA日本ゲーム開発者セミナー「Unityの導入と実践」講演より〜」

http://togetter.com/li/162122

資料は以下

UnityでのARアプリケーション開発

http://qoncept.jp/ar/seminar/unity_20110716.pdf

パネルディスカッション Q&A的な要素を中心に

Togetter - 「IGDA日本ゲーム開発セミナー「Unityの導入と実践」パネルディスカッションのまとめ」

http://togetter.com/li/162139

東京工科大学の三上先生が作られた資料についてはこちらを参照。

東京工科大学の『ゲーム開発環境「Unity」教育用テキスト』 - 強火で進め

http://d.hatena.ne.jp/nakamura001/20110420/1303275263

ここで林さんが言われた機械翻訳された様な日本語のリファレンスはおそらくこちらの事。

unityマニュアル日本語化プロジェクト

http://sky.geocities.jp/unity_manual/

その他に有志の方々が人力で翻訳されているものはこちら。

Unity - Documentation

http://ws.cis.sojo-u.ac.jp/~izumi/Unity_Documentation_jp/Documentation.html

有志の方々が翻訳されたものは人力での翻訳なので読みやすいですがまだ未翻訳の部分も有ります。

機械翻訳の方は一通り翻訳されているみたいです。必要に応じて使い分けると良いでしょう。

講演の間に新さんが話されたもの

福島でGlobal Game Jamの様なイベント、福島GameJamを開催予定。今、ゲーム開発者が出来る事は何を考えて考案。ゲームを通じて福島に「熱気」を。必ず実施します。

Twitterのハッシュタグは #fgj11

講演の間に大前さんが話されたもの

Unityユーザの助け合いの場。Facebookのグループ。

Unityユーザー助け合い所

http://www.facebook.com/groups/unityuserj

夏に泊り込みで開発合宿します。開発環境はUnityじゃなくても良いそうです。参加者募集中。

Summer Game Jam 2011 Member's Group

http://www.facebook.com/groups/200741766641469

Summer Game Jam 2011は、Global Game Jamのコンセプトを参考に、ゲーム愛好者たちが山中湖に集まって合宿し、1週間内にゲームを完成させるイベントです。

2011年07月15日

[][]GUILayoutの解説

GUILayout は GUI とは異なり、自動的にレイアウトしてくれるGUIパーツを使う事が出来ます。

この様に書くと自動的に縦に並べて表示してくれます。

function OnGUI () {
	GUILayout.Button ("test1");
	GUILayout.Button ("test2");
	GUILayout.Button ("test3");
}

f:id:nakamura001:20110716012147p:image

Space() を使うと余白を入れれます。

function OnGUI () {
	GUILayout.Button ("test1");
	GUILayout.Space (20);
	GUILayout.Button ("test2");
	GUILayout.Space (20);
	GUILayout.Button ("test3");
}

f:id:nakamura001:20110716012146p:image

水平に(1グループとして)並べる。

function OnGUI () {
	GUILayout.BeginHorizontal ("box");
	
	GUILayout.Button ("test1");
	GUILayout.Space (20);
	GUILayout.Button ("test2");
	GUILayout.Space (20);
	GUILayout.Button ("test3");
	
	GUILayout.EndHorizontal ();
}

f:id:nakamura001:20110716012458p:image

配置エリアを指定。

function OnGUI () {
	GUILayout.BeginArea (Rect (50, 50, 100, 150));
	GUILayout.Button ("test1");
	GUILayout.Button ("test2");
	GUILayout.Button ("test3");
	GUILayout.EndArea ();
}

f:id:nakamura001:20110716013539p:image

自動的に拡大/縮小する空白。指定位置にバネが入った様に他のGUIパーツが左右や上下に押さえ込まれます。

function OnGUI () {
	GUILayout.BeginArea (Rect (0,0,100,150));
	GUILayout.Button ("test1");
	GUILayout.FlexibleSpace ();
	GUILayout.Button ("test2");
	GUILayout.Button ("test3");
	GUILayout.EndArea ();
}

f:id:nakamura001:20110716012145p:image

最小の高さを指定。

function OnGUI () {
	GUILayout.BeginArea (Rect (0,0,100,150));
	GUILayout.Button ("test1", GUILayout.MinHeight(80));
	GUILayout.Button ("test2");
	GUILayout.Butto n("test3");
	GUILayout.EndArea();
}

f:id:nakamura001:20110716013538p:image

他のGUIパーツに合わせてサイズを拡大させない。

function OnGUI () {
	GUILayout.Button ("test1 hoge fuga");
	GUILayout.Button ("test2");
	GUILayout.Button ("test3", GUILayout.ExpandWidth(false));
}

f:id:nakamura001:20110716013537p:image

[][]CLRのバージョンを確認する方法

C#のファイルを新規作成して Start () に以下の様に記述すれば取得できました。

	void Start () {
		string clrVersionBuildtime = System.Reflection.Assembly.GetExecutingAssembly().ImageRuntimeVersion;
		Debug.Log(clrVersionBuildtime);
	}

参考ページ

@IT:.NET TIPS ビルド時および実行時のCLRバージョンを取得するには? - C# VB.NET

http://www.atmarkit.co.jp/fdotnet/dotnettips/278clrversion/clrversion.html

2011年07月14日

[][]iPhone/iPadのプラグインを作成する方法

f:id:nakamura001:20110715034312p:image

(2012/05/04 追記)

改訂版を書きました。こちらは Plugin/iOS フォルダを使って自動的にXcodeプロジェクトにファイルに含める方法を使った説明に改良してあります。

iPhone/iPadのプラグインを作成する方法(改訂版) - 強火で進め

http://d.hatena.ne.jp/nakamura001/20120504/1336095282

(追記ここまで)

UnityからXcodeで記述した機能が呼べるiPhone/iPadのプラグインを作成する方法を解説。今回のサンプルはこちらからDL出来ます。

プラグインを作ればネイティブコードで出来る事はなんでも出来ちゃいます。プラグインはiOS Proライセンスはもちろん、iOSライセンスでも作成可能です。

手順は以下の様になります。

1. ビルドしてXcodeのプロジェクトを作成。

2. Xcode側のプログラムを作成する為にファイルを生成。プログラムを記述する。

3. Unity側でXcode側のプログラムとUnity側のプログラムを橋渡しするプログラムを作成。

順番に詳しく解説します。 1. は問題無いと思うので 2. から

Xcode側のプログラムを作成する為にファイルを生成

今回はiPhone/iPadで設定されている言語を取得するプログラムを例に解説します。

※言語はプラグインを作らなくても Application.systemLanguage で取得出来そうな気がしますが実はiPhone/iPadでは Unknown が返され取得出来ません(3.5から出来る様になりました)。

Xcode上で LanguagePlugin.h/LanguagePlugin.m を作成し、.mファイルに以下の様に記述します。

char* MakeStringCopy (const char* string)
{
	if (string == NULL)
		return NULL;
	
	char* res = (char*)malloc(strlen(string) + 1);
	strcpy(res, string);
	return res;
}

char *CurrentLanguage_ () {
	NSArray *languages = [NSLocale preferredLanguages];
	NSString *currentLanguage = [languages objectAtIndex:0];
	return MakeStringCopy([currentLanguage UTF8String]);
}

CurrentLanguage_ () がメインの関数で MakeStringCopy() で文字列を加工しているのは以下を詳しく読んで貰うと分かりますが

Unity - Plugins - Pro/Mobile-Only Feature

http://unity3d.com/support/documentation/Manual/Plugins.html

文字列についてはこの様なルールが有るからです。

String values returned from a native method should be UTF-8 encoded and allocated on the heap. Mono marshaling calls are free for them.

コレに対処する為の処理は自分で作成しても良かったのですが公式で配布しているこちらのサンプルに記述が有ったのでそのまま流用しています。それが MakeStringCopy () となります。

このXcode側のプログラムのファイルは置く場所によってはUnityでビルドしてXcodeプロジェクトが再生成された時に(場合によっては)上書きされてしまうので以下のいずれかの位置に置くのが推奨されています。

・Unity側のプロジェクトの Assets フォルダ

Xcode側のプロジェクトの Classes フォルダ

今回は Assets フォルダに NativeCode というフォルダを作成し、そこにファイルを移動した後に再度、Xcodeのプロジェクトに追加しました。

Unity側でXcode側のプログラムとUnity側のプログラムを橋渡しするプログラムを作成

Unityに戻ってプログラムの橋渡しをするプログラムを作成します。

Plugins というフォルダを作成し、そこにC#のファイルを Binding という名前で作成します。

プログラムは以下。

using UnityEngine;
using System.Runtime.InteropServices;

public class Binding {
    [DllImport("__Internal")]
    private static extern string CurrentLanguage_ ();
 
    public static string CurrentLanguage () {
        if (Application.platform != RuntimePlatform.OSXEditor) {
            return CurrentLanguage_ ();
        } else {
        	return "";
        }
    }
}

この CurrentLanguage_ () がXcode側で作成した関数になります。

UnityのIDE上で実行した時にはこの関数を呼ぶことは出来ないので Application.platform でチェックをし、IDE上で実行中の場合は "" を返しています。

実際にこの CurrentLanguage() を呼ぶ場合はこの様にします。

Debug.Log( Binding.CurrentLanguage() );

今回は画面の左上に取得した言語を表示される様に、こんなプログラムを作成しました。

private var lang: String;

function Start () {
	lang = Binding.CurrentLanguage();
}

function OnGUI () {
	GUI.Label(Rect(20, 20, 100, 100), lang);
}

これを実行すると以下の様に画面の左上に小さく(※)現在の言語設定が表示されます。日本語に設定されている場合は ja と表示されます。

※UnityでiOS向けビルドで動的に大きい文字を使うのはちょっと手間なのでこうなってます。

f:id:nakamura001:20110715034333p:image

iPhone/iPadの言語設定については詳しくは以前書いたこちらを参照下さい。

補足情報

もし、Xcode側のプログラムをC++や.mmファイルで作成する場合はCから呼べるC++のプログラムを作成する時と同様に以下の様に extern "C" (リンケージ指定)が必要です。

extern "C" {
  float FooPluginFunction ();
} 

作成中になんだか上手く動かない場合には自分は以下の様なアラートを表示してデバッグしました。

	UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"テスト"
												   delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
	[alert show];
	[alert release];

関連情報

構造体を引数にする場合。

Specific steps to set up a plugin for iphone in XCode - Unity Answers

http://answers.unity3d.com/questions/10110/specific-steps-to-set-up-a-plugin-for-iphone-in-xc.html

Byte配列を引数にする場合。

Returning a byte array from ObjC to C# script on ios - Unity Answers

http://answers.unity3d.com/questions/132083/returning-a-byte-array-from-objc-to-c-script-on-io.html

[][]iOSライセンス→iOS Proライセンスの順番で購入した時の値段

以前、Unityのライセンスについての話を書いたのですがそこで結構重要な所が抜けてたので追記。

ライセンスごとの機能の違い - 強火で進め

http://d.hatena.ne.jp/nakamura001/20110710/1310292561

抜けていたのは「iOSライセンス→iOS Proライセンス」と購入した時の話。

なんと、Unityはこの様なアップデートの場合には差額だけで購入可能なのです。

その為、iOSライセンスを購入した後にやっぱりiOS Proライセンスが必要だなとなったら本来の13万6,000円から差額が引かれた9万9,500円で購入出来ます。実際はUnity Proライセンスも必要な為、合計は23万5,500円となります。

もちろん、引かれるのはiOS Proライセンスの料金だけでAndroidのライセンスやUnity Proライセンスなどは引かれません。また、購入フォームでiOSライセンスのシリアルを入力しないとこの割引きは行われないので購入時には気を付けて下さい。

f:id:nakamura001:20110714045609p:image

iOSライセンスにしようか、iOS Proライセンスにしようか悩んでる人は取りあえずiOSライセンスを買っちゃうのも有りだと思いますよ。

2011年07月13日

[][]UIや2Dゲームを作成出来るツール「Quad UI」(オープンソース)

Unity内に作成されたエディタでUIや2Dゲーム向けのオブジェクトが作成出来ます。現在はまだベータ版との事。

Materialに設定したテクスチャ画像から使用する部分を選択して「Bake」ボタンを押すとその部分が使用された板ポリゴンが生成されます。

詳しい使い方はこちらの動画を参照下さい。

D

D

Quad UI

http://blog.equals-equals.com/quadui/

(2012/03/18 追記)

Unity 3.5だとそのままだとちゃんと動かないみたいです。

テラシュールウェアブログ [Unity]2Dが苦手なunityの為の無料FW、Quad UIを試す!その1

http://terasur.blog.fc2.com/blog-entry-77.html

[][]テキストファイル(TextAsset)からレイアウト情報を読み込む

f:id:nakamura001:20110714020051p:image

プロジェクトファイルはこちら

プログラムはこちら。テキストファイルをTextAssetとして読み込んでいます。

【SetCubeScript.js】

var prefabs: GameObject[];
var layoutDataFile : TextAsset;
private var xMax: int;
private var yMax: int;
private var layoutData: int[];

function LoadLayoutData () {
	var lineArray = layoutDataFile.text.Split("\n"[0]);
	var dataArray;
	var x: int;
	var y: int;
	yMax = lineArray.length;
	if ((lineArray[lineArray.length-1].Trim()) == "") {
		yMax--;
	}
	dataArray = lineArray[y].Split(","[0]);
	xMax = dataArray.length;
	if ((dataArray[dataArray.length-1].Trim()) == "") {
		xMax--;
	}
	layoutData = new int[xMax*yMax];
	for (y=0; y<yMax; y++) {
		dataArray = lineArray[y].Split(","[0]);
		for (x=0; x<xMax; x++) {
			layoutData[y*xMax+x] = int.Parse(dataArray[x]);
		}
	}
}

function Start () {
	var x: int;
	var y: int;
	var xPos: float;
	var yPos: float;
	var prefIdx: int;
	LoadLayoutData();
	for (y=0; y<yMax; y++) {
		for (x=0; x<xMax; x++) {
			xPos = x*2-(xMax-1);
			yPos = -y*2+(yMax-1);
			prefIdx = layoutData[y*xMax+x];
			Instantiate(prefabs[prefIdx], Vector3(xPos, yPos, 0), Quaternion.identity);
		}
	}
}

function Update () {
}

レイアウト情報を保存しているテキストファイル(TextAsset)はこちら。

【layoutdata.txt】

1,0,1,0,0
1,0,1,0,0
1,0,0,0,0
1,1,1,1,1

2011年07月12日

[]iPhoneSafariTwitterの画面表示をPCと同じにする方法

(2012/04/03 追記)

※現在はこのページで紹介している方法がまた使える様になったみたいです。しかし、また使えなくなる可能性が有ります。その場合は下記のリンク先の方法で対応して下さい。

iPhoneでPCとTwitterのWebページを表示する方法 - 強火で進め

http://d.hatena.ne.jp/nakamura001/20130403/1364998427

(追記ここまで)

(2012/03/24 追記)

コメント欄に現在のTwitterではここで紹介している方法でもPCでの表示に切り変えられなく成っているとの情報を頂きました。

自分でも試してみた所、確かに使えなく成っていました。うーん、残念です。

(追記ここまで)

f:id:nakamura001:20110713031554p:image

iPhoneSafariTwitterを見る場合、以前であれば画面の最後にPC向けの表示へ切り替えるリングが有ったのですが現在では無くなっています。

しかも現在の表示ではPCでの表示に比べ、一部の機能が使えなかったりします。

そこで強制的にPCと同じ表示に切り替える方法を探してみた所、以下のURLを入力(またはタップして飛んでもOK)する事で切り替え可能でした。

https://mobile.twitter.com/settings/change_ui

f:id:nakamura001:20110713031552p:image

もし再度、iPhoneに最適化された表示に戻したい場合は以下のURLを入力またはタップして下さい。

https://mobile.twitter.com/

なお、Twitterのレスポンスが悪い時や3G回線だと実際に表示される前にタイムアウトに成ってしまうみたいです。その様な場合は諦めて本来の表示で使う様にしましょう。

(2011/09/25 追記)

Safariダメな時でも同様の手順でOpera Mini(無料アプリ)で試すと大丈夫でした。

そろそろ翻訳アプリ買おうかな?

最近、沢山の英語のドキュメントを読まないといけない事が多く、Google翻訳だけだとちょっときつく成って来ました。

という事で一時期検討していた翻訳アプリを本気で検討しようかな?と思ってちょっと調べてみたら「コリャ英和!一発翻訳 2012 for Mac」(Macで一般ユーザ向けだとこれくらいしか無いんですよね)の値段がかなり安く成ってるみたいでした。自分が確認した時点では7,790円でした。前は約1.5万円くらいだった気がしたのですが…

しかも、OCR機能まで付いてるみたいです。今まで画像ファイルで提供されているものは苦労して手打ちしてGoogle翻訳に通していた苦労も無くなりそうです。

うーん、この値段なら買おうかな?

コリャ英和!一発翻訳 2012 for Mac

コリャ英和!一発翻訳 2012 for Mac

[][]ゲームのスコア情報などを簡単に保存出来るPlayerPrefsクラス

f:id:nakamura001:20110712003527p:image

こんな感じにPlayerPrefsを使うと簡単にスコア情報を保存出来ます。

var Score : int = 0;

function Awake () {
	Score = PlayerPrefs.GetInt("Score");
}

function OnGUI () {
	if (GUI.Button(Rect(5, 5, 200, 50), "+1")) {
		Score++;
		PlayerPrefs.SetInt("Score", Score);
	}
	if (GUI.Button(Rect(5, 60, 200, 50), "Data Clear")) {
		Score = 0;
		PlayerPrefs.DeleteKey("Score");
	}
	GUI.Label(Rect(5, Screen.height-20, Screen.width-10, 50), "Scroe:"+Score);
}

その他に SetFloat や SetString など float や String データを保存可能です。

環境によってファイルの保存場所が異なり、以下の様になります。

Macスタンドアローン(.app)の場合

  • .plistファイルに保存
~/Library/Preferences/unity.[company name].[product name].plist

Windowsスタンドアローン(.exe)の場合

HKCU\Software\[company name]\[product name]

Web Player(Mac)の場合

  • 独自形式?のファイル
~/Library/Preferences/Unity/WebPlayerPrefs

Web Player(Win)の場合

  • 独自形式?のファイル
%APPDATA%\Unity\WebPlayerPrefs

Web Playerの場合はファイルサイズに1MBまでの制限有り。

Macスタンドアローンの.plistはこんな感じに出力されます。

f:id:nakamura001:20110712003528p:image

ファイルが更新されるのはアプリが終了したタイミングみたいです。それまではオンメモリで処理されるのかな?

関連情報

Unity Script Reference – PlayerPrefs

http://unity3d.com/support/documentation/ScriptReference/PlayerPrefs.html

[][]ターゲットプラットフォームを変更してiPhone/iPad向けアプリのサイズを減らす

Unity - Optimizing iOS Players build Size

http://unity3d.com/support/documentation/Manual/iphone-playerSizeOptimization.html

こちらの公式のドキュメントに有った、ターゲットプラットフォームを変更してどれくらい容量が削減されるか試してみました。

Unityで選択出来るiOS向けのターゲットプラットフォームは以下の3つ。

※ファイルサイズはFinderで確認したサイズ。

Api Compatibility Level は .NET 2.0 Subset を選択。

※公式ドキュメントではarmv6を選択するようにと記載。

ターゲットプラットフォームアプリのファイルサイズ
armv6 (OpenGL ES1.1)17.4MB
Universal armv6+armv7 (OpenGL ES1.1+2.0)29.2MB
armv7 (iPad only)17.5MB

確かにarmv6かarmv7だけにした場合にはUniversalのものに比べると随分削減出来るみたいです。

2011年07月11日

[][]JapaneseCalendarを使ってみた

Unityで使用可能な.NETクラスを見ていたらJapaneseCalendarなるものが有ったのでちょっと調べて使ってみました。.NETにはこんなクラスも有るんですね。

調べてみたらこのドキュメントが参考になりそうでした。残念ながらJScriptのサンプルが無かったのでC#で作ってみました。

JapaneseCalendar.GetYear メソッド (System.Globalization)

http://msdn.microsoft.com/ja-jp/library/system.globalization.japanesecalendar.getyear(v=vs.80).aspx

プログラムはこちら。動作内容は和暦での「現在の年月日」と「2年10ヶ月後」の年月日を表示するというものです。

以下の2つのファイルを適当なGameObjectに貼り付けて動作させて下さい。

【SamplesJapaneseCalendar.cs】

using UnityEngine;
using System;
using System.Globalization;


public class SamplesJapaneseCalendar : MonoBehaviour {

	public static void Main()  {
		DateTime myDT = DateTime.Now;
		JapaneseCalendar myCal = new JapaneseCalendar();

		Debug.Log( "本日:" );
		DisplayValues(myCal, myDT);

		// 2年10ヶ月進める
		myDT = myCal.AddYears( myDT, 2 );
		myDT = myCal.AddMonths( myDT, 10 );

		Debug.Log( "2年10ヶ月後:" );
		DisplayValues( myCal, myDT );

	}

	public static void DisplayValues( Calendar myCal, DateTime myDT )  {
		String Gengo = "";
		switch(myCal.GetEra( myDT )) {
			case 1:
				Gengo = "明治";
				break;
			case 2:
				Gengo = "大正";
				break;
			case 3:
				Gengo = "昭和";
				break;
			case 4:
				Gengo = "平成";
				break;
		}
		Debug.Log(Gengo+myCal.GetYear( myDT )+"年"+myCal.GetMonth( myDT )+"月"+myCal.GetDayOfMonth( myDT )+"日");
	}

}

【TestScript.cs】

using UnityEngine;
using System.Collections;

public class TestScript : MonoBehaviour {

	void Start () {
		SamplesJapaneseCalendar.Main();
	}
	
}

プログラムは元のサンプルを一部、Unity向けに修正するだけで動作しました。

この辺りはUntiyにC#が採用されている大きな利点ですね。

関連情報

数値と年号(元号)の対応ルールはこちらを参照。

JapaneseCalendar.GetEra メソッド (System.Globalization)

http://msdn.microsoft.com/ja-jp/library/system.globalization.japanesecalendar.getera(v=VS.80).aspx

[][]MacのMonoDevelopの日本語表示の文字化けの直し方

(2011/03/07 追記)

Unityのバージョン3.5に同梱されているものについては以下を参照。

MacのMonoDevelopの日本語表示の文字化けの直し方(3.5に同梱されているものの場合) - 強火で進め

http://d.hatena.ne.jp/nakamura001/20120306/1331046562

(追記ここまで)

以下のサイトを参考にアプリのパッケージ内のファイルを修正。

sd-tech: MonoDevelop(Unity) for Macの日本語文字化けを直す

http://www.sd-tech-blog.com/2011/01/monodevelopunity-for-mac.html

簡単に解説しておくとMonoDevelopアプリの「内容を表示」の後、以下のパスをエディタで開く。

Contents/Frameworks/Mono.framework/Versions/Current/etc/gtk-2.0/gtkrc

font = "Lucida Grande 14"の次の行に font_name の定義を追加して以下の様にします。

    font              = "Lucida Grande 14"
    font_name ="Hiragino Kaku Gothic Pro 10"

次にショートカットcommand+,で「Preferences」を表示し、以下の様に変更。

f:id:nakamura001:20110711151029p:image

(2011/07/28 追記)

エディタ内の日本語が文字化けする時。

同じく「Preferences」の「テキストエディタ」-「フォント」の項目に日本語に対応してないフォントが選択されていると文字化けします。

f:id:nakamura001:20110728191758p:image:w500

こんな感じにプレビューでも日本語の部分が□になってしまっているのが確認出来ます。

f:id:nakamura001:20110728191801p:image


ここで指定するのはエディタのフォントのなので等幅フォントが良いと思います。昔からのMacユーザの定番で有るOsakaを使うかお気に入りの等幅フォントを選択して下さい。

f:id:nakamura001:20110728191800p:image

f:id:nakamura001:20110728191759p:image:w500

ちなみに日本語の入力は出来ません(コピペは可能です)。

日本語の入力についてはGTK+が直るまでほったらかしの予定みたいです。

mac OSXのMonoDevelopで日本語入力出来ないのはGTK+のせいなの? : さとやn Blog

http://blog.livedoor.jp/satoyansoft/archives/65361312.html

[][]オライリーAndroid環境向けのOpenGL ES本「初めてのOpenGL ES」

初めてのOpenGL ES

初めてのOpenGL ES

目次。

本書に寄せて
はじめに

1部 2DとしてOpenGL ESを扱う

1章 OpenGL ESとAndroid
    1.1 OpenGLとは何なのか?
    1.2 OpenGL ESのバージョン
        1.2.1 Androidの対応バージョン
    1.3 OpenGL ESで利用するデータ型

2章 Hello OpenGL ES!
    2.1 プロジェクトのセットアップ
        2.1.1 SDKのインストール
        2.1.2 プロジェクト作成
        2.1.3 描画用SurfaceViewを追加する
    2.2 画面のどこを使うのか?
        2.2.1 画面を塗りつぶす
        2.2.2 GLSurfaceViewの制限

3章 簡単な図形を描画する
    3.1 正規化されたデバイス座標系の存在
    3.2 バイトオーダーの問題とjava.nioの存在
    3.3 OpenGL ESへの関連付けと描画
        3.3.1 頂点を使いまわすことによる最適化
        3.3.2 トライアングルストリップの活用
    3.4 任意座標への描画
    3.5 任意の色での描画

4章 画像を描画する
    4.1 テクスチャ、U、Vという存在
    4.2 テクスチャの制限
    4.3 テクスチャを読み込む
    4.4 頂点のUV座標を指定する
    4.5 テクスチャの指定領域を利用する
    4.6 文字を描画する
    4.7 複数枚のテクスチャを扱う

5章 画像をブレンドする
    5.1 ブレンディングという要素
    5.2 アルファブレンディング
        5.2.1 ブレンド計算を理解する

2部 メモリの効率化と速度向上のために

6章 行列のできるOpenGL
    6.1 行列とは?
        6.1.1 移動行列
        6.1.2 拡大縮小行列
        6.1.3 回転行列
    6.2 行列を乗算する際の注意点
    6.3 OpenGL ESで行列を操作する
        6.3.1 行列の適用順序
    6.4 行列を利用して任意の四角形を描画する
    6.5 行列でUV座標を操作する

7章 VertexBufferObjectで描画速度を向上する
    7.1 VertexBufferObjectとは?
    7.2 VBO利用の流れ
    7.3 UVバッファをVBOで利用する
    7.4 1つのVBOに頂点情報をまとめる

3部 3Dの基本

8章 カメラの概念
    8.1 現実をコンピュータ上に置き換えるということ
        8.1.1 gluPerspective関数

9章 インデックスバッファの存在
    9.1 インデックスバッファの必要性
    9.2 「頂点」と「ポリゴン」の分離
    9.3 インデックスバッファの利用
    9.4 インデックスバッファの利用例
        9.4.1 TRIANGLE_STRIPを利用してインデックスバッファを複数個
  用意した場合(例1)
        9.4.2 TRIANGLE_STRIPを利用してインデックスバッファを1つ
  用意した場合(例2)
        9.4.3 TRIANGLESによる正六面体描画(例3)
    9.5 インデックスバッファのVBO

10章 本格的に3Dを扱う
    10.1 「ローカル座標」と「ワールド座標」の考え方
    10.2 正六面体を複数描画する
    10.3 Zバッファの存在
        10.2.1 Zファイティングの存在
        10.2.2 指定位置に描画するための行列

11章 さらに本格的に3Dを利用する
    11.1 2Dと3Dを共存する

4部 3D知識の応用
12章 応用的な3D知識
    12.1 ライトとマテリアル
    12.2 3Dプログラムにおけるライトとは?
    12.3 3Dプログラムにおけるマテリアルとは?
        12.3.1 頂点の向きを考える
        12.3.2 ライトの情報を変更する
    12.4 マテリアルの設定

13章 フォグによる遠近の演出
    13.1 フォグを使ってみる
        13.1.1 リニア方式でフォグを指定する
    13.2 ポイントスプライトの活用
    13.3 ポリゴンの表と裏

5部 実践編

14章 実際のツールと連携する
    14.1 3DCG用ツールについて
    14.2 3DCG用ツールとは?
    14.3 モデルを構成する要素
        14.3.1 Metasequoia形式からOpenGL ESへの読み込み
    14.4 OpenGL ESへの転送
    14.5 画面内にモデルを表示する

15章 より実践的にOpenGL ESを利用する
    15.1 「アルファテスト」を利用する
    15.2 「ポリゴンの反転」を利用する
    15.3 おわりに

付録A 圧縮テクスチャを利用する
    A.1 圧縮テクスチャとは?
        A.1.1 無圧縮テクスチャについて
    A.2 圧縮テクスチャの例
    A.3 256色BitmapをAndroidで直接読み込む
    A.4 256色パレットテクスチャを生成する

付録B GLSurfaceViewから脱却する
    B.1 GLSurfaceViiewの問題点とその改善
        B.1.1 SurfaceViewの準備
        B.1.2 SurfaceHolderのコールバックを待つ
    B.2 描画用メソッドの実装
    B.3 休止・復帰処理の追加

付録C ライブ壁紙でOpenGL ESを利用する
    C.1 ライブ壁紙とは?
    C.2 ライブ壁紙を作成する
        C.2.1 EngineがOSから受け取るメッセージ
    C.3 XMLの編集

索引

関連情報

O'Reilly Japan - 初めてのOpenGL ES

http://www.oreilly.co.jp/books/9784873114965/

[][]Unityで使用可能な.NETクラス

以下の1508個のクラスが使用可能です。

※この一覧に検索用のリンクも一緒に付けておきたかったのですが付けるとはてダの1エントリーでの容量制限に引っかかるみたいなのでリンク付きはこちらに作成しました。

  • Object
  • ValueType
  • Attribute
  • Int32
  • SerializableAttribute
  • AttributeUsageAttribute
  • Int64
  • UInt32
  • CLSCompliantAttribute
  • UInt64
  • Byte
  • SByte
  • Int16
  • UInt16
  • Char
  • String
  • Single
  • Double
  • Decimal
  • Boolean
  • IntPtr
  • UIntPtr
  • Delegate
  • Enum
  • Array
  • Type
  • Exception
  • RuntimeFieldHandle
  • RuntimeTypeHandle
  • ParamArrayAttribute
  • ObsoleteAttribute
  • TypedReference
  • ArgIterator
  • MarshalByRefObject
  • Nullable<T>
  • AccessViolationException
  • ActivationContext
  • Activator
  • AppDomain
  • AppDomainManager
  • AppDomainSetup
  • AppDomainUnloadedException
  • ApplicationException
  • ApplicationId
  • ApplicationIdentity
  • ArgumentException
  • ArgumentNullException
  • ArgumentOutOfRangeException
  • ArithmeticException
  • ArrayTypeMismatchException
  • AssemblyLoadEventArgs
  • BadImageFormatException
  • BitConverter
  • Buffer
  • CannotUnloadAppDomainException
  • CharEnumerator
  • Console
  • ConsoleCancelEventArgs
  • ConsoleKeyInfo
  • ContextMarshalException
  • ContextStaticAttribute
  • Convert
  • DataMisalignedException
  • DateTime
  • DateTimeOffset
  • DBNull
  • DivideByZeroException
  • DllNotFoundException
  • DuplicateWaitObjectException
  • EntryPointNotFoundException
  • Environment
  • EventArgs
  • ExecutionEngineException
  • FieldAccessException
  • FlagsAttribute
  • FormatException
  • GC
  • Guid
  • IndexOutOfRangeException
  • InsufficientMemoryException
  • InvalidCastException
  • InvalidOperationException
  • InvalidProgramException
  • LoaderOptimizationAttribute
  • Math
  • MemberAccessException
  • MethodAccessException
  • MissingFieldException
  • MissingMemberException
  • MissingMethodException
  • MTAThreadAttribute
  • MulticastNotSupportedException
  • NonSerializedAttribute
  • NotFiniteNumberException
  • NotImplementedException
  • NotSupportedException
  • Nullable
  • NullReferenceException
  • ObjectDisposedException
  • OperatingSystem
  • OperationCanceledException
  • OutOfMemoryException
  • OverflowException
  • PlatformNotSupportedException
  • Random
  • RankException
  • ResolveEventArgs
  • RuntimeMethodHandle
  • ModuleHandle
  • StackOverflowException
  • STAThreadAttribute
  • StringComparer
  • SystemException
  • ThreadStaticAttribute
  • TimeSpan
  • TimeZone
  • TimeoutException
  • TypeInitializationException
  • TypeLoadException
  • TypeUnloadedException
  • UnauthorizedAccessException
  • UnhandledExceptionEventArgs
  • Version
  • WeakReference
  • ArraySegment<T>
  • InvalidTimeZoneException
  • TimeZoneInfo
  • TimeZoneNotFoundException
  • FileStyleUriParser
  • FtpStyleUriParser
  • GenericUriParser
  • GopherStyleUriParser
  • HttpStyleUriParser
  • LdapStyleUriParser
  • NetPipeStyleUriParser
  • NetTcpStyleUriParser
  • NewsStyleUriParser
  • UriBuilder
  • Uri
  • UriFormatException
  • UriParser
  • UriTypeConverter
  • ComVisibleAttribute
  • OutAttribute
  • DllImportAttribute
  • MarshalAsAttribute
  • InAttribute
  • GuidAttribute
  • ComImportAttribute
  • CoClassAttribute
  • OptionalAttribute
  • DefaultCharSetAttribute
  • StructLayoutAttribute
  • FieldOffsetAttribute
  • AllowReversePInvokeCallsAttribute
  • ArrayWithOffset
  • AutomationProxyAttribute
  • BestFitMappingAttribute
  • BIND_OPTS
  • BINDPTR
  • BStrWrapper
  • ClassInterfaceAttribute
  • ComAliasNameAttribute
  • ComCompatibleVersionAttribute
  • ComConversionLossAttribute
  • ComDefaultInterfaceAttribute
  • COMException
  • ComEventInterfaceAttribute
  • ComRegisterFunctionAttribute
  • ComSourceInterfacesAttribute
  • ComUnregisterFunctionAttribute
  • CONNECTDATA
  • CriticalHandle
  • CurrencyWrapper
  • DispatchWrapper
  • DISPPARAMS
  • DispIdAttribute
  • ELEMDESC
  • ErrorWrapper
  • EXCEPINFO
  • ExtensibleClassFactory
  • ExternalException
  • FILETIME
  • FUNCDESC
  • GCHandle
  • HandleRef
  • IDispatchImplAttribute
  • IDLDESC
  • ImportedFromTypeLibAttribute
  • InterfaceTypeAttribute
  • InvalidComObjectException
  • InvalidOleVariantTypeException
  • LCIDConversionAttribute
  • Marshal
  • MarshalDirectiveException
  • PARAMDESC
  • PreserveSigAttribute
  • PrimaryInteropAssemblyAttribute
  • SEHException
  • STATSTG
  • ProgIdAttribute
  • RegistrationServices
  • RuntimeEnvironment
  • SafeArrayRankMismatchException
  • SafeArrayTypeMismatchException
  • SafeHandle
  • SetWin32ContextInIDispatchAttribute
  • TYPEATTR
  • TYPEDESC
  • TYPELIBATTR
  • TypeLibConverter
  • TypeLibFuncAttribute
  • TypeLibImportClassAttribute
  • TypeLibTypeAttribute
  • TypeLibVarAttribute
  • TypeLibVersionAttribute
  • UnknownWrapper
  • UnmanagedFunctionPointerAttribute
  • VARDESC
  • VariantWrapper
  • DefaultParameterValueAttribute
  • HandleCollector
  • MemberInfo
  • AssemblyCultureAttribute
  • AssemblyVersionAttribute
  • DefaultMemberAttribute
  • AmbiguousMatchException
  • Assembly
  • AssemblyAlgorithmIdAttribute
  • AssemblyCompanyAttribute
  • AssemblyConfigurationAttribute
  • AssemblyCopyrightAttribute
  • AssemblyDefaultAliasAttribute
  • AssemblyDelaySignAttribute
  • AssemblyDescriptionAttribute
  • AssemblyFileVersionAttribute
  • AssemblyFlagsAttribute
  • AssemblyInformationalVersionAttribute
  • AssemblyKeyFileAttribute
  • AssemblyKeyNameAttribute
  • AssemblyName
  • AssemblyNameProxy
  • AssemblyProductAttribute
  • AssemblyTitleAttribute
  • AssemblyTrademarkAttribute
  • Binder
  • ConstructorInfo
  • CustomAttributeData
  • CustomAttributeFormatException
  • CustomAttributeNamedArgument
  • CustomAttributeTypedArgument
  • EventInfo
  • ExceptionHandlingClause
  • FieldInfo
  • InterfaceMapping
  • InvalidFilterCriteriaException
  • LocalVariableInfo
  • ManifestResourceInfo
  • MethodBase
  • MethodBody
  • MethodInfo
  • Missing
  • Module
  • ObfuscateAssemblyAttribute
  • ObfuscationAttribute
  • ParameterInfo
  • ParameterModifier
  • Pointer
  • PropertyInfo
  • ReflectionTypeLoadException
  • StrongNameKeyPair
  • TargetException
  • TargetInvocationException
  • TargetParameterCountException
  • TypeDelegator
  • MethodImplAttribute
  • IndexerNameAttribute
  • RequiredAttributeAttribute
  • TypeForwardedToAttribute
  • FixedBufferAttribute
  • CompilerGeneratedAttribute
  • InternalsVisibleToAttribute
  • RuntimeCompatibilityAttribute
  • UnsafeValueTypeAttribute
  • DecimalConstantAttribute
  • RuntimeHelpers
  • AccessedThroughPropertyAttribute
  • CallConvCdecl
  • CallConvFastcall
  • CallConvThiscall
  • CallConvStdcall
  • CompilationRelaxationsAttribute
  • CompilerGlobalScopeAttribute
  • CustomConstantAttribute
  • DateTimeConstantAttribute
  • DefaultDependencyAttribute
  • DependencyAttribute
  • DiscardableAttribute
  • FixedAddressValueTypeAttribute
  • HasCopySemanticsAttribute
  • IDispatchConstantAttribute
  • IUnknownConstantAttribute
  • NativeCppClassAttribute
  • RuntimeWrappedException
  • SpecialNameAttribute
  • ScopelessEnumAttribute
  • SuppressIldasmAttribute
  • StringFreezingAttribute
  • ExtensionAttribute
  • ExecutionScope
  • StrongBox<T>
  • ConditionalAttribute
  • DebuggerHiddenAttribute
  • DebuggableAttribute
  • Debugger
  • DebuggerBrowsableAttribute
  • DebuggerDisplayAttribute
  • DebuggerNonUserCodeAttribute
  • DebuggerStepThroughAttribute
  • DebuggerStepperBoundaryAttribute
  • DebuggerTypeProxyAttribute
  • DebuggerVisualizerAttribute
  • StackFrame
  • StackTrace
  • BooleanSwitch
  • ConsoleTraceListener
  • CorrelationManager
  • CounterCreationDataCollection
  • CounterCreationData
  • CounterSampleCalculator
  • CounterSample
  • DataReceivedEventArgs
  • Debug
  • DefaultTraceListener
  • DelimitedListTraceListener
  • DiagnosticsConfigurationHandler
  • EntryWrittenEventArgs
  • EventInstance
  • EventLog
  • EventLogEntryCollection
  • EventLogEntry
  • EventLogPermissionAttribute
  • EventLogPermission
  • EventLogPermissionEntryCollection
  • EventLogPermissionEntry
  • EventLogTraceListener
  • EventSourceCreationData
  • EventTypeFilter
  • FileVersionInfo
  • InstanceDataCollectionCollection
  • InstanceDataCollection
  • InstanceData
  • MonitoringDescriptionAttribute
  • PerformanceCounterCategory
  • PerformanceCounter
  • PerformanceCounterManager
  • PerformanceCounterPermissionAttribute
  • PerformanceCounterPermission
  • PerformanceCounterPermissionEntryCollection
  • PerformanceCounterPermissionEntry
  • Process
  • ProcessModuleCollection
  • ProcessModule
  • ProcessStartInfo
  • ProcessThreadCollection
  • ProcessThread
  • SourceFilter
  • SourceSwitch
  • Switch
  • SwitchAttribute
  • SwitchLevelAttribute
  • Stopwatch
  • TextWriterTraceListener
  • Trace
  • TraceEventCache
  • TraceFilter
  • TraceListenerCollection
  • TraceListener
  • TraceSource
  • TraceSwitch
  • XmlWriterTraceListener
  • SecurityAttribute
  • EnvironmentPermission
  • EnvironmentPermissionAttribute
  • FileDialogPermission
  • FileDialogPermissionAttribute
  • FileIOPermission
  • FileIOPermissionAttribute
  • GacIdentityPermission
  • GacIdentityPermissionAttribute
  • HostProtectionAttribute
  • IsolatedStorageFilePermission
  • IsolatedStorageFilePermissionAttribute
  • IsolatedStoragePermission
  • IsolatedStoragePermissionAttribute
  • KeyContainerPermission
  • KeyContainerPermissionAccessEntry
  • KeyContainerPermissionAccessEntryCollection
  • KeyContainerPermissionAccessEntryEnumerator
  • KeyContainerPermissionAttribute
  • PermissionSetAttribute
  • PrincipalPermission
  • PrincipalPermissionAttribute
  • PublisherIdentityPermission
  • PublisherIdentityPermissionAttribute
  • ReflectionPermission
  • ReflectionPermissionAttribute
  • RegistryPermission
  • RegistryPermissionAttribute
  • SecurityPermission
  • SecurityPermissionAttribute
  • SiteIdentityPermission
  • SiteIdentityPermissionAttribute
  • StrongNameIdentityPermission
  • StrongNameIdentityPermissionAttribute
  • StrongNamePublicKeyBlob
  • UIPermission
  • UIPermissionAttribute
  • UrlIdentityPermission
  • UrlIdentityPermissionAttribute
  • ZoneIdentityPermission
  • ZoneIdentityPermissionAttribute
  • ResourcePermissionBase
  • ResourcePermissionBaseEntry
  • StorePermissionAttribute
  • StorePermission
  • RegistryKey
  • Registry
  • IntranetZoneCredentialPolicy
  • PowerModeChangedEventArgs
  • SessionEndedEventArgs
  • SessionEndingEventArgs
  • SessionSwitchEventArgs
  • SystemEvents
  • TimerElapsedEventArgs
  • UserPreferenceChangedEventArgs
  • UserPreferenceChangingEventArgs
  • CriticalHandleZeroOrMinusOneIsInvalid
  • CriticalHandleMinusOneIsInvalid
  • SafeHandleZeroOrMinusOneIsInvalid
  • SafeHandleMinusOneIsInvalid
  • SafeFileHandle
  • SafeWaitHandle
  • SafePipeHandle
  • SortKey
  • Calendar
  • CharUnicodeInfo
  • ChineseLunisolarCalendar
  • CompareInfo
  • CultureInfo
  • DateTimeFormatInfo
  • DaylightTime
  • EastAsianLunisolarCalendar
  • GregorianCalendar
  • HebrewCalendar
  • HijriCalendar
  • IdnMapping
  • JapaneseCalendar
  • JapaneseLunisolarCalendar
  • JulianCalendar
  • KoreanCalendar
  • KoreanLunisolarCalendar
  • NumberFormatInfo
  • PersianCalendar
  • RegionInfo
  • StringInfo
  • TaiwanCalendar
  • TaiwanLunisolarCalendar
  • TextElementEnumerator
  • TextInfo
  • ThaiBuddhistCalendar
  • UmAlQuraCalendar
  • ArrayList
  • BitArray
  • CaseInsensitiveComparer
  • CaseInsensitiveHashCodeProvider
  • CollectionBase
  • Comparer
  • DictionaryBase
  • DictionaryEntry
  • Hashtable
  • Queue
  • ReadOnlyCollectionBase
  • SortedList
  • Stack
  • AssemblyHash
  • InternalActivationContextHelper
  • InternalApplicationIdentityHelper
  • SuppressMessageAttribute
  • SymbolToken
  • SymDocumentType
  • SymLanguageType
  • SymLanguageVendor
  • BinaryReader
  • BinaryWriter
  • BufferedStream
  • Directory
  • DirectoryInfo
  • DirectoryNotFoundException
  • DriveInfo
  • DriveNotFoundException
  • EndOfStreamException
  • File
  • FileInfo
  • FileLoadException
  • FileNotFoundException
  • FileStream
  • FileSystemInfo
  • IOException
  • MemoryStream
  • Path
  • PathTooLongException
  • Stream
  • StreamReader
  • StreamWriter
  • StringReader
  • StringWriter
  • TextReader
  • TextWriter
  • UnmanagedMemoryStream
  • ErrorEventArgs
  • FileSystemEventArgs
  • FileSystemWatcher
  • InternalBufferOverflowException
  • InvalidDataException
  • IODescriptionAttribute
  • RenamedEventArgs
  • WaitForChangedResult
  • IsolatedStorage
  • IsolatedStorageException
  • IsolatedStorageFile
  • IsolatedStorageFileStream
  • AssemblyBuilder
  • ConstructorBuilder
  • CustomAttributeBuilder
  • DynamicILInfo
  • DynamicMethod
  • EnumBuilder
  • EventBuilder
  • EventToken
  • FieldBuilder
  • FieldToken
  • GenericTypeParameterBuilder
  • ILGenerator
  • Label
  • LocalBuilder
  • MethodBuilder
  • MethodToken
  • MethodRental
  • ModuleBuilder
  • OpCode
  • OpCodes
  • ParameterBuilder
  • ParameterToken
  • PropertyBuilder
  • PropertyToken
  • SignatureHelper
  • SignatureToken
  • StringToken
  • TypeBuilder
  • TypeToken
  • UnmanagedMarshal
  • MissingManifestResourceException
  • MissingSatelliteAssemblyException
  • NeutralResourcesLanguageAttribute
  • ResourceManager
  • ResourceReader
  • ResourceSet
  • ResourceWriter
  • SatelliteContractVersionAttribute
  • GCSettings
  • MemoryFailPoint
  • PrePrepareMethodAttribute
  • ReliabilityContractAttribute
  • ActivationArguments
  • ApplicationActivator
  • BINDPTR
  • BIND_OPTS
  • CONNECTDATA
  • DISPPARAMS
  • ELEMDESC
  • EXCEPINFO
  • FILETIME
  • FUNCDESC
  • IDLDESC
  • PARAMDESC
  • STATSTG
  • TYPEATTR
  • TYPEDESC
  • TYPELIBATTR
  • VARDESC
  • FORMATETC
  • STATDATA
  • STGMEDIUM
  • ActivatedClientTypeEntry
  • ActivatedServiceTypeEntry
  • InternalRemotingServices
  • ObjectHandle
  • ObjRef
  • RemotingConfiguration
  • RemotingException
  • RemotingTimeoutException
  • RemotingServices
  • ServerException
  • SoapServices
  • TypeEntry
  • WellKnownClientTypeEntry
  • WellKnownServiceTypeEntry
  • UrlAttribute
  • BaseChannelObjectWithProperties
  • BaseChannelWithProperties
  • ChannelDataStore
  • ChannelServices
  • ClientChannelSinkStack
  • ServerChannelSinkStack
  • SinkProviderData
  • TransportHeaders
  • Context
  • ContextAttribute
  • ContextProperty
  • SynchronizationAttribute
  • ClientSponsor
  • LifetimeServices
  • AsyncResult
  • CallContext
  • ConstructionCall
  • ConstructionResponse
  • Header
  • InternalMessageWrapper
  • LogicalCallContext
  • MethodCall
  • MethodCallMessageWrapper
  • MethodResponse
  • MethodReturnMessageWrapper
  • OneWayAttribute
  • RemotingSurrogateSelector
  • ReturnMessage
  • SoapAttribute
  • SoapFieldAttribute
  • SoapMethodAttribute
  • SoapParameterAttribute
  • SoapTypeAttribute
  • SoapAnyUri
  • SoapEntity
  • SoapMonth
  • SoapNonNegativeInteger
  • SoapToken
  • SoapBase64Binary
  • SoapHexBinary
  • SoapMonthDay
  • SoapNonPositiveInteger
  • SoapYear
  • SoapDate
  • SoapId
  • SoapName
  • SoapNormalizedString
  • SoapYearMonth
  • SoapDateTime
  • SoapIdref
  • SoapNcName
  • SoapNotation
  • SoapDay
  • SoapIdrefs
  • SoapNegativeInteger
  • SoapPositiveInteger
  • SoapDuration
  • SoapInteger
  • SoapNmtoken
  • SoapQName
  • SoapEntities
  • SoapLanguage
  • SoapNmtokens
  • SoapTime
  • RealProxy
  • ProxyAttribute
  • EnterpriseServicesHelper
  • TrackingServices
  • Formatter
  • FormatterConverter
  • FormatterServices
  • ObjectIDGenerator
  • ObjectManager
  • OnDeserializedAttribute
  • OnDeserializingAttribute
  • OnSerializedAttribute
  • OnSerializingAttribute
  • OptionalFieldAttribute
  • SerializationBinder
  • SerializationEntry
  • SerializationException
  • SerializationInfo
  • SerializationInfoEnumerator
  • SerializationObjectManager
  • StreamingContext
  • SurrogateSelector
  • InternalRM
  • InternalST
  • ServerFault
  • SoapFault
  • SoapMessage
  • BinaryFormatter
  • ResourceConsumptionAttribute
  • ResourceExposureAttribute
  • VersioningHelper
  • AllowPartiallyTrustedCallersAttribute
  • CodeAccessPermission
  • HostProtectionException
  • HostSecurityManager
  • NamedPermissionSet
  • PermissionSet
  • SecureString
  • SecurityContext
  • SecurityCriticalAttribute
  • SecurityElement
  • SecurityException
  • SecurityManager
  • SecuritySafeCriticalAttribute
  • SecurityState
  • SecurityTransparentAttribute
  • SecurityTreatAsSafeAttribute
  • SuppressUnmanagedCodeSecurityAttribute
  • UnverifiableCodeAttribute
  • VerificationException
  • XmlSyntaxException
  • AccessRule
  • AceEnumerator
  • AuditRule
  • AuthorizationRule
  • AuthorizationRuleCollection
  • CommonAce
  • CommonAcl
  • CommonObjectSecurity
  • CommonSecurityDescriptor
  • CompoundAce
  • CryptoKeyAccessRule
  • CryptoKeyAuditRule
  • CryptoKeySecurity
  • CustomAce
  • DirectoryObjectSecurity
  • DirectorySecurity
  • DiscretionaryAcl
  • EventWaitHandleAccessRule
  • EventWaitHandleAuditRule
  • EventWaitHandleSecurity
  • FileSecurity
  • FileSystemAccessRule
  • FileSystemAuditRule
  • FileSystemSecurity
  • GenericAce
  • GenericAcl
  • GenericSecurityDescriptor
  • KnownAce
  • MutexAccessRule
  • MutexAuditRule
  • MutexSecurity
  • ObjectAccessRule
  • ObjectAce
  • ObjectAuditRule
  • ObjectSecurity
  • PrivilegeNotHeldException
  • QualifiedAce
  • RawAcl
  • RawSecurityDescriptor
  • RegistryAccessRule
  • RegistryAuditRule
  • RegistrySecurity
  • SystemAcl
  • SemaphoreAccessRule
  • SemaphoreAuditRule
  • SemaphoreSecurity
  • AsymmetricAlgorithm
  • AsymmetricKeyExchangeDeformatter
  • AsymmetricKeyExchangeFormatter
  • AsymmetricSignatureDeformatter
  • AsymmetricSignatureFormatter
  • CryptoAPITransform
  • CryptoConfig
  • CryptographicException
  • CryptographicUnexpectedOperationException
  • CryptoStream
  • CspKeyContainerInfo
  • CspParameters
  • DeriveBytes
  • DES
  • DESCryptoServiceProvider
  • DSA
  • DSACryptoServiceProvider
  • DSAParameters
  • DSASignatureDeformatter
  • DSASignatureFormatter
  • FromBase64Transform
  • HashAlgorithm
  • HMAC
  • HMACMD5
  • HMACRIPEMD160
  • HMACSHA1
  • HMACSHA256
  • HMACSHA384
  • HMACSHA512
  • KeyedHashAlgorithm
  • KeySizes
  • MACTripleDES
  • MaskGenerationMethod
  • MD5
  • MD5CryptoServiceProvider
  • PasswordDeriveBytes
  • PKCS1MaskGenerationMethod
  • RandomNumberGenerator
  • RC2
  • RC2CryptoServiceProvider
  • Rfc2898DeriveBytes
  • Rijndael
  • RijndaelManaged
  • RijndaelManagedTransform
  • RIPEMD160
  • RIPEMD160Managed
  • RNGCryptoServiceProvider
  • RSA
  • RSACryptoServiceProvider
  • RSAOAEPKeyExchangeDeformatter
  • RSAOAEPKeyExchangeFormatter
  • RSAParameters
  • RSAPKCS1KeyExchangeDeformatter
  • RSAPKCS1KeyExchangeFormatter
  • RSAPKCS1SignatureDeformatter
  • RSAPKCS1SignatureFormatter
  • SHA1
  • SHA1CryptoServiceProvider
  • SHA1Managed
  • SHA256
  • SHA256Managed
  • SHA384
  • SHA384Managed
  • SHA512
  • SHA512Managed
  • SignatureDescription
  • SymmetricAlgorithm
  • ToBase64Transform
  • TripleDES
  • TripleDESCryptoServiceProvider
  • Aes
  • AesManaged
  • AesCryptoServiceProvider
  • CngAlgorithm
  • CngAlgorithmGroup
  • AsnEncodedDataCollection
  • AsnEncodedData
  • AsnEncodedDataEnumerator
  • OidCollection
  • Oid
  • OidEnumerator
  • X509Certificate
  • PublicKey
  • X500DistinguishedName
  • X509BasicConstraintsExtension
  • X509Certificate2Collection
  • X509Certificate2
  • X509Certificate2Enumerator
  • X509CertificateCollection
  • X509Chain
  • X509ChainElementCollection
  • X509ChainElement
  • X509ChainElementEnumerator
  • X509ChainPolicy
  • X509ChainStatus
  • X509EnhancedKeyUsageExtension
  • X509ExtensionCollection
  • X509Extension
  • X509ExtensionEnumerator
  • X509KeyUsageExtension
  • X509Store
  • X509SubjectKeyIdentifierExtension
  • AllMembershipCondition
  • ApplicationDirectory
  • ApplicationDirectoryMembershipCondition
  • ApplicationSecurityInfo
  • ApplicationSecurityManager
  • ApplicationTrust
  • ApplicationTrustCollection
  • ApplicationTrustEnumerator
  • CodeConnectAccess
  • CodeGroup
  • Evidence
  • FileCodeGroup
  • FirstMatchCodeGroup
  • GacInstalled
  • GacMembershipCondition
  • Hash
  • HashMembershipCondition
  • NetCodeGroup
  • PermissionRequestEvidence
  • PolicyException
  • PolicyLevel
  • PolicyStatement
  • Publisher
  • PublisherMembershipCondition
  • Site
  • SiteMembershipCondition
  • StrongName
  • StrongNameMembershipCondition
  • TrustManagerContext
  • UnionCodeGroup
  • Url
  • UrlMembershipCondition
  • Zone
  • ZoneMembershipCondition
  • GenericIdentity
  • GenericPrincipal
  • IdentityNotMappedException
  • IdentityReferenceCollection
  • IdentityReference
  • NTAccount
  • SecurityIdentifier
  • WindowsIdentity
  • WindowsImpersonationContext
  • WindowsPrincipal
  • ASCIIEncoding
  • Decoder
  • DecoderExceptionFallback
  • DecoderExceptionFallbackBuffer
  • DecoderFallback
  • DecoderFallbackBuffer
  • DecoderFallbackException
  • DecoderReplacementFallback
  • DecoderReplacementFallbackBuffer
  • Encoder
  • EncoderExceptionFallback
  • EncoderExceptionFallbackBuffer
  • EncoderFallback
  • EncoderFallbackBuffer
  • EncoderFallbackException
  • EncoderReplacementFallback
  • EncoderReplacementFallbackBuffer
  • Encoding
  • EncodingInfo
  • StringBuilder
  • UnicodeEncoding
  • UTF7Encoding
  • UTF8Encoding
  • UTF32Encoding
  • AbandonedMutexException
  • AsyncFlowControl
  • AutoResetEvent
  • CompressedStack
  • EventWaitHandle
  • ExecutionContext
  • HostExecutionContext
  • HostExecutionContextManager
  • Interlocked
  • LockCookie
  • ManualResetEvent
  • Monitor
  • Mutex
  • NativeOverlapped
  • Overlapped
  • ReaderWriterLock
  • RegisteredWaitHandle
  • SynchronizationContext
  • SynchronizationLockException
  • Thread
  • ThreadAbortException
  • ThreadInterruptedException
  • ThreadPool
  • ThreadStateException
  • Timeout
  • Timer
  • WaitHandle
  • WaitHandleCannotBeOpenedException
  • LockRecursionException
  • ReaderWriterLockSlim
  • Semaphore
  • SemaphoreFullException
  • ThreadExceptionEventArgs
  • Dictionary<TKey,TValue>
  • KeyValuePair<TKey,TValue>
  • EqualityComparer<T>
  • KeyNotFoundException
  • List<T>
  • Comparer<T>
  • HashSet<T>
  • LinkedList<T>
  • LinkedListNode<T>
  • Queue<T>
  • SortedDictionary<TKey,TValue>
  • SortedList<TKey,TValue>
  • Stack<T>
  • Collection<T>
  • KeyedCollection<TKey,TItem>
  • ReadOnlyCollection<T>
  • Expression<TDelegate>
  • LambdaExpression
  • Expression
  • BinaryExpression
  • ConditionalExpression
  • ConstantExpression
  • ElementInit
  • InvocationExpression
  • ListInitExpression
  • MemberAssignment
  • MemberBinding
  • MemberExpression
  • MemberInitExpression
  • MemberListBinding
  • MemberMemberBinding
  • MethodCallExpression
  • NewArrayExpression
  • NewExpression
  • ParameterExpression
  • TypeBinaryExpression
  • UnaryExpression
  • KeyBuilder
  • BlockProcessor
  • Enumerable
  • Lookup<TKey,TElement>
  • Queryable
  • AnonymousPipeClientStream
  • AnonymousPipeServerStream
  • NamedPipeClientStream
  • NamedPipeServerStream
  • PipeAccessRule
  • PipeAuditRule
  • PipeSecurity
  • PipeStream
  • CSharpCodeProvider
  • VBCodeProvider
  • CodeArgumentReferenceExpression
  • CodeArrayCreateExpression
  • CodeArrayIndexerExpression
  • CodeAssignStatement
  • CodeAttachEventStatement
  • CodeAttributeArgumentCollection
  • CodeAttributeArgument
  • CodeAttributeDeclarationCollection
  • CodeAttributeDeclaration
  • CodeBaseReferenceExpression
  • CodeBinaryOperatorExpression
  • CodeCastExpression
  • CodeCatchClauseCollection
  • CodeCatchClause
  • CodeChecksumPragma
  • CodeComment
  • CodeCommentStatementCollection
  • CodeCommentStatement
  • CodeCompileUnit
  • CodeConditionStatement
  • CodeConstructor
  • CodeDefaultValueExpression
  • CodeDelegateCreateExpression
  • CodeDelegateInvokeExpression
  • CodeDirectionExpression
  • CodeDirectiveCollection
  • CodeDirective
  • CodeEntryPointMethod
  • CodeEventReferenceExpression
  • CodeExpressionCollection
  • CodeExpression
  • CodeExpressionStatement
  • CodeFieldReferenceExpression
  • CodeGotoStatement
  • CodeIndexerExpression
  • CodeIterationStatement
  • CodeLabeledStatement
  • CodeLinePragma
  • CodeMemberEvent
  • CodeMemberField
  • CodeMemberMethod
  • CodeMemberProperty
  • CodeMethodInvokeExpression
  • CodeMethodReferenceExpression
  • CodeMethodReturnStatement
  • CodeNamespaceCollection
  • CodeNamespace
  • CodeNamespaceImportCollection
  • CodeNamespaceImport
  • CodeObjectCreateExpression
  • CodeObject
  • CodeParameterDeclarationExpressionCollection
  • CodeParameterDeclarationExpression
  • CodePrimitiveExpression
  • CodePropertyReferenceExpression
  • CodePropertySetValueReferenceExpression
  • CodeRegionDirective
  • CodeRemoveEventStatement
  • CodeSnippetCompileUnit
  • CodeSnippetExpression
  • CodeSnippetStatement
  • CodeSnippetTypeMember
  • CodeStatementCollection
  • CodeStatement
  • CodeThisReferenceExpression
  • CodeThrowExceptionStatement
  • CodeTryCatchFinallyStatement
  • CodeTypeConstructor
  • CodeTypeDeclarationCollection
  • CodeTypeDeclaration
  • CodeTypeDelegate
  • CodeTypeMemberCollection
  • CodeTypeMember
  • CodeTypeOfExpression
  • CodeTypeParameterCollection
  • CodeTypeParameter
  • CodeTypeReferenceCollection
  • CodeTypeReference
  • CodeTypeReferenceExpression
  • CodeVariableDeclarationStatement
  • CodeVariableReferenceExpression
  • CodeDomProvider
  • CodeGenerator
  • CodeGeneratorOptions
  • CodeParser
  • CompilerErrorCollection
  • CompilerError
  • CompilerInfo
  • CompilerParameters
  • CompilerResults
  • Executor
  • GeneratedCodeAttribute
  • IndentedTextWriter
  • TempFileCollection
  • BitVector32
  • CollectionsUtil
  • HybridDictionary
  • ListDictionary
  • NameObjectCollectionBase
  • NameValueCollection
  • OrderedDictionary
  • StringCollection
  • StringDictionary
  • StringEnumerator
  • AddingNewEventArgs
  • AmbientValueAttribute
  • ArrayConverter
  • AsyncCompletedEventArgs
  • AsyncOperation
  • AsyncOperationManager
  • AttributeProviderAttribute
  • AttributeCollection
  • BackgroundWorker
  • BaseNumberConverter
  • BindableAttribute
  • BindingList<T>
  • BooleanConverter
  • BrowsableAttribute
  • ByteConverter
  • CancelEventArgs
  • CategoryAttribute
  • CharConverter
  • CollectionChangeEventArgs
  • CollectionConverter
  • ComplexBindingPropertiesAttribute
  • ComponentCollection
  • ComponentConverter
  • Component
  • ComponentEditor
  • ComponentResourceManager
  • Container
  • ContainerFilterService
  • CultureInfoConverter
  • CustomTypeDescriptor
  • DataObjectAttribute
  • DataObjectFieldAttribute
  • DataObjectMethodAttribute
  • DateTimeConverter
  • DecimalConverter
  • DefaultBindingPropertyAttribute
  • DefaultEventAttribute
  • DefaultPropertyAttribute
  • DefaultValueAttribute
  • DescriptionAttribute
  • DesignerAttribute
  • DesignerCategoryAttribute
  • DesignerSerializationVisibilityAttribute
  • DesignOnlyAttribute
  • DesignTimeVisibleAttribute
  • DisplayNameAttribute
  • DoubleConverter
  • DoWorkEventArgs
  • EditorAttribute
  • EditorBrowsableAttribute
  • EnumConverter
  • EventDescriptorCollection
  • EventDescriptor
  • EventHandlerList
  • ExpandableObjectConverter
  • ExtenderProvidedPropertyAttribute
  • GuidConverter
  • HandledEventArgs
  • ImmutableObjectAttribute
  • InheritanceAttribute
  • InitializationEventAttribute
  • InstallerTypeAttribute
  • InstanceCreationEditor
  • InvalidAsynchronousStateException
  • Int16Converter
  • Int32Converter
  • Int64Converter
  • InvalidEnumArgumentException
  • LicenseContext
  • License
  • LicenseException
  • LicenseManager
  • LicenseProviderAttribute
  • LicenseProvider
  • LicFileLicenseProvider
  • ListBindableAttribute
  • ListChangedEventArgs
  • ListSortDescriptionCollection
  • ListSortDescription
  • LocalizableAttribute
  • LookupBindingPropertiesAttribute
  • MarshalByValueComponent
  • MaskedTextProvider
  • MemberDescriptor
  • MergablePropertyAttribute
  • MultilineStringConverter
  • NestedContainer
  • NotifyParentPropertyAttribute
  • NullableConverter
  • ParenthesizePropertyNameAttribute
  • PasswordPropertyTextAttribute
  • PropertyChangedEventArgs
  • PropertyChangingEventArgs
  • PropertyDescriptorCollection
  • PropertyDescriptor
  • PropertyTabAttribute
  • ProvidePropertyAttribute
  • ReadOnlyAttribute
  • RecommendedAsConfigurableAttribute
  • ReferenceConverter
  • RefreshEventArgs
  • RefreshPropertiesAttribute
  • RunInstallerAttribute
  • RunWorkerCompletedEventArgs
  • SByteConverter
  • SettingsBindableAttribute
  • SingleConverter
  • StringConverter
  • SyntaxCheck
  • TimeSpanConverter
  • ToolboxItemAttribute
  • ToolboxItemFilterAttribute
  • TypeConverterAttribute
  • TypeConverter
  • TypeDescriptionProvider
  • TypeDescriptionProviderAttribute
  • TypeDescriptor
  • TypeListConverter
  • UInt16Converter
  • UInt32Converter
  • UInt64Converter
  • WarningException
  • Win32Exception
  • ProgressChangedEventArgs
  • ActiveDesignerEventArgs
  • CheckoutException
  • CommandID
  • ComponentChangedEventArgs
  • ComponentChangingEventArgs
  • ComponentEventArgs
  • ComponentRenameEventArgs
  • DesignerCollection
  • DesignerOptionService
  • DesignerEventArgs
  • DesignerTransactionCloseEventArgs
  • DesignerTransaction
  • DesignerVerbCollection
  • DesignerVerb
  • DesigntimeLicenseContext
  • DesigntimeLicenseContextSerializer
  • HelpKeywordAttribute
  • MenuCommand
  • ServiceContainer
  • StandardCommands
  • StandardToolWindows
  • ComponentSerializationService
  • ContextStack
  • DesignerLoader
  • DesignerSerializerAttribute
  • InstanceDescriptor
  • MemberRelationship
  • MemberRelationshipService
  • ResolveNameEventArgs
  • RootDesignerSerializerAttribute
  • SerializationStore
  • DefaultSerializationProviderAttribute
  • ApplicationScopedSettingAttribute
  • ApplicationSettingsBase
  • ApplicationSettingsGroup
  • AppSettingsReader
  • ClientSettingsSection
  • ConfigurationException
  • ConfigurationSettings
  • ConfigXmlDocument
  • DefaultSettingValueAttribute
  • DictionarySectionHandler
  • IdnElement
  • IgnoreSectionHandler
  • IriParsingElement
  • LocalFileSettingsProvider
  • NameValueFileSectionHandler
  • NameValueSectionHandler
  • NoSettingsVersionUpgradeAttribute
  • SettingAttribute
  • SettingChangingEventArgs
  • SettingElementCollection
  • SettingElement
  • SettingsAttributeDictionary
  • SettingsBase
  • SettingsContext
  • SettingsLoadedEventArgs
  • SettingsPropertyCollection
  • SettingsProperty
  • SettingsPropertyIsReadOnlyException
  • SettingsPropertyNotFoundException
  • SettingsPropertyValueCollection
  • SettingsPropertyValue
  • SettingsPropertyWrongTypeException
  • SettingsProviderAttribute
  • SettingsProviderCollection
  • SettingsProvider
  • SettingsSerializeAsAttribute
  • SettingValueElement
  • SettingsManageabilityAttribute
  • SettingsGroupDescriptionAttribute
  • SettingsDescriptionAttribute
  • SettingsGroupNameAttribute
  • SingleTagSectionHandler
  • SpecialSettingAttribute
  • UriSection
  • UserSettingsGroup
  • UserScopedSettingAttribute
  • DeflateStream
  • GZipStream
  • SerialErrorReceivedEventArgs
  • SerialPinChangedEventArgs
  • SerialPort
  • SerialDataReceivedEventArgs
  • SoundPlayer
  • SystemSound
  • SystemSounds
  • AuthenticationManager
  • Authorization
  • CookieCollection
  • CookieContainer
  • Cookie
  • CookieException
  • CredentialCache
  • Dns
  • DnsPermissionAttribute
  • DnsPermission
  • EndPoint
  • EndpointPermission
  • FileWebRequest
  • FileWebResponse
  • FtpWebRequest
  • FtpWebResponse
  • GlobalProxySelection
  • HttpListenerBasicIdentity
  • HttpListenerContext
  • HttpListener
  • HttpListenerException
  • HttpListenerPrefixCollection
  • HttpListenerRequest
  • HttpListenerResponse
  • HttpVersion
  • HttpWebRequest
  • HttpWebResponse
  • IPAddress
  • IPEndPoint
  • IPHostEntry
  • NetworkCredential
  • ProtocolViolationException
  • ServicePoint
  • ServicePointManager
  • SocketAddress
  • SocketPermissionAttribute
  • SocketPermission
  • WebClient
  • WebException
  • WebHeaderCollection
  • WebPermissionAttribute
  • WebPermission
  • WebProxy
  • WebRequest
  • WebResponse
  • UploadDataCompletedEventArgs
  • UploadFileCompletedEventArgs
  • OpenReadCompletedEventArgs
  • DownloadStringCompletedEventArgs
  • DownloadDataCompletedEventArgs
  • DownloadProgressChangedEventArgs
  • UploadStringCompletedEventArgs
  • OpenWriteCompletedEventArgs
  • UploadProgressChangedEventArgs
  • UploadValuesCompletedEventArgs
  • HttpRequestCachePolicy
  • RequestCachePolicy
  • AuthenticationModuleElementCollection
  • AuthenticationModuleElement
  • AuthenticationModulesSection
  • BypassElementCollection
  • BypassElement
  • ConnectionManagementElementCollection
  • ConnectionManagementElement
  • ConnectionManagementSection
  • DefaultProxySection
  • FtpCachePolicyElement
  • HttpCachePolicyElement
  • HttpWebRequestElement
  • Ipv6Element
  • MailSettingsSectionGroup
  • ModuleElement
  • NetSectionGroup
  • PerformanceCountersElement
  • ProxyElement
  • RequestCachingSection
  • ServicePointManagerElement
  • SettingsSection
  • SmtpNetworkElement
  • SmtpSection
  • SmtpSpecifiedPickupDirectoryElement
  • SocketElement
  • WebProxyScriptElement
  • WebRequestModuleElementCollection
  • WebRequestModuleElement
  • WebRequestModulesSection
  • AlternateViewCollection
  • AlternateView
  • AttachmentBase
  • AttachmentCollection
  • Attachment
  • LinkedResourceCollection
  • LinkedResource
  • MailAddressCollection
  • MailAddress
  • MailMessage
  • SmtpClient
  • SmtpException
  • SmtpFailedRecipientException
  • SmtpFailedRecipientsException
  • SmtpPermission
  • SmtpPermissionAttribute
  • ContentDisposition
  • ContentType
  • DispositionTypeNames
  • GatewayIPAddressInformationCollection
  • GatewayIPAddressInformation
  • IcmpV4Statistics
  • IcmpV6Statistics
  • IPAddressCollection
  • IPAddressInformationCollection
  • IPAddressInformation
  • IPGlobalProperties
  • IPGlobalStatistics
  • IPInterfaceProperties
  • IPv4InterfaceProperties
  • IPv4InterfaceStatistics
  • IPv6InterfaceProperties
  • MulticastIPAddressInformationCollection
  • MulticastIPAddressInformation
  • NetworkAvailabilityEventArgs
  • NetworkChange
  • NetworkInformationException
  • NetworkInformationPermissionAttribute
  • NetworkInformationPermission
  • NetworkInterface
  • PhysicalAddress
  • PingCompletedEventArgs
  • Ping
  • PingException
  • PingOptions
  • PingReply
  • TcpConnectionInformation
  • TcpStatistics
  • UdpStatistics
  • UnicastIPAddressInformationCollection
  • UnicastIPAddressInformation
  • AuthenticatedStream
  • NegotiateStream
  • SslStream
  • IPv6MulticastOption
  • IPPacketInformation
  • LingerOption
  • MulticastOption
  • NetworkStream
  • SendPacketsElement
  • Socket
  • SocketAsyncEventArgs
  • SocketException
  • SocketInformation
  • TcpClient
  • TcpListener
  • UdpClient
  • AuthenticationException
  • InvalidCredentialException
  • CaptureCollection
  • Capture
  • GroupCollection
  • Group
  • MatchCollection
  • Match
  • RegexCompilationInfo
  • Regex
  • ElapsedEventArgs
  • Timer
  • TimersDescriptionAttribute
  • AspNetHostingPermissionAttribute
  • AspNetHostingPermission

関連情報

Unity Script Reference – Mono Compatibility

http://unity3d.com/support/documentation/ScriptReference/MonoCompatibility.html

2011年07月10日

[][]Coroutine(コルーチン)/yield(イールド)の話 その2

yield は単体でも使用可能です。単体で使用した場合には1フレーム遅れてから実行されます。

そのため、以下の test() の様に無限ループの中で使用した場合には1フレーム毎に呼ばれる事になります。

※「Start」ボタンを押すとCoroutineの開始。「Stop」を押すとCoroutineが停止します。

function OnGUI () {
	if (GUI.Button(Rect(5, 5, 100, 100), "Start")) {
		StartCoroutine("test");
	}
	if (GUI.Button(Rect(5, 110, 100, 100), "Stop")) {
		StopCoroutine("test");
	}
}

function Update () {
	print("Update " + Time.time);
}

function test() {
	while(1) {
		yield;
		print("-----test " + Time.time);
	}
}

Coroutineはこの様な動作をする為、マルチスレッドプログラムと似た処理を作る事が可能です。

Unity Script Reference – Overview: Coroutines & Yield

http://unity3d.com/support/documentation/ScriptReference/index.Coroutines_26_Yield.html

[][]Coroutine(コルーチン)/yield(イールド)の話 その1

使った事の無い人には中々理解するのが大変なCoroutine(コルーチン)の説明。

実際のプログラムの動きを見てもらった方が手っ取り早いのでプログラムから。

function Start () {
	print ("Starting " + Time.time);
	yield WaitAndPrint();
	print ("-------Done " + Time.time);
}

function Update () {
	print ("Update " + Time.time);
}

function WaitAndPrint () {
	yield WaitForSeconds (1);
	print ("WaitAndPrint "+ Time.time);
}

この様な記述を行った場合は

	yield WaitForSeconds (1);

が実行された瞬間に WaitAndPrint() 関数は処理が終了します。

ここでは WaitForSeconds() の引数に1が指定して有るために1秒経過してから WaitAndPrint () 関数のそれ以降の処理が再開されます。

イメージ的には yield はreturn の様なイメージです。しかし、 return とは異なり、指定の時間が経過したら yield の次の行から処理が再開されます。

その為、コンソールに表示される文字は以下の順番となります。

「Start Starting」が表示
  ↓
「Update」が何度も表示
  ↓
1秒経ったら「WaitAndPrint」が表示
  ↓
直後に「-------Done」が表示

コンソール出力の時間が1秒の近辺を見ると上記の動作になっているが確認出来ます。

Update 0.9870263
UnityEngine.MonoBehaviour:print(Object)
NewBehaviourScript:Update() (at Assets/NewBehaviourScript.js:9)

Update 0.9958584
UnityEngine.MonoBehaviour:print(Object)
NewBehaviourScript:Update() (at Assets/NewBehaviourScript.js:9)

Update 1.002957
UnityEngine.MonoBehaviour:print(Object)
NewBehaviourScript:Update() (at Assets/NewBehaviourScript.js:9)

WaitAndPrint 1.002957
UnityEngine.MonoBehaviour:print(Object)
$:MoveNext() (at Assets/NewBehaviourScript.js:14)

-------Done 1.002957
UnityEngine.MonoBehaviour:print(Object)
$:MoveNext() (at Assets/NewBehaviourScript.js:5)

Update 1.011185
UnityEngine.MonoBehaviour:print(Object)
NewBehaviourScript:Update() (at Assets/NewBehaviourScript.js:9)

Update 1.020571
UnityEngine.MonoBehaviour:print(Object)
NewBehaviourScript:Update() (at Assets/NewBehaviourScript.js:9)

ちなみにコルーチンが使える場所には制限が有ります。 Start() では無く、 Awake() で以下の様に実行した場合は

function Start () {
	print ("Starting " + Time.time);
	yield WaitAndPrint();
	print ("-------Done " + Time.time);
}

以下の様にエラーが発生し、正しく動作しません。

Script error: Awake() can not be a coroutine.

Start() の yield WaitAndPrint(); を WaitAndPrint(); と変更し、以下の様にすると動作が変わります。

function Start () {
	print ("Starting " + Time.time);
	WaitAndPrint();
	print ("-------Done " + Time.time);
}

function Update () {
	print ("Update " + Time.time);
}

function WaitAndPrint () {
	yield WaitForSeconds (1);
	print ("WaitAndPrint "+ Time.time);
}

コンソールに表示される文字は以下の順番となります。

「Start Starting」が表示
  ↓
直後に「-------Done」が表示
  ↓
「Update」が何度も表示
  ↓
1秒たったら「WaitAndPrint」が表示

この場合であれば Start () を Awake () に変更し、以下の様に記述してもエラーとは成りません。

function Awake () {
	print ("Starting " + Time.time);
	WaitAndPrint();
	print ("-------Done " + Time.time);
}

Unity Script Reference – Coroutine

http://unity3d.com/support/documentation/ScriptReference/Coroutine.html

[]サイバーコネクトツー渡辺氏による「ゲーム業界特別講義」で紹介されていた書籍

気になったのでメモ。

4Gamer.net ― サイバーコネクトツー渡辺氏による「ゲーム業界特別講義」聴講レポート:ゲームクリエイターになる方法を学生向けにシンプルかつストレートに解説(NARUTO-ナルト- 疾風伝 ナルティメットインパクト)

http://www.4gamer.net/games/135/G013537/20110620040/

プログラマー志望者向け

アーティスト志望者向け

ゲームデザイナー(プランナー)志望者向け

[][]iOS版での.NETの設定による容量の違い

Player Settingsの設定項目に「API Compatibility Level」というものが有ります。

f:id:nakamura001:20110710212312p:image

この項目では「.Net 2.0」と「.Net 2.0 Subset」が選択可能です。それぞれを選択した時にサイズはどの位変わるのか確認してみました。

作成方法はUnityのプロジェクトを生成してそのままビルド。最終的にXcodeでビルドしたアプリのサイズを比較してみました。ファイルサイズはFinderで確認したサイズです。

Unityのバージョンは3.3.0f3です。

種類サイズ
.Net 2.029.6MB
.Net 2.0 Subset29.2MB

うーん、 .Net 2.0 のフルバージョンを遠慮無く使っても問題無さそうですね。

Unity - Player Settings

http://unity3d.com/support/documentation/Components/class-PlayerSettings.html

[][]ライセンスごとの機能の違い

(2012/11/23 追記)

Unity 4.0版、書きました。

ライセンスごとの機能の違い(Unity 4.0版) - 強火で進め

http://d.hatena.ne.jp/nakamura001/20121122/1353603161

(追記ここまで)

現在の Untiy のライセンスはこうなっています。

※2011/07/10 現在の情報です。

ライセンスの種類価格
Unity無料
Unity Pro13万3,875円
iOS3万6,500円
iOS Pro13万6,000円 → Unity Proライセンスとの組み合わせしか選べないので実際には +13万6,000円 となり合計27万2,000円

(2012/03/26 追記)

規約に変更が有り、Unity Pro+iOS Basic/Android Basicの組み合わせが可能になりました。

現在の規約ではUnity Pro+iOS Basic/Android Basicの組み合わせが可能 - 強火で進め

http://d.hatena.ne.jp/nakamura001/20120314/1331735072

(追記ここまで)

iOSライセンスであれば無料のUnity(便宜上、このエントリーでは以下Unityフリー版)との組み合わせでOKなので3万6,500円だけですが、iOS ProライセンスはUnity Proライセンスとの組み合わせで無いと使えないので実際には27万2,000円かかります。

実際にオンラインショップの購入ページでUnityを選択すると iOS Pro の所に「Requires Unity Pro」と表示されるのが確認出来ます。

UNITY

https://store.unity3d.com/shop/

Unityフリー版でもMacのスタンドアローンアプリ(.appファイル)、Winのスタンドアローンアプリ(.exeファイル)、ブラウザ上でUnityのWeb Playerで動作する形式の作成が可能で作成物は販売も出来ます。フリー版の使用については「年間10万ドル(約804万円)以上の収益が無い場合に限り使用出来る」という制限が有ります。ここでの収益とはUnity使ったプロジェクトのみの話ではなく、使ってる会社の前年度収益となります。

Unityは他にもWiiやPS 3、XBOX360向けの開発も可能ですがこれらコンシューマの環境はコンシューマ機を発売している任天堂やSCEとの契約をしている様な会社でしか購入出来ないので一般の人はこれらのライセンスについては気にしないで良いでしょう。

もし、それら向けのライセンスを購入したい場合はフォーラムからの申し込みになるみたいです。詳しくはFAQの「I would like to develop for a console such as Xbox360, PS3, or Nintendo Wii. What do I need?」を参照下さい。

Unity Proライセンス/iOS Proライセンスに比べてUnityフリー版/iOSライセンスでは主な部分として、以下の機能が使えません。

  • 高品質な影が使えない(丸影は可能)
  • プロファイル機能
  • Occlusion Culling
  • 高度なグラフィック

後、Untiyのフリー版はプラグインが使用出来ませんがiOSの方はiOS Proライセンスで無く、iOSライセンスでもプラグインを使用可能です。

iOS向けのにビルドした時にはXcodeのプロジェクトが生成され、それをXcodeでビルドして最終的なiPhoneアプリの作成をしているのでプロファイル機能が付かないという点についてはiOS版は気にしなくて良いかと思います。Unity上のシミュレータ画面でプロファイルを行ってもあまり意味が無いですしね。

後、iOSライセンスの場合はアプリの起動時のスプラッシュ画面をデフォルトのもの(Unityロゴ)から変更出来ないという制限も有ります。iOS Proライセンスであれば変更可能です。

なお、それぞれのライセンスの機能比較について詳しくはこちらのページを参照して下さい。

UNITY: License Comparison

http://unity3d.com/unity/licenses

関連情報

(2011/07/14 追記)

iOSライセンス→iOS Proライセンスの順番で購入した時の値段 - 強火で進め

http://d.hatena.ne.jp/nakamura001/20110714/1310614382

2011年07月09日

ボクセルで作成されたドットライクな3Dゲーム「Voxatron」

D

関連情報

Unityのフォーラムで紹介が有りました。

しかし、このページや公式サイトを読んでみましたが特にUnityについては触れられておらず、Linux版も作成中との事なのでUnityで作成されているという訳では無さそうです。

Voxatron!

http://forum.unity3d.com/threads/86750-Voxatron!!

公式サイト。

Voxatron

http://www.lexaloffle.com/voxatron.php

2011年07月08日

[][]現在、オープンベータ中の3Dエンジン「NinevehGL」が良さげ

現在、オープンベータ中の3Dエンジン「NinevehGL」が良さげ

NinevehGL - 3D engine for iOS

http://nineveh.gl/

NGLViewというViewを貼り付けて、NGLViewDelegateを設定。

NGLMeshとNGLCameraを追加。NGLMesh生成時に引数としてOBJかCOLLADAファイルの読み込みを行う事により簡単に3Dモデルを表示出来る様です。

NinevehGL Lesson 2 - Importing & Rendering from NinevehGL on Vimeo.

動画他にもこちらに沢山有ります。IBを使わないでプログラムする動画も有ります。

出来る限りプログラムの記述やIBでの操作が少なくて済むように設計されているみたいです。

これは期待出来そうですね。完成するのが楽しみです。

[][]フリーの2Dゲーム作成やアプリ作成用のフレームワーク「Orthello」

f:id:nakamura001:20110709014923p:image

WyrmTale Games - Unity Components - Orthello 2D Framework

http://www.wyrmtale.com/products/unity3d-components/orthello

ページの最後にWeb Player形式のサンプルが貼って有ります。これを見れば一通り、どの様な事が出来るか分かります。

このサンプルはOrthelloに付属しています。このサンプルのソースを読めばOrthelloの使い方についても理解出来るかと思います。

ファイルについてはRAR形式で圧縮されています。Macの場合は「The Unarchiver」などで解凍して下さい。

[]MacでRARファイルが解凍出来るアプリ「The Unarchiver」

f:id:nakamura001:20110709013352p:image

拡張子が .rar の圧縮ファイル、主にWindowsで使われている事が多いファイルですがMacでも解凍したい時が有ったりします。

Macの無料アプリでRARファイルが解答できるアプリはかなり少ないですが「The Unarchiver」で可能です。

サイトはこちら。ソースコードも配布されています。

The Unarchiver

http://wakaba.c3.cx/s/apps/unarchiver.html

現在ではApp Storeでも配布されているのでこちらからDLした方が良いでしょう。

App Storeアプリで「The Unarchiver」と検索するかこちらのリンクからたどって下さい。

2011年07月07日

[]IE10では条件付きコメントが使えない

IE10ではCSSの中で使えるIE独自の拡張機能で有る「条件付きコメント」が使えなくなるそうです。ちなみに条件付きコメントとはこんなヤツです。

<!--[if IE]>
<![endif]-->

他にも、細々とした所に変更が有るみたいなのでこちらのページに一通り目を通しておいた方が良さそうです。

HTML5 Parsing in IE10 - IEBlog - Site Home - MSDN Blogs

http://blogs.msdn.com/b/ie/archive/2011/07/06/html5-parsing-in-ie10.aspx

2011年07月06日

節電中の自販機に気になる注意書きが…

f:id:nakamura001:20110707004003j:image

節電中のためにこんな注意書きが貼ってありました。

充分に冷えてない状態の時は飲料が噴出することがあります。

開栓は少し待ってからゆっくりと開けてお飲み下さい。

冷えてない状態の時にもっと待ってから開栓するとな!?完全に冷たさ無くなっちゃいますよぉ〜。

まぁ、電力不足ですしワガママは言えませんね。

[]スマートフォンチロルチョコ

こんなチロルチョコがコンビニ有ったので買ってみました。

f:id:nakamura001:20110707002642j:image

スマートフォンのアイコンの様なデザインでチョコレートが並んでいるけどきっと気のせいです。

下の方にホームボタンっぽいものも有りますがきっと気のせいです。

f:id:nakamura001:20110707002643j:image

裏側を見ると左上にカメラのっぽいのが付いてますがきっとアレとは関係有りません。

包装を剥がすとこんな感じです。

f:id:nakamura001:20110707002641j:image

全部アップル関係のチョコレートですがきっと関係有りません。

商品名が「SMART APPLE」ですがきっと偶然です。

これ、中のチョコを入れ替える事が出来たらより良かったんですけどねぇ。

お気に入りのアプリの画像でDECOチョコを作成して入れ替えれたりしたら一段と面白かったと思うのでそこはちょっと残念でした。

関係情報

DECOチョコ 結婚式/二次会のプチギフトや記念日の贈り物に

http://www.decocho.com/

2011年07月05日

[][]Quaternion.Slerp() についての解説

f:id:nakamura001:20110706033606p:image

今回のサンプルはこちらで試せます。ソースファイルはこちら

プログラムはこの様に成ります。

【Test.js】

var startFlag : boolean;

function Update () {
	if (startFlag) {
		var toRot : Quaternion = Quaternion.Euler(0, 90, 0);
		transform.rotation = Quaternion.Slerp (transform.rotation, toRot, Time.deltaTime * 0.5);
	}
}

function OnGUI () {
	var fromRot;
	var toRot;
	if (GUI.Button (Rect(5, 5, 150, 40), "回転(1)")) {
		startFlag = true;
	}
	if (GUI.Button (Rect(5, 50, 150, 40), "回転(2)")) {
		fromRot = Quaternion.Euler(0, 0, 0);
		toRot = Quaternion.Euler(0, 90, 0);
		transform.rotation = Quaternion.Slerp (fromRot, toRot, 0.5);
	}
	if (GUI.Button (Rect(5, 95, 150, 40), "回転(3)")) {
		toRot = Quaternion.Euler(0, 90, 0);
		transform.rotation = Quaternion.Slerp (transform.rotation, toRot, 0.5);
	}
	if (GUI.Button (Rect(5, 140, 150, 40), "回転をリセット")) {
		startFlag = false;
		transform.rotation = Quaternion.Euler(0, 0, 0);
	}
	GUI.Label (Rect(5, Screen.height-20, 150, 20), "Rotation.Y = "+transform.rotation.eulerAngles.y);
}

ステージにCubeを配置し、このプログラムを追加しています。

動作確認

まずは「回転(1)」ボタンを押してみて下さい。

するとCubeの Rotation.Y の値(画面左下に表示)が徐々に90に近づいて行く事が確認できるかと思います。また、値が90に近づくほど回転量が減って行く事を確認して下さい。

※一度、「回転をリセット」ボタンを押してからもう一度押すと再度確認出来ます。

次に一度、「回転をリセット」ボタンを押してから「回転(2)」ボタンを押してみて下さい。 Rotation.Y の値が45に成ったはずです。

次にもう一度、「回転をリセット」ボタンを押してから「回転(3)」ボタンを押してみて下さい。 Rotation.Y の値を確認しながら何度かボタンを押してみて下さい。

プログラムの解説

さて、動作の確認が終ったのでプログラムの解説に進みます。

まずは「回転(1)」ボタンの動作。このボタンを押すと startFlag がtrueになり、Update () の以下の処理が実行されます。

function Update () {
	if (startFlag) {
		var toRot : Quaternion = Quaternion.Euler(0, 90, 0);
		transform.rotation = Quaternion.Slerp (transform.rotation, toRot, Time.deltaTime * 0.5);
	}
}

ここで Quaternion.Slerp () が登場します。

Unity Script Reference – Quaternion.Slerp

http://unity3d.com/support/documentation/ScriptReference/Quaternion.Slerp.html

このメソッドの引数は(from=変更前のQuaternionの値, to=変更後のQuaternionの値, t=定数t)と成っています。

Quaternionは日本語では四元数と言い、3次元空間での回転を表現する事が可能です。詳しくは「クォータニオン」か「四元数」で検索してみて下さい。

Quaternion.Slerp () は「変更前のQuaternionの値」から「変更後のQuaternionの値」へ「定数t」で指定した量だけ近づける。という動作を行います。

定数tは0〜1の範囲で指定でき、それぞれの値の時に以下の様なQuaternionの値が返されます。

  • 0の時 → 「変更前のQuaternionの値」
  • 1の時 → 「変更後のQuaternionの値」
  • 0〜1の中間の値 → 「変更前のQuaternionの値」と「変更後のQuaternionの値」の中間の値

定数tについては「回転(2)」ボタンのプログラムを見ると良く分かるかと思います。これを実行した時はfromには Rotation.Y=0 、toには Rotation.Y=90 を指定しています。この状態で定数tは0.5、つまり丁度真ん中を指定している為、結果として Rotation.Y=45 と成ります。

	if (GUI.Button (Rect(5, 50, 150, 40), "回転(2)")) {
		fromRot = Quaternion.Euler(0, 0, 0);
		toRot = Quaternion.Euler(0, 90, 0);
		transform.rotation = Quaternion.Slerp (fromRot, toRot, 0.5);
	}

最後に「回転(3)」ボタン。こちらは「回転(2)」とはfromがtransform.rotationという違いしか有りません。

	if (GUI.Button (Rect(5, 95, 150, 40), "回転(3)")) {
		toRot = Quaternion.Euler(0, 90, 0);
		transform.rotation = Quaternion.Slerp (transform.rotation, toRot, 0.5);
	}

fromが現在のCubeの回転量に成っているため最初は 0→90 の中間なので 45 。もう一度押すと 45→90 の間なので 67.5 。次は 78.75 と、徐々に回転量が少なく(半分づつに)なって行きます。

このボタンを押す動作が自動的に行われていたのが「回転(1)」ボタンを押した時の処理です。

なお、Slerpは何かな?と思い調べてみた所

SlerpはSphercal Linear Interpolationの略で、日本語では球面線形補間となります。

との事でした。

クォータニオンの使いどころ - ひにけにXNA - Site Home - MSDN Blogs

http://blogs.msdn.com/b/ito/archive/2009/05/01/more-bones-04.aspx

[][][]Unity+Kinectで作成された疾走アクションゲーム『Walk the Line』

Walk The Line - Trailer from Shaxti on Vimeo.

Kinectを使用した学生作成の疾走アクションゲーム『Walk the Line』デモ映像 - Game*Spark

http://gs.inside-games.jp/news/287/28733.html

2011年07月04日

[][]ゲーム画面のスクリーンキャプチャを行う方法(アルファチャンネルも含める)

Application.CaptureScreenshot() でスクリーンキャプチャを行った場合はアルファチャンネルが反映されません。アルファチャンネルも含めてキャプチャする為には少々手間が必要です。

ゲーム画面のアルファチャンネルの設定

そもそも、ゲーム画面のアルファチャンネルについてはカメラのBackgroundにて設定します。

f:id:nakamura001:20110705021902p:image

ここで A のパラメータをこの様に 0 に設定すると完全に透過する様になります。

f:id:nakamura001:20110705022620p:image

しかし、一度設定した後にもう一度この設定パネルを開くと A の値が 255 に成ってしまうバグが有ります。

f:id:nakamura001:20110705021903p:image

このバグはあくまで見た目だけの様です。そのため、ちゃんと 0 の設定した後に 255 に成っていたとしても内部的には反映されているので気にしないで大丈夫です。

アルファチャンネル付きでキャプチャを行う

さて、メインのキャプチャ処理について解説します。今回のサンプルは以下のページのサンプルを元に作成しました。

Unity Script Reference – Texture2D.EncodeToPNG

http://unity3d.com/support/documentation/ScriptReference/Texture2D.EncodeToPNG.html

このサンプルは適当なGameObjectを作成し、張り付けると使えます。

ゲーム開始時にキャプチャが実行されます。

※このサンプルはビルド時のPlatformの設定がWeb Playerの場合には動作しません。「PC and Mac Standalone」などを選択して試して下さい。

【Capture.js】

import System.IO;

function Start () {
	Capture("capture.png");
}

function Capture (filePath : String) {
	// We should only read the screen bufferafter rendering is complete
	yield WaitForEndOfFrame();
	
	var width = Screen.width;
	var height = Screen.height;
	var tex = new Texture2D (width, height, TextureFormat.ARGB32, false);
	// Read screen contents into the texture
	tex.ReadPixels (Rect(0, 0, width, height), 0, 0);
	tex.Apply ();

	// Encode texture into PNG
	var bytes = tex.EncodeToPNG();
	Destroy (tex);

	// For testing purposes, also write to a file in the project folder
	File.WriteAllBytes(filePath, bytes);
}

元のサンプルとの主な相違点を解説します。

まずは Texture2D の画像フォーマット。元は TextureFormat.RGB24 だったのでアルファチャンネル付きの TextureFormat.ARGB32 に変更しました。

	var tex = new Texture2D (width, height, TextureFormat.ARGB32, false);

次にサンプルでは画像をサーバへ送信する形に成っていましたが以下の様にローカルに保存する形に変更して有ります。

	File.WriteAllBytes(filePath, bytes);

[][]ゲーム画面のスクリーンキャプチャを行う方法

JavaScriptで記述する場合は以下の様になります。

このプログラムは張り付けたオブジェクトを20°ずつ回転させながらキャプチャします。

※動作はかなり重いので気を付けて下さい。

var rad = 0;

function Update () {
	var filename;
	rad += 20;
	if (rad <= 360) {
		transform.Rotate(0, 5, 0);
		filename = "RotationY_"+rad+".png";
		Application.CaptureScreenshot(filename);
		print(filename);
	}
}

関連情報

Unity Script Reference – Application.CaptureScreenshot

http://unity3d.com/support/documentation/ScriptReference/Application.CaptureScreenshot.html

[]暗黒卿のフォースの力でAR.Droneを操作

仕組みとしては単純ですが凄く良いアイディア!!

You don't know the power of the dark side from Edson Pavoni on Vimeo.

パロット エイアール ドローン (ブルー) PF720002 【日本正規品】

パロット エイアール ドローン (ブルー) PF720002 【日本正規品】

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

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

[]ARライブラリStringとKinectスターウォーズレイア姫のホログラム映像

String(UnityのiPhone版やiPhone環境向けのARライブラリ)とKinectを使ってスターウォーズレイア姫のホログラム映像の様な表現を実現した作品。

(追記)

最初、Unity+String+Kinectと書いてたけど良く考えるとStringはUnityで使う以外にも通常のiPhoneプログラムの中で使う事も出来るのでした。

動画を観ただけだとUnity上で使ってるのか通常のiPhoneプログラムなのか判断出来無かったのでその辺りの記述を修正しました。

(追記ここまで)

3d Video with Kinect and iPad from cc laan on Vimeo.

関連情報

作者さんのサイト。

laan labs :: experimental development shop

http://labs.laan.com/

3d Video from Kinect on the iPad | the labs @ laan

http://labs.laan.com/wp/2011/07/3d-video-from-kinect-on-the-ipad/


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

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

Xbox 360 Kinect センサー

Xbox 360 Kinect センサー

[][][]Unityで作られたKinectを使ったゲーム「Evade」

D

※以下のブログではKinect Usingってタイトルですが動画のタイトルはASUS Xtion PROって付いてるのでKinectでは無く、ASUS Xtion PROかも?

Evade for Kinect Using Unity3D | Kinect Hacks

http://kinect.dashhacks.com/kinect-news/2011/07/03/evade-kinect-using-unity3d#.ThCV-wd9_04.twitter

アプリ(Windows向け)はこちらのページからDL出来ます。

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

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

Xbox 360 Kinect センサー

Xbox 360 Kinect センサー

2011年07月03日

[][]ファイルオープン用のパネルを表示してテキストファイルを読み込む方法

【サンプルの動作】

Assetsのパネルで右クリック
  ↓
「Open Text File」を選択
  ↓
ファイルオープン用パネルが表示
  ↓
指定したファイルを開き、内容をコンソールに出力

JavaScriptプログラム】

以下のプログラムを Edtior というフォルダを作成し、その中に保存して下さい。

import System.IO;

@MenuItem ("Assets/Open Text File")
static function OpenTextFile(){
	var path = EditorUtility.OpenFilePanel(
		"Read A Text File", "", "txt");
	if (path.Length != 0) {
		var url = "file://" + path;
		var www = new WWW(url);
		while (!www.isDone) {}
		var txt = www.text;
		print (txt);
	}
}

[][]ファイル保存用のパネルを表示してテキストファイルを保存する方法

【サンプルの動作】

Assetsのパネルで右クリック
  ↓
「Save Text File」を選択
  ↓
ファイル保存用パネルが表示
  ↓
指定したファイル名でテキストファイルが作成される
※ファイルの中には ABC というテキストが入っている。

JavaScriptプログラム】

以下のプログラムを Edtior というフォルダを作成し、その中に保存して下さい。

import System.IO;

@MenuItem ("Assets/Save Text File")
static function SaveTextFile(){
	var str : String = EditorUtility.SaveFilePanel("Save Text...", Application.dataPath, "Test", "txt");
	if (str.Length != 0){
		var b : byte[] = new byte[3];
		b[0] = 0x41; // A
		b[1] = 0x42; // B
		b[2] = 0x43; // C
		File.WriteAllBytes(str, b);
	}
}

ここでは文字コードで配列bにA,B,Cを設定していますが以下の様な書き方も可能です。

		b[0] = "A"[0];
		b[1] = "B"[0];
		b[2] = "C"[0];

バイナリデータでは無く、テキストデータを保存する場合は File.WriteAllText() を使用。

		File.WriteAllText(str, "hogehoge");

関連情報

Unity Script Reference – EditorUtility.SaveFilePanel

http://unity3d.com/support/documentation/ScriptReference/EditorUtility.SaveFilePanel.html

[][]Web Playerのテンプレートを変更/追加する方法

f:id:nakamura001:20110703130416p:image

Macの場合は Unity.app の中の以下のフォルダにテンプレートが有ります。

Contents/Resources/WebPlayerTemplates

f:id:nakamura001:20110703130414p:image

変更したい場合はこちらのファイルを変更します。

追加する場合はここに有るフォルダをコピーし、そこに加工するのが良いでしょう。

f:id:nakamura001:20110703130415p:image

HTMLファイルでは以下の専用の埋込みタグが使用可能です。以下のタグを埋め込んでおくと実際にWeb Playerを生成した時には実際の値に置き換わります。

タグ内容置き換わる値の例
%UNITY_WEB_NAME%Web Player名。出力先フォルダ名と同じTest
%UNITY_WIDTH%Web Playerの幅600
%UNITY_HEIGHT%Web Player高さ450
%UNITY_WEB_PATH%unity3dファイルのパスTest.unity3d
%UNITY_UNITYOBJECT_LOCAL%ローカルのUnityObject.jsのパスUnityObject.js
%UNITY_UNITYOBJECT_URL%unity3d.comでホストしている UnityObject.js ファイルのURLhttp://webplayer.unity3d.com/download_webplayer-3.x/3.0/uo/UnityObject.js
%UNITY_BETA_WARNING%Unityのベータビルド時のワーニングメッセージの表示位置。ベータ版のWeb Playerを使っていてもここに表示されずに画面の右下に表示されている。現在未使用?
%UNITY_CUSTOM_SOME_TAG%Custom template tag "Some tag"(ドキュメントにはPlayer Settingで設定可能と有りますが設定する場所が見つかりませんでした)

関連情報

Unity - Using web player templates

http://unity3d.com/support/documentation/Manual/Using%20Web%20Player%20templates.html

新規作成ファイルなどの書き換え - 強火で進め

http://d.hatena.ne.jp/nakamura001/20110611/1307817907

2011年07月02日

[][]JavaScriptからC#C#からJavaScriptのプログラムにアクセスする方法

Unity3D: JavaScript -> C# or C# -> JavaScript access | 41 Post

http://www.41post.com/1935/programming/unity3d-js-cs-or-cs-js-access

[][]GTMF 2011の「Unreal Engine 3」、「OROCHI」、「Unity」のセッションまとめ

GTMF 2011の「Unreal Engine 3」、「OROCHI」、「Unity」の3つのゲームエンジニアのセッションまとめ記事。それぞれのエンジンについて動画での解説が付いていて特徴や機能が分り易かったです。

4Gamer.net ― [GTMF 2011]定番「Unreal Engine 3」や国産の「OROCHI」に新鋭「Unity」など,各種ゲームエンジン関連セッションまとめ(ミドルウェア/開発ツール)

http://www.4gamer.net/games/032/G003263/20110701090/

[][]旗をなびかせるシェーダ

解説が記載されたPDFファイルやデモのunitypackageファイルも公開されています。

Advanced Waving Flag Shader for Unity (Double sided, Alpha shadow support) – KLAKOS

http://klakos.com/en/advanced-waving-flag-shader-for-unity-double-sided-alpha-shadow-support-3/

[][]iPhone向けに出力されたファイルにて行う設定

UnityのiPhone版ではBuildを行うとXcodeプロジェクトとプログラム関連のファイルが出力されたのちXcodeでビルドが行われます。

この出力されたファイルを直接編集する事によってのみ設定可能なパラメータが存在します。

この設定は基本的には AppController.mm ファイルに記載されている様です。

FPSの設定

FPSの設定するには kFPS の定義を変更します。デフォルトは30FPS。

#define kFPS 30 

(2013/03/08 追記)

現在ではちゃんとUnityのIDE上で設定したFPSの値が反映される様になりました。

(追記ここまで)

レンダリングループ

レンダリングループは以下の3種類が選択可能です。

  • System Timer(NSTimer)
  • Thread
  • Event Pump

デフォルトではスレッドベース。

//#define FALLBACK_LOOP_TYPE NSTIMER_BASED_LOOP
#define FALLBACK_LOOP_TYPE THREAD_BASED_LOOP
//#define FALLBACK_LOOP_TYPE EVENT_PUMP_BASED_LOOP

使用したいレンダリングループの定義のコメントアウトする事で変更可能です。もし、システムタイマー(NSTimer)ベースのループにしたい場合は以下の様に変更します。

#define FALLBACK_LOOP_TYPE NSTIMER_BASED_LOOP
//#define FALLBACK_LOOP_TYPE THREAD_BASED_LOOP
//#define FALLBACK_LOOP_TYPE EVENT_PUMP_BASED_LOOP
System Timer(NSTimer)選択時に使用可能な設定

kThrottleFPS の値を変更する事でレンダリングに高い優先度を与える事が可能です。デフォルトの値は 2.0 です。

#define kThrottleFPS 2.0

数値が大きいほどレンダリングが優先されます。タッチイベントや加速度センサーの反応を見ながら調整して下さい。

Event Pump選択時に使用可能な設定

kMillisecondsPerFrameToProcessEvents で毎フレームごとにOSがイベントを処理出来る時間をミリ秒で指定。デフォルトは 3 。

#define kMillisecondsPerFrameToProcessEvents	3

数値が大きいほどタッチイベントや加速度センサーの反応が良くなり、代わりに描画のパフォーマンスが落ちます。

ディスプレイリンク(CADisplayLink)のサポート

iOS 3.1で導入されたCADisplayLinkを利用する場合は以下の定義を

#define USE_DISPLAY_LINK_IF_AVAILABLE 0

以下のように変更。

#define USE_DISPLAY_LINK_IF_AVAILABLE 1

加速度センサーのチェック頻度の設定

kAccelerometerFrequency で加速度センサーのチェック頻度(1秒当たりのチェック回数、Hz)を変更。デフォルトは 60.0 。

#define kAccelerometerFrequency					60.0

0 を指定すると加速度センサーの値をチェックしなくなります。ゲームに加速度センサーの値を使っていない場合はパフォーマンスとバッテリーの面から 0 を指定しておきましょう。

(2013/05/13 追記)

現在ではUnityのIDE上で「Disabled(無効)/15Hz/30Hz/60Hz/100Hz」のいずれかを設定出来る様に成っています。

(追記ここまで)

関連情報

Unity - Tuning Main Loop Performance

http://unity3d.com/support/documentation/Manual/iphone-Optimizing-MainLoop.html

こちらのドキュメントだと

//#define MAIN_LOOP_TYPE NSTIMER_BASED_LOOP
#define MAIN_LOOP_TYPE THREAD_BASED_LOOP
//#define MAIN_LOOP_TYPE EVENT_PUMP_BASED_LOOP

などと記載されていますが現在のバージョンのUnityでは MAIN_LOOP_TYPE から FALLBACK_LOOP_TYPE に変更された様です。

[][]Unityは今年中に社員を200人にする予定らしい

Unityの全社員は現在は125人(エンジニアは約60人)、今年中に200人まで増員するみたいです。勢いが有る感じですね。

Making Unity mainstream - Edge Magazine

http://www.next-gen.biz/features/making-unity-mainstream

ストックホルムのスタジオでグラフィックプログラマー募集中みたいです。

Jobvite - Jobvite

http://hire.jobvite.com/Jobvite/jobvite.aspx?b=nzDzGgwc

2011年07月01日

[]iPhoneをワイヤレス充電できる「AIR VOLTAGE(エアボルテージ)」

maxell ワイヤレス充電ステーション(シングル) WP-PD10S.BK

maxell ワイヤレス充電ステーション(シングル) WP-PD10S.BK

iPhoneをワイヤレス充電できる充電ステーション。

ワイヤレス充電については開発されているという話は聞いてましたが予想以上に早く製品化されましたね。

こちらの商品はQi(チー)というワイヤレス充電の規格に対応してるのでこれから他のQi対応のデバイスが出てきた時にそちらのデバイスの充電も可能です。

かなり良さそうなのですがiPhoneの充電に必要なフォルダーが上から差し込むだけなので普段使いのカバーと兼ねる事が出来そうに無いのがちょっと残念。

maxell 「Qi」規格ワイヤレス充電器カバー iPhone4専用 WP-SL10A.BK

maxell 「Qi」規格ワイヤレス充電器カバー iPhone4専用 WP-SL10A.BK

まぁ、家に居る間に「使う→充電→使う→充電」を繰り返す様な用途には便利そうな気がします。

値段も予想より安くてちょっと意外でした。

関連情報

iPhone 4 対応ワイヤレス充電器「エアボルテージ」 [個人向け] - マクセル

http://www.maxell.co.jp/jpn/consumer/wireless_charger/airvoltage/airvoltage.html

2011年これぞヒットの予感!ウワサのワイヤレス充電規格「Qi」対応 マクセル「AIR VOLTAGE」検証

http://trendy.nikkeibp.co.jp/as/airvoltage/