2013年2月27日水曜日

NGUI 2.3.4 , TNet 1.5.0 , 1.6.0

NGUIバージョンアップ情報です。なお、同じ作者がリリースしているTNetアセットも併せてリリース情報を載せます:

NGUI


http://www.tasharen.com/forum/index.php?topic=11.15
February 24, 2013, 05:52:43 PM

2.3.4
- 新機能: インスペクタ上でウィジェットのカラーを容易にコピー&ペーストする機能
- 修正: フォーラムで記載されているマイナーな課題に対するランダムな修正内容
- 修正: その他、マイナーなパフォーマンス改善の修正


TNet


http://www.tasharen.com/forum/index.php?topic=2650.0
February 23, 2013, 10:29:19 AM

1.5.0:
- 新機能: ユニバーサル プラグ&プレイ機能を追加して、ゲートウェイ/ルータでのポート開放を容易にした
- 新機能: TNObject.isMine フラグを追加し、これはインスタンス化したクライアントでのみ true (またはプレイヤーが去った場合はホストで true)
- 新機能: 探索クライアントを再設計。複数のゲームロビーサーバー/クライアントを代わりに準備
- 新機能: TNet サーバアプリはポートパラメータを新たにサポートし、ロビーサーバを開始することが可能になった
- 新機能: ゲームサーバは自動的にリモートロビーサーバにより自動的に自身の登録することが可能になった
- 新機能: Tools.externalAddress を追加し、これはインターネットで参照可能なIPアドレスを戻す
- 修正: TNet が ウェブプレイヤーで予告なく UDP を使用しなくなる仕様を修正。単にウェブプレイヤー上で UDP は今後サポートしないこととした
- 編集: localAddress および IsLocalAddress()  を Tools フォルダに移動し staticとした

1.6.0
- 新機能: プレイヤーがシーンに入場した時にオブジェクトをインスタンス化するスクリプトを追加。(ヒント:プレイヤーのアバター使用に便利)
- 新機能: 一時的なゲームオブジェクトを作成できるようにした:オブジェクトを作成したプレイヤーが去るときに破棄される
- 新機能: ステップバイステップのビデオを追加: http://www.youtube.com/watch?v=cTjy-L8C6WM
-----

ビデオが英語なのが残念なところだが、コードを入力してサンプル実行してくれるので、色々と使い方の分からないTNetについて疑問が解けるところは多いとおもう。

NGUIよりTNetのほうが修正多いところみると、今はそっちに本気かな?!

2013年2月25日月曜日

Unity本の感想

今年に発売されたUnity本(Unity4対応)を読んでみたので今日はその感想。




【サンプルスクリプトの言語】 C#
  • Unity初級者でも最初から分かるように丁寧に書かれ、6ジャンルも扱い素晴らしい!
    • 3Dシューティング
    • 3Dアクションパズル
    • ピンボール ゲーム
    • ラジコンカー ゲーム
    • プラットフォーマー ゲーム(いわゆる3D横スクロール)
    • アニメーション ゲーム
  • Unity中級者でも扱ったことがないようなテーマも触れられている
    • 日本語フォントの取り扱い
    • WebCamTexture
    • iOS/Androidネイティブ拡張機能
  • Unity4のMecanimが40ページ近く取り上げている
    • アニメータコントローラ、ブレンドツリー、トランジション
    • アニメータの制御(移動中のコライダのサイズ変更など)
Mecanimについては、知っているかぎりではUnity公式ビデオがこれまで最も詳しく、あまり日本語での情報が少ないとおもっていたが、この本をみたかぎりビデオで取り上げられているようなトピックは十分にカバーできていると感じた。
<参考:Unity公式ビデオ(Unity4.0 Mecanim)>
http://video.unity3d.com/video/7362044/unity-40-mecanim-animation

なおサンプルスクリプトについて許可なくネットワークへの配布は出来ず、商用利用は出版社へ一報が必要と明記されているのでその点は注意だ。

ちなみに、私自身はWebCamTextureは使ったことなかったのだが、ウェブカメラ専用の機能と勘違いしていたので、iPhone/Androidで使用できると知っただけでも有難い(注.文章中にAndroidでの不具合に関する記述はあるが・・・)

自分はすでにUnity初心者ではない、という人もひととおり目を通せば新しい発見はあるだろう、と思える本だ。実際、これをみて全ての機能を試したことがある、という人は十分に上級者の領域に入ってくるだろう。さらに一歩進んで、この本で触れられてないShaderLabなどカスタムシェーダやネットワークゲーム連携に挑戦すると良いとおもう。(あら、本の感想の話からずれちゃった・・・)

この本はUnity開発する人には有難い本だぜ!

2013年2月22日金曜日

Unityでマルチスレッド(後半)

前回記事に続いて、Unity Gemsのマルチスレッドに関する記事を紹介したい:


関連記事

Unityでのマルチスレッド(前半)


http://unitygems.com/threads/
November 2, 2012


デッドロックにハマらない


結局、変数が同時修正される問題の解決策は、一つの変数に対して一度に一つのスレッドしかアクセス出来ないようにすることだ。当然、複数のスレッドが同時に作業出来なくなることをも意味し、矛盾が生じるため、この制御を行なう時間は制限する必要がある。

C# には、特定のオブジェクトに対して特定の時間帯に、一つのスレッドしか存在し得ないようにする lock キーワードが用意されている。なお、値型やプリミティブは lock 出来ないため、あえてオブジェクトにと厳密に申し上げたので注意いただきたい。
int a = 50;

object guard = new object();

void ThreadOneCode()
{
     //コードを追加出来る

     lock(guard)
     {
         a = a + 1;
     }

     //コードを追加出来る

}

void ThreadTwoCode()
{
     //ここにもコードを追加出来る

     lock(guard)
     {
         a = a - 1000;
     }

     //ここにもコードを追加出来る
}
lock(guard) {...} の中の全ては、guard を使用出来るスレッドは同時に一つのみアクセスできることを保証する。これはどのようなオブジェクトにも必要であればこれを使用出来る。

もし互いにネストしているものを lock 使用すると、たくさんの問題に出くわす可能性がある。例えば内部ロックを外すために、必要な何か外部ロックと同じものを必要とするために外せない、といった状況に陥る場合がある(すでにロックしているため外せない)。これはデッドロックと呼ばれ、外すことが不可能であり、結果的に全てを凍結させる。真剣にスレッドプログラミングに取り組むとどこかで遭遇してしまう問題だ。
もしスレッドの扱いは初心者ならば、出来るかぎりメモリや変数を共有しないように努めるべきだ。変数をスレッドに渡して、戻り値として変数を受け取るのは良いが、同じメモリを使用しないようにすべきだ。


スレッドを同期する方法はたくさんあるが、言語に作り込まれているのは Lock のみで、その他はシステム上のオブジェクトの構造により保守される。この方法で対応するのであれば、効率的なコードを書く手法はいくつかある。例えば値を読み込みは複数許容するけど、書き込みするのは一つのスレッドのみ書き込みできる所有者に限定する、などだ。

Unityでの実践的なスレッド活用


Unityでは自身のクラスインスタンスおよびUnityの値型(Vector3, Quaternion) のみ処理できる。前述のとおり、これによる制限は一部発生する。それでもメッシュの頂点編集を二つ目ののスレッドでおこない、Vector3の配列をメインスレッドに戻すなどして実際のオブジェクトを更新させることが出来る。

A* を使用した経路検索コードを記述してマップ上のある地点間の経路を書くことも出来る。

何をするにせよ、何らかの効果を発揮するためには、新しいスレッドからメインゲームのスレッドへと情報を渡す必要が発生する。

どうやってスレッド間で機能する優れたコードを記述すれば良いだろうか。現行の if や チェックを全て踏まえて、処理の準備が出来てるか示すために、クラスが大量のバッファやフラグで一杯々々にならないようにする必要がある。こういうゴチャゴチャが通常バグにつながり、スレッドを、本当の意味で効率的に使用するための障壁になるものだ。

クロージャおよび無名関数を使用することで、こよ作業をより簡単に出来るフレームワークを構築出来る。このチュートリアルの中でコード全体を記述することはないが、このリンク先にはあり、どのように使えば良いかはこれからお見せしたい。

スレッドの活用例


このためのクラスの名前は Loom と呼ばれる。Loomにより別のスレッド上でコードを容易に実行することが出来て、そのもう一つのスレッドも必要な時にメインのゲームスレッドでコードを実行することご出来る。

気にすべき関数はたった二つだ:


  • RunAsync(Action) により、ステートメントのセットを別スレッドで実行する
  • QueueOnMainThread(Action, [任意で指定] float time) により、ステートメントのセットをメインスレッドで実行する (任意で delay を指定)。


Loom をアクセスするには Loom.Current を使用する。これはゲームのメインスレッドと作用する透明なゲームオブジェクトを作成することを行なう。

Loom を使用して、全ての頂点を乗算処理してメッシュを更新する例を示す:
//二つ目のスレッドをメッシュ上でスケール
void ScaleMesh(Mesh mesh, float scale)
{
    //メッシュの頂点を取得
    var vertices = mesh.vertices;
    //アクションを新しいスレッドで実行
    Loom.RunAsync(()=>{
        //頂点を一通りループ
        for(var i = 0; i < vertices.Length; i++)
        {
            //頂点をスケール
            vertices[i] = vertices[i] * scale;
        }
        //メインスレッドでコード実行して
        //メッシュを更新
        Loom.QueueOnMainThread(()=>{
            //頂点をセット
            mesh.vertices = vertices;
            //境界線を再計算
            mesh.RecalculateBounds();
        });
 
    });
}
これはクロージャの使用方法を学ぶのに好いサンプルでもある。

二つ目のスレッドで実行されるアクション (引数なし、戻り値なしのメソッド) はラムダ関数 (または無名関数) を用いて作成される。クロージャの素晴らしいところはクラスの全ての変数および自身の関数のローカル変数の両方にアクセス出来ることだ。

ラムダ関数の定義には ()=>{ ... } を使用して、この関数の中身は全て、別のスレッドで実行される。

頂点が更新されたとき、メインスレッドでメッシュを更新する必要があるためQueueOnMainThreadを使用し、これは次にUpdateサイクルが処理されたときに実行される(コールされるタイミングによって当該フレームまたは次のフレーム)。QueueOnMainThread もまたActionを引数とするため、全く同じテクニックを使用して更新された頂点を元のメッシュに渡す。この辺りが最高に便利なんだ!!

ソースコード


Loom の ソースコードはここでダウンロード出来る。同じことをUnityScript で実現するには次のように記述する:
//二つ目のスレッドでメッシュをスケール
function ScaleMesh(mesh : Mesh, scale : float)
{
    //メッシュの頂点を取得
    var vertices = mesh.vertices;
    //アクションを新規のスレッドで実行
    Loom.RunAsync(function() {
        //頂点を一通りループ
        for(var i = 0; i < vertices.Length; i++)
        {
            //頂点をスケール
            vertices[i] = vertices[i] * scale;
        }
        //メインスレッドでコードを実行
        //してメッシュを更新
        Loom.QueueOnMainThread(function() {
            //頂点をセット
            mesh.vertices = vertices;
            //境界線を再計算
            mesh.RecalculateBounds();
        });

    });
}
----

並行処理を行いたい、というケースでサンプルまでついているので有難いところだ。色々試すと良いだろう。

うーん、いつもながら中身が濃いぜ!

2013年2月21日木曜日

【朗報】NGUIにダイナミックフォント正式採用の方向性


朗報だ。

表題のとおりだが、NGUI作者がダイナミックフォント正式採用の方向性を打ち出した。NGUIのダイナミックフォントはこれまでNGUI熱狂ファンの方が独自で作成していたパッチだったが、バージョンが変わると不具合が出たりと、色々と問題はあったが、これでかなり解決しそうだ。

NGUIのダイナミックフォントが何なのか、どう便利なのか分からない方は以下を参考にすると良い。

[Unity4]NGUIでUnity4のダイナミックフォントを使うパッチ
http://terasur.blog.fc2.com/blog-entry-375.html
[Unity3D]NGUIでダイナミックフォントを使うパッチの使い方
http://terasur.blog.fc2.com/blog-entry-377.html


なお、NGUI作者が正式採用を宣言したのはNGUI掲示板のスレッドだ。2.3.3でパッチに不具合が出た、という人もこの先のリンクからダウンロードしておくと良い。

http://www.tasharen.com/forum/index.php?topic=2707.75
February 19, 2013, 09:10:45 AM

どうやら作者本人がコミットするというより掲示板の常連の方によるプルリクエストで対応のようだ。

期待しているぜ!NGUI!

2013年2月16日土曜日

Playmaker 1.5.0 リリース(エディタ多言語ベータ機能付き!)

2/16にPlaymaker 1.5.0リリースされた様子。すでに持っている方は是非アップグレードだね!



<Asset Storeリンク>

Asset Store説明を翻訳すると:
NEW! FSM テンプレート インスタンス
NEW! アクションとしてFSM テンプレートを活用
NEW! Photon ネットワーキングをフルサポート
NEW! Get/Set プロパティ アクションを強化
NEW! グラフビュー ズームおよびミニマップ
NEW! エディタを日本語、フランス語、等々に

とのこと。

ちょっとだけ開いてみると:

ミニマップが右上に表示され、画面に入りきらないフロー図もここに表示され、全体が把握できたうえで移動も出来るので便利!



エディタの多言語ベータ機能を有効にするにはPlaymakerエディタ右上のボタンを押下。まあベータ機能とはいえ、色々と日本語が見られるのは素敵

---------

Photon ネットワーキングがどういう連携なのかはまた今度調べてみよかな^^


2013年2月14日木曜日

NGUI 2.3.3

NGUIバージョンアップ情報です。

http://www.tasharen.com/forum/index.php?topic=11.15
February 13, 2013, 03:27:23 PM

2.3.3
(2.3.2はUnity Pro限定のためバージョンを一つスキップ)
- 新機能: UIPanel はフェードを容易にするためにアルファ値を追加、TweenAlphaがパネルを tween 出来るように機能追加
- 新機能: 何の上をマウスオーバーしてるか、知りたい時のために UICamera.debug モードを追加
- 新機能:ウィジットのカラーやアルファ を Unity のアニメーション機能を通じてアニメーションさせたい時にAnimatedColor および AnimatedAlpha スクリプトを追加
- 新機能: Android デバイスでキーボードおよびコントローラを新たにサポート(OUYA)
- 新機能: UIFont.pixelSize を追加、アトラスに含まれない HD/UD フォントを作成出来るように機能追加
- 修正: Unity 4.1 での最適化にあわせて修正
- 修正: PMA シェーダ を使用した時にラベルのシャドウが影響されるように修正
- 修正: UICheckbox.current がチェックボックス イベントのレシーバーで正しく動作するように修正
- 修正: UIButton 関連のスクリプトの初期化のタイミングを、使用された時からStart() された時へと変更
- 修正: TweenOrthoSize により、FOV ではなくサイズが変更されるように修正
- 修正: アトラスが正方形でない時に、スプライト選択ウィンドウが正しく表示されない不具合を修正
- 修正: UIAnchor が Zデプスを保持するように修正、これで3D UIで正しく動作出来るように変更
-------

OUYA対応....気になるので誰か試してくれ‼

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

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

2013年2月11日月曜日

より優れたPlayerPrefsクラス

PlayerPrefsを改善したクラスを提供してところを見つけたのでサイトの情報を紹介したい:

http://www.previewlabs.com/writing-playerprefs-fast/
3/11/2011

Unity でプラットフォーム独自の方法でデータを保存するのに PlayerPrefs を使用することがある。

このクラスはハッシュテーブルの働きをして キーバリューのペアを保存できる。

ビルトインの PlayerPrefs クラスの欠点として iOS で非常に遅く、Android でさらに遅いことだ。Google Nexus One で行ったテストでは、毎秒あたり 平均 6.25 個のキーバリューのペアしか保存出来なかった。300 件以上を保存しようとしていたので、あまりに時間がかかりすぎた。全ての修正毎にファイルI/Oが行われている可能性が高い。現在の PlayerPrefs クラスは大量データを扱うのに不向きだ。

そこでオリジナルの PlayerPrefs を実装しようと決めて、プロトタイプの中で高速保存が出来るパラメーターのチューニングを可能とした。同じデバイス上で現在は300 件以上を瞬時に行えるようになった。

すでに Unity の PlayerPrefs クラスをプロジェクトで使用していて、iOS および Android での最適化方法を探している場合、次の手順によって実行出来る:

PlayerPrefs.cs ファイルをダウンロードしてプロジェクトに追加してほしい。

PlayerPrefs が使用されているスクリプトの冒頭に次の行を追加:
using PlayerPrefs = PreviewLabs.PlayerPrefs;
PlayerPrefs.Flush() を使用して全ての値を保存する。これはデータを大量に書き込みすときか、アプリケーション終了時に行う(メインとなるゲーム クラスの中で) :
public void OnApplicationQuit()
{
 PlayerPrefs.Flush();
}
最適化として機能するために、Hashtableを保持して Flush() が呼ばれたときのみファイル書き込みするようにした。

XML形式は意図的に使用しておらず、今回気にしているローエンド デバイスで不要なオーバーヘッドがかかるためだ。
------

筆者も Unity Store でダウンロードしたプロジェクトサンプルにこのクラスが含まれていて、なるほどとおもってソースコードを眺めた記憶がある。

便利なものはどんどん活用しようぜ!

ブックマークに追加

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

自己紹介

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

ページビューの合計

過去7日間の人気投稿