2012年8月14日火曜日

EditorScript入門

最近忙しくて記事を書くのがサボり気味です。
今回はお酒を飲みながらEditor拡張について扱います。

Unity大きな特徴としてEditor自身を簡単に拡張できるところがあります。普段利用している際にも細かいところに手が届かず、ちょっと困ることがあると思います。
そういった場合にEditor拡張を行うことでより自由自在にUnityを活用することが出来ます。

まずEditor拡張を行う際には専用のスクリプトを用意します。Projectタブの中にEditorフォルダを用意してください。その中に入れたスクリプトがEditor拡張用のスクリプトとして認識されます。注意すべきは、Projectのなかにあればどのような階層にあったとしてもEditorフォルダの中にあるものはすべてEditor拡張用として見なされてしまうという点です。Editorフォルダの中に入っているスクリプトに関しては実際にゲームをビルドする際には含まれません。そのため、ゲームの進行に必要なスクリプトはEditorフォルダに入れないようにしましょう。

Editor拡張を行う際にはUnityEditorの名前空間を指定する必要があります。そのためC#の場合は
using UnityEditor
とスクリプトのはじめに記述します。
そのごの細かい部分に関しては以下のスクショにて



こんな感じです。
具体的に何が出来るスクリプトかというと、シーン内にあるMeshの純粋な頂点数を計算しています。
Editor拡張を行う際にはEditorWindowなどのクラスを基底クラスとして拡張していきます。そして、主にOnGUIを利用してWindowの中のボタンやテキストフィールドを用意します。その際には今回利用しているGUILayoutクラスを利用することで綺麗に並べることが可能となります。

今回は利用していませんが、Assetの管理を行う際にはファイル操作の知識があると便利です。特定の形式のデータだけを抽出してソートする等、様々な使い方があります。


また、今回このスクリプトを作成した際に気がついたのはUnityのGameWindowにあるStatsで表示されるVertsは純粋な頂点数ではないということがわかりました。
具体的にはMesh自体が持っている超点数よりも2倍近く表示されているということがわかりました。
試しにCube(8頂点) のみを画面内においたところ頂点数が16と表示されていました。
これに関しては今後調査する必要がありそうです。



2012年8月9日木曜日

パーティクルシステムShuriken

パーティクルシステムがShurikenに変わってからどうやって設定したら思い通りのパーティクルが作れるか悩んでいる人も多いみたいです。そもそも、項目が分けわからんという人も結構いるみたいですが...
意外と簡単だったりします。




上から順番に確認していきましょう。
ParticleSystemをクリックするとまずは基本となる部分が出てきます。どの要素も名前で大体判別できると思います。重要なのは、値を入力できるフィールドの右はじに下向きの三角形がついているものです。三角を押すことでわかりますが、フィールドの値をカーブやランダムな値等柔軟に入力できるようになります。これに関しては今後の部分でも非常に良く使用する部分ではあります。

・Emission
エミッションとは排出のことを指し示しています。すなわち、パーティクルの要素一つ一つがどのように発射されるかを定義する部分です。基本はTimeで値を設定するだけで良いでしょう。

・Shape
パーティクルがどのような形で排出されるかを設定することが出来ます。デフォルトはCornすなわち上に向かって開いている三角錐みたいな感じになっています。そのため、初期のパーティクルが上向きに広がるようになっています。ほかにはBoxやSphereなどの形状が設定でき、どれもその形に添って発出します。

・ 〜〜 over LifeTime系
パーティクルのライフタイムに応じて様々な値を変更することができます。

・〜〜 over Speed
上記と同様にスピードに応じて変更が出来ます。

・Collision
Colliderの衝突判定を設定すること可能です。設定したTransform情報(座標、回転)から面を作り、発生したパーティクルはそれに反射するようになります。

・SubEmitter
パーティクルの発生に伴い更に別のパーティクルを発生させることができます。Birth(発生時)、Death(消失時)、Collision(衝突時)それぞれに対して設定できます。

・TextureSheetAnimation
テクスチャを分割してアニメーションさせます。XおよびYで分割数を、Animationで全体を巡るのか一つの軸(XもしくはY)のみ巡るのか、Cyclesでスクロールする回数を設定できます。

・Renderer
パーティクルで使用するマテリアル等を設定します。パーティクルの表示方法や最大サイズ等を設定することが可能です。

こんな感じです。
正直使ってみれば意外とわかりやすいことがわかります。

2012年8月7日火曜日

FGJに参加してきました

つい昨日まで福島にいました。
もちろんFGJに参加するためです。

今回でゲームジャムは三回目でしたが、制限時間30時間はなかなかにしんどかったです。企画やコンセプトは早い段階で決まりましたが、思うように実装が進まないこともあります。
特に今回はUnityにおいて2Dゲームを作成するということでUni2Dを使用しました。
こいつは、作成した画像データからコリジョンを自動で生成してくれるというなかなかの優れもので、Unityで2Dの物理系ゲームを作成するならば見ておいても損はなさそうです。

しかし、こいつになかなかに振り回された部分もありました。
テクスチャからコリジョンを作成する際にプレハブを生成するのですが、どうやら自動でリソースを作成してしまうようでAssetServerを利用しているとコンフリクトしまくるということが発生しました。
直接的なダメージは無いものの、Updateするたびに毎回コンフリクトするのはなかなかに面倒です。また、今回はWebPlayer上での発表だったため問題なかったのですが、iOSやAndroid向けに使用するにはまだまだ重いということも聞きます。これらのことが解決されれば非常に強力なツールとして広まるのではないでしょうか。

ここでまたFGJの話に戻ります。
今回自分は3班に参加しました。主にプログラムとサウンドを扱いましたが、やはりまだまだスキルアップの余地があるなあとも思いました。また、今回初めてペアプログラミングを行ったのですが、なかなかにたのしかったです。バグを見つけるには十分な目の数があればいいとかなんとかそんな話もありますが、事実二人で一つの処理を考えれば意外としっかりとしたものができるようです。

次回のGGJではリーダーに立候補しようかなぁとも考えるこのごろです。

技術系の話はまた明日からつづきます。

2012年8月3日金曜日

マイクから音を取得して波形を描画する

今回はマイクから音を取得して波形を生成するプログラムを作成しました。その結果は


こんな感じになりました。

今回のソースは



こんな感じです。
音声の入力にはMicrophoneクラスを、波形の描画に関してはLineRendererを使用しています。PlayClip関数内のwhile文の中にあるマジックナンバーは主に波形の描画位置の調整を行っています。




2012年8月2日木曜日

最適化のお話

最適化についてまとめます。
特にiPhoneやAndroid向けに開発する場合は悩まされる部分ではあります。
Unityに限らず役に立つ部分もあるかもしれません。

まず最適化を行う上で意識すべきことはキャッシュすることです。
毎ループごとにGetComponent()しているような部分はStartであらかじめキャッシュすることで無駄な処理を省くことができます。
また、ComponentだけではなくFind()で探しているオブジェクトや、結果が変わらない計算等はキャッシュするのが基本です。

ほかにもRaycastのキャッシュも効果があります。Raycast自身を無意識で使用してしまうととんでもないネックになることがほとんどです。LayerMaskを指定して判定を行うオブジェクトを少なくすることは当然ですが、一度判定が取れたのならばその判定をキャッシュしておきRaycastHit.colliderからコライダのRaycastを使用するようにしましょう。
Physics.Raycastが全てのコライダと判定をとろうとするのに対してCollider.Raycastではコライダ自身との判定をとるだけなので圧倒的にコストが変わると考えられます。

キャッシュの他にはUpdateおよびFixedUpdateで処理する内容に注意する必要があります。特にFixedUpdateは単位時間あたりに呼び出される回数がUpdateよりも多いので、気をつけないと非常に危険です。とくに前述のRaycastと複合されてしまうと非常に大きなネックとなります。

最後にベクター系クラスのmagnitudeには気をつける必要があります。ベクトルの大きさを求める際には三平方の定理からもわかりますが、平方根の計算を行う必要があり、それには地味に負荷がかかります。単にベクトルの大小比較を行うだけであればsqrMagnitudeを使用しましょう。こちらの値は最後に平方根をとる部分が除かれているすなわち大きさの二乗の値が取れることになり、x < y ならば x^2 < y^2 となるので単純な大小比較だけであればこちらで問題ありません。

今回はプログラムを中心にまとめました。
バッチやDrawcallなどプログラム以外に深く関わっている部分に関しては後日まとめます。