2012年8月31日金曜日

PlaymakerでOSイベントに対応

今回はPlaymakerでOSイベントに対応する方法について。

Playmaker公式フォーラムのQAより翻訳します:

http://hutonggames.com/playmakerforum/index.php?topic=1591.0
July 17, 2012, 01:20:49 PM


質問
Playmakerでアプリケーションの終了、中断、フォーカス(onApplicationQuit, onApplicationPause and onApplicationFocus)をグローバルイベントとして登録する方法はないの?

iOSの場合onApplicatonPauseイベント(およびその引数)に対応できることは重要だし、そのタイミングでデータ保存しないといけない。これはユーザが電話を受けたときやホームボタンを押下したときに発生する。

ホントに、中断(onApplicatonPause)が自分にとっては一番重要で次に終了(onApplicationQuit)フォーカスで、最後にフォーカス(onApplicationFocus)の順でどうにかならないかな?(自分はonApplicationFocusがどの場合に発生するかもよくわかってないけど)

回答
次のスクリプトを試してみたらいけるよ。空のオブジェクトでも何でもアタッチするだけだから。
using UnityEngine;
using System.Collections;
using HutongGames;

public class ApplicationEventsBridge : MonoBehaviour {
 
 
 void OnApplicationQuit()
 {
  PlayMakerFSM.BroadcastEvent("APPLICATION QUIT");
 }
 void OnApplicationPause()
 {
  PlayMakerFSM.BroadcastEvent("APPLICATION PAUSE");
 }
 void OnApplicationFocus()
 {
  PlayMakerFSM.BroadcastEvent("APPLICATION FOCUS");
 }
 
}

それからはFSMのなかで次のグローバルイベントを呼べば良い。
APPLICATION QUIT
APPLICATION PAUSE
APPLICATION FOCUS

このスクリプトがやることは、単純に3つのグローバルイベントをブロードキャストするということで、それによって任意のFSMに通知することが出来る。
------

そういえばUnityでゲームをさわるようになってから、あまりOSイベントを気にしなくなってたな(爆)

EclipseでAndroid開発してたころもXCodeでiOS開発するときもOSイベントやら画面のXMLを検討するやらやってたけど、あらためてUnityやPlaymakerが便利になってもそのころの知識を大事にすべきだと認識を改めた(キリッ)

Playmakerで完成度の高いゲームを作ろうぜ!

2012年8月30日木曜日

NGUI Flashビルドのメモリリーク


今回はNGUIのFlashビルドでのメモリリーク報告について。

公式フォーラムの投稿より翻訳します:



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

August 24, 2012  at 05:16:46 AM

質問
ゲーム開発においてUnityの標準UIコンポーネントからNGUI2.1.4に切替をしている。残念ながらFlash開発に課題がある。内容はFlashで実行するときに発生して、アイドル状態でもメモリが膨れ上がり続けるものだ。
たとえばプレイヤーが何もせず、メインのゲームオブジェクト作成が行われていないにも関わらず。使用メモリは1GBを10分で超えてしまうんだ!同一条件(ゲームがアイドル状態)でNGUIを外すと(シーンから全ての
NGUIゲームオブジェクトを外す)メモリ使用は安定していてメモリリークは見られない。

短時間の調査(TheMinerプロファイラ)でNGUIがUINode.HasChanged()メソッドを頻繁に使用していてこれがUnityエンジンのコード内部でメモリをコピーしているようだ。テスト目的でこのボディ部分をコメントアウトしたところ
メモリ使用は抑えられたようだ。UINode.HasChanged()以外で同様にNGUIコンポーネントでUnityエンジンのメモリコピーにつながるものがある様子。

まだまだNGUIは愛してやまなくて、使用し続けたいのだけど、何か良いアドバイスないですか?

回答
FlashバグだからUnityに知らせてもらうしかないね。HasChanged関数ではいくつかのイコールチェックのほかないよ。
コードをつけるね:

#if UNITY_3_5
    bool isActive = mGo.active && (widget == null || (widget.enabled && widget.color.a > 0.001f));
#else
    bool isActive = mGo.activeSelf && (widget == null || (widget.enabled && widget.color.a > 0.001f));
#endif

    if (lastActive != isActive || (isActive &&
        (lastPos != trans.localPosition ||
         lastRot != trans.localRotation ||
         lastScale != trans.localScale)))
    {
        lastActive = isActive;
        lastPos = trans.localPosition;
        lastRot = trans.localRotation;
        lastScale = trans.localScale;
        return true;
    }
------- 
んー。Flashでメモリリークかー。Unity仕様といっているけどもうちょっとNGUI側でも調べてもらいたいものだけど仕方ないのかな。

 バグフィックスされたらちゃんと知らせてね!NGUI!

NGUI 2.1.6


NGUIのアップデート情報。今回はバグフィックスのマイナーバージョンアップ。

フォーラムの情報を翻訳します:

http://www.tasharen.com/forum/index.php?topic=11.15
August 25, 2012, 01:26:43 AM

-新機能:セーブ機能(UISavedOption)をポップアップリストでも使用できるよう機能追加
-修正:Unity4のifdefを新しいヘルパー関数に置換しコード可読性を改善(NGUITools.GetActive、NGUITools.SetActiveSelf)
-修正:ドラッグパネル(draggable panel)が表(UITable)の外にコンテンツが飛び出るバグを修正
-修正:ドラッグパネルのスクロールバー(UIDraggablePanel.UpdateScrollbars)の更新時にソフトクリッピングを正しく考慮できていないため不安定となってたバグを修正
-修正:スプリングパネル(SpringPanel)が完了時に位置のセットとクリッピングをしてなかっため浮動小数点がずれていたバグを修正
-修正:入力(UIInput)の言語ローカライズ機能(UILocalize)が選択されていない
テキストだと適用されない仕様を修正
-------

最新のNGUIで安定した機能を提供しよう!

2012年8月29日水曜日

ちょっと休憩~Unity Editorを日本語にしてみる実験

最近にわかにUnityの日本語環境に関する議論が活発な様子。

[Unity][Unity3d]UnityでC#の新規作成ファイルをBOM付きUTF-8にするコマンド(Mac環境向け) - 強火で進め
http://d.hatena.ne.jp/nakamura001/20120824/1345832011

MonoDevelopが日本語OKになるんなら、いっそのことUnity Editorのメニューやインスペクタも日本語にしたらどうか?と思い立って実験することにしてみた。

また、ターゲットとしてはプログラミングができなくてもロジックが組めるPlaymakerというAssetとした。理由はプログラミングが出来なく、かつ英語が苦手だけどUnityを使って開発をしたい、という層が十分なマーケットとしてあるだろう、と考えたためだ。

なお今回はお遊びのつもりでやる実験なので、開発環境をおかしくするかもしれないため、試す場合は、①必ずバックアップをとり、②最悪の場合Unity環境が立ち上がらない場合も自己責任で直す覚悟でお願いしたい。

実験内容
PlaymakerのUnity Editorを日本語にしてみる

試したOS、Unity、Assetバージョン
Windows環境、Unity3.5.5f3、Playmaker1.3.2

実験手順
  1. 上のリンク先を参考にC#のテンプレート(雛形)ファイルをBOM付きUTF-8に書き換える
  2. Playmaker/Editor配下にある2つのスクリプトをデスクトップなどにバックアップした後、以下のファイルの「Language = 日本語」より下の行にある文字列を直したいメニューの文だけ、イコールより後の文字列に置換する
  3. コンパイルする
[PlayMakerMainMenu.cs]
Flag = Flag-JP
Language = 日本語
PlayMaker/PlayMaker FSM Editor = PlayMaker/状態遷移ブラウザエディタ
PlayMaker/Editor Windows/FSM Browser = PlayMaker/編集ツール/状態遷移ブラウザ
PlayMaker/Editor Windows/State Browser = PlayMaker/編集ツール/状態ブラウザ
PlayMaker/Editor Windows/Templates Browser = PlayMaker/編集ツール/テンプレートブラウザ
PlayMaker/Editor Windows/Edit Tool Window = PlayMaker/編集ツール/編集ツール
PlayMaker/Editor Windows/Action Browser = PlayMaker/編集ツール/アクションブラウザ
PlayMaker/Editor Windows/Global Variables = PlayMaker/編集ツール/グローバル変数
PlayMaker/Editor Windows/Event Browser = PlayMaker/編集ツール/イベントブラウザ
PlayMaker/Editor Windows/Log Window = PlayMaker/編集ツール/ログ
PlayMaker/Editor Windows/Console = PlayMaker/編集ツール/コンソール
PlayMaker/Components/Add FSM To Selected Objects = PlayMaker/コンポーネント/選択オブジェクトに状態遷移を追加
PlayMaker/Components/Add PlayMakerGUI to Scene = PlayMaker/コンポーネント/PlaymakerGUIをシーンに追加
PlayMaker/Tools/Custom Action Wizard = PlayMaker/ツール/カスタムアクションウィザード
PlayMaker/Tools/Load All PlayMaker Prefabs In Project = PlayMaker/ツール/全てのPlaymakerプレハブをロード
Loading PlayMaker Prefabs = Playmakerプレハブをロード中
No PlayMaker Prefabs Found! = Playmakerプレハブは見つかりませんでした!
Loaded PlayMaker Prefabs = PlayMakerプレハブをロードしました
PlayMaker/Online Resources/HutongGames = PlayMaker/関連リンク/HutongGamesサイトへ
PlayMaker/Online Resources/Online Manual = PlayMaker/関連リンク/オンラインマニュアル
PlayMaker/Online Resources/Video Tutorials = PlayMaker/関連リンク/ビデオチュートリアル
PlayMaker/Online Resources/YouTube Channel = PlayMaker/関連リンク/YouTubeチャンネル
PlayMaker/Online Resources/PlayMaker Forums = PlayMaker/関連リンク/PlayMakerフォーラム
PlayMaker/Online Resources/Release Notes = PlayMaker/関連リンク/リリースノート
PlayMaker/Submit Bug Report = PlayMaker/バグを報告
PlayMaker/Welcome Screen = PlayMaker/ようこそ画面
PlayMaker/About PlayMaker... = PlayMaker/Playmakerについて

[FsmComponentInspector.cs]
Flag = Flag-JP
Language = 日本語
States [ = 状態 [
Events [ = イベント [
Variables [ = 変数

注意点
コンパイル時に筆者環境では以下のエラーメッセージが表示された。ここで「Keep changes」を選ぶこと。Convertを選択すると、どうもBOMなしに変換されて文字化けが起きるようだ



実験結果
  • メニュー
変更前
変更後
  • インスペクタ
変更前
変更後

うーん、やっぱり日本語のほうが見やすいね!

まあ課題は山積みなわけで:

  • 日本語化をして良い箇所を特定する必要がある。残念ながら私のほうではUnity Editor自体、どこまで日本語を使用することが許容されているか確認する術もない(たとえば、ファイルパスや変数に日本語がNGなのはすでに情報があるが、今回のメニュー、インスペクタのラベルはどうなんだろうか)
  • Assetの場合、オリジナル作者で対応する必要がある。(技術的にラベルにあたる部分をローカライズできるようにあらかじめ作者側で行わないといけないし、規約上もソースコードの改変は問題がある)
  • Unity Editorの中に日本語化してよい情報がふくまれる場合に限定される。(今回もPlayMaker FSM EditorはUnity Editorのなかになかった。DLLライブラリに入っていたのか、私のほうでは確認する術がない)
またUnity Answersでエディタに関する回答は見当たらなかったが、タグが「Localization」となっていたトピックのうち、議論が多かったものを参考までに3つほど挙げる。大抵はゲームに日本語表示をする場合のトピックのなかでエディタで正しく表示されない場合のQ&Aのようだ。
http://answers.unity3d.com/questions/57395/how-do-i-localize-strings-in-the-editor.html
http://answers.unity3d.com/questions/38272/how-do-i-display-chinese-in-unity.html
http://answers.unity3d.com/questions/32615/does-unity-3-have-native-resource-localization-sup.html

なお、賢明な読者の方はお気づきかもしれませんが、NGUIで言語切替(Localization)をするデモと同様のフォーマットを踏襲したのでうまくスクリプトを組めばゲームのなかでの多言語化にも生かせるかもしれません。(エディタとゲーム中の用語は別物かもしれませんが・・・)

Playmaker作者は過去に別の質問で回答いただいたことあるので、今回も「どう思う?」って質問だけとりあえず投げてみた。

「動かなくなるかもしれないし、そこまでやる価値はあるの?」って怒られる気もしている(笑)が・・・。奇跡的に良い返事だったらここでまた共有することにする。

開発もたまには息抜きしてリフレッシュしよう!

2012年8月28日火曜日

Unityプログラミング応用(グラフ作成) ~その3


Unityプログラミング応用(グラフ作成)の続編です。

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



Mathfとは?
Mathfは構造体であり、便利な数学的な処理を行うことが出来るstaticメソッドや変数の集合体である。関数ライブラリである。

列挙型(enum)とは?
enumという型(列挙型)を用いて名前を順番に列挙した集合である列挙体を定義することが出来る。この型の変数は名前をこの変数のひとつとして持つことが出来る。これらの名前はデフォルト0から始まる数字と対応している。

限られた選択肢を提供した場合に便利である。

デレゲートとは?
値およびオブジェクト参照を変数に格納できるのであればメソッド参照も格納が可能できるだろうか。答えはイエスで、それがまさにデレゲートである。

デレゲートの型はメソッドを作成するのと同様に定義することが出来て、違いはコードの本文(body)がないことだけである。その後はこの型をしようしてデレゲート変数を作成し、型に合うメソッドを割り当てることが出来る。
その後はこの変数をメソッドであるかのように扱うことが出来る。

デレゲートはより複雑なものもあり、リストのように動作してより複雑なイベント処理も可能であるが本講座では割愛する。

メソッド名を2回用いているのは何故?
文章により言葉の文脈における意味がまったく異なる、と同じことを意識する必要がある。

FunctionOption列挙体の中を覗いてみると、ただの単語の一覧であることが分かる。メソッド名と同じ名前であるのは今回たまたま同じ名前の設計にしただけであって同じである必要性はない。

functionDelegates配列の宣言を覗いてみると、メソッドへの実参照であり、この場合は同じ名前でないと機能しない。

記号のはどのように用いる?
記号の?のを記号の:と組み合わせることで、if文を省略(インライン化した記載)出来る。例えば:
int y; if(x > 1) { y = 10; } else { y = 20; }を省略するとint y = x > 1 ? 10 : 20;
-------
Unityプログラミング応用のその1、その2をマスター出来ていると自信がある場合はリンク先の英語サイトのコードを参照下さい。

デレゲートなど私自身はうる覚えだということを確信しましたが(汗)、具体例があるので理解が深まります。プログラミングも応用することでゲーム開発に生かすぞ!

2012年8月27日月曜日

Unityプログラミング応用(グラフ作成) ~その2

Unityプログラミング応用(グラフ作成)の続編です:
http://catlikecoding.com/unity/tutorials/graphs/

newはどのように用いる?
newキーワードは、オブジェクトの新しいインスタンスや構造体の値をコンストラクトする場合に用いる。コンストラクタと呼ばれる特別なメソッドを直後に記載する必要があり、コンストラクタは所属するクラスあるいは構造体と同じ名前をつける。

チュートリアルでposition.yに値セットしないのは何故?
ポジションがオブジェクト参照であれば正しく動くが、実際には構造体の値である。

一意のオブジェクトインスタンスはひとつのみ存在することが出来るが、複数の変数から参照することが可能である。値に対してインスタンスをアサインすることと複製することは別のことである。
たとえて言うならば皆でAさんの名前を一斉に呼んで指示するようなものである。他の人がAさんの名前を聞いたからといってAさんが二人になるわけではない。

整数や構造体のインスタンスは先のオブジェクトインスタンスとは異なる動きをする。もし構造体の値を呼び出しした場合は、複製がそこで行われて独立に保持される。Aさんの名前の例でいうと、
今度は名前を呼んでも複製なので今度は当人から返事をもらうことが出来ない。

すなわちある地点のポジション(position)を呼び出ししても複製が行われる。今回のチュートリアルではこの複製された値に何かセットしても、もとの地点そのものを更新しないと何も値の変更は行われない。

returnはどのように用いる?
returnキーワードを用いることでメソッド終了後の戻り値を知らせることが出来る。戻り値はメソッドと型を合わせる必要があり、voidである場合には戻り値が存在しない。

returnステートメントはvoid、コンストラクタの場合を除いて必ず戻り値をセットするように記載する必要がある。

また、複数の戻り値をセットすることが出来る。その場合、複数の出口が存在することになり、どのreturnが用いられるかはifステートメントで分岐させる。

チュートリアルでstaticである必要性は?
チュートリアル記載のケースはstaticでなうとも良い。ただし、これらのメソッドは後にstatic配列に用いられる予定であり、これらもstaticである必要性はない。

多くのケースでstaticである必要性はないが、オブジェクトインスタンスと独立して値やメソッドが存在することが出来る場合にstaticにするように私自身はしている。
--------

第3回に続きます。

Unityプログラミング応用を自分のものにするぞ!

2012年8月26日日曜日

Unityプログラミング応用(グラフ作成) ~その1


今回はUnityプログラミングの応用編として優良なプログラミングチュートリアルのポイント解説部分の翻訳を行う:


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

チュートリアルを進めながらC#を応用してより複雑なグラフ作成を行う。
・グラフ作成を行い、線の作成から体積の表現まで行う
・パーティクルシステムを制御する
・数学的な関数を作成する
・実行中に動作変更を行う
・StartおよびUpdateのUnityイベントメソッドを用いる
・ループをネストされた場合とそうでない場合で用いる
・配列、列挙体、デレゲートを用いる

ポイント解説
Startはどのタイミングで呼び出しされる?

コンポーネントが作成され、アクティブとなり、Updateが初回の動作を行う前にStartは呼び出しされる?

配列はどのように用いる?
配列は固定長のオブジェクトであり、複数の連続した変数を取り扱う。変数宣言をする際に[]を後に記載することでその型での配列を表す。たとえばint myVariable;は整数を表しint[] myVariableは整数の配列を表す。

実際に配列のある変数にアクセスするためにはインデックス(何番目かではなく)を[]の中に記載する。たとえばmyVariable[0]で配列の最初のエントリを取得することが出来、myVariable[1]で二つ目のエントリ、といった要領で取得する。

実際に配列を作成し変数を割り当てる場合はmyVariable = new in[10];といったように記載し、10個のエントリからなる新しい配列が作成される。別の方法としてmyVariable = {1, 2, 3};というように初期値をあらかじめ設定することも出来る。

ParticleSystem.Particleとは?
ParticleSystem.Particleとはパーティクルのデータを保持する構造体である。型の中にドットがあるためネストされていることが分かる。パーティクル(Particle)型はParticleSystem型の中で定義されているためParticleSystem.Particleとしてアクセスする。

注意すべき点としてParticleSystemの中にないParticleも存在するが、その場合の型はShurikenパーティクルシステムが使用できない。

forループはどのように用いる?
forループにより繰り返しの動きを記載できる。この場合では整数iを反復する変数として用いる。第1部分で変数を宣言し、第2部分でループのクリア条件をチェックし、第3部分で変数をインクリメントする。

whileループを用いてまったく同じ結果を得ることはできるが記載方法として{}で括る範囲が異なる。

for(int i = 0; i < 10; i++) { DoStuff(i); }
と同じ記載をするためには:
int i = 0; while(i < 10) { DoStuff(i); i++; }

i++はどのような働きをする?
++演算子により変数は1つだけインクリメントされる。++表現を先に記載することで保持する値をあらかじめインクリメントすることが出来る。例として:

int x = 0; int y = 10 + x++; →xが1, yが10となる
int x = 0; int y = 10 + ++x; →xが1, yが11となる

--は減算する場合に同様に用いることが出来る。

-----

第2回ではポイント解説の続きを翻訳します。

プログラミングを応用することでゲームに磨きをかけるぞ!!

2012年8月25日土曜日

NGUI Unity4の新フォントシステムに対応できる?

いよいよUnity4プレオーダーベータがリリース。私もUnity Free+Unity iOS($120)でさっそく試しているが、さまざまな機能が目白押しで本当に試している間が楽しい!

なかでも新フォントシステムが導入されるのは有名な話だが、現在Unity Asset StoreでNo1売り上げを誇るNGUIは対応する方向だろうか?

公式フォーラムの回答を追ってみた:

http://www.tasharen.com/forum/index.php?topic=1470.0
August 24, 2012  at 05:16:46 AM


質問
Unity4ベータが出ているが、イケてる新フォントシステムをNGUIに機能追加しないの?

回答
NGUIで使用できるようにUnity仕様がオープンな形で実装されているか、まだ情報が十分開示されていない。けれど、ぜひとも活用したいしビットマップフォントやFont Atlasはユーザにとって面倒だったので技術的に可能ならば是非機能追加したいと考えている。

August 24, 2012  at 05:21:29 AM
------------

うーん。さすが。

まだ現在のUnity4プリオーダーベータでは確かめられないのだが、過去の記事を読み返してみたくなった:
http://blogs.unity3d.com/2012/06/29/the-new-gui/

Unity4でももっと期待しているぞ!NGUI!

Unityシェーダについて考える ~その2



前回投稿の「Unityシェーダについて考える」の続編です。

さて前回に書いた、たった数行のコードからUnityはどれぐらいの量のコードを自動生成するでしょう?Arasさんのブログから再び翻訳します:
(シェーダ周りは専門家でないので多少の誤訳はご勘弁ください)



http://aras-p.info/blog/page/4/
2010-07-16

自動生成されるコード
Unityのsurface shaderのコードマクロはその後、実際の頂点シェーダ、ピクセルシェーダを生成して、それぞれのプラットフォーム向けにコンパイルする。Unity3.0のデフォルト設定で対応している内容としては:
  • フォワードレンダラーおよびデファードライティングレンダラー(Light Pre-Pass)
  • 事前計算ライトマップのオブジェクト
  • 各種ライト(Directional, Point, Spot Light)対応。シャドウマップ対応、ただしフォワードレンダラーのみであり、これはLight Pre-passでは別処理であることが理由。
  • フォワードレンダラーではVertex LitおよびSphere Harmonicsライトがオブジェクトごとにコンパイルされる。さらに追加のブレンドパスを追加のピクセルごとのライトが異なるパスでレンダリングされる必要がある場合に対応
  • Light Pre-Passレンダラーについて、ベースのパスを生成してNormalや鏡面反射を出力して、最終パスとしてAlbedoをライティングと組み合わせ、ライトマップや自己発光ライティングを追加する
  • オプションとして影のレンダリングパスを生成する(頂点編集のカスタマイズ(Vertex Modifier)が必要なケース、たとえば頂点シェーダのアニメーションとして活用されたり、あるいは複雑な透明度効果が含まれる場合など)
実際の例として、フォワードレンダリングのベースパスとしてひとつのDirectional Light、4つの頂点Point Light、3rd order SH Light、追加のライトマップで生成を設定したケースで、どれだけのコードが自動生成されるのかご覧いただこう:

#pragma vertex vert_surf
#pragma fragment frag_surf
#pragma fragmentoption ARB_fog_exp2
#pragma fragmentoption ARB_precision_hint_fastest
#pragma multi_compile_fwdbase
#include "HLSLSupport.cginc"
#include "UnityCG.cginc"
#include "Lighting.cginc"
#include "AutoLight.cginc"
struct Input {
    float2 uv_MainTex : TEXCOORD0;
};
sampler2D _MainTex;
sampler2D _BumpMap;
void surf (Input IN, inout SurfaceOutput o)
{
    o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
    o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_MainTex));
}
struct v2f_surf {
  V2F_POS_FOG;
  float2 hip_pack0 : TEXCOORD0;
  #ifndef LIGHTMAP_OFF
  float2 hip_lmap : TEXCOORD1;
  #else
  float3 lightDir : TEXCOORD1;
  float3 vlight : TEXCOORD2;
  #endif
  LIGHTING_COORDS(3,4)
};
#ifndef LIGHTMAP_OFF
float4 unity_LightmapST;
#endif
float4 _MainTex_ST;
v2f_surf vert_surf (appdata_full v) {
  v2f_surf o;
  PositionFog( v.vertex, o.pos, o.fog );
  o.hip_pack0.xy = TRANSFORM_TEX(v.texcoord, _MainTex);
  #ifndef LIGHTMAP_OFF
  o.hip_lmap.xy = v.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;
  #endif
  float3 worldN = mul((float3x3)_Object2World, SCALED_NORMAL);
  TANGENT_SPACE_ROTATION;
  #ifdef LIGHTMAP_OFF
  o.lightDir = mul (rotation, ObjSpaceLightDir(v.vertex));
  #endif
  #ifdef LIGHTMAP_OFF
  float3 shlight = ShadeSH9 (float4(worldN,1.0));
  o.vlight = shlight;
  #ifdef VERTEXLIGHT_ON
  float3 worldPos = mul(_Object2World, v.vertex).xyz;
  o.vlight += Shade4PointLights (
    unity_4LightPosX0, unity_4LightPosY0, unity_4LightPosZ0,
    unity_LightColor0, unity_LightColor1, unity_LightColor2, unity_LightColor3,
    unity_4LightAtten0, worldPos, worldN );
  #endif // VERTEXLIGHT_ON
  #endif // LIGHTMAP_OFF
  TRANSFER_VERTEX_TO_FRAGMENT(o);
  return o;
}
#ifndef LIGHTMAP_OFF
sampler2D unity_Lightmap;
#endif
half4 frag_surf (v2f_surf IN) : COLOR {
  Input surfIN;
  surfIN.uv_MainTex = IN.hip_pack0.xy;
  SurfaceOutput o;
  o.Albedo = 0.0;
  o.Emission = 0.0;
  o.Specular = 0.0;
  o.Alpha = 0.0;
  o.Gloss = 0.0;
  surf (surfIN, o);
  half atten = LIGHT_ATTENUATION(IN);
  half4 c;
  #ifdef LIGHTMAP_OFF
  c = LightingLambert (o, IN.lightDir, atten);
  c.rgb += o.Albedo * IN.vlight;
  #else // LIGHTMAP_OFF
  half3 lmFull = DecodeLightmap (tex2D(unity_Lightmap, IN.hip_lmap.xy));
  #ifdef SHADOWS_SCREEN
  c.rgb = o.Albedo * min(lmFull, atten*2);
  #else
  c.rgb = o.Albedo * lmFull;
  #endif
  c.a = o.Alpha;
  #endif // LIGHTMAP_OFF
  return c;
}

実に90行のコード!

このうち、10行は自身のsurface shaderのコードであり、残りの80行はUnity 2.xの際は手書きが必要であったものである。(まあ、そもそも2.xはここまでライティング対応できてなかったから行数もここまでなかっただろうが)。さらに言ってしまうと、これはフォワードレンダラーのベースパスだけなのである。さらに追加のパスのコードも生成するし、デファードのベースパスも生成するし、デファードの最終パスも生成するし、影のパスも生成するし、まだまだ処理はあるのだ。

要するに、シェーダはより簡潔に書かれるべきなのである(少なくとも私にとって)。これによりshaderを書くUnityユーザが3倍ぐらいに増えてほしいものである。(今は10人だから30人か!)ライティングに関する変更予定のパイプラインが次のUnityバージョンで予定されているが、互換性がより高まるだろう。
----------

おー。コードは8倍に膨れ上がるのですね。これを自動生成とはさすがUnity!

しかしAras氏のブログは色々と気持ちがこもっているので、難しい用語は少し読み飛ばしながら読んでもなかなか読み応えがある内容ですね。学習に生かしたいものです。

世界でも数少ないシェーダをマスターしているプログラマを目指そう!

2012年8月24日金曜日

Unityシェーダについて考える ~その1


最近Unityアジアブートキャンプの内容が公開された。

[Unity3D]Unityアジアブートキャンプの内容の一部を一般公開 - テラシュールウェア
http://terasur.blog.fc2.com/blog-entry-239.html

テーマのひとつで「ShaderLab入門」紹介があったのだが、UnityではAras Pranckevičiusさんという方がでこのエリアをご担当されており、そのブログの内容からUnityがシェーダに対して目指していることが分かるのでちょっと紹介をしたい。



http://aras-p.info/blog/page/4/
2010-07-16

「シェーダ死すべし」という自分の発見から1年が経った。

どうしたことかUnity3になって、いよいよこの発見が実現に至ることになった。新機能をSurface Shaderという名前にした理由は「シェーダ死すべし」としたかったものの、それではイカンだろうと判断してグッとこらえたからである(笑)

実現したいこと
主に実現したいこととしてはサーフェイスのプロパティ宣言に時間の90%をかけてあとは余計なことをしたくないということだ。言い換えると:

「おーい、Albedoにこのテキスチャを適用して、ノーマルはこのノーマルマップを使うぞ。あとBlinn-Phongのライティングモデルを使うからな。それ以上は面倒だからいちいち聞いてくれるなよ!」

もっと言うと、フォワードレンダリングやデファードレンダリングであるか、ライトタイプの処理や、どれだけの数のライトをフォワードレンダラーで処理して、間接照明のSHプローブの処理をどうするかとか、まったく興味がないよ!ってことだ。汚れ仕事はレンダリングプログラマーの仕事なんだから、なんとかしろや!と。

具体例
簡単な事例だけど、完全に使えるUnity3.0シェーダで、拡散ライティングでテキスチャ、ノーマルマップつかったものを紹介する:

良いモデルとテキスチャの組み合わせで結構生かす画像ができているだろ!どんなもんだい。(注:画像は冒頭の画像)
Shader "Example/Diffuse Bump" {
  Properties {
    _MainTex ("Texture", 2D) = "white" {}
    _BumpMap ("Bumpmap", 2D) = "bump" {}
  }
  SubShader {
    Tags { "RenderType" = "Opaque" }
    CGPROGRAM
    #pragma surface surf Lambert
    struct Input {
      float2 uv_MainTex;
      float2 uv_BumpMap;
    };
    sampler2D _MainTex;
    sampler2D _BumpMap;
    void surf (Input IN, inout SurfaceOutput o) {
      o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
      o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap));
    }
    ENDCG
  } 
  Fallback "Diffuse"
}

コードのなかで面白味に欠けるところはグレーにしてみた(※本ブログではグレーにできなかったが、CGPROGRAM~ENDCG以外はグレー)。(宣言として、シリアライズしたシェーダのプロパティやUI名、古い機械向けに使用するシェーダ(Fallback)、等)そうすると残るのはCg/HLSLコードで、これは自動生成で大量のコード(ライティングや、その他諸々)に変換してくれる。

上記のシェーダはいくつかのパーツに分解できる:

  • surfをメイン関数としたsurface shaderで、Lambertライティングモデルを使用する。Lambertはデフォルト選択できるモデルのひとつだが、自分で書くことも出来る。
  • surface shaderからデータの入力を行う。これもデフォルト選択できる入力から選ぶことも出来て、頂点ごとに計算されピクセルごとにsurface関数に渡される。この例ではふたつのテキスチャ位置を設定する。
  • 実際のsurface shaderコードにあたる。入力値をとり、SurfaceOutput(デフォルトで存在する構造体)に書き込むことができる、ただしそのライティングモデルにその構造体に対応していることが前提となる。実際のコードはAlbedoおよびNormalを出力に指定するのみである。

-----

うーん。まったく別世界の話なので分かっていないところが多く誤訳などあったらご勘弁を。

次回はいかにUnityがコードを自動生成してくれているか紹介する。やはりコードは自身で書く部分は少ないにこしたことはないと感じる。

世界でも数少ないシェーダを使いこなすプログラマになろう!

2012年8月23日木曜日

セーブ機能を実現するAsset


今回はゲームにセーブ機能を実現するAssetの紹介から。Asset作者のウェブページからの翻訳です:



http://whydoidoit.com/unity-serializer-v0-2/

August 12, 2012 at 6:00 am

対応プラットフォーム

Unityランタイムプラットフォームは全て対応。(iOS, Android含む)

機能

ゲーム中にインスタンス化されたプレハブも対応、さらにシーンに含まれるオブジェクトのステータスも大丈夫(たとえばゲームの最中にDestroyされるケースも)

Unity Serializerによりカスタムクラスをシリアライズし、フィールドやプロパティの値(複雑なオブジェクトのジェネリックな集合)、さらに以下の標準Unityコンポーネントにも対応:

アニメーション
Rigidbody
マテリアル、テクスチャ(参照およびプログラム生成)
NavMeshAgent
Transform(親子などの関係も)

ただしこのプロジェクトはベータ版。人により正しく動いても保証はなく、バグ報告はあげるように。
----

うーん。ベータ版とはいえ素晴らしいの一言。と、いいたところだが・・・・筆者ではセーブはできたものの、ロードは保存されるべき変数が保存できなかった。

具体的にいうとStart(), Awake()で初期化処理をスキップするようにあらかじめ設定する必要があったり、もう少し検証をしてから活用する必要がありそうだ。(中途半端な紹介ですみません・・・)

しかしUnityに付属しているAngryBotsに作者が実装したYoutube動画は2分程度のものであり、「AngryBotsのセーブ機能がこんなに簡単に出来ちゃうの?」といった感じなのだが、使いこなせたらかなり便利な感じ。

http://www.youtube.com/watch?v=5HXYQlouL9k&feature=player_embedded

セーブ機能もゲームに実装しようぜ!

NGUI 2.1.5 - Unity4ベータ対応


昨日リリースされたUnity4のベータ版ですが、NGUIがさっそくサポートを開始しました。
2.1.5アップデート内容をNGUI公式フォーラムより翻訳します:

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

August 07, 2012, 12:58:41 PM

2.1.5
-新機能:Unity4をサポート
-新機能:NGUIはUnity3.5.5のColorをColor32で代替、メモリ帯域幅を節約
-新機能:UIStretchにてウィジェットの境界(画面だけでなく)をストレッチする機能追加
-修正:ボタン(UIImageButton)追加の際にすでにcolliderが存在する場合にbox colliderを追加する不具合を修正
-修正:シンボルパーサー(NGUITools.ParseSymbol)でシンボルが有効であるかをチェックするよう修正
-修正:テクスチャ(UITexture)と同様の修正をウィジエット(UIWidget)にも反映
-修正:アンカー(UIAnchor)をラベルにくっつけられるよう修正
-修正:スプライト(UISlicedSprite)でパディングを使用しないよう修正
------------

この投稿時点では、早い方もまだUnity4ベータの機能検証をされているところだとおもいますが、さっそくNGUIはサポートを始めましたぞ!

やるな!誰よりも対応が早いぞNGUI!

2012年8月22日水曜日

Unityプログラミング基礎(時計の作成) ~その2


「Unityプログラミングの基礎」の続編です。

まとめ部分(後半)の翻訳です:



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


クラスとは?

クラスとはオブジェクトを自身のコンピュータメモリ上で展開するうえでの設計図である。設計図によりこれらオブジェクトがどのようなデータが含まれているかとその振る舞いが定義される。

MonoBehaviourとは?

UnityEngine名前空間に含まれるクラスである。Unityコンポーネントとしてクラスを作成する場合はMonoBehaviourから継承する。便利な機能が標準で組み込まれており、例をあげるとフレームごとの更新処理ができるUpdate()など含まれる。

変数とは?

変数とは加工できる値である。オブジェクト、整数など参照させることが出来る。変数はあらかじめ使用前に型宣言が必要である。

また変数はあらかじめ定義された有効範囲でのみ使用することが出来る。デフォルトではクラス内が 有効範囲である。さらにそのクラスからインスタンス化されたオブジェクトはインスタンス毎にローカルな値を持つ。しかしstatic宣言することで、全てのインスタンスから同じ値を参照する。もし変数がメソッド内で宣言された場合はそのメソッド呼び出しが行われた時のみ存在する。

メソッドとは?

メソッドはクラスに定義された一連の動作である。入力値を処理して出力値に変換する。メソッド定義の際に入力値を持たない場合は、「メソッド名()」と記載する。出力値を持たないメソッドはvoidと記載する。

デフォルトでメソッドは通常オブジェクトに対する動作を定義するが、オブジェクトを必要としない動作を定義することも出来る。その場合はメソッドそのものをstatic宣言して記載する。

const(定数)の特徴は?

constと記載すると実行中に値が変わることのない定数であることを明示することになる。値はコンパイル時に計算され、参照されればその値が渡される。

コンパイル時に全ての定数はあらかじめ計算されるため、たとえば(1+1)と記載することと2と記載することは全く同じことを意味する。

struct(構造体)とは?

struct(構造体)とはクラス同様に設計図のようなものにあたる。違いはstructとして作成される場合はオブジェクト型ではなく値型(整数、等)である。
すなわちオブジェクトのような何かの概念を表現する性質は持たず単純な値をあらわす場合に用いる。

プロパティとは?

プロパティとは変数に見せかけたメソッドである。読み取り/書き込み専用とすることが出来る。

クォータニオンとは?

クォータニオンは複雑な数字から算出され、三次元回転をあらわす。単純な三次元ベクトルより理解することが難しいが便利な特性がいくつか存在する。Quaternion構造体はUnityEngine名前空間に存在する。

rotationをでなくlocalRotationを使用するのはどんな場合?

localRotationは配置(Tranform)の実際の回転を表し、親オブジェクトの回転とは独立している。たとえば時計オブジェクトを回転する場合には針はそれに沿って回転する。

rorationは配置(Transform)の最終的な回転を表し、親オブジェクトの回転と依存している。たとえば時計全体を回転させた場合に針はそのままの状態で維持される。

型キャスト(casting)とは?

型キャストをすることで変数の型を明示的に変換することが出来る。型キャストを記載する場合は値の前に型を()の前に記載する。型キャストを単純な変数に対して行うと、たとえば浮動小数を整数にすると小数点以下が切り捨てられる。

オブジェクト参照で型キャストした場合はオブジェクトは変換されず、参照の扱い方のみが異なる。オブジェクトの型がはっきりと分かっている場合のみに用いることになる。
---------

抽象的な概念ばかりでしたが、Unityプログラミング基礎のその1、その2をマスター出来ていると自信がある場合はリンク先の英語サイトのコードを参照下さい。

「このコードが何故ここで使われる必要があるのか?」の具体例があるので力がつきます。またプログラミングはどうしても英語が用いられれますが、苦手意識が減ります。

また筆者自身はUnityにおけるC#について概念を勉強する場合は以下のリンク先が最強と考えています:
http://www.slideshare.net/lucifuges/unityc

プログラミングも基礎をしっかり覚えることで実力がつくぞ!

2012年8月21日火曜日

XNAゲームのUnity3D移行


XNAゲームのデモがコード変更なしで動作したとの発表がありました。XNAゲームをブラウザで動かす道が開けたということですが、現時点でどのような制約があるか、発表内容を翻訳してみた:

http://channel9.msdn.com/coding4fun/blog/XNA-and-Unity3D-developers-unite-UnityXNA



UnityXNA発表 - Unity3D上で動作するXNA

XNAゲームはUnity3D上で動作するというのが持論であったため、実際にやってみた。

これはアクションゲームのデモでXNAがUnity3D上で動作した証拠である。
元のコードを一切変更することはなかった。新しいコードとMono XNAからコード流用を混在させる形で、XNAエミュレーションをゲームオブジェクトにスクリプトをアタッチすることでゲームのUpdate処理と描画での実行に成功した。

現時点の実装
1.基本的なゲームループおよびゲーム時間の計算処理
2.コンテンツマネージャによる2Dテクスチャ、サウンドエフェクト、ゲームミュージック(Songs)を各々Unity3Dオブジェクトでラッピング
3.スプライトバッチ描画専用にを描画キューを独自作成し実装。現時点で色の濃淡、コマアニメーションのフレーム処理(source rectangle)、スプライト反転表示をサポート。
4.スプライトバッチでの文字列描画は限定的にサポートし、文字列の位置、色までは処理。
5.ゲームミュージック(Songs)のメディアプレーヤ再生および効果音再生をサポート
6.キー押下取得(KeyboardStates)をいくつかのキーに限定してエミュレーション、マッピングはXNA値からUnity3D値(KeyCodes)へ。
7.元のコードを一切変更することなく、アクションゲームのデモが実行可能

課題および当面の改善ポイント
1.スプライトフォントは未サポート、すべての文字列描画(DrawStrings)は標準GUIラベルのフォントとしてレンダリング
2.フレームレートは60FPSで垂直同期。垂直同期オフにするとゲーム時間の計算処理に不具合
3.Windows Media Audio(.wma)ファイルはUnity3Dで未サポートのため、デモの音声ファイルはOgg Vorbis(.ogg)に変換
4.キーボード入力はいくつかのキーに限定されているため、今後XNA値からUnity3D値(KeyCodes)へのマッピングを改善する必要あり
5.マウス、ゲームパッド、タッチパッドによる入力は未実装
---------

まだ実用に耐えうるためにはフォントやら入力装置への対応などあるものの、XNAで何かを作ってきた、という方には大変魅力ある発表ですね。今後に期待します。

Unity3Dへどんどん移行しようぜ!XNA!

Unityプログラミング基礎(時計の作成) ~その1

最近Unityプログラミングの基礎について書かれている英語サイトを探したところ、実にすぐれたものがあることが分かった。

あいかわらず英語でのみ書かれているため、まとめ部分を翻訳をしてみた:



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


チュートリアルを進めながらC#の基本用語を押さえる。作成するものは簡単な時計である。
・オブジェクト階層を作成する
・スクリプトを作成しアタッチする
・名前空間にアクセスする
・Updateメソッドで更新する
・時間の進行にともない針の動きに反映させる

用語

ゲームオブジェクトとは?
シーンに含まれるすべてが原則ゲームオブジェクトである。名前、タグ、レイヤー、位置(Transform)コンポーネントをもっておりこれらはスクリプトのなかでエディタ編集できる。
単独では使用できず空のコンテナである。コンポーネントをアタッチすることや、オブジェクトを含めることで有用に使用することが出来る。

子オブジェクトとは?
あるオブジェクトを別のオブジェクトとして含める(つまり階層ビューであるオブジェクト上にドラッグ&ドロップすることで)ことで子オブジェクトの扱いとなる。
親オブジェクトの位置(Transform)は子オブジェクトにより継承されて最初に反映される。すなわち子オブジェクトの位置(Tranform position)が(10,0,0)であり、
親の位置が(2,1,0)であった場合は子オブジェクトの配置は(12,1,0)になる。しかし、親の回転位置(Tranform rotation)が(0,0,90)であった場合は子オブジェクトの
回転位置は(0,0,90)となって親オブジェクトを中心にして回転されることで(2,11,0)が配置になる。拡大(Scale)は同様に親オブジェクトより反映される。

名前空間とは?
コーディングのいてウェブサイトのドメインに相当するもの。たとえばMonoBehaviourはUnityEngine名前空間の中に定義されアドレスはUnityEngine.MonogBehaviourである。

ドメインと全く同様に名前空間はネストすることが出来る。大きな違いは記載順番が逆であり、forum.unity3d.comではなくcom.unity3d.forumと記載する。たとえばArrayListタイプがCollections名前空間に存在し、さらにSystem名前空間に存在する場合、アクセスするためにはSystem.Collections.ArrayListと記載する必要がある。

using句で何が出来る?
名前空間をusing句であらかじめ宣言することで、その後記載を省略できる。すなわちusing UnityEngineと記載することでUnityEngine.MonoBehaviourはMonoBehaviourとだけ
書くことが出来る。
---------

第2回も続けて用語の翻訳をします。

Unityプログラミングもこういう翻訳がもっとある方が良いとおもう方はポチっとね♪ ↓
このエントリーをはてなブックマークに追加


プログラミングも基礎からきっちりと身につけるべし!

2012年8月20日月曜日

NGUI UIの配置変更と注意事項


今回はNGUIでのボタン配置に関する話。簡単なようで思い通りにいかない場合ありますよねー

http://www.tasharen.com/forum/index.php?topic=1367.0
August 14, 2012, 03:28:00 PM

質問
1)ボタンの右寄せ、左寄せは可能ですか?
 画面の例では:Settingsボタンをスクリーン右端に設定し、残りは相対的に右寄せにしたい
2)ボタンの衝突(Collider)判定は動的に変更できますか?
 たとえば:ボタンを一個だけ作成してラベルのテキストを変更して2倍の大きさになった場合、衝突(Collider)判定がそのままの大きさなのですが、
 どうすれば良いですか?



回答
1)UIAnchorをアタッチすることでアンカーが横にくっつくように指定できるよ
2)NGUITools.AddWidgetCollider関数をテキストの大きさを更新した後に呼び出すだけで衝突(Collider)判定の大きさは修正できるよ
----

衝突判定の動的変更が必要とは気づかなかった。テクニックを磨こうぜ!NGUI!

2012年8月19日日曜日

UnityとBlenderでアニメーションの切り分けは?


今回の投稿はアニメーションに何を使えば良いか、とのお話。皆さん、Unityのアニメーション機能はオマケのようなものと認識しつつも、実際に使う場面になったらBlenderでどこまでやったら良いか迷うのでは?

Unityフォーラムからの回答を翻訳しました:

http://answers.unity3d.com/questions/17354/blender-or-unity-for-animation.html

May 15, 2012 at 04:01 AM

質問
BlenderとUnityどちらでもアニメーションが出来ることは知っているけど、たとえば人形(Ragdoll)を作成する場合に胴体、腕、等を複数の
パーツから組み立てる場合にBlenderでパーツを組み立ててUnityで編集するか、全部をBlenderで編集したほうが良いか、どちらがオススメですか?

ベストアンサー
アニメーションに関しての扱いはUnityとBlenderで異なる。Blenderではモデルに「走る」「歩く」「動作なし」「攻撃」などアニメーションを決めてメッシュ単位で動作させる。
一方Unityのアニメーションはゲームオブジェクトのプロパティに関するアニメーションが主である。もし配置(Transform)、大きさ(Scale)、回転(Rotation)に関してアニメーション
をした場合に出来るということだ。スクリプト変数さえUnityのアニメーターを通して編集することが出来る。

すなわちやりたいことによって解決策が異なる。もし特定の動きに関してのキャラクターの固定された動きを作成した場合はBlenderで行ったほうが良い。
もしアニメーションによりUnity特有の変数に影響を与えたい場合はUnityアニメーターを使用すれば良い。

その他、人形(Ragdoll)については専門でないが、Blenderでボーン構造やメッシュまで組み立てて、Unityのメッシュにインポートしてサブメッシュを人形(Ragdoll)コンポーネントに
アサインすればUnityは適切な制約やジョイントを作成し、人形(Ragdoll)エフェクトは表現できる。

一貫性が重要で、「歩く」アニメーションをBlenderで実施し、「走る」をUnityで実施する、などといったことは行わないように。


回答
自分のゲームではUnity標準のアニメーション機能を使って軌道(path)に沿って動くようにして、実際のキャラクターの動きにはFBXでインポートしたアニメーションを
使っている。互いにネストさせることが必要で、たとえば親オブジェクトが軌道に動くものとすると、子オブジェクトにFBXアニメーションをつけると良い。

またUnity標準のアニメーションをモデル内のアニメーションに使うのも良い。たとえば坪が割って開けられるとかそういったイメージ。

Unity標準のアニメーションのメリットは:
・アニメーションのフレームレートを気軽にリサンプリング出来る。60-90FPSと15、30FPSは世界観が180度変わってくるのだが、インポートされたアニメーションはサイズが顕著に増加してしまう。
・アニメーションの途中でスクリプト実行が可能(Flashに近い)であることで、タイミング合わせなど推測で行う必要性がない。たとえばパーティクル効果を動作のあるタイミングで動かすことが容易だ。

----------

要点はスクリプト連携の場合にUnity標準のほうがメリットある、とのことですね。また親オブジェクトと子オブジェクトに動作スクリプトを別のものをつけるのはTweenでも使われるテクニックですね。

ちなみにココでは2Dアニメーションに特化話は書いていないですが、Unity Asset Storeで購入できるAssetも選択肢に入るので、そこも比較したコメントがほしいですね(Smooth Moveとか)。。。

頑張ってクールなアニメーションを作成しよう!

2012年8月18日土曜日

NGUI 2.0.2


今回もNGUIアップデート情報から。初期化まわりの処理修正がメインですね:

http://www.tasharen.com/forum/index.php?topic=11.0
Reply on: April 17, 2012, 04:18:56 AM

2.0.2
-修正:ボタン(UIButton)スクリプトにおいてゲームオブジェクトが有効/無効されたときに選択されたステータスが正しく有効/無効にならない不具合を修正
-修正:パネル(SpringPanel)からドラッグパネル(DraggablePanel)スクリプトにイベントを正しく通知するよう修正(スクロールバーなど)
-修正:ドラッグパネル(DraggablePanel)がドラッグ時以外でも動作が止まるよう修正
-修正:ドラッグパネル(DraggablePanel)が開始時にパネルの位置をリセットしないよう修正
-修正:ドラッグパネル(DraggablePanel)の位置リセット(ResetPosition)関数を正しく修正
-修正:ドラッグパネル(DraggablePanel)のスクロールバー更新(UpdateScrollbars)関数がスクロールバー更新時(コールされているときなど)にも位置調整されてしまう不具合を修正
-修正:3DのUIを正しいアンカーのオフセットで作成されるよう修正
---

継続して勉強しようぜ!NGUI!

新しいiPadの解像度とゲーム開発


新しいiPadのRetinaディスプレイを見たことある人は本当に美しいと感じたに違いない。ましてやこのブログを読むような開発者の方はデザイナーの方と新しいiPadを最大限に活かした美麗なゲーム画像を使用することも多いだろう。

しかし、だ。2048×1536の画面は過去と比べて4倍のピクセル数を必要とする。

これは大きなポイントで結論からいうと新しいiPadのハードウェアスペックではこのピクセル数が負担になっているといわざるを得ない。

RetinaディスプレイについてSam Byfordさんという方がthevergeに投稿した内容が大変興味深かったので最後のまとめだけ翻訳してみた。

http://mobile.theverge.com/2012/5/26/3019105/retina-display-new-ipad-graphics



総括
リソース消費の大きいゲームがRetinaの解像度で何らかのトレードオフなく動作することは難しい。

結論からいうとN.O.V.A.3だけ例外的に新旧iPadで全く異なるスタイルのグラフィック体験をする(※上記画像の上下比較)ものの、その他では新しいiPadは多くのタイトルにおいて抜群のビジュアルを提供出来ており、他機種との差別化が良く出来ている。特に2Dゲームは新しいiPadで驚異的に綺麗であり、たとえばWaking Mars, Aquaria, Superbrothers:Sword and Sworcery EPが良い例である。一方、技術的にリソースを大きく消費するゲームが何らかのトレードオフなく動作することは難しく、さらに2048×1536解像度が足かせとなりiPad2グラフィックと同程度の処理パフォーマンスを期待することは難しい。A5XおよびRetinaディスプレイは各々魅力的なパーツであるが、一方でA5XではRetinaディスプレイによる負担増を支えきることが出来ていない。

GameloftはCNET取材に対し、N.O.V.A.3は将来バージョンアップする際にユーザに選択権を提供し、高解像度か全種類のパーティクル効果を選ばせることを予定していると発表したが、それよりもA5Xがより飛躍して過去とは歴然と違うパフォーマンスを提供することが急務だ。もし4倍超のグラフィックをもって美麗なパーティクル効果をRetinaディスプレイで提供することが出来たら開発者にとって道は大きく拓ける。しかし、現実は何万といった処理しきれないピクセルを削る作業が残っているということだ。また結局のところDVDの480pでも十分綺麗なのでそこで妥協すべきだろうか、という議論でもある。
-----

英語に自信ある方は是非原文をみてほしい。具体的に各ゲームソフトでなんらかの影響が出ているのだが、その内容が詳しく記載されている。まだまだ高解像度とパーティクルを両立させるのは難しいと感じざるを得ない。

ゲームを作る時は新しいiPadのRetinaディスプレイでグラフィックを残すかよくよく検討が必要だ!

2012年8月17日金曜日

Blender アニメーションの作業時間短縮


今回の投稿は趣向をかえてUnityにアニメーション取り込む際にもっともメジャーなBlenderアニメーションについて。
一般に人型アニメーションを作成するときはボーンアニメーションを使用するわけですが、その際に「Rigify」だとArmature作成(特に手間がかかる手の部分)が楽チンというお話です。
スクリプトの説明文から翻訳します:
-------
http://wiki.blender.org/index.php/Extensions:2.6/Py/Scripts/Rigging/Rigify
Rigifyはキャラクターのリグ作成の自動化をサポートします。積み上げアプローチが取られており、小さなリグ(例 手、足、背骨、指)から成る体全体のリグを作成することが出来ます。
リグの数は少ないが、より多くのリグのパーツがRigifyに加えられると、キャラクター、モンスターの種類が多くなりリギングの幅も広がるでしょう。
Rigifyの基本姿勢としてリグ作成をすれば、元のRigifyそのものがなくても動作するという点があります。つまりRigifyで作成したリグを他人に配布しても相手はRigifyをもっていなくても完全に機能します。
※また理解すべき点としてRigifyがサポートするのはリグコントロールやボーンの作成自動化まで、という点です。リグをメッシュに加えるところは自分で行う必要があるため自身でスキニングは行う必要があります。
-------
んー、実際に使ってみた感想としては本当に便利!手とか細かいパーツは通常相当面倒ですしね。
自分自身は※印の補足がよく分からない。Auto WeightがあるのでArmatureとメッシュを連結することは容易とおもうのだが、何の説明かが良く分からない。
(詳しい方にいつか教えてもらいたい)
なおBlenderで3Dモデル作って、キャラクターとして動かすのを見たことがない、という方は以下のリンクをみていただくと良いです。(なんと15分でキャラ作成、歩行、ジャンプの2アクションまで一通り入っている)
http://www.youtube.com/watch?v=GYZkwbg2T2s
またRigifyのチュートリアルビデオは以下が参考になります(残念ながらこちらも英語)
http://www.youtube.com/watch?v=Txl1X2WVX_E

街全体をBlenderで作成する

今回の記事はBlenderで街をまるごと作ろう、という海外の方らしく限りなく野心的でスケールの大きいチャレンジの紹介です。

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


http://www.blenderguru.com/videos/how-to-create-a-city

March 29, 2012


チュートリアルの中で紹介していること:

ローポリモデルでビル作成
パーティクルのみで街を作成
交差点のある道をテクスチャ付で作成
街全体の作成は難易度が高いシーン。ビル、車、街灯に加えて道まである!

驚くなかれアーティストのほとんどはこの作業をスクリプトで実施している。ただ経験からいうと現状のBlenderスクリプトでは十分な品質の結果が得にくい

そこでこのチュートリアルの中でいくつか街並みを作成するのに役立つTipsを紹介している
-------

んー、リンク先を見ると1時間超の英語ビデオ。最後はここでどうしてもつまずくなー

個人的に記憶に残ったのは:

・27:00~ ビル5つを街全体にランダム配置する操作
・30:00~ 道路部分を切り取る操作。Google Mapで道路がどうなっているか勉強すると良いが、言えることとして必ずビルが道路と面していないとリアリティがないとコメント
・47:00~ 道路のUVマッピングを上下方向、左右方向ともに全てひとつのテクスチャに重ねる操作
・テクスチャは自作でなくcgtextures.comより借りているとのコメント

その他、ヘリコプター、車や街灯の配置については一言コメント程度です(笑)

ただ街並み全体を作るのにどの部分に労力を割くべきか?は本当に勉強になります。

Blenderでスケールが大きなことにもチャレンジしてみる価値あり!

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

2012年8月15日水曜日

NGUI 2.00


今回もNGUIアップデート情報から:

http://www.tasharen.com/forum/index.php?topic=11.0
Reply on: April 12, 2012, 01:43:49 AM

2.00
-新機能:カメラのドラッグ(UIDragCamera)、パネルコンテンツのドラッグ(UIDragPanelContents)のスクリプト動作を機能追加
-新機能:新ウィジェットのスクロールバー(Scroll Bar)追加
-新機能:カメラにドラッグ(UIDragCamera)スクリプトをアタッチすることでドラッグ出来る機能追加
-新機能:パネルにドラッグ(UIDragPanelContents)スクリプトをアタッチすることでドラッグ出来る機能追加
-新機能:パネル(UIDraggablePanel)でスクロールバーに常に表示、必要でなければフェードアウト、ドラッグ時のみフェードインする機能追加
-新機能:スクロールビューおよびドラッグパネルおよびクエストログのデモを更新、スクロールバーを使用するよう機能追加
-新機能:デモの順序を基本編、一般編、応用編と並ぶよう再構成
-新機能:ローカライズがロード(Resources.Load)時に自動的に読み込むよう修正(ローカルリストで見つからなかった場合)
-新機能:アトラスメーカーで特定のスプライトをインポートする際、透明ピクセルをトリミングするよう機能追加
-新機能:アトラスメーカーでスプライト間のパディングを値指定できるよう機能追加
-修正:エディタの値保存先をPlayerPrefsからEditorPrefsに変更
-修正:ポップアップリストがエディットモードの場合にイベント送信(SendMessage)する不具合を修正
-修正:イベントリスナー追加(UIEventListener.Add)関数をイベントリスナー取得(UIEventListener.Get)関数に置き換えし、「-=」記号に対応
-削除:デモにてスクロールビューにUIDragObjectを用いてたものが不要となったため削除
---

ようやく2.00まで翻訳終わったぜ、それでもまだ4月分。NGUI作者バージョンアップ早すぎです!

NGUI 2.0.1


今回もNGUIアップデート情報から。キー入力周りの修正ですね:

http://www.tasharen.com/forum/index.php?topic=11.0
Reply on: April 15, 2012, 08:30:54 PM

2.0.1
-新機能:ドラッグパネル(UIDraggablePanel)がシーンビューにおいてドラッグ可能なウィジェットをオレンジ色の外枠で囲むように機能追加
-新機能:ドラッグパネル(UIDraggablePanel)に「ただちに再配置」(repositionNow)チェックボックスを追加し、子ウィジェットの現在の境界に沿ってクリップエリアを再配置するよう機能追加
-新機能:カメラ(UICamera)の上下方向の軸(vertical axis)、左右方向の軸(horizontal axis)の名称指定を出来るよう機能追加
-修正:カメラ(UICamera)でW:前進、S:後退、A:左に平行移動、D:右に平行移動あるいはスペースキーのイベントを入力フィールド時も処理してしまう不具合を修正
-修正:ドラッグパネル(UIDraggablePanel)の「開始時ドラッグ強度」を「開始時相対位置」に名称変更(startingDragAmount →startingRelativePosition)
-修正:チェックボックス(UICheckbox)が開始時ただちにチェック状態を確認するよう修正
-修正:スクロールバー(UISlider)が開始時に値をただちに反映するよう修正
-修正:入力のテキスト値(UIInput.text)が見出し(caption)利用時の不具合を修正し、ラベルのテキストでなくテキストの値を返すよう修正
-修正:入力のテキスト値(UIInput.text)が現在アクティブな色をラベルに反映するよう修正
---

キー入力もゲームで活用しようぜ!NGUI!

NGUI 2.0.3


今回もNGUIアップデート情報。どうやらボタン/キーボード入力周りですね。

http://www.tasharen.com/forum/index.php?topic=11.0
Reply on: April 17, 2012, 07:29:46 PM

2.0.3
-新機能:ボタンサウンド(UIButtonSound)で音量のみならずピッチも変更できる機能追加
-修正:ドラッグパネル(UIDraggablePanel)でスクロールバーを開始時にアップデートできるよう修正
-修正:UITweenScaleの開始時スケールを0から1に修正
-修正:入力(UIInput)でスペースキーと同じ高さの文字を無視するよう修正(Mac OS入力の不具合に対応)
-修正:変更が入るごとにテクスチャがマテリアルから外れる不具合を修正
-修正:マウスのUICameraにおける処理を修正、特にハイライトの際の不具合を修正
----

すごい勢いで修正しているけど、自分のゲーム開発で出ている不具合を先に処理している、とか何かあるんだろうか。

アップデートが早いゾ!NGUI!

NGUI 2.0.4


今回もNGUIアップデート情報の翻訳。これも5月の修正ですが、staticなどパフォーマンスを強く意識したバージョンであったことが読み取れます:

http://www.tasharen.com/forum/index.php?topic=11.0
Reply on: May 02, 2012, 10:46:04 AM

2.0.4
-新機能:パネルをstaticに指定出来る。ウィジェットが移動/回転/拡大できないことが事前に分かっている場合にパフォーマンス向上が期待できる
-新機能:UIButtonを追加。UIButtonColorと同じで違いは無効ステータスをもっていること
-新機能:ダブルクリックイベント(onDoubleClick)を追加。クリックイベント(OnClick)とほぼ同様でダブルクリックのときに発生
-修正:UIDraggablePanelの多くのウィジェットにおいて顕著にパフォーマンス改善
-修正:全てのプライベート設定されたシリアライズ(serializable)プロパティがインスペクタで隠す(hidden)設定に変更
-修正:UITooltipをより堅牢に修正し、背景枠と同じサイズをパディングに使用する
-修正:UILablelインスペクタにおいてテキストボックスを単語途中改行(word wrap)に対応
-修正:ボタンアニメーション実行(UIButtonPlayAnimation)とボタンTween実行(UIButtonTween)でイベントレシーバーを追加(完了時 on finishied)
-修正:UIGridがアイテム再配置の都度Z更新していた不具合を修正
-修正:ローカライズ(Localization)クラスをひとつのみ存在できるよう修正
-修正:ラベル(UILabel)のエディタ上のパフォーマンスを改善
-修正:スプライト(UISprite)のピクセル最適化(MakePixelPerfect)でパディングを正しく考慮するよう修正
---

パフォーマンス改善がすごいぞ!NGUI!

NGUI ドラッグパネルのパフォーマンス

今回はドラッグパネルのパフォーマンスに関するディスカッションから。



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

質問(常連メンバーAさん)
NGUIをしばらく使ってみてNGUI/Unityで悩んでいることがあって他の人も同様の
状況がないか教えてほしい。

1.Draggable PanelがiPhone4で遅い。iPad2, iPhone3, iPhone4Sは大丈夫。でもDraggable panelがひとつあるだけ、それもiPhone4だと遅い。それしかシーンにないのにパフォーマンスが激重。何か間違えた?でも実際問題、私が重く感じている。シェーダの問題?iPhone4のFillrateが悪いと聞いたことあるけど関係ある?
2.メニューをオブジェクト名、カメラ、パネル、アンカー等で作成してメニューを独自で作成する場合。質問はカメラのことで、たとえば「タイトルスクリーン」ってメニューをひとつのオブジェクトに格納したとして、カメラはひとつだけ使用したとする。もしゲームのメニューとチャットウィンドウに別アセットを容易したらパフォーマンスに悪影響出る?
カメラを3つか4つあると確実にパフォーマンスが激重になる?だとしたらUnityの仕組みがよく分からないし、もし複数カメラがあった場合、それぞれ別のコールが行われて、Draw Callを余分にコールするのとどんな違いがあるのか。
(とくにカメラが別レイヤーでレンダリングされてるのであれば)
3.UIDraggablePanel
ドラッグパネルのリストにて使用オブジェクトが1000あるけど画面表示されるのが10個の場合、1000オブジェクトをあらかじめ生成するのと動的に生成するのとどちらがよいのか?iphone 4でUIDraggablePanelパフォーマンスが落ちる点と連動して関係あるのかなと考えているのですが。

コメント(初心者Bさん)

んー、UI Root配下にひとつのレイヤーでひとつのカメラがベストじゃなかったかな?あと画面外に大量の非表示オブジェクトがあっても配置(geometry)が変わらないならパフォーマンスに何の影響もないんじゃないかな?(パネル全体を動かすのは配置変更に当たらないとおもっているし)

ただ、動的に生成するのがパフォーマンスに悪影響は作者さんに回答おまかせですー。

回答
Draggable Panelは正しく設定することで十分なパフォーマンスを発揮するので、実際にデモのパフォーマンスを見てほしい。その時にパネルの中のものをドラッグするときには配置情報を更新し直す必要あるのでパフォーマンスは当然に落ちる。パネルそのものあるいはUIDraggablePanelのドラッグは実際には何も動かす必要ないためレスポンス早い。

パフォーマンスをさらに早めるにはstaticにすることでウィジェットの大きさ、色、位置が変わらない。これは無駄なチェックを外すのでパフォーマンスが向上する。

賢くやるなら、デフォルトでstaticにしておいて、パネル変更が必要なときにstaticeを外す方法がある(ボタンクリックの時に外す、等)。次のフレームでまた元に戻せば良い。

あと複数カメラはひとつのカメラより確実にリソース消費する。私自身が作成してるWinwardでもカメラはひとつであり、その下に必要なウィンドウがアンカー付でたくさんついている(必要なときまで無効化)。

追加質問(常連メンバーAさん
Bさんの指摘は認識している。確かにUIPanelは別の配置(geometry)を必要としておりDrawCallを余分に消費するので、複数のUI Panelをさらにパネルのなかに入れ込むことは遅くなる要因だ。自分の場合にはUIDraggablePanelではNGUIデモと同じ設定にしてて、パネルだけ動かしてオブジェクトは動かしていない。

ところで、UIPanelをネストしてUIPanelの中にあり、かつ片方がstaticで片方がstaticでない場合は結局static扱いになるのだろうか?
たぶん親が優先されると考えているのかな?自分のプロジェクトでパフォーマンス低下の要因として説明つくのはUIPanelにあるDraggablePanelしか考えられず、ただ二つ目のUIPanelはドラッグ可能であるにも関わらず一つ目をドラッグ不可能としていることである。

追加回答
ネストされたパネルはすべて別エンティティとして扱われる。staticも子が優先され(親から子への)継承は行われない。
----

パフォーマンスに関する議論はケースバイケースだと認識している。ただし、色々なケースにおいて実際の利点・欠点の情報が共有されることで、個々のプロジェクトについて正しい判断が出来るものだ。Unityは日本でも勉強会やセミナーが活発なので、そういった所で議論されたうえでさらに情報の公開が進むことを強く望む。

もっと活発な議論をしようぜ! NGUI!

2012年8月14日火曜日

タイトルを目立たせるBlenderカメラテクニック


今回もBlenderのテクニックから。タイトルはやっぱり派手がベストだけど3Dを生かしてタイトル全体が揺れるってのはどうか?!



Blender Guruからの翻訳を紹介します:

http://www.blenderguru.com/videos/creating-camera-shake

September 29, 2011

このチュートリアルで紹介すること:

・オブジェクトに短時間でランダム動作をさせる
・ノイズ編集モジュール(Noise Modifier)を隅から隅まで学習
・コンポジタ(compositor)を通してカメラブレ(motion blur)効果を出すこと

カメラブレ(motion blur)はいつか試してみたいもの。カメラ揺れは視聴者に何か大変なことが始まっていることを示す。
ゴジラが街中を闊歩することなのか核爆弾の爆発なのか、カメラ揺れは便利な表現手法だ。

大抵の市販の視覚エフェクトではカメラ揺れを示すためにビデオフレームをリリース時に加工して行うが、3Dであることを
生かしてBlenderのなかで物理的にカメラを動かすことを試みてみる。
-----

うーん。Blenderで出来るのはなるほどだが、これこそUnityで実行したいもの。

タイトル画面で迫力を出そう!



NGUI 背景をボヤかすテクニック


今回の記事はゲームで開発しているウィンドウを表示したときにその背景をボヤかすテクニック。百聞は一見にしかず、次のようなケースです。よく見かけるでしょ?



NGUIを使う場合にどんなディスカッションがなされているか、公式フォーラムの回答を翻訳します:

http://www.tasharen.com/forum/index.php?topic=243
May 02, 2012, 01:55:55 PM

質問
今作っているゲームにはUIが何種類かあって、どれかのUIにフォーカスを当てたときには背景のゲームをボヤかすようにしたいんだけど、誰か簡単な方法分かりませんか?巨大スプライトをGUIの後ろに配置するようにして作成して、iTween.FadeToを使うことはフェードイン・アウトどっちも
試したことあるけどうまくいかない。どうしたらいい?

回答
Winwardsでやった方法を紹介するのでいいかな?画面と同じ大きさの背景を作ってUIStretchとColliderを貼り付けるんだよ。それによって画面全体をカバーできる。あとはZを-50に設定して必ずすべてのオブジェクトより前にあるようにすることだ。それのさらに上にウィンドウなどがさらにそれらのオブジェクトの前にあるようにするんだけど、そのときはZを(-50よりも)さらに低い値にすることがポイントだね。
---

なるほどねー。最近の家庭用ゲームも確かにウィンドウを表示すると、その背景画面はわざとボヤかすのが良くあるよね。

クールなUIにしようぜ!NGUI!

2012年8月13日月曜日

iTween 複数動作を簡単実現

今回の投稿は複数のiTween動作について。回答はiTween 作者がunityフォーラムで回答したもの。
http://answers.unity3d.com/questions/42902/multiple-itween-movetos.html#answer-42991
Jan 15 2012  at 02:37 AM

質問
水に浮かぶ瓶を再現したい。瓶は15 秒感覚で繰り返し左右に動いてて、
だとmoveToコールはオブジェクトに一つしか登録出来ない みたい。なんか間違えたかな?コード書かないとむり?
回答
いや、やり方は問題なしでiTweenではオブジェクトのTransformを一つづつ処理する。これはUnityがオブジェクトx,y,zを同時セットする必要があるためなんだ。
でも君のやりたいことは簡単に出来て、親オブジェクトと子オブジェクトを作成してそれぞれにiTweenを上下用と左右用をアタッチすればいいんだ。瓶は子オブジェクト にして親オブジェクトは空ゲームオブジェクトを新規作成すればいいよ。
----------
おおーなんかiTweenの組み合わせはコード書かないとと思ってたけどこれなら楽チンだね。
便利だぜ!iTween!

2012年8月10日金曜日

NGUI 2.1.4

今回はNGUIのマイナーアップデート。

August 07, 2012, 12:58:41 PM
http://www.tasharen.com/forum/index.php?topic=11.15

2.1.4
-新機能:UIInputで複数行入力をサポート。改行はCtrl+Enter
-修正:UICheckboxComponent(チェックボックスコンポーネント)はデフォルトでデレゲートを使用
-修正:UITextureのバグ修正
------

マメな修正も大事。皆も見習おう!NGUI!

NGUI TweenのBounce使える?


今回はNGUIとTween連携に関する質問。Tweenは本当に応用利くよねー、っておもうけど今回はそれに関連した投稿の翻訳:

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

July 13, 2012, 10:41:23 PM

質問
TweenでFromフィールドがないものって出来ないですか。現在(Current)のポジション、色、アルファ値、などウィジエットの元の情報を使ってくれるやつ。
あるいは自分でTweenerコードを書いてもいいんだけど。ただ仮想OnStartメソッドをUITweenerクラスに実装してもらえばの話になるけど。

BounceメソッドもTweenとして出来ないですかね。

回答
UITweener.Beginの類の関数がピッタリだね。例は

TweenPosition.Begin(targetGameObject, duration, targetPosition);

これにはFromないし、現在(Current)のポジション、色など元の情報を使ってくれる。

あと、Bounceメソッドもすでに機能としてあるよ。ただ、最近のNGUIバージョンを使っていることが条件にはなるけどね。

TweenPosition.Begin(targetGameObject, duration, targetPosition).method = UITweener.Method.BounceOut;
----

Bounceかー。使ったことなかったけど便利かもしれないな。

Tweenとの連携も最高だ!NGUI!

2012年8月9日木曜日

NGUI 2.0.5


今回もNGUIアップデート情報の翻訳から:

http://www.tasharen.com/forum/index.php?topic=11.0
May 14, 2012, 01:30:36 AM

2.0.5
-新機能:カスタム定義の記号(顔文字emoticon等)フォントのサポート
-新機能:ショートカットキーを作成、NGUIメニュー→ピクセル最適化をAlt+Shift+P、NGUIメニュー→Collider追加をAlt+Shift+C
-新機能:アクティブ時(OnActivate)条件をTweenおよびアクティブなアニメーションに追加
-新機能:UITableで下向けに加えて上向きの配置が可能となる機能追加
-新機能:付箋風のTipsをUICameraで特定することが可能となる機能追加、常に表示しやすくできる
-新機能:UIInputで入力操作の通知を送信することが可能となる機能追加
-新機能:TweenVolumeにて音源の音量をTweenすることが可能となる機能追加
-修正:「Cleaning up leaked objects in scene(シーンでメモリリークしたオブジェクトのクリーンアップ)」とのエラーメッセージが表示される不具合を修正
---

Tween Volumeをいじることができるのが2.0.5からの機能なのね。顔文字はあくまで外国のものだけど、そもそも無料フォントで顔文字入りはあるのだろうか?(すみません、知識なくて)

勉強しがいがあるぞ!NGUI!

NGUI パーティクルでも活用すべき?


今回はゲームで必須のパーティクル生成とNGUIの関係に関する記事。一般にNGUIはパーティクル生成を標準的にはサポートする機能がないけど

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

August 08, 2012, 03:47:08 AM

質問
NGUIでメニューを作るのは向いているけど、パーティクル生成とメニューに連結してないスプライトに活用する使い方はアリですか?

作者回答
理屈上はAtlasテクスチャ(スプライト)の一部しか使用しない複製されたマテリアルをパーティクルい使うことは可能だね。
だけど今はマテリアルのUVオフセットを自分で指定しないといけない。でも出来ることは出来る。

フォーラムのディスカッション

新米Aさん
自分ではNGUI描画で全部のパーティクルや効果にいているけど、何も問題はないね。良いのは1Draw Callで出来る
ってところ。画面に何千っていうパーティクルを描いたとしてもね。

考慮すべきはDepthのソート方法。もしオブジェクトの前か後ろに表示したい場合は複数のパネルが必要になってくる。
自分で作成してるシーンはアーケードボードゲームなので静的(Static)だから3パネルのみに抑えられている。1つが前、1つが後ろ、1つがUI。

他に考慮すべきはAtlasの個数。これはマテリアルがどんな種類かによって作成が必要な数が決まってくる。

常連Cさん:
自分のゲームは別のtk2dライブラリで使いたいパーティクル・効果を描いている。気になるのはNGUI作者自身がパーティクル向きにエンジンを作成しているかどうか。現時点では玉石混淆ってところだけど、NGUIが本当にイケていることを鑑みてもNGUIでパーティクル・スプライト・メニュー
全部に活用することは検討してる。

新米Bさん:
実際どうやってやるの?Draw Callは是非減らしたいけど?

常連Cさん:
それはやり方が一杯あってひとことでは言い表せない。だけどUnityのパーティクルシステムはパーティクルごとにDraw Callを必要としてるものの、シーンの3次元空間に含まれているものなんだ。
一方でNGUIでパーティクルを作成するってことはゲームに2次元空間で表面に乗せることになる。ボクが作るならコードを全部書いて特定パーティクルのイメージを画像から引っ張ってきて同じコードのなかで3次元座標のどこにマップするからトラッキングするクラスを作るね。

何をいっているかサッパリっていうならUnityのパーティクルシステムを使ったほうが楽チンだし、それもいいと思うね。
----------

今回は作者コメントよりもフォーラムの常連さんコメントが気になったところ。

NGUIは2Dだからパーティクルも2次元なのはそれは当たり前。だけどそれが自分のゲームに合うか?うーん、自分にはサッパリ分からん。

Depthが関係ないなら行けるのかな。

色々実験してみようぜ! NGUI!

FingerGestures 50%セール

過去に紹介したFingerGesturesがUnity Asset Storeで8月末まで半額セールの様子。8/9現在でみたら$27.50かー。

http://fingergestures.fatalfrog.com/hot-deal-fingergestures-is-50-off-until-september

今回よりバージョンアップを行っていて:

Playmaker連携
TBDragView※

※作者説明ではGoogleストリートビュー風?の操作ができるとのこと

TBDragViewどんなものだろう?とデモみてみたらスワイプでカメラが3D回転するところまでは確認出来ました。(私の検証不足でしたらすみません)

FingerGesturesは今後アツいか?!

NGUI Unity4.0での動作状況


今回は話題のUnity4.0にアップグレードするときの注意点から。

http://www.tasharen.com/forum/index.php?topic=1083
July 19, 2012, 10:03:58 PM

質問:
Unity4.0にアップグレードしたがNGUIのUIPanel属性がクリックできないものがある(Normal, Depth Pass, Static)がどうしたら良いか?

回答:
まだUnity4.0は未サポート。ベータ版だしね。ただUnity4.0でNGUIがベースにしているエディタ機能自体に変更かけている可能性が高いね。
ほとんどのチェックボックスでの一般的な問題のようでいてUI Panel独自の可能性もある(例 UISlicedSpriteで中央埋め(Fill Center)のチェックを外すことは出来るけどプレビューボックスはチェックを外せない)
----

Unity 4.0でエディタに変更が入っているのでNGUIの対応はまだこれからですね。まだ検証作業の方がほとんどとおもいますが、エディタ自体が動かないものがあるとのことなので注意ですね。
※2.1.5からUnity4.0プリオーダーベータ版をサポートしているとの情報があります

正式版出たらちゃんとサポートしてねNGUI!

2012年8月8日水曜日

NGUI作者にメールしてみた

今回の記事はUnity開発とは無関係ですが。NGUI作者にメールしてみたので記事にします。

最近ブログのアクセスログをみていたら英語の原作文も載せていたためか海外からのアクセスが少しづつ増えていました。

うーん、もともと原作文は載せるべきでなかったなと反省して、それは消していったものの、ブログの投稿数が増えるにあたってそろそろNGUI作者の承諾も明確にもらうべきところかな、と。

というわけで、本家フォーラムのメール投稿フォームから連絡してみました:


-------

質問(私)
日本にいるUnityインディーズゲーム開発者ですが最近NGUI購入しました。
多くの日本人がUnity Asset Storeのツールでもトップクラスの2Dツールと認識していて、本家フォーラムでの情報・コメントは価値の高い情報とみています(例としてアップデート情報や便利Tips等)

しかし英語で全部読むのはツラくフォーラムから情報を読み取る作業が大変です。

そこでブログ上で翻訳を載せてきたいのですが、承諾してもらえませんか?

私は開発を本業にしているわけではなく、空いた時間に趣味としてやっているだけなのでせいぜい一日20分ぐらい翻訳するのが精一杯なので短いブログ投稿ばかりです。

著作者としての権利は理解したうえで、NGUIを活用したい日本人の皆様のためにもどうでしょうか。

回答(NGUI作者)
Of course, go ahead, and thank you.
-------

Cool! 返事も早かった!いいぞNGUI!

そして皆様のためにもどんどん訳していきます!!


2012年8月7日火曜日

NGUI:複数デバイス解像度対応


iPhoneアプリを作成するとき、iPhone 3G対応に頭を悩ませる。解像度の差異があるのでiPhone4とサイズの異なる画像を用意しないといけないためだ。

今回はNGUIでこの複数デバイスの解像度対応を行うためのスクリプトについて、NGUI作者がフォーラム投稿者の回答を引用しているため、紹介したい。

June 25, 2012, 04:48:43 PM
http://www.tasharen.com/forum/index.php?topic=832

ランタイムでAtlasを動的に切替する方法の議論はこのフォーラムでも何度かあった。私もスクリプト作成したので共有したい。
動作の条件として事前作業があるが、あまり難しくないんでぜひ試してほしい。

準備するもの:

・参照元Atlas - UI全体をこのAtlasで作成し、以下のAtlasを参照させる
・参照元Font

以下、解像度別
・SD Atlas - (iPhone 3GS以前)
・SD フォント
・HD Atlas - (初期iPad, iPad2, iPhone4以降)
・HD フォント
・SHD Atlas - (iPad3)SHD=超高解像度だけどiPad3解像度対応をしないなら不要
・SHD フォント -

これら3つの「実体」Atlasおよびフォントをresourcesフォルダ配下に、さらにGUI/SD, GUI/HD, GUI/SHDというフォルダ階層に置く。(参照元ではない点に注意)明確にするために私自身はAtlas関係ファイル(プレハブ、画像イメージ、マテリアル)はすべてこのフォルダにそれぞれ置いている。


以下のスクリプトを任意の空ゲームオブジェクトに貼り付ける
http://www.tasharen.com/forum/index.php?topic=832
(注:リンク先でスクリプト参照のこと)

■■ 重要 ■■
Unity上でEdit→Project Setting→Script Execution Orderにてスクリプト実行順序を変更するメニューに遷移をして、解像度変更コントローラ(ResolutionsSwitchController)を一覧に追加し、実行順を上になるように変更する。目的は出来るかぎり最初に実行することであり、必須条件としてNGUIスクリプトより先に実行すること。私自身はlocalizationの次の実行順としている。

メモ
・横長画面(landscape)想定でスクリプトは動作する(すなわち解像度チェックは横幅Widthを基準に行われている。将来的には変更すべきとおもっているし、自身でも変更可)
・2つあるラベルはデバッグ目的。想定どおりの解像度で動作していることを保証するため
・スクリプトはエディタ(editor)上で動作しないようにも変更できる。(参照をおかしくしてしまうリスクもあるため)

自分のニーズにあわせてこのスクリプトを実行、更新、修正することは自由。このスクリプトが誰かの役に立つことを祈る!
-----

Androidの複数解像度対応は最初からサジを投げたくなるようなものだが、たしかにiPhone 3GS対応はまだまだ手抜きが許されるものでない。

良く考えてるぞNGUI!



Playmaker入門ビデオについて

今回は趣向をかえてPlaymaker公式フォーラムより入門ビデオチュートリアル(Youtubeアップ)の概要についての翻訳。FAQは昨年10月のもので目新しくないですが、7/30/2012時点で同スレッドでこの入門ビデオチュートリアルの使い方について活発に意見が交わされています:

http://hutonggames.com/playmakerforum/index.php?topic=836.0


--
on: October 28, 2011, 04:18:47 PM

新Youtubeチュートリアル連載を始めたよ!「PlaymakerとUnityのみでゲームデザイン」

- Unity3DのPlaymakerプラグインを使って13のビデオで4時間超の必修ゲーム作成テクニック。
- Playmaker1.2の新機能を網羅。(グローバル変数、イベント、その他)
- 全編movフォーマット(1280x720)
- Playmakerの基本から始め応用に進むため、Playmaker初心者からより進んだ経験者まで対象
- 自分のプロジェクト開発がもっとすぐに、楽しくなること間違いなし

(13のビデオのうち3つが無料、残りはリーズナブルな値段で提供予定
00 - PlaymakerとUnityでのゲームデザイン入門(※無料)
01 - 状態(States)の例1 電気スイッチ
02 - 状態(States)の例2 閉じて閉める
03 - トリガー
04 - 変数入門
05 - 物体の破壊
06 - プラットフォーム色変更
07 - グローバル変数、イベント、マネージャ - アイテム取得でのHP変更
08 - PlaymakerとiTween(※無料)
09 - ポップアップマネージャ
12 - Playmakerのスクリプト連携(※無料)

(※筆者注 2014/1/26時点はすべて無料のため、最新状況はサイト確認ください http://christopherorth.com/video-tutorials
--

筆者もこのチュートリアル参考にさせていただきました。痛いのが全編英語というところでしょうか。。。Playmaker活用したい方はぜひ参考に!

NGUI ちょっと息抜き:「天才作者」について(続編)

前々回少しコメントをいただけたので、NGUIちょっと息抜き:「天才作者について(続編)です!


今年4月にUnity社が作者にどうして開発したの?Unityのどんなところがお気に入り? をぶつけてみたインタビューの翻訳です。


http://unity3d.com/unity/asset-store/in-depth/issue3

Published: April 18, 2012


NGUIについて教えてください。最初の発想と、どうして作ることにしたのか。
NGUIはUnityを使って誰でもゲームのユーザインタフェースを作成できるツールです。最初の発想は簡単。他のUIパッケージを使うのが楽しめなかったし、絶対にもっと良い方法があるはずだとおもった。最後は自分で投資して、自分でソリューションを作り始めた。皆も気に入ってくれるようだったし、自分も夢中になった。自分でツールを作って粋なユーザインタフェースを「Unityのやり方」で皆が簡単に作成できるものを作りたかった。コンポーネントベースでドラッグ&ドロップで短いスクリプトを貼り付けるだけで思った動きをしてくれる。柔軟性があって何時間もUIのコードとにらめっこすることを避けたかった。

Unityについてどういうところが好きですか?
嫌いになるところないでしょ?良く設計されているし。マルチプラットフォーム対応がクリックするだけで瞬時に実現できる、それも分速じゃなくて秒速といった感じ。ビルドに何時間かかるとかいったこともないし。初心者がプロジェクト始めるまで一日中環境設定に悩まされることもない。あと、ゲームをポーズする簡単さ!何でも見た目を手軽に直せる簡単さ!完全にハマってるよ!
---

うーん、天才作者の人間的側面がみえてくるなー。ちょっと私の翻訳が意約も入っているけど気持ちのアツさは十分に伝わってくるな!(。。。そう願ってます^^)

NGUI 2.0.9

NGUIの日本語情報ってなかなかなくて困ることありますよね。かなり更新頻度が高いのに・・・
各バージョンでのアップデート情報をちょっとづつ翻訳してきます。

今回は6月24日リリースの2.0.9のアップデート情報から:

Reply #10 on: June 24, 2012, 01:11:27 PM

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

2.0.9
- 新機能:UITableで子オブジェクトをソートして値を返す機能追加(UITable.children)
- 修正:UISpriteAnimationのポーズが可能(FPS=0)
- 修正:UITweenerの遅延(delay)のバグ修正
- 修正:UIPanelのDraw Call実行の際に「フラグを隠す」hideflags設定だとまれにワーニング表示されるため「ロード時にdestroyしない」よう修正
- 修正:マルチタッチ処理をオフにした場合の処理方法を修正
- 修正:ARBフラグメントシェーダの関連オプション(#pragma fragmentoptoin ARB_precision_hint_fastest)が未サポートのため発生するバグがあるためこのオプションを削除
- 修正:iOS上で別フィールドに遷移する際UIInput caratをクリアするよう修正
- 修正:iOS上で選択時(OnSelect)の際にUIInputのデフォルトテキストをクリアするよう修正
- 修正:Inventoryデモを修正、内部でメニューがある形からNGUI配下のメニューとなるよう修正

-------

時間あるときにちょっとづつですが、こちらも更新してきまーす!

NGUI 2.0.7


今回もNGUIの過去アップデート情報から、2012年5月ごろの2.0.7更新情報の翻訳です:

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

May 21, 2012, 07:52:16 PM

2.0.7
-新機能:モバイルデバイスのキーボードタイプを指定できるよう機能追加
-新機能:入力制限により特定の文字列以外を排除できるよう機能修正(例 数字のみ入力)
-修正:フォントのアルファチャンネル結びつけを外すことで、アルファ値が正常動作するよう修正
-修正:クリップされたパネルがコンソールでエラーメッセージ(マテリアルが使用されていませんunused material)が出ないよう修正
-修正:3D UIのアンカーオフセットが作成時に適正な値にならない不具合を修正
-修正:UISliderColorsが3色以上でも対応するよう修正
-修正:UI Panelで実行時Null例外が発生する不具合を修正
---

入力制限とかも、かけることが出来たのですね。。。。

NGUIリリースの更新頻度がすごい!

NGUI 2.0.8


NGUIのアップデート情報を引き続きみていきます。

今回は6/8に行われたv2.0.8の翻訳です:

June 08, 2012, 05:18:56 PM

2.0.8
- 新機能:パックフォントをクリップされたパネルでも使用できるよう修正。(シェーダをクリップ対応とした)
- 新機能:UILabelの最大行数を指定できるよう機能追加(以前は複数行あるいは単一行のみ指定)
- 新機能:UIButtonの無効色を明示的に指定する機能追加
- 新機能:Tweenおよびアニメーションにイベントを2つ追加(ダブルクリックOnDoubleClick、選択OnSelect)
- 新機能:NGUITools.soundVolumeにてUI音声のボリュームをコントロールする機能を追加
- 新機能:Tweenの遅延について、開始時間遅延を指定できるよう修正
- 新機能:UICameraでマルチタッチを無効に指定できるよう修正、これによりシングルタッチとみなすことが可能
- 新機能:ピクセル矯正(MakePixelPerfect)をNGUIMenuからNGUIToolsへ移動
- 修正:UIImageButtonのスクリプトを無効にすることでイメージ切替を防止できるよう修正
- 修正:明示的に指定した言語がLocalizationの初期値により上書きされるバグを修正
---

こうして並べてみると作者がどのあたりの機能を直していこうとしていったかが良く分かりますねー。

頻繁にバージョンアップを精力的にこなすNGUIは偉い!

NGUI 2.0.6


おなじみNGUIのアップデート情報です。

今回は2012年5月のアップデート情報の翻訳から:

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

May 16, 2012, 05:47:16 PM

2.0.6
-新機能:RGBAチャネルに分割されたフォントをサポート(東洋言語では75%のサイズダウンが見込める)
-新機能:UITooltipはNGUIコアに追加、フリー版でも使用可とした(これまではデモのみ)
-新機能:決定、キャンセルの対応キーをUICameraで指定可能とする機能追加(これまではReturn、Escキー固定)
-修正:ゲームオブジェクトに二つ目のウィジェット追加する際にUnityクラッシュするバグを修正
-修正:UIDrawCallはインデックスバッファを必要なとき以外更新しないよう修正、パフォーマンスが向上
-修正:UIDrawCallでダブルバッファリングを実現、iOSでのパフォーマンス向上
-修正:シンボルが色変更(あるいはその処理)がなされるか指定できるよう修正
-修正:ハイライト機能のバグ修正(押した際にハイライト済みにならなかった)
---

じつはNGUI作者はダブルバイト文字が色々と難しい問題をはらんでいることをそこそこご存知の様子。このバージョンでも意識してくれていて有難い!

PlaymakerでiPhoneスワイプにてゲームを動かす


今回はPlaymaker記事。何回か前にFinger GesturesというAssetを紹介した。現時点ではiPhone/Androidのスワイプ、マルチ入力などあらゆるタッチパネル動作をゲーム入力に
使うにあたり最強ツール(NGUI作者によれば)となっている。
じつはPlaymakerがFinger Gesturesに対応しているため、プログラミングなしでスマートフォンの入力をゲームに使えるので便利だ。
現在Playmaker向け機能がv0.3となっているため、最新のアップデート内容を紹介したい:



http://hutonggames.com/playmakerforum/index.php?topic=1379

April 25, 2012, 12:18:25 PM
(v0.3更新内容)
・FingerGesturesDectectionInputイベントについてドラッグ、ピンチ、回転のような連続操作の場合ステートレスとする
・"Must Hit Object" (オブジェクトのタッチ判定が必要)というプロパティをFingerGesturesDectectionInputイベントに追加し、タッチした箇所にオブジェクトがないとイベントが起動されない
・FingerGesturesDragObjectアクションを使用してオブジェクトをドラッグする機能を追加。デモとしてはサンプル(Samples)フォルダのPlaymaker Dragシーンを参照のこと
・"Playmakerタップ"サンプルをサンプル(Samples)フォルダに追加
--

Playmakerはまだまだ英語情報ばかり先行しているので、なかなかハードルが高いがプログラミングなしでiPhoneスワイプの複雑な動作を組み込みできる価値は高い。

一方でAsset Storeで有料のFinger Gestures購入するのは情報すくないなかで勇気はいるとおもう。気になる方はFinger Gesturesサイトでいろいろいじれるのでそれをまずはチェックしてから!
http://fingergestures.fatalfrog.com/


ところでFinger GesturesをPlaymakerと連携させるためにはフォーラム登録したうえで、申請OKとなってからダウンロードすることになるからひと手間かかる。申請OKの条件はUnity Asset Storeで購入した際のInvoice Noを伝えて購入者であることを示すことのみで、数分~長くて数時間かかる。FingerGesturesを購入した方は試す価値がある。

以下、さらにFingerGestures作者フォーラム記載内容を翻訳してみる:

http://forum.fatalfrog.com/index.php?topic=37.0
on: 24 March, 2012, 09:26:18 PM

FingerGesturesの登録を行うことで優先的なサポートおよび最新アップデートをフォーラムの最新アップデートコーナー(Releases)にて受け取る権利を得ます。
次のリンクにてeメールで受け取り済み(送付元:Unity Asset Store, あるいはFatal Frog Software)のライセンスキーを知らせることだ。

Unity Asset Store経由での購入の場合はライセンスキーは購入後にUnity送信メールにあるInvoice No欄に記載の値で良い。
----

私の場合は

①フォーラム登録用のリンクから登録(私は数分で登録が完了メールが到着)
登録用のリンク先
http://forum.fatalfrog.com/index.php?action=register

②申請リンクから(数分で登録が完了メールが到着)
申請リンク先
http://forum.fatalfrog.com/index.php?action=profile;area=groupmembership;request=9
文面記入例
I'd like to register my copy of FingerGesture to download latest updates from Fatal Frog Software.
Invoice No XXXXXX(Unity送信メール記載のInvoice No)

FingerGestures購入まで行った人はぜひお試しあれ!

2012年8月6日月曜日

NGUI 2.1.3

今回もNGUIアップデート情報から。

この記事を書いている数時間前にいよいよ新バージョン2.1.3出たようなので翻訳します:

http://www.tasharen.com/forum/index.php?topic=11.0
August 5, 2012 at 04:00:10 PM

2.1.3
-新機能:スクロールビューのデモにおいて、トグルするとアイテムがリストの画面中心になる機能を追加(FAQ対応)
-新機能:UIAnchorをウィジェットやパネルの横にアンカーを配置する機能を追加
-新機能:UICameraでドラッグ検知強度(threshold)を追加。ドラッグイベントの送信は強度を超えた場合のみ行われる
-新機能:UITextureのマテリアル作成を必須でないよう機能追加
-新機能:UV四角形をUITextureに指定することで、テクスチャの一部のみを表示する機能を追加
-新機能:送信者(sender)、Tween、 アニメーションといったコンポーネントでメッセージ送信(SendMessage)イベントのかわりにコールバックデレゲートを使用する機能を追加
-新機能:現在のUIカメラ(UICamera.current)、現在のUIポップアップリスト(UIPopupList.Current)を指定できるよう機能追加
-新機能:オブジェクト位置を揺らす関数(SpringPosition)に終了時(on finished)イベント通知を追加(イベント受信およびデレゲート)
-新機能:パネル全体(子ウィジェット含んだ)のアルファ値を一度に変更できるスクリプトを追加(UIPanelAlpha.で指定)
-修正:リストを新リスト(BetterList)で置き換えし、メモリ割当を大幅に改善
-修正:カスタムのテクスチャパッカーが余白(padding)を正しく認識するよう修正
---

今回もマイナーバージョンアップのようですが、新機能はどれも使い道は存分にありそう。つい昨日に福島Game Jamというイベントが行われたが、その場でもNGUIが使われているチームもあったと聞く。メジャーになったものだ。

どんどん活用しようぜ!NGUI

NGUI ちょっと一息:「天才作者」インディーズゲームの未来は?


本日の記事はインディーズゲーム開発の未来について。お約束のNGUI作者の言葉の翻訳:
(Unity 2012年4月インタビュー)

http://unity3d.com/unity/asset-store/in-depth/issue3

Published: April 18, 2012

- あなたのビジョンとして、ゲーム開発および開発者の未来とはどんなものですか?

ボクの見方として、この業界は家の地下室で少人数のチームメンバーがゲームを一緒に作っていたところから始まったけど、それが進化して巨大企業の集合へと変化したが、その過程で週60時間勤務(注:12時間×5日)をする無数の開発者に下支えされる金儲けビジネスとなっていった。本当に不幸な業界になってしまった。サービス残業は当たり前。そのなかで他社のゲームを真似することが成功のためのお約束にさえなった。環境がイノベーションを阻害し新しい挑戦は難しく、「楽しいこと」はそのまた夢になった。

幸いなことにその時代は過ぎ去りつつある。

デジタル配信時代にボクらはいる。Kickstarterでプロジェクト資金を集めたり、アルファー版(開発初期バージョンによる使用感ヒアリング)によって成功確率を高められるし、それでも売れなかった場合の逃げ道としてAsset Storeで切り売り(個別コンポーネント販売、あるいはプロジェクト全体)することで追加の資金確保ができる。場合によってはAsset Storeで販売したコンポーネントが良く売れてもとのプロジェクト全体を単体売り上げだけで賄うことさえ出来る。

言い換えると:完成してもしなくてもカネになる。リスクがないんだから近い未来に開発者がインディーズ路線にどんどん集まってくるのは当然なんじゃないだろうか。
---

んー、リスクがないかー。自分はすごーく時間をとられている気がするのだが、それはあくまでも自分が楽しんでやっている時間だからいいのかな?Unity3D開発者が皆、それだけで食っていける、というのも一握りのような気はするのだが。

まあ、成功しているからいえるというだけでなく、インディーズ開発は夢があってしかもUnity Asset Storeで販売できる実力がつけばあとは食っていけるよ!ってことですな^^

2012年8月4日土曜日

NGUI 攻撃ダメージ表示の作成

ゲームを作成すると必須になってくるのがダメージ表示。ドラクエ風でいえば「ゆうじは10のダメージ!」ってやつだね。最近だとキャラクターの上にダメージの大きさが表示されて何秒後かに消える。

NGUI作者はWinwardというゲームを別に開発していて、NGUI使ってダメージの大きさ表示している。今回はそのツールの説明を翻訳してみた:



July 12, 2012, 02:32:39 AM
http://www.tasharen.com/forum/index.php?topic=997.0

どんな内容?

一番簡単な使い方はゲームのWarcraftで出てくる攻撃ダメージテキスト。数字がポップアップして、飛んでいくやつ。違うところは数字が加算される(一秒間の間)ことと、プラス値とマイナス値を別に扱えること。
つまりダメージとヒットを自分でスクリプト工夫せずに表示できるってこと。

テキスト表示にも使えて(チャットなど)、キャラクターの上に文字列を表示することが出来る。さらにはその文字列の表示時間を何秒維持してから浮き上がってフェードアウトさせるかも指定できる。

当たり前だけどメッセージがフェードアウトする際のカーブを指定することも出来る。実際にボクが開発したWinwardでまさに使っているもの。

パッケージに付属するデモ

http://www.tasharen.com/hudtext/ex1/
http://www.tasharen.com/hudtext/ex2/

ビデオチュートリアル

http://www.youtube.com/watch?v=diql3UP1KQM

使い方
UI Rootの配下にゲームオブジェクトを作成し、それにHUDTextスクリプトを貼り付けたうえでフォント指定する。
もし別カメラで表示されるオブジェクトを追跡するようにしたい場合はUIFollowTargetスクリプトを貼り付けしたうえで、さらにターゲット指定をする。
コードの中でHUDTextのAdd()関数を使って新しい浮動テキストの一覧に追加文字列を指定する。
HUDTextスクリプトをいじってスプラインまで変更し、テキストのモーションを変更することも出来る。
----

うーん、Youtubeビデオが相変わらず英語のうえに、最後らへんが良く分からないけど、作者自身が使っているダメージ表示だから今後もサポートが期待できそう。

自分のゲーム開発に使うのがベストだな!NGUIさん。



2012年8月2日木曜日

NGUI ちょっと息抜き:「天才作者」の販売方針


皆さん、いよいよiPhone/Androidアプリとしてリリースだ!っていうときに価格設定とかどうしてますか。またリリースが終わって次のアプリはどんなコンセプトにしよう、とおもったときにUnity Asset Storeにチャレンジしてみよう、とかありますかね?

今回はNGUI作者の言葉(Unityによる2012年4月インタビュー)からそのあたりを翻訳してみました:

http://unity3d.com/unity/asset-store/in-depth/issue3

Published: April 18, 2012

- UnityのAsset Storeで作品を販売検討しているミドルウェア開発者にアドバイスはありますか?

一言で言えば:穴をみつけて埋めること。何かUnity開発するうえで不足している機能や、自分だったらより良くできると感じた場合、たとえば漫画チックでない宇宙船のモデルなんかどうだろう?作成してアップしてそれでお金を稼げる。まあお金を目標にすることはお勧めしないけどね。良い製品を作ることに狙いをさだめて、そこにこだわりを持つ。お金は後から自然についてくるよ。

もうひとつのオススメとしては、価格に関すること。自分の作品が他人より遥かに優れていると感じたとき、すごく高値をつけようと盛り上がっちゃったりするよね?ボクはそれはやめるべきとおもう。低価格が購入者を惹きつけて、気に入ればクチコミで広めてくれて、新たな購入者をさらに惹きつけるというドミノ倒しみたいなもんだ。価格が低いほどドミノは倒れて、お金はどんどん入ってくる!
---

うーん、ガッチリ稼いでる人が言うと重み感じるけど、アプリをどうやって出そうか、どんぐらい宣伝しようかと必死に考えている身からすると「早い、安い、旨い」だなんてグサッと刺さる言葉だね。たしかにこの人はそれが出来ているかなぁ。安い?だけ微妙かなぁ、まあ自分が同じものを作る労力でのコストパフォーマンスを考えたら間違いなく安いか。

今日も凄いぞ!NGUI作者。

Unity Asset Storeゲームサンプルのダウンロード


まるごと使えるUnity3Dゲームサンプルって有難いですよね。パラメータを色々さわったり、自分で作った3Dモデルを何かと入れ替えてみたり、カスタマイズしながら知らないことがどんどん勉強できるのは本当に楽しい!

今回はPlaymakerで公開しているゲームサンプルから翻訳します。(Playmakerなしでも動作します。)

C# Game Examplesの意向でダウンロードフリーですが、コンテンツを使った二次配布の扱いは正直分からないのでご自身で十分に調査いただき自己責任でお願いしますね。


https://hutonggames.fogbugz.com/default.asp?W880
--
Last modified on 2012/06/12 8:16 by User.

https://hutonggames.fogbugz.com/default.asp?W880
ゲームサンプル

このページ(注:上記リンク先)は完全に動作するゲームが含まれます。さらにPlaymakerで作成しておりスクリプトなしで動作します。

M2H C# ゲームサンプル

これはM2HウェブページのC#ゲームサンプルから流用しているものです。

Mike Hergaarden(M2H)に感謝ですね、素晴らしいサンプルを提供いただきPlaymakerに流用する許諾をいただけた。これで完全に動作するゲームを望んでいる開発者に道が拓ける。

このパッケージにはシーンのみ含まれるため、リソースも必要であればC#ゲームサンプルをダウンロードいないといけない。

卵キャッチャー
床ジャンパー
マーブルゲーム
3Dブレークアウト
シューティングレンジ

注意:

正しくパッケージをインポートするためには次の手順を実施すること

1:最新のPlaymakerパッケージをasset storeからインポートすること
2:最新のM2H C#ゲームサンプルパッケージをUnity Asset Storeからインポートすること
3:上記リンク(注: 上記リンク先にてM2HGamesPlayMaker.unitypackageをクリックください)
4:メニューから "PlayMaker/Tools/import globals"を選択してください(このassetは4,5が終わったら削除OKです)
5:Playmakerにてグローバル変数ブラウザを拓いて、 "total number of blocks"を1など適切な値に変更する

ステップ5を実施しないと、変数がおかしくなりブレークアウトのゲームが正しく動作しません

--

Playmakerがなくても上記ステップ2からUnity Asset StoreからC#版はフリーでダウンロード可能です。私はPlaymaker版を持っていますが、色々な検証に活用してます!

2012年8月1日水曜日

NGUI iPhoneビルドでのパフォーマンス改善

こんにちは。iPhoneビルドのときはWeb Playerと違ってパフォーマンス気になりますよね。今回はNGUIパフォーマンス改善で「widgetsAreStatic※」
(静的ウィジェット)について作者のコメントを翻訳します:
(※本記事掲載後、Staticという表現に修正されていることが分かりました)

http://www.tasharen.com/forum/index.php?topic=261
on: May 03, 2012, 08:03:29 PM

説明しないと難しいかなとおもってフォーラム書き込みします。このバージョン(2.0.4c)からiPhone/Androidビルドでのパフォーマンス改善が必要ならパネル単位で静的であるかのフラグを追加したよ。つまりウィジェットに変化がない場合(=Transformに変更がない、つまり移動、回転、拡大をしない)のものだ。

静的に指定した場合、いちいちフレームごとに動いたかどうかのチェックを省略することができて、フレームレートの改善が期待できる。その代わりスクロールバーやハイライトなど一部の機能は使用できなくなる。

スクロールビューのデモを少し修正して、どのように使えるか分かるようにしたよ。大部分のパネルは動かす予定ないためwidgetsAreStaticをtrueに設定した。注意点として、パネル自身が動くのは問題がなくウィジェットの変化にカウントされないので問題なく動作する。
このオプションはスクロールビューにコンテンツをiPhone/Androidビルドで載せる場合にとくに役に立つ。UIDraggablePanel配下に長いウィジェットのリストがあった場合などパネルを静的に指定した場合、顕著なパフォーマンス向上が期待できる。

このフラグはオン・オフもいつでも変更が効く。たとえばパネルを通常は静的に指定しておいて、何かのボタンを押した場合に静的指定をオフにすることも可能だ。
----
なるほど、なるほど。スクロールビューはデモだけみたけど実装するのが面倒かもとおもって飛ばしていたけど、実際に使うときはwidgetsAreStaticを使用したほうがよいケースは応用が利きそうだ。
フラグひとつでパフォーマンス向上、NGUIやはり簡単・便利だ! このエントリーをはてなブックマークに追加

ブックマークに追加

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

自己紹介

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

ページビューの合計

過去7日間の人気投稿

ブログ アーカイブ