2012年9月29日土曜日

Unity3.5.6+iOS6対応のMac環境について

Unity 3.5.6がiOS6対応してリリースされることになって自分は色々とMac環境に変更が必要になったので紹介したい。

投稿内容はSnow Leopard環境を現在もっている方向けで、それ以外の方にとっては意味ある内容でないのであらかじめ注意。


理由は、これまでSnow Leopard + XCode4.2でしばらくiOS書き出しをしてたもののiPhone5(すなわちiOS6)対応をするためには、いよいよMountain Lion + XCode4.5に環境変更が必要になったためだ。

そこで苦労したこといくつか:

  1. Mac OS再インストール後、Unityを再インストールする都度アクティベーションをやり直す必要がある
  2. iOSのProvisioning Profile設定を2台目のMacで実機テストできるように証明書などの設定をしていて、エラーが出てきてハマった。

1.については苦労しない方が多いとおもうが、同一ライセンスでアクティベーションを過剰に繰り返すと、ライセンス規約に違反したとみなされ、Unity社から警告が来ることがありえるので注意。

2.のオーガナイザーで出たエラーは以下。
xcode could not find a valid private key / certificate pair for this profile in your keychain.

解決する際に参考にしたサイトは以下。様々な検証をしてくれた先人がいたので自分は助かった!

2台目以降のMacで実機テストをする方法
http://labs.karappo.net/iphone/index.php?itemid=274

その後は順調にUnityでビルドして、ターゲットをiOS6にして問題なく実機転送に成功!

環境構築だけで苦労したが、実際のゲーム開発で困ったことが出てきたらまた紹介することにする。

【ちょっと息抜き】各国でのUnity情報源を調べる

本日は土曜日。ゲーム開発は手を休めて暇な検索テストをしてみた!



【調査内容】

  • 主要な国のUnity情報源を見つける。方法論としてはYahoo!で「Unity3d」と検索してみて有用な情報ソースから各国の違いをみつける
  • 国によりもっとも使用頻度高い検索エンジンは異なるがあえて無視(またこの調査自体、いったい何か意味あるかどうかw)
  • 各国の「ウェブ全体で検索」でなく「各国のサイトで検索」も併せて使用
【対象】
  1. www.yahoo.com
  2. uk.yahoo.com
  3. ru.yahoo.com
  4. www.yahoo.de
  5. www.yahoo.fr
  6. it.yahoo.com
  7. nl.yahoo.com
  8. www.yahoo.kr
  9. www.yahoo.cn
  10. www.yahoo.co.jp
【結果】

アメリカ・イギリス・オランダ
・英語のunity3d.comのフォーラムやAnswersが見れるためそれ以外のブログなど活字の情報源は少ない
・ビデオチュートリアルがもっとも充実している

ドイツ
・Unity Insiderというフォーラムが充実している

韓国・日本
・個人ブログでの情報が多い特徴


イタリア・フランス・ロシア・中国
・情報源がやや少ないようにみえた(探し方が悪かっただけかもしれません)


最近はGoogle Chromeだと上記すべてのサイトの活字を日本語に訳してくれるから便利ですね!
逆にいうと、ビデオチュートリアルが充実すると、画面を動かしているのは分かるけど活字と違って何を言っているかが全く分からないw

最近は各言語の音声認識率は100%に近いのだから、機械翻訳でも良いから自動的に日本語に変換してほしいものです!

Unityについて言えばそれにしても国によって(あるいは英語が母国語に近いかどうか)、情報の取り方違いそうだなーというのが正直な感想。またUnity3.5.6については日本語が検証情報が案外ともっとも多かったりw

言葉の壁を乗り越えてUnityを標準言語で行こうぜ!

2012年9月28日金曜日

Unityプログラミング応用(エディタ編集)~その3

前回に引き続きプログラミング応用編として、Unityエディタの編集に関して学習していきたい。
リンク先のウェブサイトの記載と併せ、ポイント解説の翻訳を見比べてほしい:

http://catlikecoding.com/unity/tutorials/star

GUILayoutボタンはどのような働きをする?
メソッドのGUILayout.Buttonはボタンを表示し、かつクリックされたかどうか値を返す。普段使用するときはif構文のなかで呼び出しを行いそのコードブロックの中で必要な処理を行うようにする。
GUIメソッドのなかで実際に起きる流れであるが、デモのケースではOnInspectorGUIが一度ならず呼び出しが行われる。レイアウト処理、再描画、有効なGUIイベントの発生(よくあるケース)、等の際に呼び出しされる。マウスクリックイベントがボタン上で発生したときのみtrueを返す。
理解を深めるためにはDebug.Log(Event.current);をOnInspectorGUIメソッドの最後に追加するなど、テストすると良い。
通常は心配する必要がないが、テキスト生成など重い処理の際には認識する必要がある。必要性もないのに1秒あたりに何度も発生させたい処理ではない。

新しい配列要素は何が入る?
SerializedPropertyを通して新しい配列要素を挿入した場合、新しい配列要素はその一つ手前の要素の複製になる。もし最初の要素である場合はデフォルト値が入る。

ValidateCommandって何?
GUIイベントのひとつであるValidateCommandは特別のアクション(元に戻す、やり直し等)の発生を示す。ExecuteCommandに近い印象があるが、このコマンドタイプは別にあり、意味がわずかに違いつつ全く同じ目的で使用することになる。残念ながらどこでチェックをして、GUI設計の内容によってどちらかのイベントだけが発生して両方ともには発生してくれない。正直どうしてなのかは分からない。
そうすると安全に対処する方法は両方ともチェックすることだ。この場合にかぎっていえばValidateコマンドをチェックすることで要件は満たせているようだ。

breakって何? キーワードbreakを使ってループから抜け出すことが出来る。複雑な条件があって早い段階でループを抜け出したい場合に便利だ。
for(int i = 0; i < 100; i++) { if(i == 5) { break; } DoStuff(); }
と同じ結果になるのは:
for(int i = 0; i < 5; i++) { DoStuff(); }

foreachって何?
forループの便利な代替手段がforeachだ。通常のforループに比べてオーバーヘッドがあるので自分はゲームコードでは絶対使わない。だけどエディタコードで反復する整数が不要な場合は気にせず使用する。
foreach(Star s in targets) { s.UpdateStar(); }
と同じ結果になるのは:
for(int i = 0; i < targets.Length; i++) { Star s = (Star)targets[i]; s.UpdateStar(); }

OnSceneGUIはどうしてtarget引数が必要?
下位互換のためとおもわれる。マルチオブジェクトのエディットはUnity3.5から導入された。その前のバージョンはtargetしか変数がなかった。

ワールド座標にどうやって変換する?
ローカル座標をワールド座標に変換するためにはオブジェクト階層のTransformマトリクスを適用する。Unityはシーンのレンダリングで自動処理してくれるが、自ら行う必要があるケースが存在する。この場合はTransform.TransformPointメソッドを使う。

ローカル座標にどうやって変換する?
ワールド座標に変換する場合とまったく逆のステップをまったく逆順序で行う。Tranform.InverseTranformPointメソッドを使う。注意点としてワールド座標の場合はさきに回転(rotate)してそれからtranformを行ったが、元に戻すためには順序を逆にしてtransformを先に行って逆変換(invert transform)をローカル座標で行う必要がある。

スナップショットって何?
もし元に戻すステップを各々のGUIイベントに用意すると、ハンドルをドラッグする操作は何十もの修正ステップに対する元に戻す操作履歴が必要になってしまう。だから代わりにハンドルはオブジェクトのコピー、すなわちスナップショットを作成してして操作に対するひとつだけの元に戻す操作履歴ををその動作が終了したタイミングで登録する。SetSnapshotTargetはどのオブジェクトを用意すればよいかを取得できる。
すべてのUnityエディタGUI要素は本質的にこれと同じで、ハンドルのドラッグ、数値スライド、テキスト入力、あるいはその他の要素であれ同様である。
-----------

Unityエディタ編集は覚えることを面倒くさがらず、うまく使いこなすと結果的に生産性があげられる、というのがポイントだとおもう。

一人でも多くUnityのエディタ編集をマスターしよう!

2012年9月27日木曜日

Unityプログラミング応用(エディタ編集)~その2

前回に引き続きプログラミング応用編として、Unityエディタの編集に関して学習していきたい。
リンク先のウェブサイトの記載と併せ、ポイント解説の翻訳を見比べてほしい:

http://catlikecoding.com/unity/tutorials/star

構造体(struct)を使用しないのはなんで?
Star.Pointが軽量でありデータは常に全てが必要であるため、構造体にすることでオブジェクトのオーバーヘッドを回避することは意味があるといえる。しかしUnityはカスタムの構造体の型をサポートしていない。だから格納したいものには、データをバンドルするクラスを使用せざるを得ない。
オブジェクトのオーバーヘッドやNullエラーの可能性が気になるのであればオフセットおよび色データを別の配列に保存することは可能である。しかし、その場合にはこれらの配列が同期していることを保証する必要がある。それも実現可能ではあるが、クラスにするアプローチがより簡単である。このデモで使用した理由はそのためである。

オーバーライド(override)は何をする?
オーバーライドは親クラスのメソッドを上書きするときに用いる手法。virtual定義されたメソッドのみオーバーライドできる。このデモのケースにおいてはUnityが型を正確に知らなくてもエディタのOnInspectorGUIメソッド呼び出しを行うことが出来る。
だとするとUnityのStartやUpdateイベントめせっどはoverideキーワードが必要なのだろうか。答えはNoでUnityは自らのイベントメソッドを機能させるためには別のアプローチをとっているためである。
じゃあOnInspectorGUIがUnityのイベントメソッドではないのはなんでだろうか?答えは分からないが何かが整合性ご取れていないかレガシーのコードなのであろう。

SerializedObjectって何?
クラスのSerializedObjectはUnityオブジェクトのラッパー(wrapper)あるいはプロキシとして機能する。ブラックボックスのように何が入っているか分からずともデータをオブジェクトから抽出するのに使用することが出来る。Unityインスペクタが自身で作成した何かに対してもデフォルトのインスペクタを表示できるのはこのためである。元に戻す機能も無償で付属する。

EditorGUILayout?って何?
クラスのEditorGUILayoutはUnityエディタで表示するための便利ユーティリティである。さまざまな描画を行うメソッドが含まれ、デモのケースではSerializedPropertyを描画するためのみにしようしている。
EditorGUIクラスも似たような便利ユーティリティであるが、この場合は自らGUIレイアウトを処理する必要が出てくる。

GUIContentって何?
GUIContentはラッパー(wrapper)オブジェクトでありテキスト、テクスチャ、ツールチップ(ToolTip)などラベルに使用するものが対象。

GUILayoutをEditorGUILayoutの代わりに使用するのはなんで?
ゲーム開発に普段使っているUnity GUIを使用するので問題ない。GUILayoutは基本的なラベルやボタンの機能を提供する一方でEditorGUILayoutはエディタ特有の入力フィールドなど保持している。
-----------

次回はいよいよ最後のまとめ!プログラミングのポイントを押さえて、Editorを使いたおそう!

2012年9月26日水曜日

NGUI 2.2.xバージョンアップ時のUnityバージョンに注意


NGUI公式フォーラムにて、

・NGUI 2.1.6から2.2.1にバージョンアップした
・Unity3.5.5f3でないとエラーが出た

との報告があがっていますので共有します:

http://www.tasharen.com/forum/index.php?topic=1747.0
September 23, 2012, 04:00:54 AM

リンク先によればエラーメッセージは以下が表示されるとのこと。

"Assets/NGUI/Scripts/Internal/UIDrawCall.cs(272,38): error CS1061: Type `UnityEngine.Mesh' does not contain a definition for `colors32' and no extension method `colors32' of type `UnityEngine.Mesh' could be found (are you missing a using directive or an assembly reference?)"
---------

NGUI2.2.xあたりからcolor32入りましたが、これはUnity3.5.5から導入されたプロパティであるため、確かにこのバージョン以降でないとエラーが出るのは間違いありません。(color32についてはリンク先を参照のこと)

強火で進め:Color と Color32 の違い
http://d.hatena.ne.jp/nakamura001/20120822

そういやAsset StoreのNGUI説明もバージョンに関する記載がないなー?NGUIにかぎらず同様のエラーが出た場合はまずUnityバージョンの確認をしましょう!

2012年9月25日火曜日

Reflections EngineでUnityにリアルな光の反射を

Asset Storeで興味深いアセットがあったので紹介したい。

まずは恒例の紹介文の翻訳から:

http://u3d.as/content/tong-games/reflections-engine/2XP

想像力を生かして光を美麗に描画するゲームの仕組みを手に入れよう!このアセットであなたのゲームをより美しくする

デモに含まれる内容:
光線の作成
屈折
光線の複数反射
連鎖での反射
イベントの作成

Reflections Engineは反射光の物理計算の威力を発揮しあなたのゲームを強化する

アセットの提供内容:

*コードを一行も書かずに使える、簡単かつ強力なBehaviorスクリプト
*使いやすいイベントが用意されており、Unityのメッセージ(Start、OnCollisionEnterなど)とシームレスなコードが用意されておりプロジェクトに簡単に統合できる
*使用デモあり。
*readmeファイルと役に立つドキュメンテーション
------

おおっ!たった$10のアセットInspectorで光の量を調整したり反射の向きが変わるのはけっこう感動するので、ぜひ動画でみてほしい!

どれも2分程度の動画。最初の1分半でセットアップ、最後30秒で実行テスト。時間がない人は最後30秒づつをみるだけでも、十分威力は伝わるはず。

光線の作成

屈折

光線の複数反射

連鎖での反射


イベントの作成

この作者は学習型のAIのアセットもリリースしている様子。ニューラルネットワークと呼ばれるものでこれも興味深いのでまたの機会に紹介したい。

Reflections EngineでUnityにリアルな光の反射をゲームに取り込もう!

2012年9月23日日曜日

Unity 海外の活動:ヤングゲームデザイナーズ夏季教室

海外で若い人はどうやってUnity学んでいるのかな?とおもって外人のつぶやきをみていたら面白い動画みつかったので共有したい。

Unityテクノロジー社UKのBen Pitt氏がリードする形で英国バークシャイヤーのサウスヒルパークというところでヤングゲームデザイナーズ夏季教室と銘打ったゲーム開発ラボが行われて、動画が共有されている:


動画をみると、Unityを勉強している大学生もサポート役を担う形で少年たちに教えている様子があり、言っていたコメントとして「みんなゴッドオブウォーとか既成のFPS作りたがるかな?とおもったけど全然そんなことない。自分のアイデアを持っていてそれを作るための方法を知りたがっているんだ」とあって、この子達は期待できるなと感じる。

動画見ると高い完成度のものを作成していることが良く分かるのだが、子供たちのコメントも「凄く勉強になってて、特にスクリプトの書き方が良く分かった」と言っているあたり本当に感心だ。

日本もゲームジャムとか素晴らしい取組みはあるが、まだこのビデオに映ってるような年齢層の子供たちに対して同等レベルのイベントはない。吸収が早い子供たち向けに一種のエリート教育としてもっと力を入れてもよいのかも。WiiUの事例にかぎらずUnityがゲーム開発の標準言語となった今、いつか若きスタープログラマーがこのツールで最高のゲームを作ってくれるのは間違いないのだから。

外国の子供たちもUnityの勉強頑張って面白いゲームを世界に提供してくれ!

【ちょっと休憩】完成Unityゲームのコード行数


Unityのモバイル向けの完成されたゲームのコード行数ってどれぐらいの量になるのだろうか?

それはゲーム内容によって大きく異なるに決まっているが、実際に初めてゲーム開発に取り組む場合に知りたいことでもある。

今回はAsset Storeに完成プロジェクトでAndroid向けにも遊べるCrusher Balloonを参考にテーマとして取り上げてみたい。

Crusher Ballons 動画

Asset Store紹介をみていただいたら分かるとおもうが、Crusher BalloonsはAngry Bird風のステージロックシステムを採用していて45ステージほど用意されていてゲームの完成度としてもなかなかのレベルであるといえる。

Asset Storeにて$20前後で販売されているものなので、コードをそのままお見せすることは出来ないものの、C#スクリプトとしては4000行ほど入っており内訳を調べてみることにする。

方針として、カウント方法として以下のような記載で4行として数える。
void Start()
{
  hoge;
}
結果だが、スクリプト内容を処理の種類に分類してみると以下のとおりだった:
私が受けた印象として100行程度の極めて短いスクリプトもふくめてなのでおもったよりボリュームは少ないな、という感じ。

ちなみに100行程度のスクリプトを実際にPlaymakerに移植してみて表現するとこれぐらいの遷移図になる。

Unityの開発は慣れない人にとってはどこまで作成すれば終わりか分からないとシンドイもの。でも実際に他の方の作成したものから学ぶのがいつも早道だと感じる。

Asset Storeの完成プロジェクトを参考にしていこう!

Unity C#とJavascriptの主な違い

Unity WikiにてUnity C#とJavascriptの違いを整理しているので紹介したい。

なおリンク先では各々の違いの詳細説明もついているため興味ある方は併せて確認いただくと、さらに勉強になるとおもう。


http://wiki.unity3d.com/index.php/Csharp_Differences_from_JS
17 August 2012, at 11:59

Unity C#とJavascriptの主な違い
  • 関数定義
function Start () { /* stuff. */ } // JS
void Start() { /* stuff. */ } // C#
string MyFunc() { return "hello, world"; } // C#
  • C#ジェネリック
//JS
function Start(){  var someScript : ExampleScript = GetComponent(ExampleScript);  someScript.DoSomething();}
//C#
void Start(){  var someScript = GetComponent<ExampleScript>();  // Or a more verbose version of the line above: 
var someScript = (ExampleScript) GetComponent(typeof(ExampleScript)); 
someScript.DoSomething();}
  • foreachキーワード
for(var x in someList){ // JS
  x.someVar = true;}
foreach(var x in someList) { // C#
  x.someVar = true;}
  • newキーワード
var foo = Vector3(0, 0, 0); // JS
var foo = new Vector3(0, 0, 0); // C#
Instantiate(someObj, new Vector3(0, 0, 0), someRotation); // C#
  • 型キャスト
var foo : GameObject = Instantiate(someObj...); // JS
var foo = Instantiate(someObj...) as GameObject; // JS
var foo = (GameObject) Instantiate(someObj...); // C#
var foo = Instantiate(someObj...) as GameObject; // C#
  • Getter/Setterプロパティ
C#では変数であるかのようにアクセスできる特別な関数が定義することができる。たとえばfoo.somVar="testing";と記述して裏ではget/set関数を準備してこの引数"testing"を内部に保持するようにすることはできる。しかし他のあらゆる処理(例 一文字目は大文字とする、等)も行うことは可能である。つまり変数割当てだけでなく、関数呼び出しにて変数の値セットを行い、その他もあらゆる処理を加えることが出来る。

考察
このリストを作成するきっかけとなったのはUnityチュートリアルにJavascriptが多いためにC#でなくJavascriptを勉強しようと計画した人がいたためだ。それには一定のメリットがあり、特にプログラミングが初めてだという場合にチュートリアルからコピー&ペーストが出来るという側面がある。しかし、長い目でみるとそれは言語を選択する正しい理由にはならない。

事実はC#およびJavascriptが90%の部分でソックリである。ほとんどの場合、JavascriptをC#に変更するための箇所はわずかだ。そこで、差がわずかだとするならC#をなぜ選択するとしたらその根拠がポイントとなる。まあ、この議論を始めると宗教的な論争になりかねないのでここでどちらかに優劣をつけるつもりはない。

でも断言できることとしてC#を私が選択した理由はエディタの優位性だ。

MicrosoftはVisual C# Expressのフリー版があり、Unityと良く連携できている。Intellisenseの自動補完機能がありtooltipヘルプも関数パラメータが含まれる。強力なエディタはコーディングの生産性をあげる。現時点ではJavascriptで同等の機能をもったフリーのエディタはみたことがない。
--------

はて・・・、違いの点については理解できたつもりが、最後のVisual C# Expressの一文で飛躍したのでちょっと分からなくなってしまった。

以下のUnity Wikiでも設定方法はあるが、はたしてMonoDevelopの自動補完よりはるか優れているとのことなのだろうか?そのあたりは今後で検証してみたい。

http://wiki.unity3d.com/index.php?title=Setting_up_Visual_Studio_for_Unity#Using_Visual_C.23_Express_As_the_code_editor

Unityでどうせ覚えるならやはりC#でOK!

2012年9月22日土曜日

NGUI 2.2.1

NGUIバージョンアップ情報です。このブログでも2.2.0は不具合報告が公式フォーラムであったことを共有しましたが、そのバグ修正のリリースのようです。

http://www.tasharen.com/forum/index.php?topic=11.15

9/21 07:05:03 AM

- 修正: スプライトリストのパフォーマンスを改善
- 修正: スプライトの境界(Border)編集が正しく動作しない不具合を改善
- 修正: その他、微修正
-------

余談ですが、他の投稿をみるとNGUI作者はコペンハーゲンのUnity本社にここ数日に行っていた様子。

http://www.tasharen.com/forum/index.php?topic=1667

私の憶測の世界ですがUnity4.0の新GUIに色んな機能の取り込みやNGUIのようなメジャーアセットが正しく動作するための検討しているんじゃないかな?と期待したりしてます。

さらにメジャーになってくれよ!NGUI!

2012年9月19日水曜日

NGUI 2.2.0の不具合情報に注意!!

つい数日前にリリースされたばかりのNGUI2.2.0であるが、Atlas Editorの不具合情報が報告されフォーラムでも話題となっているため共有したい。

(以下、9/22追記)
なおNGUI2.2.1で以下の不具合は修正されました。

(追記ここまで)

http://www.tasharen.com/forum/index.php?topic=1670.0
2012/09/18 at 01:29:19 PM

http://www.tasharen.com/forum/index.php?topic=1686.0
2012/09/18 at 04:28:31 PM

不具合報告
  1. Atlasのスプライトを編集するとエラーメッセージが表示される。
    • エラーメッセージ
      ImportSettings 'Assets/Atlas/PVMI.png' has been modified but AssetDatabase.ImportAsset has not been called. Please fix the scripts code or Import the asset manually.
  2. Inspectorで反映した設定がリアルタイムでNGUIウィジェットに反映されない。
    • Dimension, borderなど設定しても反映されない
いずれも開発者はバグとして認識していて次回バージョンアップで対応予定とのこと。
----------
    現時点(9/19)でみると2.1.6から2.2.0へのアップグレードはこれらのバグ修正が出るまで待っても良いようにみえる。

    うーん、今ちょうどNGUIはAsset StoreのMadness!でほぼ半額セールをやっているだけにこれはいただけないな。

    早く修正頼むよ!NGUI!


    Unityプログラミング応用(エディタ編集)~その1

    UnityのInspectorは他の開発環境にない便利さを提供してくれる。リアルタイムで変数を変更したり、オブジェクトをドラッグしたり、さまざまな機能がありゲーム開発を効率的に作業できるようになっている。

    このエディタをさらにカスタマイズすることが出来る。ただしそのための作法(プログラミング方法)を学ぶ必要がある。

    なぜそこまで手を入れる必要があるのか?答えは簡単で、「さらに楽をするため」である。Inspector上でスクリプトがおもいのままに変数をリアルタイム編集できると、何度もプログラムを実行する必要がなくなる。

    プログラミング応用編として、過去に紹介したウェブサイトの内容が非常に優れており、そこに書かれているポイント箇所を翻訳する形で学習を進めていきたい。併せてリンク先を参照いただきながらみていってほしい:

    http://catlikecoding.com/unity/tutorials/star
    メッシュ(Mesh)って何?
    概念的にはメッシュはグラフィックスのハードウェアにより用いられる構造体であり複雑な描画に活用される。三次元空間の点の集合と三角形(基本的な二次元形状)から定義される。三角形はメッシュが表現しようとしている物体の表面を構成する。物体そのものはリアルに描かれるため実際には三角形の集合をみていることに気づかないほどだ。

    クラスの属性って何?
    クラスの属性はクラスにつけられるタグのようなもので、Unityがクラスをどう扱うか変更することができる。デモのケースではUnityに必要なコンポーネントがあるか確認させていて、このコンポーネントを追加するゲームオブジェクトに必要なコンポーネントが揃っていることを保証する。

    typeofはどう使う?
    演算子typeofによりクラス等の型オブジェクトを取得する。変数に対して使用することはできず、明示的な型名でしか使用できない。
    クラス名をそのまま使用しない理由は明確でコンパイルエラーになってしまうためだ。あえてクラス名をそのまま使用しないのは型を変数に変換する必要があるためだ。

    forループの変則的な使用法は?
    for構文のなかで、複数のステートメントを反復宣言に入れて増分させることが可能。変則的な点はコンマで反復、増分それぞれの箇所に記入する必要がある点だ。
    for(int iA = 0, iB = 0; iA < 10; iA++, iB++) { DoStuff(iA, iB); }
    と同等の記入方法は
    int iA = 0, iB = 0; while(iA < 10) { DoStuff(iA, iB); iA++; iB++ }
    

    CGPROGRAMは何をする?
    Unityエンジンからグラフィックカードにデータフローがあり、頂点ごとに処理される。次に頂点間の補間データが個々の頂点から個別のピクセルの描画までのデータフローの処理がある。デモのケースではポジションおよび色データのデータフローが処理される。このケースではさらに、頂点のポジションをワールド座標からスクリーン座標に変換するという点が追加処理となる。
    CGPROGRAM文の上にある構文はデフォルトのライティング、Zバッファともにオフにする命令文である。カリングもオフにしているため三角形の両面(正面のみならず)を見ることが出来る。Blend SrcAlpha OneMinusSrcAlphaはデフォルトのアルファブレンドであり、透明を扱うことが出来る。

    固定機能シェーダがないのはなんで?
    固定機能シェーダは現在では使用されていない。またCGPROGRAMを使うことでUnityのスクリーンピクセルの変換が明示的になる。

    Nullとサイズの両方をチェックするのはなんで?
    新規作成されたとき、スターのコンポーネントはまだ配列がない。技術的にも配列を後でNullに設定することも可能である。エラーを未然に防ぐためにもその点は良く注意しておく必要がある。配列が存在する場合だけサイズをチェックする必要がある。
    --------

    繰り返しになるがリンク先ではエディタのプログラミングがより詳細が書かれており、ステップごとに丁寧に画面操作が一から書かれているので時間ある際に必ず併せて見てほしい。

    次回も引き続きエディタのプログラミングについてみていきます!

    2012年9月18日火曜日

    Unity3D SQLiteを使用できるアセット

    UnityでSQLiteを使用する方法に関する記事を最近読み、大変興味深い内容だと感じた。

    テラシュールウェア:[Unity3D]UnityでSQLiteを使用する
    http://terasur.blog.fc2.com/blog-entry-265.html

    見たかぎり手順はなかなか一筋縄でいくものでないけど、アセットでこれは何とかならないだろうか?とおもって検証することにしてみた。

    まずはAsset Storeでの「SQL」という文言での検索結果:

    これらアセットのうち「Mono SQLite」だけがPlaymaker連携もうたっており、公式フォーラムでのサポートの回答を行っていたため、購入して内容の確認を行った。(このあたり全部買うわけにいかず、客観的な理由でなく趣味嗜好)

    なおYoutubeチャンネルでの宣伝ビデオはなかなか興味深いもので簡単なゲームのプロトタイプを作りながら、MonoSQLiteとPlaymaker連携をする勉強になる、なかなか優れたビデオ。


    そして、自身での検証結果ですが・・・

    結論からいうと、「簡単・手軽にモバイルデバイスへ出力する」とは言いづらい結果でした。まあモバイル環境でDBアクセスするのだから簡単には行かないだろうとはおもいつつも、きちんとお金を払うことを考えると慎重な検討のうえで購入を決めたほうが良い一品、という感想。

    作成した方はブラジルの方なので、公式サイトも英語以外にところどころポルトガル語らしき言葉があって、おおらかな国の人が作ったものという感じ。
    (公式フォーラムでも7/20頃からNGUIとの連携機能リリースもうたっていて「来週木曜日出す」まで8月半ばに書いてあったけど、9月入ってもなかなか出てこないw)

    自分の検証内容が雑なところもあるのかもしれないので、もう少しまた時間おいて検証してまだ同じ感想かどうかは客観的にみるようにしよかな。。。

    -----
    • エディタ上は問題なく動作
    • iOSビルド
      • 環境はUnity3.5.2f2  iOS Free版でテスト
      • マニュアル通りに進めると、XCodeビルド時にエラーが発生する※
      • データベースのデバイスへの移行は手動処理が必要※
      • SELECT, UPDATE, DELETEは正常処理
    • Androidビルド
      • 環境は Unity3.5.5f3  Android Free版でテスト
      • データベース のデバイスへの移行はうまくいかなかったため検証できず(後日またやってみます)
      • SELECT, UPDATE, DELETEは正常処理
    • 暗号化は今回テストせず
    • その他、検証時に経験した不具合として:
      • "Prepare for iOS"、"Prepare for non-iOS"を複数回行うとなぜかビルド時に「MonoSQLite名前空間が見つからない」エラーが出るようになり、Unityを終了して再度Unityを起動で直った
      • 不具合ではないが、DBをStreaming Assetsフォルダ以外に誤って作成した場合も、DBへの初回アクセス時にDBをStreaming Assets配下に0KBで自動作成してしまうため、値が空である理由に気づきにくい事態に陥った
    ※ フォーラムみて知ったが、UnityのiOSビルド時にSymLinkを選択するほか、XCodeでの手動処理があった
    2) Did you added the dbs and the sqlite library to your XCode Project? Use add files, in your XCode project and add the database files in the StreamingAssets folder to the project. Then, go to Build Phases, look for Link Binary Libraries, click the + Button, look for sqlite and add the 3.0 library.
    

    2012年9月17日月曜日

    NGUI 2.2.0

    Unity4.0ベータのリリース以降、3回目のNGUIバージョンアップ。

    http://www.tasharen.com/forum/index.php?topic=11.15

    September 16, 2012, 11:38:28 PM


    -新機能: スプライト選択ウィンドウを追加、ドロップダウンウィンドウの代わりに使用が可能。スプライトのテキスチャをウィンドウ選択できる。スプライト選択ウィンドウに絞込み検索機能あり。
    -新機能: スプライトのプレビューはプレビューウィンドウで表示されるよう修正、ウィジェットの色tintが反映される。
    -新機能: 複数のウィジェットが同一depthの値である場合に注意メッセージを表示する機能を追加、ひとつのパネルに複数のAtlasが使用されている場合にもメッセージ表示
    -新機能: すぐにスプライトを編集できる機能追加、編集(edit)オプションからアクセス。
    -新機能: Atlasでスプライトを編集する際、スプライトの編集から移動した場合は、"・・・に戻る(Return to ...)"ボタンが表示される
    -修正: UIAnchor、UIStretch がラベル(label)で正しく動作するよう修正
    -修正: UITextureでテキスチャへの参照を失うことがある不具合を修正
    -修正: NGUITools.EncodeColorがFlashで正しく動作するよう修正(不具合を回避)
    --------

    月末までに別のゲーム開発を進めながらもマメに修正あげてくるところはさすが。

    でも、日本でよく修正要望あがっているSliced SpriteをTileできる機能は入ってないなー。今後に期待。

    NGUIをマメにアップデートして使いこなそうぜ!

    NGUI ゲームのコンフィグを簡単保存!

    ゲームを作成するとき、音量のオンオフやいくつかの設定をコンフィグとしてあらかじめ準備することが多い。

    この際、UnityでNGUIを活用する場合はUIPopupListで「EASY, NORMAL, HARD」としたり、UICheckboxでチェックボックスなどコンフィグに使いやすい。

    しかし、次回にもゲームを起動したときにその設定は保存しておきたいもの。セーブデータほどのものでない場合はPlayerPrefsというところに簡易に保存できるが、NGUIにはスクリプト記述せずに保存できる方法がある。

    http://www.tasharen.com/forum/index.php?topic=88.0

    September 09, 2012, 05:23:16 PM



    質問のまとめ
    PlayerPrefsに各種設定を保存して、Awake()のなかでUICheckbox.isCheckedをTrueやFalseをPlayerPrefsから読み込む方法をとっているんだけど正しいやり方かな?

    回答のまとめ
    それでも出来るけど、UISavedOptionのスクリプトをアタッチするだけで自動的にチェックボックスの値は保存できるよ(ラジオボタンのグループも同様)。
    ちなみにラジオボタンについてはグループのルートアイテム(radio root)にアタッチする。それ以外の場合は個別のチェックボックスにアタッチする。
    -----

    コンフィグ設定を保存するにはコードいらず。アタッチするだけ。便利だね!

    細部まで覚えてコードいらずにしよう ! NGUI!

    2012年9月15日土曜日

    NGUI 【ちょっと息抜き】作者がiPadもってない!

    今日は土曜日なので息抜き。

    NGUI公式フォーラムの質問のやりとりで、薄々は気づいていたものの、すっかり分かってしまった。。。。作者はiPadを持っていなかった!!

    まあ他の色んな回答をみてたら、そうかもなとはおもってたけど、iPad3も出てかなりたつ現在、たしかカナダに住んでいるはずの作者ならiPadぐらい持っているんじゃないかとおもってたが、動かぬ証拠があったので、ちょっと翻訳。

    http://www.tasharen.com/forum/index.php?topic=1635.0
    September 13, 2012, 08:38:29 PM

    質問のまとめ
    キーボードを表示/隠すためのAPIを探してたんだけど、UIInput.csの200行目から250行目のコードで表示はうまく行くけどキーボードを閉じる時に問題がある。タップが終わった後にDoneボタンを押すと、onSubmitを使って適切にイベントをキャッチしてくれる。(291行目のonSubmitのデリゲート)だけど右下のボタンでキーボードをクローズするとうまく動作しないんだ。

    どうやったらこのイベントをキャッチできるのか、それからキーボードを閉じる時にいつでもOnSelectを使うの?うーん、テストした限りでは閉じるとキーボードからフォーカスがなくなるとOnSelectが呼び出されるんだけど、必ずしもキーボードを閉じるのとは連動してない様子。

    作者回答
    え?良く分からないなー。どうやってソフトキーボードでSubmitせずに閉じるの?右下のボタンって自分はEnterキーだよ?

    親切な通りがかりの人(の続き)
    iOSキーボードはキーボードを閉じるためのボタンがあるけど、NGUIのSubmitと連動しないんだ。iPadだけかも知れないけど、この画面コピーに右下をみてよ。


    作者回答(の続き)
    おおーー!面白いなー、画像つけて有難う。で、そのボタンを押すとどんなイベントが通知されるのかなぁ?
    -------

    ちなみに、回答はまだ途中で作者の名誉のためにいうと、対応はまだ検討中。イベント名分かったら修正するんだろうね。Tasharenの中の他の人のiPadでテストちゃんとやってくれるんだよね???

    早くiPad買ってよ ! NGUI作者!

    2012年9月14日金曜日

    NGUI作者がこの半年間を振り返る

    Unityのアセットストアで2012年にバージョンアップも20回しているアセットなんて他にあるんだろうか?

    公式フォーラムでの自らの回答が一日平均17回、累計で2700回。ちょっとして鉄人になりかけているNGUI作者。

    彼の原点はどこにあるのだろう?怒濤の半年間を振り返ってくれたので是非紹介したい。


    http://www.tasharen.com/
    9/12/2012

    すっかり更新忘れのトップページ・・・

    フォーラムでほとんどの時間を費やしてきて、トップページのこと6ヶ月すっかり無視してた。その間、何があったっけ?

    NGUIは引き続きまあまあ知名度を維持してて狂気のアセットストアセール(Asset Store Madness)に2度参加(今まさに2回目の参加中)。総計(grossing)および有名(most popular)の両部門で一位の座を確保。もっとも重要なのは世界中の人々が喜んで使用してくれていること、自分にとってはそれが真に大事なことだね。Unityの来るGUIソリューション開発がまだ荒い段階にあることもあいまってNGUIを皆さんが選択されている様子、これは自分にとって刺激であり、また小さな変更や改善をフィードバックにもとづいて行うことにつながっている。

    それと一対をなすのがWinwardで、短期間3ヶ月プロジェクトのはずだったのだけど、いまや開発7ヶ月目に入ってしまった。すごく時間をとられてて今月の終わりまで状況が続きそう。10月1日が磨きをかけたベータ版のリリース日を何とか目指している。結局、週100時間の開発を続けるのは人として限界があるからね。

    でも良い面をとらえると、すべては順調に進んできている。面白いし、小さいけどアクティブなコミュニティがあってマルチプレイヤーのホスティングができていて、日々新しいコンテンツを増してきている。ずばぬけた人たちの特典(戦力)としてロックしてる船さえも用意している。これはDesuraウェブサイトを通して近々公開予定だけどSteam Green Lightウェブサイトでも認知度をあげようとしている。まあ、皆も手伝ってくれるなら是非一票を!
    ----------

    日本人のアツい応援もやる気につなげて毎日新たな機能追加してくれよ!NGUI!

    Playmaker 覚えておきたい既知の不具合


    今回はPlaymaker使用するうえで知っておきたい既知の不具合について。

    公式フォーラムを翻訳した:


    https://hutonggames.fogbugz.com/default.asp?W6

    2011/03/05 13:47

    既知の不具合

    全般
    • Unityエディタでシーンを保存する際にテキスチャがメモリリークしているとのエラー表示される。実際にはテキスチャはまだ使用中であるため結果的には問題ない。詳細はリンク先を参照のこと
    http://answers.unity3d.com/questions/24719/leaking-textures-loaded-from-a-dll
    • 解決方法:(Playmakerによる修正案)将来的にエラー表示が本当にエラーであった場合には修正予定
    • Playmakerを使用してないプロジェクトに切替えた場合、Playmakerウィンドウがあった場所でエラーが表示される(missing script)。
      • 回避方法:Playmaker用にレイアウトを作成し、Playmakerを使用するときだけそのレイアウトに切替える
    • 英語以外の文字をゲームオブジェクト名に使用するとUIで正しく表示されず場合によってはPlaymakerをクラッシュさせる(例 MacOSで漢字)
    グラフビュー
    • ドラッグ選択マーカーをPlaymakerウィンドウの外でマウスボタンをリリースするとマーカーが元に戻らない
      • 回避方法:Playmakerウィンドウでもう一度クリックすること
    アクション
    • 元に戻す、やり直すボタンがアクションのパラメータ編集の際に効かない
      • (Playmakerによる修正案)今後修正予定
    アニメーション再生(Play Animation)
    • 終了(Finish)イベントがデフォルトの繰返し再生モード(Wrap Mode)で起動されない。(アニメーションが終了位置より手前で終わってしまう)
      • 回避方法:別の再生モードをしようする(例 Clamp Forever)、あるいはアニメーションから終了イベントを発行する
    遷移(Transition)
    • 現在グローバル遷移の順番、優先順位をセットする方法がない
      • これは複数のグローバル遷移において共通のイベントを使用して優先順位をセットしたい場合に問題となりうる。稀なケースの可能性あり
    • 遷移の順番を変更するクイックな方法がない
    • Sequence Eventアクションを用いて、グラフ上で整理する方法がある
    • 回避方法:手動で遷移を編集する
    テンプレートのコピー&ペースト
    • 状態(State)、テンプレートをペーストする際、必要なイベントおよび変数が足されるが、FSMに変数があり名前が一緒だが型が異なる場合に対応できていない。変数が存在することが前提条件となっていて、実際には変数の参照がなくなり、もう一度手動で足す必要がある(別の名前で)
      • 回避方法:大体のケースにおいて変数の型が変数名に反映されているため回避できる。ネーミング標準を定めるのが良い(例 論理型であればIsやHasで始めれば他の型では使用されない)
      • 他の解決方法(Playmakerによる修正案):
    • 自動的にリネームする機能追加を行う
    • 名前が一緒であると表示するダイアログボックスの機能追加を行う
    • 変数の参照がなくなった場合に警告が表示の機能追加を行う
    --------

    不具合といっても致命的なレベルはない様子。Playmakerの開発者も公式フォーラムで積極的に回答をしていて、常連ユーザも掲示板で活発にコード共有をしているので、サポートもしばらくは大丈夫な様子。

    Playmakerをもっとゲーム開発に活用しようぜ!!

    2012年9月13日木曜日

    Unity コピー&ペーストを実現するには?


    Web Playerなど、Unity開発でコピー&ペーストに対応していない場合、標準では対応していないために困る。ただし代わりにスクリプトで対応する方法があるとの情報があったため、紹介することにした。

    Unity公式フォーラムからの回答を翻訳してみた:

    http://answers.unity3d.com/questions/266244/how-can-i-add-copypaste-clipboard-support-to-my-ga.html

    Jun 25 at 04:37 PM

    コピー&ペースト機能としてCtrl+C, Ctrl+V(Macコマンド)をアプリケーションに機能をもたせたい。理想的にはポップアップメニューで右クリックできるかもしれないがその解決方法は時間がかかりそうなので何かクリッポボード上のコンテンツをゲームに入れ込む手段さえあればよいと考えている。

    たとえば.NETの場合はSystem.Windows.Clipboardを使うのだけれど、System.Windows名前空間はUnity(たぶんMonoも同様)で使用不可だから困っている。何か良い方法ないだろうか?

    リフレクション使用すれば、GUIUtilityのプライベートメンバーを参照することで実現できるね。自分も調べたソース元が分からないけど、以下のスクリプトを使用すれば実現できるよ。

    // C#
    // ClipboardHelper.cs
    using UnityEngine;
    using System;
    using System.Reflection;
    
    public class ClipboardHelper
    {
        private static PropertyInfo m_systemCopyBufferProperty = null;
        private static PropertyInfo GetSystemCopyBufferProperty()
        {
           if (m_systemCopyBufferProperty == null)
           {
             Type T = typeof(GUIUtility);
             m_systemCopyBufferProperty = T.GetProperty("systemCopyBuffer", BindingFlags.Static | BindingFlags.NonPublic);
             if (m_systemCopyBufferProperty == null)
              throw new Exception("Can't access internal member 'GUIUtility.systemCopyBuffer' it may have been removed / renamed");
           }
           return m_systemCopyBufferProperty;
        }
        public static string clipBoard
        {
           get 
           {
             PropertyInfo P = GetSystemCopyBufferProperty();
             return (string)P.GetValue(null,null);
           }
           set
           {
             PropertyInfo P = GetSystemCopyBufferProperty();
             P.SetValue(null,value,null);
           }
        }
    }
    

    ----------

    ちなみに、NGUIでも作者に「これ使って実装してもらえない?」と聞いた方がいるようだったが残念ながらドキュメントないので実装できないとの返事だった様子。
    使用するなら自己責任の範囲で、とのことか。

    Unityで色々な機能をテストしてカスタマイズしよう!

    2012年9月12日水曜日

    Blender 初心者必見!ライティングの基本を学ぶ!

    ゲームでライトを配置するとき、なぜそこに配置したか理由がないときはないだろうか。理由を説明できない場合というのはまだ理解度が浅い証拠でもある。結果的にゲームのユーザにとって魅力的でない絵ととらえられてしまう。

    Blender Guruの記事の翻訳を紹介するが、百聞は一見にしかずでAndrew Priceによる本家サイトのビデオもあわせてみて学習してほしい。

    Blender初心者のレベルにあわせて記事はできているが、三点ライティングシステムぐらいは分かっているよ、という中級者もビデオを通してみることで考え方が体系化できるとおもう。

    http://www.blenderguru.com/videos/mastering-lighting
    チュートリアルの学習ポイント:

    ライティング基礎の重要ポイント
    ライティングのよくある間違い
    影がライトと同じぐらい重要な理由

    ランプを無造作においてみて、なんとか綺麗に見えるのじゃないかと思ったあなた、それはよくある間違いです

    ライティングはセオリーを知らないと威圧的に感じるトピックだ。大体の人は良いライティングとそうでないケースの見分けは出来るが、何故そうであるかは理解出来ていない

    ライティングを理解するためにはセオリーを理解する必要がある。セオリーに反対するならば別のチュートリアルに飛んでもらってかまわない。だけど、ことライティングに関してはセオリーが重要なのである
    ----

    上記リンク先のビデオのポイントをまとめました。なお理論すっとばしてBlenderでの実演だけ見たい方は24:00から15分だけみればOKです。

    なおビデオだけダイレクトに参照することも出来ます:

    http://www.youtube.com/watch?v=m-N149FMlWk


    2:30 影の重要性を強調。右の例だと形状を把握することが出来ない

    3:30 右側の写真が立体感があり、魅力的という話。ルネッサンス以降に影をつける絵の技術が急速に発達したとの解説

    5:30 ルネッサンス以前の写真。確かに平坦で表情のない絵だが、ここでビックリするぐらいつまらなさについてメッタ斬りの解説。まあライティングという観点では何もしていないというのは確かだがかなりAndrewの主観入ってくる

    7:30 階調範囲について、左の例で白い箇所がつぶれているとの解説。右上のヒストグラムで比較すると右側が上手に上限や下限に張り付かずに滑らかに変化しているのがわかる

    11:30 三点ライティングシステムについて。初心者の方むけの説明として:

    キーライト(Key Light)
    最も明るいライト、カメラから45度の位置に配置 -左の絵

    フィルライト(Fill Light)
    やや明るさを抑えたライト、キーライトの反対側から90度の位置に配置 -中央の絵

    バックライト(Rim Light)
    やや明るさを抑えたライト、背面方向からの光 -右の絵

    3つの絵を全てをマージして綺麗な絵となるところを実演。

    12:30 ルーブルなど有名美術館の200絵画における調査で、75%の絵画は左上部からの照明との内容を引用。脳の認知の話が出てくるが、3点ライティングを美しいと感じるのはちょうど太陽が上から照らす(キーライトとして)ことから来るのではないか、との仮説を紹介。だからこそ逆に暗闇で懐中電灯を下から人の顔を照らすと不気味に感じるのは脳が違和感を感じるようにに認知するためであろう、との話。さらに発展してもし人間が仮に2つの太陽が照らすような環境で生物として生まれてきていたら、脳の認知が変わってきて美しいと感じるものも変わったのではないかとの仮説を紹介する。なるほど、なるほど。

    18:30 ピクサー社のJeremy Vickeryの言葉を引用し、現実をそのままに表現しようとするのではなく、人がこうあってほしいという願望を描くのだ、という話を紹介。まあ日本の漫画家に通ずるような話

    23:30 ライティングにおけるチェックリスト
    ・観客に着目してほしいところ、そのメッセージ性はちゃんと用意できているか?また実際の絵に反映できているか?
    ・全てのオブジェクトの形状は判別できることができるか?(2:30の話)
    ・階調範囲は適切か?(7:30の話)
    ・オブジェクトと背景はきれいに分離できているか?(11:30のフィルライトの話)

    24:00 Blender実演によるライティング実作業の開始

    26:30 三点ライティングのうち、キーライトをPivot Point→3D Cursorを選び、Ctrlを押しつつマウス操作で5度ずつ移動するため、45度配置(左下のRot: 45.00と表示される)にピタリとあわせる

    27:30 ランプの大きさ、強度と被写体の大きさをバランスとるべき、との話。また自己発光(Emission)も調整

    30:30 階調の確認をBlenderで行う。レンダリングした後にTボタンで表示。Histogramのところに何も表示されないのはバグとのことで、Sample Lineでヒストグラムを表示させる。リアルタイムで2点間のヒストグラムが動的に表示されるので、白がつぶれているところが容易に確認できる

    32:20 フィルライトを配置。距離については近いほど階調で白がつぶれやすいとの話。強度はキーライト25に対して、フィルライトは12に設定。なおライトは別レイヤーのして、それぞれのライト効果だけ見れるよう工夫。

    35:00 バックライトを配置、Blenderのスポットランプを活用する。やはり別のレイヤーにして輪郭のエッジが際立つように調整。被写体以外の布に不要に光が当たっていると美しくならないため、スポットライトの照射範囲をせばめる。

    38:00 完成!さらなる改善点としては、階調をSample Lineで調べて、黒でつぶれているところを修正する、ぐらいとのこと。

    なるほど!24:00ぐらいまでの豊富な絵画サンプルを使った理論講義からそれ以降の実演が絶妙にバランスがとれていて良く出来た大学講義のような印象を受ける。

    Blenderをマスターしてゲームを綺麗に完成するぞ!

    2012年9月11日火曜日

    Unity オブジェクトプールの作成 ~その2

    前回までオブジェクトのプールを作成するためのコーディングをみてきた。

    さらに一歩進んでこれをコーディングでなく、アセットとして解決するのがPool Manager2というアセットだ。他にも多くのアセットがあるのだが、Playmakerと連動するのは本製品のみであるのでコーディングを避けたい人は注目しても良いのではないか。

    公式ページの機能紹介を翻訳したい:



    http://poolmanager.path-o-logical.com/

    2012/09/08

    インスタンスをプールする機能

    • インスタンス生成/破棄(Destroy)の代わりに生成/非生成(despawn)を実装。時間のかかるガーベージコレクションを避け、フレームレート低下を回避
      • ランタイム前にインスタンスをプール
        • シーンに配置するオブジェクトもゲーム再生前にプールできる

    複雑なセットアップ不要

    • プールマネージャプール生成(PoolManager SpawnPool)コンポーネントをゲームオブジェクトにドラッグ&ドロップしたうえ、コード中のInstantiate(), Destroy()を各々Spawn(),Despawn()に置き換えておく。引数は変更前と同じで良い仕様

    初期化およびクリーンアップは自動的に作動しレベルローディングに最適

    • オプションとしてロード時に破棄しないDontDestroyOnLoadを指定することでプール永続に対応。なお当該オプションについてはUnityドキュメントをリンク先で確認のこと
    http://unity3d.com/support/documentation/ScriptReference/Object.DontDestroyOnLoad.html

    複数プレハブをひとつの論理プールで

    • プールは複数プレハブから派生したインスタンスで作成可能。これによりユーザフレンドリーで論理的なグループ分けにすることが可能。たとえば全ての敵、爆発、発射台、など好みにあわせたグループ分けが可能。グループ名は任意に設定でき、20プールを設定してもオーバーヘッドは1プールと違いがなく、好みにあわせたグループ分けを実現が可能

    プレハブごとに上級オプションを定義(オプション)

    • Unityのインスペクタでプレハブをドラッグ&ドロップすることでプールに多くのオプションを設定することが出来る。(同等の機能はスクリプトを通じて実装可能)これはオプションであるためクイックスタートする場合は設定する必要がない
      • インスタンスのプレロード
        • ゲームプレイ時の参照のロードおよびフレームレート悪影響をさけるためインスタンスのプレロードを任意の個数実現することが可能。非常に肝要であり、Unityにてゲームプレイの前にできるかぎりの情報をロードすることが可能
      • インスタンスの”スマート”カリング機能
        • プールサイズが大きくなりすぎた場合に非生成(despawn)し非アクティブとなったインスタンスを破棄(destroy)。重いゲームイベント後のメモリのクリーンアップを制御する際に有効。使用後、この機能はオフになり、特定のトリガー条件が再度のクリーンアップをオンにする。カリングは特定のターゲット数に到達したときにオフ。パラメータをチューニングしてカリング頻度を調整することが可能。
      • 最大インスタンス数の設定
        • ゲームの最大インスタンス数を設定可能。ゲームにとって重要でないアイテムの個数調整に有効で、例えば小さな弾丸の数や、小さな炎などに応用可能。

    シーンの自動整理

    • インスタンス名に番号を自動付与しゲームの開発やデバッグを楽にする
      • プール生成オブジェクトをシーンから自由につけはずし可能
        • さらにプールマネージャにより自動的にプールの初期化およびクリーンアップを実現
      • プールのプレハブ生成
        • ローディングを軽減し、ゲームの特定のレベルをまるごとプレハブにできる
      • プール生成オブジェクトの親子関係
        • シーンのどこにでも親子関係をもたせることが可能、オブジェクトを追跡させることも可能。たとえばゲームの進行バーGUIパーツのカメラにつけるなども可能。

    全てを内部キャッシュ

    • Spawn()から参照があった場合もオーバーヘッドがない。逆にInstantiate()を使用したときは多くのオーバーヘッドが存在し、インスタンス生成、メモリ領域の確保、GameObjectに型キャストしてTransformが必要な場合はGameObject.transformでGetComponentを外部コールするなどが発生してしまうため有効

    デバッグオプション

    • メッセージログによりプールのログが解析できる。デバッグは階層になっているため、して特定のプレハブから派生したインスタンス、あるいはプール生成オブジェクト単位でのみデバッグ表示するようフィルタができる

    パーティクルエミッター向けのハンドリング

    • パーティクル破棄時の処理は、Unity標準の自動破棄(destroy)からプールマネージャ独自の非生成(despawn)に置き換えられる。コードではTranformでなくParticleEmitterをSpawn()に渡せば良い。

    各々のプールはリストになっている

    • 生成された(アクティブの)インスタンスのみ含まれる。これはインスタンスで作業をする際に静的(static)アクセスが出来るため便利である

    その他便利な機能

    • 使用されたプレハブをGetするメソッドしインスタンスを生成するなど、Unityでは標準的に提供されていない機能であり、カスタムエディタで情報が整理され作業効率を向上させる
    -----

    ひととおりの機能は揃っているようだ。他のアセットで同等の機能があるかどうか比較してみるのが良いのではないかとおもう。

    パフォーマンスも意識して開発しようぜ!!

    2012年9月10日月曜日

    Unity オブジェクトプールの作成 ~その1

    ゲームの中でオブジェクトをどんどんインスタンス生成、破棄するとシーンによってはパフォーマンスに悪影響が出てくる。

    そうしたときにどうすれば良いのだろうか?

    ひとつの解決策がオブジェクトプールの作成だ。Unity Answersから翻訳を紹介する:


    http://answers.unity3d.com/questions/7877/how-do-you-use-a-pool-of-objects-rather-than-creat.html

    Nov 18, 2009

    質問
    オブジェクトの作成、破棄を繰り返すのでなくオブジェクトのプールを使用するにはどうしたら良いか?

    ゲームプレイの際にインスタンス生成、破棄をするのでなく、再利用可能なオブジェクトのプール(弾丸、敵、爆発、その他)を作成、取得をするためにはどうしたら良いか?
    フォーラムのレスのなかでStartのときにオブジェクトのプール作成して必要なときに取得するのが良いというコメントをみているが、実際に完成したスクリプトやシーンでのセットアップ例や実際にどうしたら良いかみたことがない。

    回答
    自分の作ろうとしてるゲームについてどこまで理解しているかがポイント。理解が深いほど最適化が可能だね。たとえば弾丸が必要で、ゲームのなかで弾丸1000個が1画面に出現する上限と分かっている場合を想定しよう。配列の中から次の弾丸を選ぶクラスは次のようなものだ:
    ※9/10 23:23 スクリプトの"<bullets.Length"以下が正しく表示されていなかったため修正

    public class BulletGetter : MonoBehaviour {
    
        GameObject[] bullets;
        int lastBullet = -1;
        int bulletCache = 1000;
    
        void Awake(){
         bullets = new GameObject[bulletCache];
            for(int i=0; i < bullets.Length; i++){
                bullets[i] = new GameObject ("Bullet-"+i);
            }   
        }
    
        int GetNextBullet(){
            lastBullet +=1;
            if(lastBullet > bulletCache-1){
                lastBullet = 0;//reset the loop
            }
            return lastBullet;
        }
    }
    
    さらに様々な改善を加えることが可能。たとえば弾丸を使用中にアクティブ、非アクティブにする、画面に1000以上の弾丸が必要となった場合に自動的に配列の大きさを増やす、等々。あとはゲームオブジェクト作成の代わりにプレハブをAwakeでインスタンス化することもできる。

    キャッシングのシステム上もっとも重要なことは、未使用になった場合に元に戻すメソッドを用意すること。もうオブジェクトを単純に破棄、作成することはないのだから、オブジェクトの状態を簡単に取得して変更できるようにスクリプトを工夫する必要がある。
    -------

    今回はコーディングでオブジェクトプール作成する方法をみてきた。

    当然に自分でコーディングをしたほうが最適化できるのは明らかだろう。しかしUnityはコーディングやそのテストの時間がとれない人のための手段も用意している。そう、それがAsset Storeだ。

    次回はAsset Storeからオブジェクトプールの作成に対応しているAssetを紹介する。

    オブジェクトプールでパフォーマンスを改善するぞ ! Unity!

    2012年9月9日日曜日

    Playmaker上級編 カスタムアクションのC#コード記載

    今回はPlaymakerの高度な使い方を紹介したい。カスタムアクションを自らC#で記入する方法だ。

    公式フォーラムからカスタムアクションに関する記述を翻訳する:

    https://hutonggames.fogbugz.com/default.asp?W351

    このカスタムアクションの簡単な記載サンプルでは、システム日付と時刻を取得し、文字列変数に格納する。
    using System;
    
    namespace HutongGames.PlayMaker.Actions
    
    {
     [ActionCategory(ActionCategory.Time)]
     [Tooltip("Gets system date and time info and stores it in a string variable")]
     public class GetSystemDateTIme : FsmStateAction
     { 
      [UIHint(UIHint.Variable)]
      [Tooltip("Store System DateTime as as string.")]
      public FsmString storeString;
      [Tooltip("Optional foramt tstring. E.g., MM/dd/yyyy MM:mm")]
      public FsmString format;
     
      public override void Reset()
      {
       storeString = null;
       format = "MM/dd/yyyy MM:mm";
      }
      
      public override void OnEnter()
      {
       storeString.Value = DateTime.Now.ToString(format.Value);
       
       Finish();
      }
     }
    }
    

    このアクションはコードを目で追っても十分理解可能であるが、簡単に概要を紹介する:

    属性(Attributes)
    カテゴリー表示(ActionCategory), 便利な使い方(Tooltip),ヒント( UIHint)属性に対するアクションを記述することが出来る。

    [ActionCategory(ActionCategory.Time)]
    PlaymakerのAction Browserから検索するときにTimeのカテゴリーに表示※されるように指定する。新たなカテゴリーを追加する場合にはActionCategoryの列挙型(enum)を使用するか、文字列型を使用してカスタムのカテゴリーを定義することが出来る。

    [Tooltip("...")]
    Playmakerエディタ上での概要や便利な使い方表示を特定のクラスおよびパブリックのフィールドに設定する。

    UIHint(UIHint.Variable)]
    ユーザがドロップダウンボックスから値を選択できる機能を設定する。

    リセット(Reset)
    全てのアクションにおいてパブリック変数は初期値をユーザにとって便利な値に設定すべきである。

    Resetはステートにアクションが追加されたときに呼び出しされ、またAction Editor設定メニューからResetを選択した際に表示される

    開始(OnEnter)
    OnEnterはステートがアクティブになったときに呼び出しされる。アクションが簡単なものである場合は、多くのケースで全ての処理をこのなかだけで行う。
    storeString.Value = DateTime.Now.ToString(format.Value);
    このステートメントがこの簡単なアクションの肝であり、日付、時刻をフォーマットにあわせ文字列型として格納している。

    アクションが完了した際にはFinish()を呼び出しする。

    すべてのステートにおけるアクションが完了したとき、システムはFINISHEDイベントを送信し次のステートに遷移するような準備が整う。
    -------

    Playmakerはいざとなれば自分でアクションもカスタマイズ出来るのが魅力。

    C#でPlaymakerをさらに便利になるようにしようぜ!

    2012年9月7日金曜日

    Unity Hangout最高!

    今日はUnity Hangout1なるものをYoutubeで視聴してみた。
    http://www.youtube.com/watch?v=7Brg_aSjh2E&feature=plcp


    ニコニコ動画みたいなもんで、今回の参加者はUnity Technologiesの外人5名ほど。

    まあ、概要はslideshareみてもらえば分かるけど、とにかく、とにかく、とにかくUnity開発者の人だったら聞いて盛り上げる内容だった!


    Unity hangout1を視聴してみた from gamesonytablet

    次回もHangoutに期待するぞ!Unity!!

    Playmakerで配列、ハッシュテーブル

    Unityでプログラミングせずにゲームを作成する人にとってPlaymakerは便利なのだが、どうしても出来ないことがいくつかある。

    そのひとつが配列、ハッシュテーブルの取り扱いなのだが、便利なAssetがあり、Playmaker公式フォーラムで人気を博していることが分かった。

    ただし、まだアルファーバージョンであり、商用としては保証がないので、その前提でフォーラムからの翻訳を紹介することにする:



    配列とハッシュテーブルをPlaymakerで使用したい、そんなあなたにうってつけ!この機能的なシステムは使い勝手を重視し、Playmakerで配列およびハッシュテーブルが使用できる。パッケージは以下のwikiで入手可能だ:
    (訳者注。2013/3/19 にバージョンアップされており、それより過去バージョン Array Makerで作成したプロジェクトは動きません)

    https://hutonggames.fogbugz.com/default.asp?W715

    要約すると、配列とハッシュテーブルのふたつの代替になるコンポーネントを用意していて、オーサリングあるいはランタイム(Playmakerで出来るようにカスタムアクションを用意)で作成することが出来る。そこから先は、カスタムのアクションがフルセットで用意されているので配列とハッシュテーブルで行う全てのことがPlaymakerのなかで使用できる。

    良い面は配列とハッシュテーブルの代替になるコンポーネントがカスタムエディタとなり、オーサリングの最中にコンテンツをドラッグして反映することが出来ることだ。

    最初はAsset Storeでの販売もは計画したのだが、現実的に考えてサポートの時間がない私にとっては出来ない選択だったのが残念。ただし空き時間でもっと追加機能をつけたいとおもう。

    いくつかのデモがパッケージに付属していて大体のカスタムアクションは使える。なかには軽いテストでシステムが期待どおりに動くか確かめる程度のものもあれば、一方では見ていて楽しいデモも付属している:
    PlayMakerSamples/Addons/ArrayMaker/ArrayList/GameObjectPositionning
    (訳者注:2012/9/7時点ではPlayMakerSamples/TestLab/Addons/ArrayMaker/ArrayList/GameObjectPositioning)

    このデモでは配列で定義されているすべての要素(この場合は立方体)に位置(Position)を使って作成、さらに色を別の配列からセット。落下するにつれ、各々の立方体は配列に位置(Position)を再セットし、さらにリアルタイムで立方体が元の配列にセットすることを実現。さらにいうと、配列のエディタで色情報を更新すると、関連する立方体の色がリアルタイムで変化するのをみることが出来る!(備忘録として、Unityのプリファレンス設定で"OS X Color Picker"のチェックを外せば粒状の色変更にすることが出来る。OS X Pickerオンの際はマウスボタンを押しあげた瞬間だけ色が変化し、押している間は変化しない)
    ----------

    実際にこれらの中身はどうなっているのだろうか?

    状態遷移エディタ(FSM Editor)とインスペクタの内容を確認してみた:

    FSM Editor
     Inspector

    なるほど、要素のインデックスをFSM Editorでid指定してInspectorの各Itemから呼び出しを行うわけだ。直感的でわかりやすい。

    アルファバージョンじゃなくて早く正式バージョンを期待したいぞ!Arraymaker!

    2012年9月6日木曜日

    Playmaker サードパーティツール、アドオン


    Playmakerでビジュアルプログラミングをするといっても現実的には制約が多い。自分がAsset Storeで購入したアセットと連携するのか、というのがその大きな悩みのひとつになる。

    しかしPlaymakerには活発なフォーラムがあり、ユーザとやりとりしている中で連携部分を拡張している。

    今回はサードパーティツール、アドオンの考え方について公式フォーラムより翻訳する:
    https://hutonggames.fogbugz.com/default.asp?W714
    2012/08/27 8:42

    サードパーティツール

    Playmakerが他のUnityフレームワーク、ツール、オンラインサービスと連携するためにはカスタムアクションが必要。サードパーティ製の拡張ツールがPlaymakerのカスタムアクションと連携するリクエストはフォーラムからリクエスト可能。
    http://hutonggames.com/playmakerforum/index.php?board=8.0

    対応内容

    • Photon
    • 2D Toolkit
    • ex2D (beta)
    • FingerGestures (beta)
    • NGUI (beta)
    • PoolManager 2
    • Smooth Moves (scroll to bottom for actions; also checkout Tutorial 18)
    • SpriteManager 2
    • TestFlight AutoPilot
    • Midi Unified
    • Vectrosity
    • Input.touches
    • TargetPro


    まもなく対応予定

    • EZGUI
    • MegaShape
    • MegaFiers
    • Tidy TileMapper
    • UnityConstraints
    • UnityRandom
    • IOS GameCenter
    • Parse(素晴らしいSAASでアプリ間で独特かつ高機能なリアルタイム通信を提供!チャットから通知まで簡単で高機能なアプリを提供することを可能にする)
    • Pusher(素晴らしいSAASで独特かつ高機能なオンラインデータおよびオブジェクトストレージ、ユーザ管理機能を提供する)

    アドオン

    アドオンはAsset StoreのサードパーティフレームワークOSシステムに依存しないカスタム機能。

    対応内容

    • ArrayMaker(ArrayMakerにより配列、ハッシュテーブルをPlaymakerで処理することが出来る)


    まもなく対応予定

    • XmlMaker (ファイル、オンラインのライブデータ、ゲームで生成されたデータなどのXMLデータを処理することが出来る。xPathアクセスとCSVパーサの機能を持つ)

    ---------

    次回はこれらのうちArrayMakerを詳細に取り上げたいとおもっています。

    高機能なPlaymakerを隅々まで使い倒そう!

    2012年9月5日水曜日

    NGUI画面サイズを取得する場合の注意


    皆さんはゲーム開発のときに画面サイズを取得したスクリプト書いていたりしますか?

    マルチプラットフォーム対応する場合はハードコードせずに対応したいもの。

    その際に注意すべきフラグなどもあることが分かったため、今回は作者サイトから関連FAQを翻訳した:
    http://www.tasharen.com/forum/index.php?topic=1214
    July 31, 2012, 05:07:51 PM

    質問
    NGUIでのUI作成を順調に進めている。そのなかで悩んでいることがあるんだけど、状況としてはカメラをプラットフォームの解像度に合わせるなかで、今は解像度の異なる画面サイズにあうように自分でオブジェクトの大きさを手動指定している。

    問題はScreen.widthをコールして画面横幅を取得してるが、Unity Editorの画面サイズしか値が取得できてないがために、カメラの座標系とずれちゃっていること。(つまり、カメラは1280×720でUI Rootになっているんだけど、Unity Editorが16:9の小さい画面にしているような状況とか)NGUIが相対サイズを計算してくれることは分かっているんだけど、どうも自身で変更できる方法がわからず、読取り専用なので困ってます。どうやったらカメラの表示範囲での画面サイズを取得できるんでしょう?pixelHeightもpixelWidthを使ってもエディタの画面サイズの各々の高さ、幅の値を取得してしまっている様子。

    回答
    UIRootのautomaticチェックボックスを外してみて。それだけで画面サイズが読取り専用でなくて手動指定できるようになるよ。
    -----

    知らなかったけど画面サイズを取得するだけでもオフにすべきパラメータがあるのか。これは盲点だね。

    勉強してマスターしようぜ!NGUI。

    2012年9月4日火曜日

    必ず役立つ!Unity Wikiの裏技・便利技18~その2


    今回も軽いノリで。

    Unityの操作が思い通りにいかないとおもっているアナタ。Unity WikiのTipsはひととおり目を通しただろうか!

    まだ、という答えを期待しています(爆)

    前回の翻訳の続きをしてみた:


    http://wiki.unity3d.com/index.php/Tip_of_the_day
    1 January 2012, at 06:00
    1. Booはビルトイン関数として shell(), join() ,reversed()がある。素晴らしいことに、これらはJavaScriptでも使用できる。
    2. インスペクタで見るすべてのビルトインコンポーネントはヘッダーの右上に?記号が付いている。コンテキストヘルプを開くのに最短の方法となっている。
    3. どの軸がUnityでどの色であるか覚えるコツはRGB=XYZの関係になっていると覚えれば良い。
    4. 複数のオブジェクトを選択する際、Edit->Load SelectionおよびEdit->Save Selectionで選択オブジェクトをキーボードショートカットとしてCtrl+Alt+1など登録することができ、シーンで頻繁に使用するパーツ選択に活用できる。
    5. 階層ビューでオブジェクトをOption+クリックすることでその配下の階層すべてを展開、たたむことが出来る。(訳者注:前回4番目と同じ内容、ただしMacでの操作)
    6. エディタスクリプトを書くことでプロジェクトに特有のUnityでの繰り返し作業を短縮出来る。これらは通常のスクリプトと同程度に記述が簡単であるし、色々と負荷軽減になる。リンクを参照のこと。 http://wiki.unity3d.com/index.php/Wizard_Archive
    7. Unityエディタをひとつだけ起動していて、そこでGameビューを表示してない場合、Unityエディタはプレイモードに入ったときに自動的にGameビューがSceneビューの場所に表示され、またゲームを停止した場合に元に戻る。画面の解像度が小さいモニターで特に役立つ。
    8. タグを自分のカテゴリーや属性をゲームオブジェクトに割り当てするのに使用する。そうすればスクリプトでタグを使用してアクセスできる。例:if (contact.otherCollider.tag == "Enemy") あるいは GameObject.FindWithTag ("Enemy")
    9. プロジェクト内のファイルをUnityのプロジェクトビューを使用して移動したい場合、Finder(Mac)を使用せずUnityのプロジェクトビューを使用すること。こうしないとデータ参照、インポート設定が保持されないことがある。
    ---------

    うーん、今回はいくつか知っているなぁ。しかも前回4番目と同じのがあるのはどういうことだろう。

    まあ、それでもUnityマスターを自負するならWikiの便利技は全部覚えとくべき。

    周りの皆にも伝授しようぜ!Unity Wiki!

    2012年9月3日月曜日

    必ず役立つ!Unity Wikiの裏技・便利技18 ~その1

    今回はちょっと軽いノリで。

    Unityを使用していると、操作性が思い通りにいかなかったり、単純作業の繰り返しでイライラすることない?プログラマの人なら昔使っていたツールだったらこのあたり自動化できるのに、とかおもったりすることもあるんじゃないかな。

    でもちょっと待った!Unity WikiのTipsはひととおり目を通しただろうか!

    まだ、という人には翻訳をしてみたので、今回はそのネタで:


    http://wiki.unity3d.com/index.php/Tip_of_the_day
    1 January 2012, at 06:00
    1. ゲームオブジェクト移動時、Vを押下。クイックに近接する頂点にカーソルが合わさる
    2. スキンされたキャラクターは毎フレーム頂点更新される(アニメーション時以外も)。スキンされたキャラクターをその位置に固定する(消さずに、かつTポーズに戻さず)ためにはSkinnedMeshRenderのbonesフィールドをnullにする。
    3. インスペクタ上で配列要素の挿入、削除を行う便利なホットキーがある。SHIFT+DELで選択オブジェクトを削除、CTRL+Dで複製。SHIFTはGameObject[]のように参照型でのみ必要。
    4. 階層が深くなってしまった場合、アイテムを全て開げるときにALTボタンを押したままにすると、ネストされた階層も強制的に全て広げる。
    5. Debug.Logや関連メソッドを使用するとき、スクリプトのインスタンスを渡すことでログ出力をクリックしてそのオブジェクトをエディタ上で選択状態にできる:Debug.Log("This",this);
    6. スクリーンにオブジェクトを配置する際、地面のすぐ上にぴったり配置したいなどオブジェクトに隣接させたい場合、コマンドキー(WindowsではCtrl)を押したまま各軸をドラッグすることでぴったりと止まる。(Edit->Snap Settingsで増分が定義されている)
    7. JavaScriptのクラスをインポートする場合。Debug.LogとSendMessageOptions.DontRequireReceiverが長くてタイピングが疲れるのでは?クラスのstaticメンバーおよび列挙体(enum)なら名前空間のインポート同様にインポートすることが出来るのをご存知ですか?単純にimport UnityEngine.Debug;およびimport UnityEngine.SendMessageOptionsを最初に書いておくことでLog("my log string")およびSendMessage("ApplyDamage",2.0,DontRequireReceiver)のように省略できる。
    8. オブジェクトの削除。コマンドキー+Backspaceをシーン、階層、プロジェクトビューで使用してオブジェクトを取り除く。シーンおよび階層ビューではオブジェクトの選択されたインスタンスのみが取り除かれる。プロジェクトビューでは選択されたオブジェクトファイルを取り除き、システムのゴミ箱に移動される。
    9. テキスチャ、たとえばフォントテキスチャが必要で、Texture.masterTextureLimitに影響を受けたくない場合、テキスチャのインポート設定でGenerate Mip Mapsをオフにする。デメリットとして、これによりより小さいスケールでのレンダリングにおいて画像の明瞭さにマイナス効果を及ぼす。
    ------------

    検証をすべてしていないけど基本的にほとんど知らなかったものばかり。Unity Wikiだけあって役立つものばかり!

    ちょっと長いので、残りの9個のTipsは次回。

    2012年9月2日日曜日

    NGUI 連続押下イベント

    今回はボタンの連続押下イベントから。 スペースキーを押している間は何度もスペースが押されますよね?あれはNGUIでどう実現するのでしょう。

    http://www.tasharen.com/forum/index.php?topic=1407


    2012/8/19 at 03:43:23 AM

    質問
    ボタンを押している間、一定間隔で繰り返し押下イベントを発生させるにはどうしたら良いですか?

    回答
    スクリプトをボタンにアタッチすれば一発解決です~



    using UnityEngine;
    
    public class RepeatButton : MonoBehaviour
    {
        public float interval = 0.25f;
    
        bool mIsPressed = false;
        float mNextClick = 0f;
    
        void OnPress (bool isPressed) { mIsPressed = isPressed; mNextClick = Time.realtimeSinceStartup + interval; }
        
        void Update ()
        {
            if (mIsPressed && Time.realtimeSinceStartup < mNextClick)
            {
                mNextClick = Time.realtimeSinceStartup + interval;
    
                // Do what you need to do, or simply:
                //SendMessage("OnClick", SendMessageOptions.DontRequireReceiver);
            }
        }
    }
    
    --------

    NGUIフォーラムで投稿された質問ですが、驚くべきことにわずか5分以内にスクリプト付きで回答が返信されてました。

    うーん、おそるべし ! NGUI!

    2012年9月1日土曜日

    NGUI Unity4 New GUIに対抗、大幅変更を予定?


    NGUIのUnity4対応だが、これまではマイナーバージョンアップを繰り返しているのみの印象である。

    しかし、つい数日前にUnite2012のNew GUI Systemビデオが公開され、ユーザからは「NGUIはいつどうするの?」という声がNGUI公式フォーラムであがるようになっている。

    これに刺激を受けてかどうかは分からないが、どうやらNGUI作者は10月にいくつか大きな変更を予定しているようである。

    公式フォーラムでのNGUI作者コメントを翻訳する:

    http://www.tasharen.com/forum/index.php?topic=1534.0
    August 31, 2012, 02:27:15 PM

    NGUIについて、いくつかの新しい機能を10月にリリースすることを考えていて、その時期はバカみたいに忙しくないんだよ(IGFコンペティションが10月期限で今は頭が一杯で)。皆さんも安心してほしいけど、NGUIは引き続き開発を継続するしさらに拡張をしていくつもりで、10月のリリースではユーザビリティや大規模プロジェクト(およびサイズの大きいAtlas)にも対応させるつもりだ。

    今は10月といってるけど微妙なところ。もしかするとそれよりも早くできるかもしれないけど、まあ見ていてよ。
    ---------

    いつものことだがUnity4での大幅変更を期待しているぞ!NGUI!

    Blenderで宇宙からの地球を創る


    過去の投稿でBlenderで街全体を作成してみたことがあったが、当サイトとしては予想外にアクセス数が多かったため今回は地球を作成するチュートリアルを紹介したい。

    BlenderGuruサイトの記事を翻訳する:




    チュートリアルで学ぶこと:

    ・カラーマップ、バンプマップ、鏡面マップを使う
    ・雲と大気圏の追加
    ・マテリアルノードを活用し、暗闇の中で光る都市の灯りを再現
    ・複雑な地形(terrain)、海、雲、大気圏などリアリティのある地球をBlender作成する際に難易度が高いポイントの作成

    実際には一度覚えれば簡単!

    このチュートリアルのなかでNASAで提供されているテキスチャを活用し、いくつかのマテリアルの洗練されたシェーディングを行う。



    ----
    最初の2:30~9:30ぐらいでいきなりリアルな地球が出来る。そこから気にになる部分をプロの技術でブラッシュアップする手腕はまさに圧巻!

    以下、ポイントになるところのメモ:

    • 0:00 ビデオ作成の経緯。コロンブスの発見になぞらえ、Andrew Priceは地球が3つの層から出来ていることを発見(地表→雲→大気圏の順でチュートリアルが進行)
    • 2:36 実際の作成作業の開始
    • 5:10 通常はLambertしか使用しないがシェーダMinaevertが今回は良い
    • 6:20 NASAの画像サイズはオープンで最高の品質。サイズはBlenderに取り込むには大きすぎてクラッシュするためPhotoshopで縮小
    • 7:58 アフリカを左下にしておくと緑が目立ち、かつ海と陸に光が反射して綺麗
    • 9:30 バンプマップでいきなり綺麗に
    • 11:15 鏡面反射が海だけに適用するよう鏡面マップ適用(specular map)
    • 14:00 ノードエディタを使用して地球の裏側、表側で太陽が当たっている側とそうでない側でマテリアルをColorRamp, Mixで合成
    • 16:55 色んなパターンでミックス。すでに相当リアル
    • 18:39 雲の層を作成開始
    • 20:44 アルファ値を0にしてNASAの雲画像を重ねる。どうやて撮影したか分からないがNASAは凄い!とコメント
    • 21:29 普通にアルファチャンネルを重ねると地球が真っ黒になる。地球の層(マテリアル)にRecieve Transparentオンにしておくことで直る(Mixした3つのマテリアルすべてでオンにする必要あり)
    • 22:20 大気圏の層を作成開始。地平線に近いほど青く見えるよう工夫している。先ほど同様に雲の層にRecieve Transparentオンにしておく。
    • 24:14 現実よりも紫色が濃い大気圏にしたほうが綺麗に。滲み(Blur)ノードをフル活用
    • 25:20 星を作成。BlenderのStar機能を使用Minimum Distanceを使用するとカメラに近すぎて大きすぎて星は排除できる
    • 26:55 BlenderのStar機能はキラキラと瞬いてチカチカするため平坦な画像に焼きこみ
    • 29:20 地球の自己発光を強めにするとどんな感じか実験。現実よりもちょっと強めが良いが、ほどほど落ち着いていたぐらいが良いとコメント
    • 31:35 テキスチャのシャープ(Sharp)の調整あり/なしの比較。ありがわずかに良い
    リンク先には.blendファイルもあり、Blenderをお持ちの方は見応えあるのでぜひダウンロードしてみたいただきたい。

    Blenderでリアルな素材をゲームに活用しよう!

    ブックマークに追加

    このエントリーをはてなブックマークに追加

    自己紹介

    自分の写真
    Unity3D公式マニュアル翻訳やってる人がスマホ(iPhone, Android)のゲーム開発しています。気軽に面白く初心者が遊べる内容がモットー。Blogでは開発情報をひたすら、Twitterではゲーム作成の過程で参考にしている情報を中心につぶやきます

    ページビューの合計

    過去7日間の人気投稿

    ブログ アーカイブ