2012年11月23日金曜日

Playmaker多言語版のベータテスト

UnityアセットストアのPlaymakerはビジュアルプログラミングツールですが、簡単なゲームの動作ならプログラムを書かずに実現することができます。

そのPlaymakerについて多言語版のベータテストが進んでいて、筆者も協力しています。
http://hutonggames.com/playmakerforum/index.php?topic=2584.0

本日(11/23/2012)時点では、英語版をベースにして:
・日本語
・フランス語
・スウェーデン語
の翻訳が進んでいます。

現在のベータテスト版のPlaymakerを動画でアップしました:

http://youtu.be/N70VAFpE8og
もちろん日本語化だけでなく、過去からPlaymakerで期待されていた機能もいくつか盛り込まれています。そのあたりは別の機会でまた取り上げてみます。(まあ、当ブログのメインユーザのプログラマの方には日本語化よりも、追加機能のほうが有難いはずです)

なお、今回の多言語化は推奨外であるUnityメニューなどは対象外としていて、あくまでユーザ向けのアセットであるPlaymakerのツール部分に限定されています。

Playmakerの次のバージョンも期待しているぜ!

2012年11月16日金曜日

NGUI 2.2.4, 2.2.5, 2.2.6

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

http://www.tasharen.com/forum/index.php?topic=11.15
November 14, 2012, 06:45:16 PM

2.2.4:
- 新機能:SpringPanelとUICenterOnChildにOnFinishedコールバックを追加
- 新機能:UIForwardEventsにOnScrollを追加。
- 修正:UISavedOptionは無効時状態変化のデリゲートを登録解除。
- 修正:IgnoreTimeScaleは時間差分(delta Time)を最大1秒とし、スリープから復帰時にポーズしてしまうバグを修正。
- 修正: UIWidgetは親子関係を再設定するときにUITexturesをクリーンアップしないバグを修正。
- 修正:durationが0の場合にTweenスクリプトが直ちにサンプリングするよう修正
- 修正 UIFontとUIAtlasのMarkAsDirty()関数は現在の参照Atlasで(エディタ上にて)正常に動作するよう修正。

2.2.5:
- 新機能:スプライト選択ウィンドウでスプライトをダブルクリックすると、ウィンドウを閉じる機能を追加。
- 修正 UIRootはautomaticモードのとき最大値/最小値で値をはさむ機能を修正。
- 修正: パスワード フィールドが正しく折り返しするよう修正
- 修正: MakePixelPerfect()が負の値を保存できるよう修正。
- 修正:UISliderでコントローラをクリックしたとき0になるバグを修正。

2.2.6:
- 新機能:マウスとタッチイベントが、パネルのクリッピング矩形選択(rect)によって、ウィジェットと同じようにクリップングできるオプションを追加。
- 新機能:一度に複数のスプライトを削除できるよう機能追加。(Atlas Makerにて)
- 修正:Unity4ベースのネストされたアクティブなステートをサポートするよう修正。(上位互換)
-------

過去にこのブログでもとりあげた不具合・機能要望が解消・反映されています:

NGUI 解像度調整機能が縦(Height)にしか対応してない
http://gamesonytablet.blogspot.com/2012/10/ngui-height.html

~2012/11/17追記~
NGUI 解像度調整機能について、このバージョンではWidth対応まではしていない。

詳しくは、機会あれば別記事としたいが、理由は現時点だとコードが複雑になり影響範囲も大きいためとのことでよりエレガントな解決策が見つかれば対応する、と将来的な課題になった。
~追記ここまで~

NGUI不具合 長時間スリープ後の動作
http://gamesonytablet.blogspot.com/2012/10/ngui_30.html

Unity社に入社してもNGUI作者はメンテナンスをきちんとやっているぜ!

2012年11月7日水曜日

1週間ブログ休止します

諸所の事情ありまして1週間ほどブログ休止します。

私にとっては悪い話でないのですが、色々と忙しくなりまして。来週後半にはまた復活します

ゲームは初心者にやさしく

2012年11月5日月曜日

Unity初心者が学ぶ「OnTriggerやOnCollisionの判定条件」

前回記事に引き続いてOnTriggerやOnCollisionの判定条件についてUnity Gemsからの翻訳を投稿する:

-------
http://unitygems.com/mistakes1/

October 15, 2012

OnTriggerやOnCollisionの判定条件

衝突する双方のオブジェクトにcolliderをアタッチしないと判定は行われない。もしOnCollisionを使用するならばisTriggerでTrueをチェックしない。逆にOnTriggerを使用する場合はisTriggerでTrueをチェックする。追加で以下のルールに従う必要がある。

2つの主なルールが存在する:

  • OnCollision、OnTriggerメソッドをふくむスクリプトの対象となるゲームオブジェクトにRigidbodyコンポーネントをアタッチすること
isKinematicでTrueをチェックすることでオブジェクトに物理エンジンが作用しないように変更できる

衝突判定はUnityの物理(Physics)エンジン機能の一部である。ゲームで物理エンジンを使用したくない場合であっても衝突判定を使用したい場合はRigidboyコンポーネントを追加する必要がある。isKinematicでTrueをチェックしたRigidbodyはオブジェクトに物理エンジンが作用しない
  • 衝突するオブジェクトのどちらかのRigidbodyはスリープになっていないことが必要

Unityでパフォーマンスを改善するため、停止したRigidbodyをに自動的にスリープさせる。別のRigidbodyが衝突すると再度Awakeとなる。しかしながらRigidbodyを持たないオブジェクトのcolliderを作成、移動する、もしくはRigidbodyがAwakeでないRigidbodyである場合、衝突判定はスキップされる

作成、移動する全てのColliderにKinematicなRigidbodyを必ずアタッチすること。

  • 他の重要な考慮点

衝突判定が行われるためには他にもいくつかのルールが存在する。
Mesh Colliderは衝突する双方のオブジェクトのConvexでTrueをチェックする必要がある。Convexでないメッシュの衝突判定が必要である場合は衝突する相手方がプリミティブであることが必要条件となる。詳細は後ほど記載

Mesh Colliderは片面であるため、法線が外向きの場合のみ衝突判定が行われる

Mesh Colliderはバックフェースカリング(モデル後面の無視)が適用される

オブジェクトのcolliderは複数のプリミティブから構成することができ、複雑なオブジェクトを再現することができる。必要なことは複数の子オブジェクトを衝突判定させたいオブジェクトにアタッチする。さらにRigidbodyをアタッチしたうえで、プリミティブなcolliderを子オブジェクトにアタッチし、sizeとscaleを適切に設定する。組み合わせた形状が新たなcolliderとなる。
------

複数のColliderを子オブジェクトで構成することで代替する方法というのは有力だとおもう。基本を積み重ねてゲームテクニックを磨こうぜ!

2012年11月2日金曜日

必見!Unity初心者が学ぶ「別スクリプトの変数やメソッドへの参照」

前回投稿に続いて「別スクリプトの変数やメソッドへの参照」についてUnity Gemsより紹介する:

------
http://unitygems.com/mistakes1/
October 15, 2012

別スクリプトの変数やメソッドへの参照

二つのスクリプトを作成し、相互に参照したいメソッドや変数があるけれどもどうやったらスクリプトを参照する方法や変数を取得する方法が分からなかったとする。用語として、呼び出しを行って変数参照を行うスクリプトを「caller」呼び出される変数やメソッドを保有するスクリプトを「target」と定義する。
「staticを変数に用いないこと」がUnityで陥りやすい「罠」。ついつい変数を保有するスクリプトの参照方法が分からない場合に、簡単に参照出来る方法としてやってしまいがちだ。正確に理解していないかぎりやってはいけない典型パターンだ。staticな変数はグローバル変数の扱いであり使用すべき状況はかぎられていて、かつ上級者向けにシナリオといえる。複雑なゲームのプログラミングにおいて一度も使うことがなかったとしても全く困らないことが殆どだ。
Unity Answers頻出パターンとして「一人の敵を死なせるつもりが全員死なせてしまった」がある。大抵、開発者が参照方法を分からず、staticな変数定義に手をつけてしまったことが原因である。身に覚えのある方は良く読んで正しく理解すること!

「target」スクリプトへの参照を得るためには、まずどのオブジェクトにアタッチされているかを理解する必要がある。方法は5種類ほどある:

1.参照した「target」スクリプトが「caller」スクリプトと同じオブジェクトにある場合
この場合、GetComponent呼び出しを行い、戻り値としてスクリプトがアタッチされているゲームオブジェクトを取得すると良い。GetComponentを明示的に型定義しない場合は同一のゲームオブジェクトにアタッチされたスクリプトが戻される。

Javascriptの場合のGetComponent記述方法は:

GetComponent(TargetScriptName).someVariable = someValue;
GetComponent(TargetScriptName).SomeMethod();

C#記述方法:

GetComponent<TargetScriptName>().someVariable = someValue;
GetComponent<TargetScriptName>().SomeMethod();

GetComponentの戻り値がString型となるパターンは出来るかぎり避けること。GetComponentの戻り値がString型でない場合は呼び出しを行うことで正しい型が戻され、変数やメソッドをすぐに参照することが出来る。一方、GetComponent("「target」スクリプト名")という記述をするとスクリプト名を戻り値として得られるが、コンパイラが正しい型を認識できないため変数やメソッドをすぐに参照することが出来ない。

2.Collider、Triggerを通して「target」スクリプトを参照する
この場合、すでに参照したいオブジェクトを取得できており、OnTriggerの場合はColliderとして、OnCollisionの場合はCollisonとして参照できる。

あとは取得したオブジェクトにGetComponentを使用するだけだ。

Javascriptでは
function OnTriggerEnter(other : Collider)
{
      other.GetComponent(TargetScriptName).someVariable = someValue;
}


C#では
void OnTriggerEnter(Collider other)
{
      other.GetComponent<TargetScriptName>().someVariable = someValue;
}

OnCollisionの場合、衝突したCollisionオブジェクトを取得できているため、相手オブジェクトを代表するものに対してGetComponentを呼び出しする:

function OnCollisionEnter(collision : Collision)
{
       collision.collider.GetComponent(TargetScriptName).someVariable = someValue;
}

C#では

void OnCollisionEnter(Collision collision)
{
      collision.GetComponent<TargetScriptName>().someVariable = someValue;
}

また、Trigger, Colliderの相手オブジェクトの子オブジェクトへの参照が必要である場合、GetComponentInChildrenを用いれば良い

GetComponentChildrenは呼び出ししたオブジェクトも検索対象とすることに留意

3.二つのオブジェクトにエディタを通じた関連性がある、あるいはスクリプトで関連性を記述している
この場合、オブジェクトに関連性があり、呼び出したタイミングで相互に作用してはいないものの、何らかの長期的な関連性がある。例をあげると、敵がプレイヤーを追跡している場合、プレイヤーは武器を敵に向けてロックオンしている関連性があるし、別のパターンではプレイヤーが何かの乗りものに乗車している関連性がある場合などがあげられる。

次に「caller」スクリプトの中に変数を通して「target」スクリプトを参照させたい。一番簡単な方法は変数の型定義としてTargetScriptNameとすることであるが、別の方法としてはGameObjectやTranformなど異なる参照変数とすることも出来る。
パフォーマンス観点からGetComponent呼び出しはマイナス効果があるので留意すること。たとえ複数の変数を定義してわざわざ同じオブジェクトを参照する場合であってもパフォーマンス観点からGetComponent呼び出しの回避は検討すべきである。一般にGetComponentから必要オブジェクトへの参照をAwakeやStart時にpublic変数にキャッシュしておくのが良い。複数の変数の場合は、ランタイムで変数のひとつを変更したら必ず他の変数も変更されるように必ずに実装すべきである。

エディタの場合は、Inspectorを用いて変数をセットする、あるいはランタイムにセットする場合は前述の2または後述の4の手法を用いてComponentを取得し、変数をセットアップする必要がある。

Triggerによる長期的な関連性をもった例:

var targetScript : TargetScriptName;

function Update()
{
     //If we have a target, and that target is ready to be targeted
     if(targetScript && targetScript.someVariable > 100)
     {
         //Do one thing     }
     else
     {
         //Do something else
     }
}
function OnTriggerEnter(other : Collider)
{
     //Check whether the thing we hit can be a target
     var target = other.GetComponent(TargetScriptName);
     if(target)
     {
           //If it can then target it
           targetScript = target;
     }
}

4.「target」スクリプトを名前かタグの一致で判定する

この方法はパフォーマンス観点で別のオブジェクトを見つけるにあたり最もマイナス効果が大きい。オブジェクトへの参照を一致で判定させることは一度だけにとどめるよう設計を行い、出来ることならばStartかAwakeのなかであらかじめ行うことが肝要である。

名前やタグの一致によりオブジェクトを見つけた後は、前述の2とまったく同様の方法でGetComponentを通じて参照を行えばよい。

なおオブジェクトを見つける手法は複数ある。例えばGameObject.FindWithTagかGameObject.Findでシーン全体に対して検索を行う。あるいはtranform.Findを用いることでゲームオブジェクトの子オブジェクトを検索させることが出来る。見つける手法がどれであったとしても前述の2の方法でスクリプトを参照させ、出来ることならば結果をキャッシュしておき長期的に呼び出しできるように前述の3の方法を用いてその後は継続的に参照を行う。

TargetScriptName targetScript;

void Start()
{
       targetScript = GameObject.Find("someObjectName").GetComponent<TargetScriptName>();
}

void Update()
{
      if(Vector3.Distance(targetScript.transform.position, transform.position) < 10)
      {
          targetScript.someVariable -= someValue;
      }
}

5.オブジェクトに参照したい別コンポーネントがあるが、そのコンポーネント上に参照したい変数がない場合
階層を辿っていく場合や、同じオブジェクトに複数のスクリプトがある場合に頻出する。本質的には前述の2のパターンと同じといえる。

例えば「caller」スクリプトがアタッチされているオブジェクト子オブジェクト全てへの参照が必要である場合

for(var t : Transform in transform)

     target = t.GetComponent(TargetScriptName);
     target.DoSomething();
     target.someVariable = someValue;
}

---------

内容が濃い!やっぱり情報を整理してある素晴らしいウェブサイトがUnity Gemsだとおもう。

次回はさらに「OnTriggerやOnCollisionの判定条件」をカバーしていきたい。

文中アイコンは以下サイトの素材を利用しています



必見!Unity初心者がハマる11の「罠」~目次

Unity初心者が頼りにできるウェブ上の情報というのは限定されている。

いかに良心的であり誰かのために役立つ情報を提供にしたいコンテンツとなるかはウェブサイトの管理者の意向により大きく左右されるといえる。

Unity Answersの常連が集まってUnity初心者のためにより有用な情報を提供したい目的でUnity Gemsというウェブサイトが最近立ち上がった。

内容を確認すると珠玉(Gems)という名に恥じない内容といえる。

いつもどおりウェブサイト管理者に連絡をとり、公開されている情報を翻訳してこのブログにアップする許可を得たので共有したい。現在の管理者の方はUnity Serializerというツールも提供しているMike Talbot氏だ。

内容も濃く情報量が膨大であるため何週間か複数回に分け投稿するので辛抱強くお付き合いいただきたい:

---------

http://unitygems.com/mistakes1/
October 15, 2012

Unity初心者は間違いを犯すのが常である。このガイドを活用して落とし穴にハマらないコツを掴んでほしい。

Unityプログラミング初心者のハマる「罠」は誰もが引っかかりやすいものがいくつかある。プログラミング初心者であるがゆえにハマるものと、他の言語とのわずかな違いでUnityではゲームオブジェクトに複数のスクリプトをアタッチすることによりハマるものの両方のパターンが存在する。

Unity Answers頻出パターンを学習ステップのなかでカバーしたい。

本シリーズで学習できること

学習ステップ
  1. 別スクリプトの変数やメソッドへの参照
  2. OnTriggerやOnCollisionの判定条件
  3. Inputの正しい用法
  4. 未来事象の正しい文法
  5. ListやDictionariesで増減するオブジェクトコレクションを管理
  6. Rigidbodyの正しい移動方法
  7. Character Controllerの正しい使い方
  8. クォータニオンの修正方法
  9. C#とJavascriptを正しく連動させる
Unity初心者がハマる11の「罠」
  1. 簡単なタイマー機能にyieldやcoroutineを使用しないこと
  2. staticを変数に用いないこと
  3. CharacerControllerを格闘やゲームでの移動ではない目的で使用しないこと
  4. FixedUpdateの中でInputを使用しないこと
  5. Array, HashtableやArrayリストを間違った使用方法で使わないこと
  6. Quaternionのx,y,z値を更新しないこと
  7. kinematicでないrigidbodyでオブジェクトを移動しないこと
  8. collisionやtriggerの発生条件を勘違いしないこと
  9. Java, Javascript一般のプログラミング手法をUnityに持ち込まないこと
  10. waitやyield後のcoroutineの終了条件を勘違いしないこと
  11. C#スクリプトからJavascriptの相互参照を軽く考えすぎないこと
-----

次回投稿で第1回「別スクリプトの変数やメソッドへの参照」を紹介する!
http://gamesonytablet.blogspot.com/2012/11/unity.html

2012年11月1日木曜日

Scaleform for Unity

Autodesk社のScaleformのUnityプラグインに関する動画が最近アップされたようだったため紹介する。




http://www.youtube.com/watch?v=c_f_pbGmHi8&list=PLE347157F6317BA5C&feature=plcp

2012/10/12

この短時間のビデオにて2つの異なるゲームデモから、ScaleformのUnityプラグイン新機能であるレンダリングからテキスチャ生成について紹介する。
----

有料のソフトウェアであっても、今後アーティストの方が過去から使用しているツールとしてAdobe社やAutodesk社の様々な製品をUnityに移行していく流れは今後も加速するんじゃないかな、とおもう。

最近で大きなニュースとしてGreeが発表したFlashをUnity(or HTML5)で再生するLWFプラグインのことも記憶に新しい:

テラシュールウェア:[Unity3D]LWFの導入手順ムービ
http://terasur.blog.fc2.com/blog-entry-302.html

ベストな組み合わせで面白いゲームを開発しょうぜ!

ブックマークに追加

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

自己紹介

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

ページビューの合計

過去7日間の人気投稿