!!!独り言日記 !![Shade] 続・ウエイトペイント(2014/04/29) 先週の続き。 Shadeでのスキンで、自動バインドではスキニングが難しい例です。 先月書いたカミキリムシで説明。 その前に、ボーン構造をどう配置しているかを記載します。 Shade上ではボーン表示は可視しにくいため、一度fbx出力してQuickTimeで見てみます(あくまでも説明のための対処)。 FBXで出力したものを見るツールとして、QuickTimeがあります。 Autodesk提供のQuickTime Viewer(plugin)の適用が必要です。 http://usa.autodesk.com/adsk/servlet/pc/item?siteID=123112&id=10775920 また、「FBX Converter」というのでも見ることができます。これも上記URLからダウンロードできます。 ※ 画像はQuickTimeで見たもの {{ref_image shade_bug_bone_01_20140429.png}} 赤いマルをつけた部分がボーンのルートになります。 QuickTimeはボーン構造を見るだけ。では、Shadeに戻りましょう。 動きをつける要所としては、 *羽を広げる *足(6本)を動かす *首を上下左右に動かす *腹をピクピクさせる というのを設けてみます。 それぞれが動かせるようにボーンが配置されてます。ボーンは構成済みとします(先月に説明済み)。 ボーン名は他のものと同じにならないユニークな英字名になるようにしてください。 !まずはスキンの自動バインド +形状のポリゴンメッシュを選択し、形状編集モード+頂点選択モードで全頂点を選択 +スキンウィンドウを表示し、「頂点ブレンド」を選択 +「バインド」ボタンを押す で、一度自動バインドします。 これでジョイントモードにして羽の付け根のボーンをブラウザで選びます。 画像では「boneWingRight0」という名のボーンを選択しています。 そして、図形ウィンドウ上のマニピュレータをドラッグして回転をかけてみます。 {{ref_image shade_bug_bone_02_20140429.png}} これくらいになると、自動バインドでは対処できず不正に変形します。 これは自動バインドの問題ではなく、距離でなんとなくウエイト値を自動割り当てするバインドの限界です。後は人様の目で修正が必要。 これをウエイトペイントで見ると、、、 {{ref_image shade_bug_bone_03_20140429.png}} 首近くの羽の根元で影響が弱かったり(黄色〜青になってる)、首に少し影響が入ってたり(黄色)、腹部分に影響が強く出てます(赤くなってる)。 羽の場合は「ぐにゃっと」の変形ではなく、機械的に開閉させるほうがいいですね。この「ウエイトペイントの様子を目で見て修正箇所を把握する」は大事ではあります。 ウエイトペイントでは羽が真っ赤に塗られていると目的の動きができそう、と推定できます。 !羽だけ選択 頂点選択モードにして、羽の部分に属する頂点を選択。 ここでは「boneWingRight0」のボーンの右側だけを適用するので右半分だけ選択。 !ウエイトペイントで塗りつぶす 「boneWingRight0」で連動する頂点として、先ほど選択した頂点に対して1.0で塗りつぶします。ツールパラメータのウエイトに1.0を入力。その右のバケツのアイコンを選択。 {{ref_image shade_bug_bone_04_20140429.png}} 選択頂点に対して1.0のウエイト値を適用後、 そのまま、ウエイトペイントのツールパラメータの「対象選択」を選んで頂点選択モードに移行。 ツールボックスの「編集」-「メッシュ」-「選択を反転」で選択状態を反転させます。 「ペイント」に戻り、今度はウエイト値を0.0にして塗りつぶし。 これで面選択モードに移行して、透視図でぐるっと見てみましょう。 {{ref_image shade_bug_bone_05_20140429.png}} 「boneWingRight0」のボーンでの羽根部分の影響は、1.0となりウエイトペイントの表示では真っ赤になりました。 !ジョイントモードで羽のボーンを回転して確認 自動バインド直後に羽のボーンを回転したときの「ぐにゃっと」を再度リベンジ。 ジョイントモードにして、ブラウザで「boneWingRight0」のボーンを選択してマニピュレータで回転させます。 {{ref_image shade_bug_bone_06_20140429.png}} 羽らしい開閉になりました。 ウエイトペイントでの「ウエイト値を0.0または1.0にして塗りつぶし」というのが、こういった動作をさせる場合に使えるのが分かったかと思います。 ここでは右の羽だけ対処したので、左の羽(boneWingLight0)も同じようにしてウエイト値を修正します。 今月は画像が多かったのでここまでにして、次の月にそれ以外の *足(6本)を動かす *首を上下左右に動かす *腹をピクピクさせる を対応させるウエイトペイントについて記載していきます。 !!KADAN (android向けカジュアルゲーム) (2014/04/28) Google Playにて「KADAN」というカジュアルゲームを公開しました。 以下より購入できます。 https://play.google.com/store/apps/details?id=jp.ne.ft_lab.KADAN 100円としました。 なお、Androd 4.0.3以降が必要です。Nexus 7(2012)以上のスペックがあればストレスなく動作するかと思います。 また、本ft-labでアプリやAssetなど、単体のものを作成した場合は http://www.ft-lab.jp のほうで列挙していくことにします。 「ft-lab.ne.jp」のこちらのほうは主にTips系や日記などとし、サイトで分けて役割分担することにします。 自作アプリ第一弾で、Unityの学習が大きな目的ではあったのですが、知識のない状態からここまで持ってくるのに半年かかりました。 「これはどう実装してるの?」など実装に関することでしたら回答できますので、遠慮なく突いてくださいませ。 facebook : https://www.facebook.com/yutaka.yoshisaka また、iOS版は引き続き対応予定です。 独り言日記でも、こう実装した、という内容は書いていくことにします。 ゲームってプログラムが大半かというとそうではなくて、画像や3Dデータや音など、リソース作成のほうが作業量多いんですよ。 !![Unity] Photon Cloud(2014/04/27) 近々使う予定の「Photon Cloud」についての現在知ってる知識を以下にまとめました(まとめています)。 http://ft-lab.ne.jp/cgi-bin-unity/wiki.cgi?page=unity_photon_cloud 左のメニュー部に「Photon Cloud」という項目を設けていくつか説明入れてます。 これは何ができるのかというと、マルチプレイのゲームを手軽に実装できるエンジンで、遠隔地のアプリの同期を取ることが可能です。 実際にPC上で試したり(この場合は回線が安定しているのでほぼラグは無し)、 Unite会場でモバイルでの動作を見せてもらいました。 遠隔地でもほぼストレスなく同期を取れてましたねぇ。 ゲームだけじゃなくて同期を取る必要があるアプリならなんでも使えそうですね。 まだ、「何ができる」を大雑把にしかつかんでないので新しく分かったことなどがあったら追記するようにします。 実験としての今のちいさな目標は、Unityちゃんを複数端末で同期させる、です。 !!バージョン管理(2014/04/25) モバイルアプリ開発が落ち着いたので、今までプロジェクトや元素材ファイルなど、適当にバックアップ取って管理してたのをgitで管理するようにしました(いまさらですが)。 gitとは、ソースやリソースなどのファイルをバージョン管理するツールです。 過去に作ったファイルに間違って変な記述を書いてしまった場合、その間違いが起きる前まで戻ったり、プロジェクトを分岐したりできます。 主に複数人で開発する場合で使われ、Unityのセミナーなど聞くと必ず「gitかsubversionでバージョン管理するべし」と言われますね。 開発ではよく使いますが、デザインでも使うようにしてるところもあるみたいです(Uniteの講演によると)。 SourceTreeというのを使うと、WinでもMacでもGUI環境でgitを使えるみたいなので、ローカルではありますがバージョン管理するように。 {{ref_image sourceTree_20140425.jpg}} 日本語にも対応してますよ。 このサイトが分かりやすかったです。 http://naichilab.blogspot.jp/2014/01/gitsourcetreegit.html !!ドメインの処理待ち(2014/04/25) 現在はandroid用のアプリ申請はgoogleへの登録は済みで後は公開するだけ、なんですが、 アプリやassetなどを置くサーバのドメインがまだなので待ち状態です。 今週中にリリース予定だったんですが申し訳ないです m(_ _)m 手続き関連は先にやっておくべきでしたね。 なお、サイト自身はすでに完成済み。 !![Shade] ウエイトペイント(2014/04/25) ちょっと期間が空きましたが、Shadeでのウエイトペイントの手順など。 *ツールボックスより「編集」-「共通」-「ウエイトペイント」選択 *頂点選択モードにする で、まずは、テスト的にウエイト値を1.0か0.0にして、曲げるとカクカクになるか確認。 {{ref_image shade_bone_01_20140425.png}} ツールパラメータのウエイトペイントグループ内で「対象選択」ボタンを押すと図形ウィンドウ上でのドラッグで矩形範囲の頂点選択ができます。 なお、四面図のうち選択したアクティブな図面でウエイトペイントの表示が行われます。 +これでboneAについてくる(画像ではポリゴンメッシュの下側)頂点を選択してから「ペイント」に戻す。 +対応ボーン(ここではboneA)をツールパラメータで選択 +ツールパラメータのウエイトのスライダを1.0に。 +ウエイトの右の塗りつぶしボタンを押す と、選択頂点でのboneAが影響するウエイト値がすべて1.0になります。 ということは、==その逆の選択されていない頂点のウエイト値は0.0となります==選択頂点のうち、boneBでの頂点のウエイト値は0.0となります。 ここでいったんウエイトペイントを抜けて(図面上でEnterを押す)、モーションウィンドウでシーケンス位置を移動させてポリゴンメッシュの曲がり具合を確認。 {{ref_image shade_bone_02_20140425.png}} boneBが回転しても、下側のboneAに属する頂点はピクリとも動いてませんね。 機械の関節などはこれで表現するとよさそうではあります。 それでは再びウエイトペイントモードに戻って。 演算を「加算」にし、ウエイトを0.1あたりにします。ツールパラメータではboneAを選択。 {{ref_image shade_bone_03_20140425.png}} ここで、図形ウィンドウ上の頂点をドラッグしていくとウエイト値は+0.1されます。 Shiftキーを押しながら図形ウィンドウ上の頂点をドラッグしていくとウエイト値は-0.1されます。個人的には「演算」の箇所は「加算」だけで変えることなく操作は可能かと。 ここで注意点。Shade 14.1.0では、正面図や側面図ではドラッグでのペイントは正しく行われないことがあります。 ということで、'''透視図でウエイトペイントします。''' また、ペイント時は面選択モードのほうが分かりやすい気がしてますので、面選択モードに移行。 このときには選択はすべて解除します。 そうしないと、黄色の半透明が選択部に乗るので見にくくなりますので。 下画像のように、上図の黄色で囲った部分あたりを円柱の周りで視点をぐるぐるまわしながら、頂点付近をShiftキー押しでドラッグ(ウエイト値を-0.1する)します。 {{ref_image shade_bone_04_20140425.png}} 0に近づきすぎたらShiftキーを離した状態でドラッグ(ウエイト値を+0.1する)。 ウエイトは頂点に対して与えられますので、ペイント処理は頂点を意識するようにしてください。 '''ズズズっと'''塗る感じよりも、'''ちょちょちょ'''とタッチする感じのほうが微調整しやすいかもしれません。 で、ある程度黄色になったらツールパラメータでboneBに切り替えてみます。 {{ref_image shade_bone_05_20140425.png}} 関節部分が黄色になってますね。ウエイト値としては0.5付近。円柱の中間あたりの頂点は、boneA/boneBの両方の影響を受けるようになったことになります。 図形ウィンドウ上でEnterキーを押して、ウエイトペイントモードから抜けます。 これで、モーションウィンドウのシーケンス位置を変えてみます。 {{ref_image shade_bone_06_20140425.png}} それなりに関節部分がグニャっとなりました。 まずはこれだけできれば、だいたいは対処できるかと思います。 といっても、円柱をボーンで曲げるのは自動バインドで十分ではありますが。 !まとめ *ウエイトペイント時に、ウエイトで0.0または1.0を与えて選択頂点を塗りつぶす機能がある(これが重要っていうのは次回説明) *ウエイトペイントで塗る時は、透視図で面選択で行うのが分かりやすい *ウエイトペイントで塗る時はウエイト値を0.1など小さい値にして、頂点付近をドラッグで+0.1、Shift押しドラッグで-0.1 *ウエイトペイント(スキンでのウエイトの割り当て)は、頂点に対して行われる では、次回は自動バインドでは対処できない/ウエイトペイントもちょっとテクニックがいる例を説明します。 形状は円柱ではなく、カミキリムシ(先月の独り言日記に記載)にバトンタッチします。 !!いろいろ手続きなど(2014/04/23) アプリ作成はようやく公開段階までこぎつけまして、ただいま申請作業中です。 オンラインだけで出来ないのもあり、事務手続きに時間がかかりますねぇ。 初回はAndroid版だけ出しますが、iOS版も引き続き対応予定です。 アプリごとに専用のページ作ったほうがいいかなということで、「ft-lab.ne.jp」ではないドメインを取りました。 また、これらは公開準備が整い次第連絡しますね。 独り言日記で進めていたShade関連の記事は1週間ペースのノルマを予定してたのですが、今週分はちと遅れております(アプリ開発/申請で手間取っていたため)。 そろそろ書き出せるかと。 なお、アプリで使った3Dデータ/アニメーションデータなどはUnityのプロジェクト内で以下のような感じになってます(全部Shadeでモデリング/アニメーション付けしてます)。 {{ref_image unity_kadan_project_objects.jpg}} 結構モデリングしたなぁと改めて。 3D形状やテクスチャなど、これらは資産になりますねぇ。 これらの開発ネタについても、日記で話題にしていければと思います。 3Dモデルとテクスチャは自前ですが、音や背景(空)の一部はAssetStoreを使わせてもらいました。また、同じくAssetStoreで購入したNGUIとBitmap2Materialは大活躍です。AssetStoreはUnity開発者みんなのリソース置き場ですね。 すでに誰かが作ったもので使えそうなものは使え、という精神は改めてすばらしいなぁと。 アプリ完成記念(?)に、一度これらの小物(建物もあるけど)を総動員してフォトリアルレンダリングすることにしてます。 実際、時代背景はほとんど絡まないカジュアルゲームなのですが、この時代(江戸や明治初期)の展示がある博物館行ったり日本画の展示を見にいったりと、インスパイヤされたものはかなりたくさんあります。 !![Unity] NGUIでのUIButtonの反応がたまに外れる現象(Android)(2014/04/19) Unity 4.3.4とNGUI 3.4.8にて。 NGUIのプッシュボタン用のSpriteでUIButtonを追加し、そのSpriteの下に画像を用意。 nextBut <== Sprite (UIButton割り当ても行った) Sprite <== 矢印の画像を指定したSprite UIButtonを割り当てたSpriteではSprite(画像)を割り当てずに、子のSpriteにアイコン画像を割り当てるとします。 {{ref_image unity_ngui_UIButton_20140419.png}} この場合、なぜかAndroid実機でボタンをタッチしても反応しない(タッチのタイミングによってはボタンがプッシュされない。反応が遅いように感じる)ことが。 これが地味に気になるので原因を追求中。 どうも、UIButtonを割り当てているSpriteがNoneだと起きやすく、ここにSprite画像を割り当てていると起きない感じがします。 ってことは、UIButtonを割り当てたSpriteはNoneでなくて、限りなく透明に近い半透明などを配置したほうがよいのかな。 以下のように、UIButtonを割り当てているSpriteをNoneではなくて、限りなく透明に近い画像をAtlasに入れて割り当てると、うまくいってます。 {{ref_image unity_ngui_UIButton_02_20140419.png}} この際は、Project右クリックで出るメニューの「NGUI」-「Open Atlas Maker」で「Trim Alpha」をOffにしないと、限りなくアルファが0.0に近い画像はAtlasに割り当てられないようです。 !![Shade] ポリゴンメッシュとスキン(2014/04/13) 先週の続き。 先週は、Shade上でボーンを配置してモーションウィンドウで動かすところまでを書きました。 次は、ポリゴンメッシュとして円柱を配置してこれをボーンについてくるようにします。 スキニングは「'''ポリゴンメッシュの頂点ごと'''」に個々のボーンがどう影響を及ぼすかを指定する作業になります。 スキンを割り当て/調整する方法は大きく3種類。 *スキンのバインド(自動) *ウエイトペイントで調整 *スキンのテーブルで調整 スキンのバインドだけで済めばいいのですが、実際は細かい調整が必要になってくることが多々あります、円柱などではバインドだけでOKだったりもしますが。 大部分はウエイトペイントで乗り切ることができます。 どうしても、という最後の手段はスキンウィンドウのテーブルで数値指定、となります。 !スキンのバインド さて、ブラウザ上でボーンのルートと同じ階層に円柱のポリゴンメッシュを配置しました。 円柱のポリゴンメッシュを選択した状態にします。 形状編集モードに移行し、頂点選択ですべての頂点を選択してください。 この状態で、メインメニューの「表示」-「スキン」を選択してスキンウィンドウを表示。 「頂点ブレンド」を選択。 スキンウィンドウの左上「バインド」ボタンを押します。 {{ref_image shade_skin_bind_01_20140413.png}} これで、選択された頂点に自動でスキンが割り当てられます。 この後、モーションウィンドウで再生してみましょう。 ボーンの動きにあわせてポリゴンメッシュが変形しますね。 これでスキンの割り当てが行われたことになります。 {{ref_image shade_skin_bind_02_20140413.png}} !スキンって何だ? では、そもそも「スキン」ってどういう仕組みなのでしょうか? これからが本題になります。 Shadeの旧スキン割り当て(クラシック)は、 MaxやMayaなどの一般的な3Dソフトとは異なる法則でスキニングが行われています。 これについては詳しくないのでここでは説明しません。 Shadeでの「頂点ブレンド」は、いわゆる一般的なスキンの計算が行われています。 ボーンの動きに対して、なんらかの法則があって頂点がぐにゃっとついてくるようにする計算が行われています。 単純に円柱に2つのボーン(3つのボーンジョイント)が存在するとして図式化します。 {{ref_image shade_skin_bind_03_20140413.png}} *boneA〜boneBを結ぶ線を1つめのボーン(中心はboneA) *boneB〜boneCを結ぶ線を2つめのボーン(中心はboneB) とします。boneCは先端ノードになります。これが回転したり移動しても円柱の各頂点は影響しないのでここでは考えません。 ですが、先端ノードの回転や移動は、実はアニメーションで結構使えます。 キャラクタの目玉の回転やフェイシャルアニメーションなど。 Shadeでも実はフェイシャルアニメーションはできますよ。これは別の機会に。 ボーン周囲にポリゴンメッシュの頂点(図ではP0/P1/P2/P3)が配置されているとしてください。 スキンを考える際は、ボーンは「'''線'''」としてみるようにします。 boneAが動く(回転と考えてください)とP0の頂点は100%boneAに引っ張られます。そうすると、子ボーンのboneBでの影響は0%です。 P1の点は、ちょうどboneAの作るボーンとboneBの作るボーンの真ん中です。 この場合は両方の影響を半々に受けます。 boneAの影響は50%、boneBの影響も50%。 P2の点は、boneBの影響を受けますがboneAの影響は受けません。 boneAの影響は0%、boneBの影響は100%。 boneBはboneAの子になりますので、boneAが回転するとboneBはそのままついてきます。 P2の点がboneBの影響を100%受けるというのは、 boneBを中心とした世界(boneBのローカル座標)でboneBの影響が100%という意味になります。 ですので、boneAが回転した場合はboneBが不動の状態でも、P2の頂点をワールド空間で見たら 当然ながらその回転に従うことになります。 、、、すんごい説明が難しい(^_^;; このように、スキンの特徴は *隣り合ったボーンに対する影響を数値として頂点に与える(離れたボーンは考慮されない)。 *頂点ごとのボーンの影響は合計すると1.0(100%)になる。 というルールがあります。 これをペイントで塗ったり視覚化するのがウエイトペイント機能になります。 !ウエイトペイントでスキンの影響を視覚化 Shadeにて、スキンを割り当てたポリゴンメッシュを選択して、いったん形状編集モード/面選択に移行。すべての面選択を解除します(そのほうが視覚化として分かりやすいです)。 ツールボックスの「編集」-「共通」-「ウエイトペイント」を選択します。 4面図の透視図をクリック。 ツールパラメータのウエイトペイントで「boneA」「boneB」の選択を切り替えてみてください。 {{ref_image shade_skin_bind_04_20140413.png}} 図形ウィンドウでは、青〜黄〜赤のグラデーションがかかってるのが確認できます。 ブラウザで選択されたポリゴンメッシュのうち、ツールパラメータのウエイトペイントグループのリスト部で選択したボーンがどれくらい影響を与えるか、が視覚化されてます。 完全な青は0.0、完全な赤は1.0となります。 ボーンの関節に向かうにしたがって、黄色から青に移行してるのが分かります。 影響が半分半分のところは黄色になることになりますね。 「スキンって何だ?」での画像のボーンの影響の図がグラフィカルに確認できるのが分かりますでしょうか。 この色合いをペイントすることで変更することができます。 これは頂点単位に行われます。 ほとんどは、頂点ごとのスキン値は0.0または1.0になるかと思います。かなり大雑把に書くと、ボーン同士の境界になる関節付近での頂点でのスキンをうまいこと割り当てて、ボーンの動きに合わせて滑らかに変形させる、のが目的の作業となります。 と、少し長くなったので今回はここまで。 次は、ウエイトペイントでのスキンの値変更についてです。 もう少し円柱は続きます。 その後あたりに、自動バインドでは調整が難しいカミキリムシをお題にすることにします。 PS. 追記です。 幸いなことに、ここで説明している事柄はShadeに限らず他の3Dツールでも同じ考え方でいけます。おそらくTips的なことはそのまま流用できるかと。 同じ概念だと、Unity含む他のツールとのやりとりが楽になりますね(何よりも、日記で説明するのが楽だというメリットが)。 !!毛筆フォント(2014/04/13) コーエーサインワークスさんの毛筆フォントのお試し版がUnityで使えるか試してみました。TTFで問題なく表示できました(お試し版なので表示できない文字はありますが)。 {{ref_image unity_font_gyousyo_20140413.png}} 上画像で使用している文字は、コーエーサインワークスの昭和行書TTF教育漢字/昭和楷書TTF教育漢字のフォントを使用しています。 やはりものすごく引き締まってますね。 近々出すアプリではテキストはそんなにこだわってないのですが、次回もしくは次々回では考慮したいところ(最近、江戸や明治時代あたりにはまってまして、、、)。 http://www.koueisha.ecnet.jp/shiyoukyodaku.html より、「一般商用利用」の範囲では映像作品やPVなどでの使用はOKになってました。 アプリやゲームで使う場合は「特殊商用利用」になってますね。 こういう風に明確化されているのはうれしい。リンクを見ると、既存のゲームや映画などでも利用されているみたいです。 カプコンのモバイル向けゲーム「鬼武者Soul」で使われてますね。 しかし、「アプリ」(ゲーム含む)となると企業も個人も関係ないので、こういった使えるライセンス関連は念入りに調査しておかないと。 !!フォントをアプリ/ゲームに組み込む場合の注意事項を調査 (2014/04/13) フォント使用時のライセンスについて深く調べたことがなかったため、 アプリでテキスト表示する箇所が出てきた段階でがっつり調べてみました。 Unity関連の情報をまとめてるページに記載。 http://ft-lab.ne.jp/cgi-bin-unity/wiki.cgi?page=unity_ngui_font_ttf 結果として、「ttf埋め込み」に関しては結構ライセンスのハードルが高いです。有料でライセンスを交わせるフォント会社もありますので、それを使うのが安心かも。 Windows OS付属の「MS ゴシック」や「MS 明朝」などの「MS○○」系については、印刷物での画像としての利用、は大丈夫っぽいですね。 ただ、ゲームやアプリなどで画像としてのメニューテキストを用意しての使用、は微妙にグレーかも。 埋め込みとしても使用するとなるとフリーでは「M+ FONTS」が無難かなぁ。 http://mplus-fonts.sourceforge.jp/mplus-outline-fonts/index.html 毛筆体フォントも使いたいところですが、これは有料のを買うほうが手っ取り早い感じがします。 http://www.koueisha.ecnet.jp/ とか、魅力的なフォントが。アプリで使う場合は「特殊商用利用」ですね。 !![Unity] Unity-Chanを歩かせる (2014/04/13) 先週公開された「ユニティちゃん」ですが、少し触ってみると歩かせるのはすぐできますね。 ↓下のは、Blob Shadow Projectorでニセ影を追加しています。 {{ref_image unity_chan_01_20140413.png}} 忘れないように少し手順を記載。 !UnityChan.unitypackageを置く場所 拡張子「unitypackage」は、AssetStoreで購入したものなど複数のAssetをまとめたもの。 Windows 7環境では、 C:\Users\ユーザ名\AppData\Roaming\Unity\Asset Store 内にAsset Storeで購入したものが配置されています。ここの「Unity Technologies」ディレクトリの下に「unity-chan.com」でダウンロードした「UnityChan.unitypackage」を置いてみました。 ここに配置すると、新規プロジェクト生成時のインポートするAssetのリストでUnity-Chanが選択できます。 !新しいプロジェクトを作り、Unity-Chanをインポート 新しいプロジェクトにて、メインメニューの「Assets」-「Import Package」-「Custom Package」を選択。 先ほど置いた「UnityChan.unitypackage」を指定してインポート。 !Prefabをシーンに配置 Projectの「Assets/UnityChan/Prefabs/for Locomotion」の「unitychan」をシーンにドラッグして配置。 InspectorでPositionのYが0.0であるのを確認。 すでに衝突判定用のカプセルが割り当てられています。 {{ref_image unity_chan_02_20140413.png}} !Planeを配置 地面用にGameObjectのPlaneを配置。InspectorでPositionのYが0.0なのを確認。 プリセットで用意されているGameObjectであるので、すでに衝突判定用のColliderは割り当てられてます。 !Directional Lightを配置 光源としてDirectional Lightをシーンに追加。 Intensityを1.0にしてユニティちゃんのほうに向けます。 Intensityが1.0以下だと暗すぎますので、他の形状とLayerで分けて光源処理してもいいかもしれません。 これで実行すると、地面に接地するようにユニティちゃんのColliderのカプセルが立った状態になります。 キーボードのWASDで移動でき、ちゃんと歩行モーションもされています。 ゲーム画面のテストGUI表示は「UnityChanControlScriptWithRgidBody.cs」「FaceUpdate.cs」内のOnGUIで短いスクリプトなので、これを参考にカスタマイズしていけば自分のゲームにも使えそうですね。 何よりも、Mecanimの勉強になりそう。私の知らない方法使ってるなぁ。後、フェイシャルアニメーションをどう操作してるかなど参考になりそうです。 !![Unity] [Android] INTERNET Permission (2014/04/11) 細かいところやタイトル/アプリアイコンなど調整中。 Unityでネットアクセスしてないのに、Androidアプリにして実機で確認すると「ネットワークへのフルアクセス」がついてしまってました。 {{ref_image unity_manifest_20140411.png}} 単純なUnityアプリではこれは付かないけど、何かしらのAsset使用でネットアクセス関数が存在する予感。 androidで言えばAndroidManifest.xmlの「」に相当。 UnityではプロジェクトのTemp/StagingArea/AndroidManifest.xmlが該当のManifestになりますが、、、Manifestをいじっても「Plugins/Android」に移行させてもうまく除去できず。 プロジェクト内を検索するとNGUI内の「NGUI/Scripts/Internal/NGUITools.cs」の「OpenURL」がWWWを使ってる。これをコメントアウトすると 「ネットワークへのフルアクセス」と「USBストレージの,,,,」が消えました。 なお、Development Buildではこの2つはWWWの使用/未使用に関係なく付くみたいですね。 このNGUIの「OpenURL」の箇所をコメントアウトした影響か、アプリのサイズもなんだか少し小さくなった気がします。 !![Unity] Unite Japan 2014 (2014/04/09) 04/07〜08のUnite Japan 2014はなかなかためになりました。 開発者向けの大規模イベントなのでノウハウが盛りだくさんでしたね。 すでに4gamerを中心にレポート記事が上がってるので「Unity Unite 2014」をキーワードでググるとよいかも。 全体的に見て、 *OculusのHMDでのVRの時代がきてる(SonyのProject Morpheusもちらっと講演で出てきました) *コンシューマ(コンソール)機もUnityで開発できる道ができる。個人も参入可(SonyのPlayStation MobileやMSのID@Xbox)。 *インディーズが伸びてきてる。 といった感じでした。 Unity5はグラフィックの向上も目玉ですが、個人的にはMecanim/Audioの強化がナイス。 技術的なこと以外では、コミュニティーを充実させる取り組みが気に入りました。 と、ようやく落ち着いたのでこちらは開発の追い込み中です。 !![Unity] モーションカーブの表示 (2014/04/09) いまさらなんですが、Unityでモーションカーブ見ることできますね。 Unite Japan 2014の講演で知りました。 Hierarchyでモーション付きのGameObjectを選択して、メインメニューの「Window」-「Animation」を選択。 ウィンドウ下の「Dope Sheet」で全体を表示、「Curves」を選択すると左のボーン階層構造で選択されたボーンでのPositonやRotationをグラフ表示。 {{ref_image unity_anim_20140409.png}} 編集が可能かどうかは不明。 !![Shade] ボーンとアニメーション(2014/04/06) 先週に引き続き、Shadeでのボーンを使った動きのつけ方です。 とりあえずは、オブジェクトモードとジョイントモードの理解/ボーンを使ったアニメーション、を先に説明した後、スキニングを説明しましょうか。 簡単に、上向きの円柱に2組のボーン(連続した3ボーンジョイントを指定)を入れて動かすものとします。 ある程度進めてから、先月のカミキリムシに戻ります。 また、最終的にUnityに渡しますのでそれに必要な指定も行いつつになります。 !ボーンの配置 ツールボックスの「パート」-「ジョイント」より「ボーン」を選択し、ツールパラメータで「自動で軸合わせ」をOffにします。 このボーンを配置するときは「オブジェクトモード」になっています。 ボーンや新規形状を配置するときは強制的にオブジェクトモードになりますので意識する必要はありませんが、「オブジェクトモードで配置してる」ということが後々重要になります。 以下のように配置しました。 {{ref_image shade_bone_20140406.png}} ボーン名は「ボーン」のままですので、3つのボーンをboneA/boneB/boneCとしてブラウザで親子構造にします。 このときに、各ボーンの形状情報ウィンドウを見て変換行列の「スケール」「回転」がかかってないことを確認します。移動はゼロでなくてもOK。 また、ボーンジョイント属性の回転角度指定とオフセットがゼロであるのを確認します。 以下、確認事項です。 *ボーン名は同じ名前がかぶらないようにユニークな名称で。 *ボーン名は英字/数字であること。全角文字は使わない。 *ボーンの変換行列のスケールと回転は指定しない。 *ボーンを配置した初期段階では、ボーンジョイント属性の回転とオフセットはゼロにする。 !モーションのシーケンスOn/Offを理解する モーションウィンドウを表示します。 {{ref_image shade_bone_02_20140406.png}} 左上に「シーケンス」チェックボックスがあります。 モーションをつける際は、これがOnになっている状態で行います。 モーションをつけたあと、これをOn/OffすることでOn時にアニメーションの動きを確認、Off時に姿勢が初期状態になる、が切り替わるようにします。 ここでは、シーケンスOff時はボーンの回転とオフセットがゼロである状態ということにします(変更することも可能ですが迷わないようにゼロを初期姿勢に)。 であれば、何もしなくてOK。 では、シーケンスをOnの状態にして0フレームに現在の姿勢をキーフレームとして登録しましょう。 !モーションのキーフレームを登録 モーションウィンドウで「シーケンスをOn」にします。 ボーンのルートである「boneA」を選択し、 モーションウィンドウ上部の「+」ボタンを押すとキーフレームとして現在の姿勢が登録されます。 {{ref_image shade_bone_03_20140406.png}} 上記画像の状態では、0フレーム目にboneA/boneB/boneCのボーンの「回転」「オフセット」情報が記録されたことになります。 モーションのキー要素としてボーンの「回転」「オフセット」を変更していくことで、動きをつけることになります(すべてのジョイントが個々にパラメータを持ち、同様にキーフレームアニメーションを行えますがここでは割愛)。 このときのボーン自身の変換行列内に含まれる「移動」「回転」「スケール」は不動である点に注意してください。 「オブジェクトモード」では'''形状自身の固定の姿勢'''を編集することができ、 モーション時の動きの要素は「ジョイントモード」で編集することになります。 このあたりごっちゃになると、気づかないうちに形状の姿勢が変わってしまってぐちゃぐちゃに、ということになりかねないので十分気をつける必要があります。 !ジョイントの操作 では、今度は20フレーム目くらいに移動して少しボーンを傾けるアニメーションをつけてみます。 モーションウィンドウで20フレーム目にドラッグして移動しておきます。 ジョイントの操作は、 *ジョイントモードにして、図形ウィンドウ上でジョイントをマニピュレータをつかんで回転または移動させる *ジョイントを選択した状態で、形状情報ウィンドウの「ボーンジョイント属性」をいじる の2パターンがあります。どちらでもよいです。 ここではジョイントモードにして操作してみます。 ジョイントモード時は、図形ウィンドウ上でボーン上をマウスクリックするとそのボーンを選択することができます。 以下のように、boneBを選択してZ軸中心に回転させました。 {{ref_image shade_bone_04_20140406.png}} このとき、間違えてオブジェクトモードで操作してしまうと形状自身の変換行列に回転が入ってしまい、せっかくのモーション付けが台無しになるので注意。 このとき、boneBの形状情報ウィンドウの「ボーンジョイント属性」で回転値が変更されているのが分かります。 Z軸中心に回転させたため、Z成分が変更されてます。 この状態でいったんキーフレーム登録します。モーションウィンドウで「+」ボタンを押します。 {{ref_image shade_bone_05_20140406.png}} これで0フレームと20フレームにキーが割り当てられたことになります。 これで再生すると、ボーンがお辞儀するような動きをします。後は、ジョイントを動かしてはキーフレーム登録、を繰り返していけばOKです。 !ボーンの役割 ボーンはその名のとおり「骨」になります。 ボーンだけではShadeでレンダリングしてもUnityに持っていっても、見えないものになります。 「実体」としてのポリゴンメッシュが存在することで、ようやく動きのある形状を表示できます。そのポリゴンメッシュとボーンをつなぎ合わせるものが「スキン」になり、このスキンを割り当てる処理が「スキニング」になります。 {{ref_image shade_bone_06_20140406.png}} Unityに渡す場合は、 +ポリゴンメッシュの形状、ボーン群、スキン情報 +ボーン群、モーションデータ みたいなfbxを別ファイルで出力して、2つめ「ボーン+モーションデータ」を複数設けてこれをMecanim(Unityのアニメーションの状態管理機能)で制御するのが楽かと思います。 Unity上では、1つの最小単位での動きを「Animation Clip」という名で扱ってます。 Unityでは、任意のボーン名とボーン構造を1つのカタマリと見て、 これに別々の動きを対応付けることができます(待つ、歩く、走る、など)。 個々のボーン名が識別IDになってると考えると分かりやすいかもしれません。 ボーンをポリゴンメッシュ形状に結びつけ(バインド)て調整するのが「スキニング」になります。 ということで、次回はポリゴンメッシュとスキニングについてを予定してます。 !!Substance Painter (2014/04/06) Steamで購入できる「Substance Painter」を購入。 http://www.allegorithmic.com/products/substance-painter 3Dの形状に対して3Dペイントとして「汚れ」を付けることに特化したツールです。 まだベータなのですが結構使えます。 {{ref_image substance_painter_20140405.jpg}} 上記は、あらかじめいくつか銅と錆の画像を用意しておいて、それをペイントしています。 銅や錆の画像は、iPhoneで撮影してきたのを使いました。Bitmap2MaterialでBumpを出力して、凸凹もマッピング。 Substance Painter 0.4.0段階では、凸凹は高さ(Bump)マップで指定するようでした。 別途、3Dペイントで汚れを追加したりできます。パーティクルとして雨や風での風化的な表現ができるのがウリのようです。 ベータ版では、それぞれのDiffuseやNormal/Roughnessマップ画像類を画像として出力して他ツールで利用することが可能。 鉄錆だけじゃなくて、壁の汚れや地面などさまざまなところで使い古されたような演出ができそうな気がします。 !!来週はUnite(2014/04/01) Unityの大きなイベント「Unite 2014」は来週の4/7-4/8。 じっくり見てきます。 Oculus VRの話もあるみたいですので楽しみ。 こちらの開発中のもUniteまでには申請しておこうと進めてましたが、ちょっとずれ込みそうです。 しかし、Unity5で追加されるリアルタイムGIの技術なども控えているので(もちろん予約購入済み)新しいことを覚えていくだけでも精一杯ですねぇ。まだUnityのちょっとの機能しか理解していないと実感。 でも、「これさえ覚えておけばモバイルやゲーム開発は一安心」という実感はありますね。