- 投稿日:2020-11-15T20:59:25+09:00
Unityでカスタム法線メッシュにブレンドシェイプを適用した際に法線が崩れる問題の解決法
はじめに
UTS2.0などのNPRシェーダを使ってキャラクターを可愛く見せようとした時、顔メッシュの法線編集は必須になってくると思います。
しかし、Blenderなどでカスタム法線メッシュを作成し、ブレンドシェイプを適用すると、デフォルトではカスタム法線とシェイプキー適用後の法線が競合し、最終的な法線が崩れてしまします。
これではいい感じの陰影が出るように法線を調整していても、ブレンドシェイプを使用して表情が変わった際に陰影がおかしくなってしまいます。この記事で書くこと
- カスタム法線メッシュにブレンドシェイプを適用した時に法線が崩れ、陰影がおかしくなる問題の解決法
この記事で書かないこと
- 法線(Normal)に関する基礎知識
- 法線編集そのもののやり方
環境
- Windows 10
- Unity 2018.4.20f1
結論
UnityへのFBXファイル読み込み時、
Import Settings
でBlend Shape Normals
をNone
に設定してください。
これにより、ブレンドシェイプを適用した場合も法線が変化せず、設定したカスタム法線通りの陰影が出ます。
以下ツイートを参考にしています。
https://twitter.com/momonoki3000/status/1327679608490061824/photo/1推奨されない方法
以下のように
Legacy Blend Shape Normals
にチェックを入れた場合も、上記画像の設定をした場合と同様にブレンドシェイプを適用した際にカスタム法線が崩れなくなります。
しかし、上記のツイートにもありますが、これは非推奨のようです。
公式マニュアルを確認したところ、記載そのものがありませんでした。
Legacy
とありますが、ドキュメントに項目を記載する価値すらないということなのでしょうか…。Blend Shape Normalsの動作確認
2020年11月時点でのVRChat公式バージョンであるUnity 2018.4のマニュアルによると、以下の記載があります。
ブレンドシェイプの法線を計算するかどうか、および法線の計算方法を定義します。 Normals プロパティーと同じ値を使用します。
なお、設定値は以下の3つで、マニュアルには説明が記載されていません…。
※分かりやすいようデフォルト値であるCalculate
を一番上に記載しています。
- Calculate (デフォルト値)
- Import
- None
これだけでは動作がわからないため、カスタム法線を適用した自作モデルを使用して動作検証をします。
その他設定はすべてデフォルト値を使用します。
ブレンドシェイプを適用していない状態では、FBXに設定したカスタム法線そのままの陰影が出ています。Blend Shape Normals : Calculate (デフォルト値)
動作の推測
名称から、ブレンドシェイプ適用後のメッシュ形状に合わせて法線を計算する…というパラメータと考えられます。
それがメッシュに設定されたカスタム法線と競合し、結果として法線が崩れてしまってるのではないでしょうか。なお、このモデルでは全メッシュを結合しているため、ブレンドシェイプを使用した場合に顔を中心としてモデル全体の法線が崩れ、陰影もおかしくなってしまっています。
Blend Shape Normals : Import
動作の推測
Calculate
では崩れていた耳や腕リボンの陰影は変化しなくなりました。
しかし、カスタム法線を使用した顔の陰影は崩れたままになっています。
どのようなパラメータであるかは、結果からは判断できません…。Blend Shape Normals : None
動作の推測
ブレンドシェイプ適用後もカスタム法線の陰影がそのまま維持されています。
ブレンドシェイプの法線を使用しないというパラメータで、ブレンドシェイプの法線がカスタム法線と競合せず、陰影も崩れない…という動作と考えられます。このため、カスタム法線をブレンドシェイプで崩さないよう、
None
を選択した方がいいでしょう。Legacy Blend Shape Normals (おまけ)
余談ですが、この項目にチェックを入れると、動作としては
Blend Shape Normals
でNone
を選択した場合と同様のものになります。
しかし、レガシーという文字、そしてマニュアルに記載がないという部分から、Unityとして非推奨の設定と考えられますので、基本的にこちらではなくBlend Shape Normals
を使用した方がよさそうです。その他設定項目
今回詳細に動作検証はできなかったのですが、上記ツイートによると
Blend Shape Normals
以下の設定の推奨値は以下のようになっているそうです。
設定項目 推奨値 設定値の説明 Normals Mode Unweighted 法線にウェイト設定はありません。 Smoothness Source None ハードエッジで頂点を分割しません。 Tangents None 頂点接線をインポートしません。メッシュに接線がないため、法線マップしたシェーダーとは使用できません。 自分が動作検証をした限り、
Blend Shape Normals
をNone
にした状態でこれらの設定を変化させた場合、モデルの見た目に変化を確認することはできませんでした。
しかし、「モデルデータの軽さ」という観点ではこの設定にしたほうがデータが軽い…というのはありそうですので、どの設定にしたらいいかわからない、という方はこちらの設定にするのがオススメだと思います。最後に
自分はこれまで非推奨となっている
Legacy Blend Shape Normals
を使用していたのですが、上記ツイートを見て検証した結果、公式マニュアルにも記載されないレガシー設定の危うさを知ることができました。
同様にLegacy Blend Shape Normals
を使用されている方への助けになれば幸いです。もし間違いや不明点などがありましたら、ご指摘をお願いします。
参考情報
- 投稿日:2020-11-15T20:42:48+09:00
Unity PlayGround Referenceガイド
Unity Playgroundリファレンスガイド日本語訳版の内容をもとに、スクリプトの内容を一つずつ確認していきます。
準備
1:Unity PlayGround Reference.zipをダウンロードし、解凍する。その後、Unity Hubを起動してプロジェクトフォルダを読み込み、Unityエディタを起動する。
2:プロジェクトエリアのツリーからAssets>UnityPlayGround_Reference>Movementを開き、Moveファイルをダブルクリックする。HierarchyのルートにMoveファイルが登録されるのを確認しよう。ワンポイントアドバイス
この演習ではわかりやすさを優先し、事前にオブジェクトに必要なスクリプト(Rigidbody 2D、BoxBoxcorider 2Dなど)をアタッチし、パラメータなどを調整して、Prefabにしてあります。実際にゲームを作るときは、これらを別途アタッチすることが必要です。Movement scripts(移動スクリプト)
このカテゴリのスクリプトをアタッチすると、オブジェクトを移動させられます。移動はすべて物理法則に基づくため、ほとんどすべてRigidbody2Dコンポーネントが必要です。また、Collider2Dコンポーネントを使用すると、複数のオブジェクト間でインタラクションが可能になります。
Auto Move
AutoMoveスクリプトをアタッチするとオブジェクトが自動的に移動します。敵キャラクターやアイテムなどを移動させるのに便利です。移動の向きと強さはVector2のベクトルで表現されます。シーンビューでは、緑色の矢印ギズモが向きを表し、大きさが強さを表します。
1:プロジェクトエリアからAsteroid2 PrefabをHierarchyにドラッグ&ドロップし、シーンビューの左側に移動させる。その後、Asteroid2のInspectorから「Open Prefab」をクリックする。
2:プロジェクトエリアのツリーからAssets>Scripts>Movementと進み、Auto Moveをシーンビュー上のAsteroid2にドラッグ&ドロップする。正しくアタッチされていたら、InspectorにAuto Moveコンポーネントが表示される。その後、Hierarchyの「<」アイコンをクリックする。
3:シーンビューの再生ボタンをクリックすると、隕石が左から右に移動する。ワンポイントアドバイス
スクリプトのアイコンをドラッグ&ドロップするかわりに、InspectorのAdd Componentからスクリプトの絞り込み検索を行って決定しても良い。あらかじめ必要なスクリプトの名称が分かっている場合は、こちらの方が便利だ。そのため以下の説明ではこちらの方式を採用する。コンポーネントの見方
Rigidbody 2D
オブジェクトに物理挙動を与えるコンポーネント。2Dと3Dがあり、Unity PlayGroundでは2Dのみを使う。下記のパラメータを変更すると移動速度などを変えられる。
Mass:オブジェクトの質量
Friction:摩擦係数
Angular Friction:転がり摩擦の計数
Gravity:オブジェクトに働く重力
Constaraints:チェックするとその軸が固定される(移動や回転をしなくなる)Circle Collier 2D
Collierはオブジェクトの当たり判定を設定する際に使うほか、Is Triggerをオンにすることで、各種スイッチの役割もはたす。形状によりBox ColliderやCircle Colliderなどがあり、2Dと3Dが存在する。Rigidbodyと同じくUnity PlayGroundでは2Dのみを使う。
Radiusu:半径
Is Trigger:これをオンにすると当たり判定がなくなる代わりに、オブジェクト同士が触れたときの検出ができる。
Material:反射する素材などを設定できる。
Offset:Colliderの中心点を上下左右に移動させられる。
Used by Effector:さまざmなあエフェクトを追加できる(参考)Auto Move
Direction:オブジェクトの移動方向をX軸とY軸で設定できる。マイナスの数値を設定すると反対側に移動する。
Relative To Rotation:オンにすると進行方向に対してオブジェクトの向きを自動変更できる。Auto Rotateと組み合わせると効果を発揮する。Auto Rotate
Auto Rotateオブジェクトをアタッチすると、オブジェクトを回転させられる。回転中に他のオブジェクトと衝突したりすると、回転速度や向きが変化する。
1:プロジェクトエリアで先ほどのAsteroid2 Prefabを選択し、InspectorからOpen Prefabsをクリックする。
2:InspectorのAdd Componentから「Auto Rotate」を絞り込み検索する。
3:Rotation Speedのパラメータを設定する。正数字で時計回り、負数字で逆時計回りにオブジェクトが回転する。設定が終了したら「<」ボタンをクリックする。Relative To Rotaionのチェックは外しておくこと。
4:再生ボタンをクリックして、アステロイドが回転しながら移動する様子を確認しよう。CAMERA FOLLOW
CameraFollowスクリプトは他のスクリプトと違い、Main Cameraにアタッチします。シーン内で動くゲームオブジェクトをTargetとして割り当てることで、そのオブジェクトを常に画面の中心に表示するようにカメラを動かすことができます。
1:HierarchyでMain Cameraを選択し、InspectorのAdd Componentから「Camera Follow」を絞り込み検索する。
2:HierarchyからAsteroid2をCamera FollowのTargetスロットにドラッグ&ドロップする。
3:再生ボタンをクリックして、Asteroid2の動きにカメラが追随することを確認しよう。
4:画面のフレームに合わせてカメラを自動停止させるには、Main CameraのCamera Followコンポーネントにある「Use Bound」をオンにする。
5:シーンビュー上の黄色い枠線を画面のフレームにあわせて拡張する。
6:再生ボタンをクリックして、カメラが見切れないように止まることを確認しよう。
7:動作確認が終わったら、Main CameraのCamera Followコンポーネントをオフにしよう。また、Use Boundもオフにしておく。これで追随が行われなくなる。Follow Target
FollowTargetは、指定されたターゲットを追跡するようにオブジェクトを動かすスクリプトです。
1:はじめに先ほどシーンビューに配置したAsteroid2を選択し、Inspectorでオブジェクト名のチェックボックスをオフにしよう。これでHierarchyに配置したまま、シーンビュー上で表示を消すことができる。復活させたい場合はチェックボックスをオンにすればいい。これは他のオブジェクトでも同様だ。ワンポイントアドバイス
同じようにInspectorのコンポーネントにあるチェックボックスをオンオフすることで、それぞれのコンポーネントの働きを一時的にオフにしたり、オンにしたりできる。
2:プロジェクトエリアのツリーからAssets>Unity PlayGround_Reference>Movementと進み、SpaceShipBlueをHierarchyにドラッグ&ドロップする。その後、シーンビュー上で位置を中央下側に移動させる。
3:同様にSpaceShipRedをHierarchyにドラッグ&ドロップする。
4:プロジェクトエリアのSpaceshipRed Prefabを選択し、InspectorでOpen Prefabをクリックする。
5:InspectorのAdd ComponentでFollow Targetを絞り込み検索し、アタッチする。その後、「<」ボタンをクリックして元に戻る。
6:HierarchyでSpaceshipRedをクリックする。次にInspectorのFollow TargetコンポーネントにあるTargetスロットに、HierarchyからSpaceshipBlueをドラッグ&ドロップして配置する。最後にLook up targetにチェックを入れ、Use Sideを「up」にする。ワンポイントテクニック
Speedの値を変えると移動速度が変わる。また、Look up targetのチェックをオフにするとSpaceShipRedが真下を向いたまま移動する。
7:再生ボタンをクリックして、SpaceshipRedがSpaceShipBlueに向かって移動するか確認しよう。
ワンポイントテクニック
複数のオブジェクトでFollow Targetを連鎖して設定することで、列を作って移動させることもできる(ただし、このままでは先頭のオブジェクトが消失すると、後続の動きが止まってしまうので注意が必要だ。シューティングゲームの敵キャラクターの動きなどに応用する場合は、列の先頭が破壊されたら自動的に次の敵が先頭になるように、スクリプトを工夫する必要がある)Jump
Move
Patrol
Push
Rotate
Wander
- 投稿日:2020-11-15T20:26:36+09:00
toio for Unity Editor Windows BLE対応
初めに
Unityでtoioの開発できるってことで飛びつきました。
https://toio.io/blog/detail/20200930-1.html
しかし、よく内容を見ているとUnity Editor内で確認できるのは
シュミレーターでのtoioの動き確認のみ。う~ん。やっぱUnity Editorでtoioコアキューブが動いてほしい
というわけでtoioの仕様についていろいろ調べ始めました。toio™コア キューブ 技術仕様2.2.0
https://toio.github.io/toio-spec/docs/ble_communication_overview.htmlBLEで接続してtoioコアキューブが動いているようなので
Unity EditorでBLE接続出来てしまえばいけちゃうのでは?
って事で調べ始めました。Uunity EitorでBLEを接続する
UnityでBLE接続するぞってって事でAssetstoreに行って検索を!
自分で作るんじゃないんだ。。。
無ければ自分で作るんですけどね。。ということで調べたら、あった!!神
Arduino Bluetooth Plugin $19
https://assetstore.unity.com/packages/tools/input-management/arduino-bluetooth-plugin-98960Arduino Bluetooth Pluginを使ってBLE接続
Arduino Unity Plugin.pdfの説明の最後のほうに
Setup BLE in unity editor for Windows 10の説明があるので手順書通りインストールします。BLEの通信するアプリ(BluetoothDesktopServer)を立ち上げて
アプリはBLEのサーバーと通信するものですが、コマンドでループバックで通信を行えるようにコマンドで実行しておきます。
CheckNetIsolation.exe LoopbackExempt -is -n=BluetoothDesktopServer_t05x7yb6e6yp0後はc#の方で
BluetoothHelper.BLE_AS_CLIENT = true;でBLEの接続の準備をしておきます。
Unity Editorで立ち上げて、toioのBLEを探すので接続したら
ServiceとCharacteristicsを指定して値を渡すと
toioがtoio™コア キューブ 技術仕様通りに値を送ると
値通り動いてくれます。※注意
Arduino Bluetooth PluginのwindowsのBLEの接続はまだ開発途中らしく、安定した接続はまだらしいです。この記事は2020/10に環境を作りました。
- 投稿日:2020-11-15T16:14:27+09:00
2Dプロジェクトで画像を表示する
前書き
初めてUnityを触る方向け記事になります。
(筆者も初めてUnityに触っているため一部誤りがあるかもしれませんがご了承ください)Unityのインストールがまだの方はこちらを参照し、インストールしてください。
Unityインストール手順2Dプロジェクトで画像を表示する
画像を表示する方法を下記手順に沿って解説します。
2Dプロジェクトを作成
Unityの新しいプロジェクトの作り方を参考に2Dプロジェクトを作成する
Canvasを追加
ヒエラルキー内のMain Cameraを右クリックし、UI→Canvasを選択します。
Canvasはオブジェクトを表示するために必要な要素になります。
画像を追加
追加したCanvasを右クリックし、UI→画像を選択します。
次に適当な画像ファイルをUnityに読み込ませます。
プロジェクト内のAssetsを選択し、エクスプローラーから画像を引っ張って入れます。
画像ファイル投入後、Imageに画像を設定するため、ヒエラルキー内の画像を選択します。
右側のインスペクター内に[ソース画像]に"なし(スプライト)"となっているので、ここに先ほどAssetsに投入した画像を引っ張ります。
以上で画像を表示させることができます。
- 投稿日:2020-11-15T13:47:06+09:00
Unityの新しいプロジェクトの作り方
前書き
初めてUnityを触る方向け記事になります。
(筆者も初めてUnityに触っているため一部誤りがあるかもしれませんがご了承ください)Unityのインストールがまだの方はこちらを参照し、インストールしてください。
Unityインストール手順Unity起動
Unityインストール後下記アイコンが作成されているので実行します。
起動すると下記のような画面が表示されるので[新規作成]ボタンを押下します。
以上がプロジェクト作成までの手順になります。
- 投稿日:2020-11-15T13:28:32+09:00
Unityインストール手順
Unityインストール手順
Unityには複数のプランが存在し、条件に合わせて選択する必要があります。
詳細は下記リンクから確認を推奨しますが、ザクッと解説しますので適切なプランを選択し、Unityをインストールしてください。
Unityのプラン選択画面プランは大別し、個人向けと企業向けがあります。
さらに上記2つにそれぞれプランがぶら下がっています。
個人で触ってみたいのであれば自身の年収が約1000万(すごいザックリ価格)を超えていなければPersonalプランで大丈夫です。
ただ、上位のプランの方が色々サービスが追加されているので必要であれば有料のプランを選択することも良いと思います。
大別 プラン 料金 利用条件 個人向け Student 無料 学生向け 個人向け Personal 無料 過去12か月の収入・資金調達が10万ドルを超えていない場合
企業でも上記条件を満たしていれば当プランを利用可能企業向け Plus 有料 過去12か月の収入・資金調達が20万ドルを超えていない場合 企業向け Pro 有料 条件なし 企業向け Enterprise 有料 条件なし