作成者別アーカイブ: おやぢ

■Unityメモ_テクスチャで表情を変更したい!

ゲーム「ゆかりん症候群」用にVoxelキャラの表情を変更したい!
普通の3Dモデルと同じだろうけど・・・まずモーフかテクスチャかの方法だけど、
Voxelキャラにモーフは無理、口とかないしするとテクスチャしかないですね!

調べてみると、下記のような資料が見つかりました。

■第17回_プレゼン資料(Unityはじめるよ~フェイスアニメーション~)
表情をテクスチャで実装する資料 ※リンク

■「だいしブログ」
VoxelキャラのUV展開等を説明いただいた方がいらっしゃったので
大変参考になりました!
「だいしブログ」
http://github.dev7.jp/b/2016/07/16/mgopt/

こちらの資料以外にも参考にした資料がありますが、
主に参考となって資料は上記になります。

また、Voxelモデルで表情作成までの流れを記載しますが、
他のモデルでも実装できるかと思います。
※今回紹介の方法がベストとは限りませんし、問題があるかもしれませんが・・・

さて今回、テクスチャで表情変更する方法ですが
「第17回_プレゼン資料(Unityはじめるよ~フェイスアニメーション~)」でも記載のある「1枚の画像に複数の表情を配置するUVアニメーション」で実装していきます。

まずは表情を適用する顔部分だけのメッシュ作成の為、MagicaVoxelで顔のみをPLY出力します。
ここから「だいしブログ」様からの情報をなぞらえる箇所が多くなります。

FaceTextureAnim_1

PLY出力したデータをBlenderでインポートします、必要に応じてサイズ等を変更します。

FaceTextureAnim_2

表情を適応するメッシュのみにするため、編集モードで余分な頂点を削除します。
ついでに、ツール→重複頂点を削除 も行います。

FaceTextureAnim_3

次にUVを展開するため、画面左メニューの「シェーディングUV」から
「UVマッピング」→「展開」→「スマートUV投影」を行います。
展開する際にはメッシュを全選択しておいてください。

FaceTextureAnim_4

画面上の「ScreenLayout」を「UV Editing」に切り替えます。

FaceTextureAnim_5

画面左下の「新規」から新規テクスチャを作成します。
サイズは「1024*1024」となっており、大きいので縮小します。
正直どれくらいが正しいかは不明なので、「128*128」で作ってみます。
このサイズが表情ひとつ分のサイズになります。

サイズが小さいとUnityで表示させた際に、ぼやけたりするのかな・・・?
作成したら「画像」ボタンから「画像を別名保存」します。

次に画面上の「ScreenLayout」を「Defaoult」に切り替えます。

FaceTextureAnim_6

画面右側のメニューから「カメラアイコン」を選択、メニュー最下部の「ベイク」から
ベイクモードを「頂点色」に変更して、「ベイク」ボタンを押します。

FaceTextureAnim_6_2

再度「ScreenLayout」を「UV Editing」に切り替えて、
テクスチャに焼きこまれていたら上書き保存してください。
また、不要な頂点色を削除するため、
メッシュ上で、スペースキーを押して、「頂点色を削除」を検索して実行します。

FaceTextureAnim_7

次に「ScreenLayout」を「Defaoult」に戻して
画面右側のメニューから「マテリアルアイコン」を選択、
「新規」ボタンを押してマテリアル作成します。

FaceTextureAnim_8

「テクスチャアイコン」を選択して、先ほどのテクスチャを、アタッチします。
アタッチには「新規」ボタンの横の「テクスチャアイコン」を押して、
先ほど作成したテクスチャを選択します。
が、出てきませんでした・・・

FaceTextureAnim_9

そこで新規ボタンを押して、タイプに「画像または動画」を選択
メニュー下から「画像」項目の「開く」から、先ほど作成したテクスチャを開きます。

FaceTextureAnim_10

この状態で、「FBX形式」でエクスポートしておきます。
また、先ほどの色を焼き付けたテクスチャが、表情1つ分ということで
そのテクスチャを編集、サイズを大きくして、他の表情をタイリングします。
今回テスト用に適当な画像を用意します。

FaceTextureAnim_11

タイリングは左上からの順として、顔の向きはそのままとします。
出来れば回転させたいですが、メッシュの向き?と合わなくなって変になります。
現状では我慢!

次はUnity側の対応になります。
Unityを起動して、出力したFBXと表情テクスチャを読み込みます。

FaceTextureAnim_12

Scene上に該当のFBX 顔メッシュを配置し
適用されているマテリアルには、上記の表情テクスチャを適用させます。

FaceTextureAnim_13

表情を変更する為に、スクリプトを適用します。
「FaceChanger」とでも名前を付けて、顔メッシュにアタッチしてください。
親のオブジェクトではなく、「MeshRenderer」を持つ子のオブジェクトです。

スクリプトの内容は下記となりますが、
こちらは資料「第17回_プレゼン資料(Unityはじめるよ~フェイスアニメーション~)」を自分用にいろいろ変えております。
また正直これがベストな方法かはわかりません・・・素人なもので・・・

内容は単純に「FaceNo」をテクスチャ上の参照するタイル番号として
タイル番号からテクスチャ上の位置XYを割り出し、
XY座標をUV座標の 0.0f ~ 1.0f に計算し直して、マテリアルに反映しております。

実際に動作を見てみますと・・・

FaceTextureAnim_14

分かりにくいと思われますが、「FaceNo」を変えることで変化しております。
これを「Update」などで、切り替え続けることでアニメーションもできそうですね。

ちなみにクエリちゃんも表情はテクスチャであるとのことで、
同様のスクリプトで切り替えることもできました!

FaceTextureAnim_15

・クエリちゃん公式サイト
http://www.query-chan.com/

Query-Chan_license_logo

さて表情となる顔部分は出来ましたが、本体モデルとどう合体させるかですが
資料「第17回_プレゼン資料(Unityはじめるよ~フェイスアニメーション~)」では
モデルの手前に置くことで対処しておりますが、クエリちゃんモデルを見ると
顔部分がくり抜かれた状態であることがわかります。

ので、自分も顔部分を取り除いたモデルで対応したいと思います。
顔の部分はBlender上で、面を選択して、面削除などを行います。

FaceTextureAnim_16

あとはUnity上でモデルを読み込んで、位置を合わせて子要素にして完成です!

FaceTextureAnim_17 FaceTextureAnim_18

長くなりましたが、これで表情つきのキャラが作れますね!

※その他参考資料
http://blog.livedoor.jp/akinow/archives/52169431.html
http://blenderfaq.blender.jp/oldfaq/tips/hyoujou-no-animeshon-wo-tekusucha-no-kirikae-de-hyougen-suru
http://yukuto.net/blog/201512blender_material_and_texture_for_unity/
http://krlab.info.kochi-tech.ac.jp/kurihara/lecture/cg/BlenderWeb_Hayashi/html/materialAndTexture.html

Unityメモ_当たり判定を調べる

「OnControllerColliderHit」の当たり判定がよくわからなかったため、
適当にあたり判定を調べたメモ
個人用なのでかなり適当に

最終的にはこちらの方の記載でようやく対応方法がわかりました・・・
http://tech.hisasann.com/cs/144/


CharacterController 同士は、何も設定しなくても互いにぶつかり、
相手の身体を滑ったりも出来る便利なものですが、その代わり現在の仕様上、
ぶつかった相手が CharacterController だった場合、衝突情報を取得することができないようです。
処理上はちゃんと衝突してても、OnControllerColliderHit には、
CharacterController タイプのオブジェクト情報だけ送られてきません
(その他のコライダは当然取得出来ます)。

回避策としては、子オブジェクトに CharacterController 付属のコライダと同じくらいの大きさの CapsuleCollider をアタッチすることが挙げられます。
この子オブジェクトに、CharacterController を搭載した親オブジェクトと同じ tag や layer を設定しておけば、大抵の用は済みます。
必要であれば、衝突した子オブジェクトの parent を参照すればよいでしょう。


—————————————————
■衝突される側
・BoxCollider (isTriggerなし + rigidbodyなし)
→ 衝突する側:反応なし 衝突される側:反応なし
・BoxCollider (isTriggerあり + rigidbodyなし)
→ 衝突する側:反応なし 衝突される側:反応なし
・BoxCollider (isTriggerなし + rigidbodyあり)
→ 衝突する側:反応なし 衝突される側:OnCollisionStayに反応あり
・BoxCollider (isTriggerあり + rigidbodyあり)
→ 衝突する側:Trigger全て反応あり 衝突される側:Trigger全て反応あり
・CharacterController
→ 衝突する側:反応なし 衝突される側:反応なし
—————————————————

—————————————————
■衝突する側
・BoxCollider (isTriggerあり + rigidbodyなし)

■衝突される側
・BoxCollider (isTriggerなし + rigidbodyなし)
→ 衝突する側:反応なし 衝突される側:反応なし
・BoxCollider (isTriggerあり + rigidbodyなし)
→ 衝突する側:反応なし 衝突される側:反応なし
・BoxCollider (isTriggerなし + rigidbodyあり)
→ 衝突する側:Trigger全て反応あり 衝突される側:Trigger全て反応あり
・BoxCollider (isTriggerあり + rigidbodyあり)
→ 衝突する側:Trigger全て反応あり 衝突される側:Trigger全て反応あり
・CharacterController
→ 衝突する側:Trigger全て反応あり 衝突される側:Trigger全て反応あり
—————————————————

—————————————————
■衝突する側
・BoxCollider (isTriggerなし + rigidbodyあり)

■衝突される側
・BoxCollider (isTriggerなし + rigidbodyなし)
→ 衝突する側:Collision全て反応あり    衝突される側:Collision全て反応あり
・BoxCollider (isTriggerあり + rigidbodyなし)
→ 衝突する側:Trigger全て反応あり    衝突される側:Trigger全て反応あり
・BoxCollider (isTriggerなし + rigidbodyあり)
→ 衝突する側:Collision全て反応あり    衝突される側:Collision全て反応あり
・BoxCollider (isTriggerあり + rigidbodyあり)
→ 衝突する側:Trigger全て反応あり    衝突される側:Trigger全て反応あり
・CharacterController
→ 衝突する側:Collision全て反応あり    衝突される側:Collision全て反応あり
—————————————————

—————————————————
■衝突する側
・BoxCollider (isTriggerあり + rigidbodyあり)

■衝突される側
・BoxCollider (isTriggerなし + rigidbodyなし)
→ 衝突する側:Trigger全て反応あり    衝突される側:Trigger全て反応あり
・BoxCollider (isTriggerあり + rigidbodyなし)
→ 衝突する側:Trigger全て反応あり    衝突される側:Trigger全て反応あり
・BoxCollider (isTriggerなし + rigidbodyあり)
→ 衝突する側:Trigger全て反応あり    衝突される側:Trigger全て反応あり
・BoxCollider (isTriggerあり + rigidbodyあり)
→ 衝突する側:Trigger全て反応あり    衝突される側:Trigger全て反応あり
・CharacterController
→ 衝突する側:Trigger全て反応あり    衝突される側:Trigger全て反応あり
—————————————————

—————————————————
■衝突する側
・CharacterController(rigidbodyなし)

■衝突される側
・BoxCollider (isTriggerなし + rigidbodyなし)
→衝突する側:反応なし 衝突される側:反応なし
・BoxCollider (isTriggerあり + rigidbodyなし)
→衝突する側:Trigger全て反応あり    衝突される側:Trigger全て反応あり
・BoxCollider (isTriggerなし + rigidbodyあり)
→衝突する側:反応なし 衝突される側:反応なし
・BoxCollider (isTriggerあり + rigidbodyあり)
→衝突する側:Trigger全て反応あり    衝突される側:Trigger全て反応あり
・CharacterController(rigidbodyなし)
→衝突する側:反応なし 衝突される側:反応なし

・BoxCollider (isTriggerなし + rigidbodyあり + isKinematicあり)
→ 衝突する側:反応なし 衝突される側:反応なし
・BoxCollider (isTriggerなし + rigidbodyあり + isKinematicなし)
→ 衝突する側:Collision全て反応あり    衝突される側:Collision全て反応あり
・BoxCollider (isTriggerあり + rigidbodyあり + isKinematicあり)
→ 衝突する側:Trigger全て反応あり    衝突される側:Trigger全て反応あり
・BoxCollider (isTriggerあり + rigidbodyあり + isKinematicなし)
→ 衝突する側:Trigger全て反応あり    衝突される側:Trigger全て反応あり
—————————————————

—————————————————
■衝突する側
・CharacterController(rigidbodyあり)

■衝突される側
・CharacterController(rigidbodyあり)
→ 衝突する側:反応なし 衝突される側:反応なし
・CharacterController(rigidbodyなし)
→ 衝突する側:反応なし 衝突される側:反応なし
—————————————————

■Unityメモ_CoreGameKitを試してみる_Part2

前回の「CoreGameKit」の記事は公式の使い方ではなかったので、
今回は公式チュートリアル動画から、リスポーン地点を作成します。

参考動画:https://www.youtube.com/watch?v=aBEkcHO6vZk

まずはAssetの「CoreGameKit」フォルダから
「Prefabs」の「LevelWaveSettings」を選択して、「Inspecter」から
「CreateLevelWaveSettingsPrefab」ボタンを押して、Sceneに専用オブジェクトを追加します。

CoreGameKit_2_1
追加された「LevelWaveSettings」選択し、
「Inspecter」から「ConfigurePooling」ボタンを押します。

CoreGameKit_2_2

すると「PoolBoss」の設定画面が表示されます。

CoreGameKit_2_3

内容をドキュメントから簡単に調べると・・・

「NewCategoryName」
→ カテゴリ新規作成名

「CreateNewCategory」
→ カテゴリ作成ボタン

「Default Item Category」
→ デフォルトのアイテムカテゴリ 作成されたアイテムはこのカテゴリを使用

「Auto-Add Missing Items」
→ 不足している項目を自動追加 機能がよくわかりません・・・

「LogMessages」
→ スポーンしたときやスポーンを削除した際に、メッセージしてくれるようです

となっており、「Drag prefabs here in bulk to add them to the pool」に
プールにしたいプレハブをドロップすると下記のようなアイテムメニューが表示されます

「Category (blue dropdown)」
→ ドロップダウンから別のカテゴリを選択

「Buttons (“Prefab” icon / Add / clone / Delete)」
→ プレハブのアイコンをクリックすると、プロジェクトビューでプレハブ強調表示されます

「Prefab」
→ プールしたいプレハブの指定

「Preload Qty」
→ プリロード数量 プレハブのコピー量

「AllowInstantiateMore」
→ アイテムの制限 インスタンス化が詳細にチェック
シーンの後にインスタンス化することができるアイテムの量に制限を置くために使用

「RecycleOldest」
→ ドキュメントにないようです・・・

「LogMessages」
→ プールアイテムのメッセージをログに記録する

各項目の機能は詳しくわかりませんが、
今回は下記画像のように、適当なプレハブと数値を入力します。

CoreGameKit_2_4

入力後、再度Scene上の「LevelWaveSettings」を選択して、
「Inspector」から「CreateSpawner」ボタンを押して、
各スポーンを作成します。

CoreGameKit_2_5
「UseGlobalWaves」項目から「AutoStartWaves」にチェックします。

CoreGameKit_2_6

「LevelWaves」から「Add」ボタンを押します。
「Duration」は10にします。

CoreGameKit_2_7

その後、「Hierarchy」から「LevelWaveSettings」→「Spawners」内の
各スポーンオブジェクトに「WaveSettings」がアタッチされているので
「Add」ボタンを押して詳細な設定画面が表示されます。

CoreGameKit_2_8

今回は上記画像のようにパラメータを設定し、
スポーンさせたいプレハブをドラッグアンドドロップします。

各スポーンオブジェクトを設定し終えて再生すると・・・

CoreGameKit_2_9

オブジェクトが生成されました!
イベントを変えれば、特定オブジェクトに接触したらスポーンするなど
簡単に実装できそうです!

■Unityメモ_CoreGameKitを試してみる

Gamekit

プーリングなどのゲーム制作に役立つAssetらしい

まずは資料はこちら
・CoreGameKit資料

ドキュメント
https://dl.dropboxusercontent.com/u/40293802/DarkTonic/KW_ReadMe.pdf
API
https://dl.dropboxusercontent.com/u/40293802/DarkTonic/CoreGameKit_API/Index.html
チュートリアル動画
https://www.youtube.com/user/DarkTonicGames/videos
公式フォーラム
http://darktonic.freeforums.net/
Unityフォーラム
http://forum.unity3d.com/threads/50-off-sale-released-core-gamekit-pooling-spawning-combat.167910/

試してみますが、本当に簡単に。
今回は任意のオブジェクトを自動でリスポーンさせる設定を行います。
「CoreGameKit」のAssetフォルダから、「LevelWaveSettings」プレハブを「Scene」に配置します。

CoreGameKit_1_1

配置した「LevelWaveSettings」プレハブ内の、「PoolBoss」を選択し
「Inspecter」に設定情報が現れるので、
「Auto-Add Missing Item」の項目にチェックします。

CoreGameKit_1_2

リスポーン用のイベントを設定する「GameObject」に、
「Triggered Spawner」をアタッチします。

CoreGameKit_1_3

アタッチした「Triggered Spawner」の「Inspecter」から
「EventToActive」のプルダウンメニューより「Visible」を選択することで
リスポーンイベントが設定できるようです。

CoreGameKit_1_6

イベント設定内に必要パラメータを設定します。
各パラメータについては、詳しく知らない為、適当に設定します。
「PrefabToSpawn」 → リスポーンしたいプレハブをアタッチ
「MinToSpawn」   → ランダム生成の最低値
「MaxToSpawn」   → ランダム生成の最高値
「TimeToSpawnAll」→ リスポーン発生ごとのディレイ
「DelayWave」    → リスポーン発生までのディレイ

今回は上から「4 4 3 2」で設定して見ると・・・

CoreGameKit_1_7

イベントは「表示」中に発生で、生成範囲は4~4なので、
4体が絶対表示され、リスポーン発生まで2秒
発生後は3ms? で発生してますね
「TimeToSpawnAll」の単位がわかりませんが・・・でもそんな感じに!

今回はここまで!
また何かわかれば試すかも?

■Unityメモ_Skele_part3

今回は「Skele」でアニメーション作成する場合に、
モデルの「Generic型」でないと作成できませんが、
作成したアニメーションを「Humanoid型」に変換して見ようと思います!

公式チュートリアルはこちら
https://www.youtube.com/watch?v=TNCng47imhU

変換に使用するツールが

Humanoid型への変換に、「DAE Exporter」
Generic型への変換に、「Muscle Clip Converter」

となります。

まずは「Generic型」モデルでアニメーションを作成します。

Skele_2_1.png

適当に「Generic型」「Humanoid型」モデルを用意して

Skele_2_2_g

「Generic型」で適当にアニメーションを作成して、変換する素材を用意します。

ここからアニメーションを「Humanoid型」に変換したいと思います。
Unityで「Window」→「Skele」→「DAE Exporter」を開きます。

Skele_2_3.png

チュートリアル動画の場合、
「put the RootNode here(check Appendix part if you’re not sure)」とのことで
英語はできないですが・・・ボーンのRootを入れれば良いようです。

次に青くて見にくいですが、「AutoFind」ボタンを押して、
「AddClip」ボタンを教えて、先ほど作成した変換用アニメーションを追加します。

Skele_2_5.png

設定が完了したら、「Export!」ボタンを押して、変換したファイルを保存します。

Skele_2_6.png

変換されたアニメーションを含む、関連ファイルが出力されました。
.daeファイルで出力されますが、これを調べたところ
「ソフトウェア間でデータの欠損なくスムーズに受け渡しができるような統一形式」とのことです。
https://codezine.jp/article/detail/843

内容はモデルデータとアニメーションデータとなるようですが、
アニメーションのみ必要な場合は、「Ctrl + D」でコピーして取り出せます。
http://tsubakit1.hateblo.jp/entry/2015/06/01/235939

さてこの出力されたアニメーションを見てみます。

Skele_2_7

左から
「Generic型」の元アニメなどを作成したモデルとそのアニメ再生
元の「Humanoid型」モデルに、生成したアニメを再生
生成されたモデルの「Humanoid型」に、生成されたアニメを再生

結果は・・・うまくいきませんでした。
手が変にねじれたり、なんか浮いたりと使用に耐えるものではありませんね・・・
あ、浮くのは「Apply Root Motion」にチェックしていたからのようです

う~ん・・・ボクセルモデルだからなのでしょうか・・・
チュートリアル動画の「RobotKyle」で再生すると問題はなさそうなんですが・・・

ふと思ったのが「Humanoid型」ボーンの設定を見直してみると
色々ボーン抜けがあったり、「Character is not in T pose」が発生してました。
「Pose」メニューから、「Enforce T-pose」でボーンを修正します。
http://docs.unity3d.com/ja/current/Manual/ConfiguringtheAvatar.html

Skele_2_8

修正して問題なしに!
そしていざ再生・・・

Skele_2_9_g

中央のモデルが修正したものですが、うまく再生されました!!
これで安心してモーション作って他モデルに、共有できる!

■Unityメモ_Arbor2を試してみる

Assetの「Arbor2」を試してみようと思います!

arbor_1_1

Arbor2」はFSM(finite state machine)ベースのビジュアルスクリプティング
詳しくはこちらから確認します。
説明:http://arbor.caitsithware.com/manual/getting-started/#FSM
リファレンス:http://arbor.caitsithware.com/manual/behaviour-reference/

本当に軽くですが、まずは敵が徘徊する設定まで。
とりあえず敵とするキャラに、「ArborFSM」をアタッチします。

arbor_1_2

「OpenEditor」ボタンを押して、編集画面を表示
ステートを作成して、「挙動追加」→「Agent」→「AgentPatrol」を選択して追加

arbor_1_3

必要な値の詳細はリファレンスを確認するとして、
「AgentController」が必要なので、敵キャラにアタッチします。

arbor_1_4

「AgentController」に必要なパラメータとして
リファレンスによると、
「Agent」に、「NavMeshAgent」

「Speed Parameter」から
「Animator」に、使用したい「Animatorコンポーネント」を設定
設定したAnimatorの「Parameter」がプルダウンで表示されます。
この項目は「移動速度をAnimatorへ渡す際のSpeedパラメータの名称を指定する。」
とのことで移動する際に、プルダウンで設定した「Parameter」に渡されます。
ただし「Float型」だけのようです。

とりあえずまずは、「NavMeshAgent」を用意します。
移動したいフィールドのオブジェクトを「Static」設定します。

arbor_1_5

Unityメニューの「Window」→「Navigation」を開き
タブ「Bake」から「Bake」ボタンを押して、「NavMesh」を作成します。

敵キャラに「Navigation」→「NavMeshAgent」をアタッチします。

arbor_1_6

これで「NavMeshAgent」が用意できたので、
敵キャラの「AgentController」の「Agent」に自身をアタッチします。

arbor_1_7

次に「OpenEditor」ボタンから、「ArborEditor」を開き
「AgentController」パラメータに敵キャラをアタッチして、各パラメータを入力します。

arbor_1_8
動かすと・・・

arbor_1_9

自動で徘徊するようになりました!
他の「Agent」である、「AgentFollow」「AgentEscape」も
対象設定する以外には同じパラメータなので、すぐ実装できました!

arbor_1_10

今後活用していきたいけど、使いどころとかまだよくわからないし
チュートリアルも少ないし、調べながら使っていこう。

■Unityメモ_SuperLevelOptimizerを試してみる

Assetの「SuperLevelOptimizer」を試してみようと思います!
こちらのアセットはSceneに配置された大量のオブジェクトを1つにまとめたり
ゾーン分けしてドローコールを減らすように出来るみたいですね。

とはいえ日本語資料もなさそうだし、本家のチュートリアルは英語だし・・・
動画見てわかるところを少し触る程度です。
また、無駄な手順や間違いもありそうです・・・

まずは結合したいオブジェクト以外を非アクティブにした後に
結合したオブジェクトを全選択して、Staticにチェックを入れるようです。

level_1_1
「Yes,change children」を押して、Static化!

次にメニューから「Tools」 → 「NGSTools」 → 「SuperLevelOptimizer」 → 「CreateOptimizer」
と選択して、専用オブジェクトを作成します。

level_1_2

作成した専用オブジェクトを選択すると
「Inspector」に「Optimize」というボタンが現れるので選択します。

level_1_3

処理が終わると、「Hierarchy」上に結合されたオブジェクトが作成されます。
この作られたオブジェクトだけの表示と、結合前のオブジェクトだけを表示した場合の
「Batches」を比較してみましょう。

level_1_4level_1_5

こちらは結合前のオブジェクト表示状態、「Batches」が「162」となっておりますが・・・

level_1_6level_1_7

こちらは結合後のオブジェクト表示状態、「Batches」が「13」となっており、
ドローコールが減少しておりますね!

代わりに「Saved by Batching」が102の増加となってますね。
この「Saved by Batching」がなにかを調べると、複数描画をまとめる機能のようで
今回の機能が働いていることがわかりますね・・・よかった!!

※参考資料
https://www.youtube.com/watch?v=M3b38qSAlZE&feature=youtu.be
https://www.youtube.com/watch?v=UOd4QmQes44&feature=youtu.be
https://www.youtube.com/watch?v=5ShWfQa3GME
https://www.youtube.com/watch?v=W0fqW4XtK2E
http://tsubakit1.hateblo.jp/entry/20130509/1368110060

■Unity初心者だけど、ゲーム作ってみる!_Part2

前回の続きですが、一応作っているタイトルを仮でも決めておきます!
ゆかりんが大量発生というより、一般人がゆかりん化する病気が蔓延する設定として
「ゆかりん症候群」(仮)としておきます!
まあ配信するかは未定ですが・・・

今回は昨日までにステージや武器を作成!

road
道!

light
電柱ぽいもの!

car
車ぽいもの!

pikopiko
武器ぴこぴこはんまー!

もうすこしまともで、他の種類も必要そうだけど・・・
とりあえずこれらを使ってUnityでステージ作成!

yukarin_stage_2_1

パーティクルも付けて、ライトの色も変えて
バイオ世界の荒廃した道路っぽくはなったかな・・・?

後はぴこぴこはんまーも
マキちゃんに装備して、歩行・攻撃モーションの作成しました!

maki_attack_2_2

オラオラオラオラオラオラ!
まあ調整とかは今後ってことで!
今日は休みだし、ゲーム性を作ってかないと・・・

※参考資料
ステージ制作に役立ちました!
http://tsubakit1.hateblo.jp/archive/category/%E3%82%B9%E3%83%86%E3%83%BC%E3%82%B8%E6%A7%8B%E7%AF%89

■Unityメモ_Skele_part2

Skeleで少し躓いた箇所があったのでメモメモ

3Dモデルに武器を持たせるときに
よくボーンの手の子要素に武器のオブジェクトを入れることがあるかと思います。
skele_p2_1

この状態で「Skele」をからボーン編集が可能ですが、
ポーズをリセットするときに、この持たせた武器がでっかくなっちゃった!!
skele_p2_2

原因としては・・・単に武器オブジェクトの「Rig」設定が
初期値である「None」だった為でした・・
skele_p2_3

ボーンがないから大丈夫かなと思ってましたが・・・
「Generic」にすると正常になりました。
これからはしっかり設定しないと!
skele_p2_4

■UnityでFBXのデータを使用する注意点

VoxelをUnityで使う際に、「MagicaVoxel」で作って
「Blender」でリギングや調整をしてFBX形式で出力
UnityでFBXを取り込んで、使いますがScale値が1にならない場合がありました
(Scale100になったりする・・・これは気持ち悪い)
今回はこれを直していきたい!
※あくまで初心者が調べた結果なので、問題があるかもしれません

始めにVoxelのCube1つ分はBlender上で「1m」になります
FBXでUnityに読み込んだ場合も、「1m」になっているようですね
scale_test_1
※適当に身長比較、右から1番目がUnityのCube 、右から2番目がVoxelのCube

しかしSceneに配置したVoxelのCubeの「Inspector」からScaleを見ると
Scaleが100となっていて、当然これを1にすると
1mの100分の1なので、1cmと小さくなります
scale_test_2

したらばUnity上の読み込んだFBXデータの「Inspector」からScale Factorを
100に設定すると元サイズが100倍され、Sceneに配置したオブジェクトの
Scaleを1にすれば見え方も変わらず、1mになります!
Sceneに配置する際に巨大なモデルが出てきますが・・・
scale_test_3

しかしこれはFBXデータの元になったBlender側のモデルが小さい場合の
対処になりますね。(Blender側の拡大縮小率1.0)

ではBlender側の拡大縮小率を100にして、FBXを出力
Unityで取り込んで、ScaleFactorは1のまま、Sceneに配置したら
配置オブジェクトのScaleを1にしても大丈夫そうですね
ということで実験!

自前のBlender上のボクセルゆかりんは
寸法を身長1m54cm程度にして、拡大縮小率を1.0にしております
scale_test_4

FBX出力の際には、拡大縮小率を100に設定して出力
scale_test_5

Unityで取り込むこんで、Sceneに配置、Scaleを1にすると
Unity上でBlender上の身長のサイズとなる
scale_test_6

しかしこれが正しいのか結構不安が残ります・・・
下記の参考にさせていただいた資料を見ると、Unity上でScaleを
変更することは書かれていないような・・・

とりあえずこれで制作を進めていこうかな

※参考資料
http://yukuto.net/blog/201512blender_fbx_unity_export_setting_of_scale_factor/
http://wildpractice.blog.fc2.com/blog-entry-9.html
http://d.hatena.ne.jp/tueda_wolf/20120106/p1
http://semakimomo.net/post-102/