20201115のUnityに関する記事は6件です。

Unityでカスタム法線メッシュにブレンドシェイプを適用した際に法線が崩れる問題の解決法

はじめに

UTS2.0などのNPRシェーダを使ってキャラクターを可愛く見せようとした時、顔メッシュの法線編集は必須になってくると思います。
しかし、Blenderなどでカスタム法線メッシュを作成し、ブレンドシェイプを適用すると、デフォルトではカスタム法線とシェイプキー適用後の法線が競合し、最終的な法線が崩れてしまします。
これではいい感じの陰影が出るように法線を調整していても、ブレンドシェイプを使用して表情が変わった際に陰影がおかしくなってしまいます。

この記事で書くこと

  • カスタム法線メッシュにブレンドシェイプを適用した時に法線が崩れ、陰影がおかしくなる問題の解決法

この記事で書かないこと

  • 法線(Normal)に関する基礎知識
  • 法線編集そのもののやり方

環境

  • Windows 10
  • Unity 2018.4.20f1

結論

UnityへのFBXファイル読み込み時、Import SettingsBlend Shape NormalsNoneに設定してください。
これにより、ブレンドシェイプを適用した場合も法線が変化せず、設定したカスタム法線通りの陰影が出ます。
image.png
以下ツイートを参考にしています。
https://twitter.com/momonoki3000/status/1327679608490061824/photo/1

推奨されない方法

以下のようにLegacy Blend Shape Normalsにチェックを入れた場合も、上記画像の設定をした場合と同様にブレンドシェイプを適用した際にカスタム法線が崩れなくなります。
しかし、上記のツイートにもありますが、これは非推奨のようです。
image.png
公式マニュアルを確認したところ、記載そのものがありませんでした。
Legacyとありますが、ドキュメントに項目を記載する価値すらないということなのでしょうか…。

Blend Shape Normalsの動作確認

2020年11月時点でのVRChat公式バージョンであるUnity 2018.4のマニュアルによると、以下の記載があります。

ブレンドシェイプの法線を計算するかどうか、および法線の計算方法を定義します。 Normals プロパティーと同じ値を使用します。

なお、設定値は以下の3つで、マニュアルには説明が記載されていません…。
※分かりやすいようデフォルト値であるCalculateを一番上に記載しています。

  • Calculate (デフォルト値)
  • Import
  • None

これだけでは動作がわからないため、カスタム法線を適用した自作モデルを使用して動作検証をします。
その他設定はすべてデフォルト値を使用します。

Setting_PlaneFacial_Rotation.gif
ブレンドシェイプを適用していない状態では、FBXに設定したカスタム法線そのままの陰影が出ています。

Blend Shape Normals : Calculate (デフォルト値)

NoSetting_Facial_NoRotation.gif

動作の推測

名称から、ブレンドシェイプ適用後のメッシュ形状に合わせて法線を計算する…というパラメータと考えられます。
それがメッシュに設定されたカスタム法線と競合し、結果として法線が崩れてしまってるのではないでしょうか。

なお、このモデルでは全メッシュを結合しているため、ブレンドシェイプを使用した場合に顔を中心としてモデル全体の法線が崩れ、陰影もおかしくなってしまっています。

Blend Shape Normals : Import

Setting_BlendShapeImport_Facial.gif

動作の推測

Calculateでは崩れていた耳や腕リボンの陰影は変化しなくなりました。
しかし、カスタム法線を使用した顔の陰影は崩れたままになっています。
どのようなパラメータであるかは、結果からは判断できません…。

Blend Shape Normals : None

Setting_Facial_NoRotation.gif

動作の推測

ブレンドシェイプ適用後もカスタム法線の陰影がそのまま維持されています。
ブレンドシェイプの法線を使用しないというパラメータで、ブレンドシェイプの法線がカスタム法線と競合せず、陰影も崩れない…という動作と考えられます。

このため、カスタム法線をブレンドシェイプで崩さないよう、Noneを選択した方がいいでしょう。

Legacy Blend Shape Normals (おまけ)

余談ですが、この項目にチェックを入れると、動作としてはBlend Shape NormalsNoneを選択した場合と同様のものになります。
しかし、レガシーという文字、そしてマニュアルに記載がないという部分から、Unityとして非推奨の設定と考えられますので、基本的にこちらではなくBlend Shape Normalsを使用した方がよさそうです。

その他設定項目

今回詳細に動作検証はできなかったのですが、上記ツイートによるとBlend Shape Normals以下の設定の推奨値は以下のようになっているそうです。

設定項目 推奨値 設定値の説明
Normals Mode Unweighted 法線にウェイト設定はありません。
Smoothness Source None ハードエッジで頂点を分割しません。
Tangents None 頂点接線をインポートしません。メッシュに接線がないため、法線マップしたシェーダーとは使用できません。

自分が動作検証をした限り、Blend Shape NormalsNoneにした状態でこれらの設定を変化させた場合、モデルの見た目に変化を確認することはできませんでした。
しかし、「モデルデータの軽さ」という観点ではこの設定にしたほうがデータが軽い…というのはありそうですので、どの設定にしたらいいかわからない、という方はこちらの設定にするのがオススメだと思います。

最後に

自分はこれまで非推奨となっているLegacy Blend Shape Normalsを使用していたのですが、上記ツイートを見て検証した結果、公式マニュアルにも記載されないレガシー設定の危うさを知ることができました。
同様にLegacy Blend Shape Normalsを使用されている方への助けになれば幸いです。

もし間違いや不明点などがありましたら、ご指摘をお願いします。

参考情報

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Unity PlayGround Referenceガイド

Unity Playgroundリファレンスガイド日本語訳版の内容をもとに、スクリプトの内容を一つずつ確認していきます。

準備

無題.png
1:Unity PlayGround Reference.zipをダウンロードし、解凍する。その後、Unity Hubを起動してプロジェクトフォルダを読み込み、Unityエディタを起動する。

スクリーンショット (1273).png
2:プロジェクトエリアのツリーからAssets>UnityPlayGround_Reference>Movementを開き、Moveファイルをダブルクリックする。HierarchyのルートにMoveファイルが登録されるのを確認しよう。

ワンポイントアドバイス
この演習ではわかりやすさを優先し、事前にオブジェクトに必要なスクリプト(Rigidbody 2D、BoxBoxcorider 2Dなど)をアタッチし、パラメータなどを調整して、Prefabにしてあります。実際にゲームを作るときは、これらを別途アタッチすることが必要です。

Movement scripts(移動スクリプト)

このカテゴリのスクリプトをアタッチすると、オブジェクトを移動させられます。移動はすべて物理法則に基づくため、ほとんどすべてRigidbody2Dコンポーネントが必要です。また、Collider2Dコンポーネントを使用すると、複数のオブジェクト間でインタラクションが可能になります。

Auto Move

Automove.png
AutoMoveスクリプトをアタッチするとオブジェクトが自動的に移動します。敵キャラクターやアイテムなどを移動させるのに便利です。移動の向きと強さはVector2のベクトルで表現されます。シーンビューでは、緑色の矢印ギズモが向きを表し、大きさが強さを表します。

スクリーンショット (1276).png
1:プロジェクトエリアからAsteroid2 PrefabをHierarchyにドラッグ&ドロップし、シーンビューの左側に移動させる。その後、Asteroid2のInspectorから「Open Prefab」をクリックする。

スクリーンショット (1278).png
2:プロジェクトエリアのツリーからAssets>Scripts>Movementと進み、Auto Moveをシーンビュー上のAsteroid2にドラッグ&ドロップする。正しくアタッチされていたら、InspectorにAuto Moveコンポーネントが表示される。その後、Hierarchyの「<」アイコンをクリックする。

スクリーンショット (1279).png
3:シーンビューの再生ボタンをクリックすると、隕石が左から右に移動する。

ワンポイントアドバイス
スクリーンショット (1277).png
スクリプトのアイコンをドラッグ&ドロップするかわりに、InspectorのAdd Componentからスクリプトの絞り込み検索を行って決定しても良い。あらかじめ必要なスクリプトの名称が分かっている場合は、こちらの方が便利だ。そのため以下の説明ではこちらの方式を採用する。

コンポーネントの見方
rb.png
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

無題.png
Auto Rotateオブジェクトをアタッチすると、オブジェクトを回転させられる。回転中に他のオブジェクトと衝突したりすると、回転速度や向きが変化する。

スクリーンショット (1280).png
1:プロジェクトエリアで先ほどのAsteroid2 Prefabを選択し、InspectorからOpen Prefabsをクリックする。

スクリーンショット (1282).png
2:InspectorのAdd Componentから「Auto Rotate」を絞り込み検索する。

スクリーンショット (1296).png
3:Rotation Speedのパラメータを設定する。正数字で時計回り、負数字で逆時計回りにオブジェクトが回転する。設定が終了したら「<」ボタンをクリックする。Relative To Rotaionのチェックは外しておくこと。

スクリーンショット (1285).png
4:再生ボタンをクリックして、アステロイドが回転しながら移動する様子を確認しよう。

CAMERA FOLLOW

無題.png
CameraFollowスクリプトは他のスクリプトと違い、Main Cameraにアタッチします。シーン内で動くゲームオブジェクトをTargetとして割り当てることで、そのオブジェクトを常に画面の中心に表示するようにカメラを動かすことができます。
スクリーンショット (1299).png
1:HierarchyでMain Cameraを選択し、InspectorのAdd Componentから「Camera Follow」を絞り込み検索する。

スクリーンショット (1300).png
2:HierarchyからAsteroid2をCamera FollowのTargetスロットにドラッグ&ドロップする。

スクリーンショット (1301).png
3:再生ボタンをクリックして、Asteroid2の動きにカメラが追随することを確認しよう。

スクリーンショット (1302).png
4:画面のフレームに合わせてカメラを自動停止させるには、Main CameraのCamera Followコンポーネントにある「Use Bound」をオンにする。

スクリーンショット (1303).png
5:シーンビュー上の黄色い枠線を画面のフレームにあわせて拡張する。

スクリーンショット (1304).png
6:再生ボタンをクリックして、カメラが見切れないように止まることを確認しよう。

スクリーンショット (1306).png
7:動作確認が終わったら、Main CameraのCamera Followコンポーネントをオフにしよう。また、Use Boundもオフにしておく。これで追随が行われなくなる。

Follow Target

無題.png
FollowTargetは、指定されたターゲットを追跡するようにオブジェクトを動かすスクリプトです。

スクリーンショット (1309).png
1:はじめに先ほどシーンビューに配置したAsteroid2を選択し、Inspectorでオブジェクト名のチェックボックスをオフにしよう。これでHierarchyに配置したまま、シーンビュー上で表示を消すことができる。復活させたい場合はチェックボックスをオンにすればいい。これは他のオブジェクトでも同様だ。

ワンポイントアドバイス
同じようにInspectorのコンポーネントにあるチェックボックスをオンオフすることで、それぞれのコンポーネントの働きを一時的にオフにしたり、オンにしたりできる。

スクリーンショット (1310).png
2:プロジェクトエリアのツリーからAssets>Unity PlayGround_Reference>Movementと進み、SpaceShipBlueをHierarchyにドラッグ&ドロップする。その後、シーンビュー上で位置を中央下側に移動させる。

スクリーンショット (1311).png
3:同様にSpaceShipRedをHierarchyにドラッグ&ドロップする。

スクリーンショット (1323).png
4:プロジェクトエリアのSpaceshipRed Prefabを選択し、InspectorでOpen Prefabをクリックする。

スクリーンショット (1324).png
5:InspectorのAdd ComponentでFollow Targetを絞り込み検索し、アタッチする。その後、「<」ボタンをクリックして元に戻る。

スクリーンショット (1332).png
6:HierarchyでSpaceshipRedをクリックする。次にInspectorのFollow TargetコンポーネントにあるTargetスロットに、HierarchyからSpaceshipBlueをドラッグ&ドロップして配置する。最後にLook up targetにチェックを入れ、Use Sideを「up」にする。

ワンポイントテクニック
Speedの値を変えると移動速度が変わる。また、Look up targetのチェックをオフにするとSpaceShipRedが真下を向いたまま移動する。

スクリーンショット (1328).png
7:再生ボタンをクリックして、SpaceshipRedがSpaceShipBlueに向かって移動するか確認しよう。

スクリーンショット (1334).png
ワンポイントテクニック
複数のオブジェクトでFollow Targetを連鎖して設定することで、列を作って移動させることもできる(ただし、このままでは先頭のオブジェクトが消失すると、後続の動きが止まってしまうので注意が必要だ。シューティングゲームの敵キャラクターの動きなどに応用する場合は、列の先頭が破壊されたら自動的に次の敵が先頭になるように、スクリプトを工夫する必要がある)

Jump

move1.png

Move

move2.png

Patrol

move3.png

Push

push.png

Rotate

rotate.png

Wander

wander.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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.html

BLEで接続して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-98960

で早速ポチって見ました。
image.png

Arduino Bluetooth Pluginを使ってBLE接続

image.png
Arduino Unity Plugin.pdfの説明の最後のほうに
Setup BLE in unity editor for Windows 10の説明があるので手順書通りインストールします。

image.png

BLEの通信するアプリ(BluetoothDesktopServer)を立ち上げて
image.png

アプリは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に環境を作りました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

2Dプロジェクトで画像を表示する

前書き

初めてUnityを触る方向け記事になります。
(筆者も初めてUnityに触っているため一部誤りがあるかもしれませんがご了承ください)

Unityのインストールがまだの方はこちらを参照し、インストールしてください。
Unityインストール手順

2Dプロジェクトで画像を表示する

画像を表示する方法を下記手順に沿って解説します。

2Dプロジェクトを作成

Unityの新しいプロジェクトの作り方を参考に2Dプロジェクトを作成する

Canvasを追加

ヒエラルキー内のMain Cameraを右クリックし、UI→Canvasを選択します。
Canvasはオブジェクトを表示するために必要な要素になります。
image.png

画像を追加

追加したCanvasを右クリックし、UI→画像を選択します。
image.png

次に適当な画像ファイルをUnityに読み込ませます。
プロジェクト内のAssetsを選択し、エクスプローラーから画像を引っ張って入れます。
image.png

画像ファイル投入後、Imageに画像を設定するため、ヒエラルキー内の画像を選択します。
image.png

右側のインスペクター内に[ソース画像]に"なし(スプライト)"となっているので、ここに先ほどAssetsに投入した画像を引っ張ります。
image.png

以上で画像を表示させることができます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Unityの新しいプロジェクトの作り方

前書き

初めてUnityを触る方向け記事になります。
(筆者も初めてUnityに触っているため一部誤りがあるかもしれませんがご了承ください)

Unityのインストールがまだの方はこちらを参照し、インストールしてください。
Unityインストール手順

Unity起動

Unityインストール後下記アイコンが作成されているので実行します。
image.png

起動すると下記のような画面が表示されるので[新規作成]ボタンを押下します。
image.png

テンプレート・プロジェクト名・保存先を入力してください。
image.png

以上がプロジェクト作成までの手順になります。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Unityインストール手順

Unityインストール手順

Unityには複数のプランが存在し、条件に合わせて選択する必要があります。
詳細は下記リンクから確認を推奨しますが、ザクッと解説しますので適切なプランを選択し、Unityをインストールしてください。
Unityのプラン選択画面

プランは大別し、個人向けと企業向けがあります。
さらに上記2つにそれぞれプランがぶら下がっています。
個人で触ってみたいのであれば自身の年収が約1000万(すごいザックリ価格)を超えていなければPersonalプランで大丈夫です。
ただ、上位のプランの方が色々サービスが追加されているので必要であれば有料のプランを選択することも良いと思います。

大別 プラン 料金 利用条件
個人向け Student 無料 学生向け
個人向け Personal 無料 過去12か月の収入・資金調達が10万ドルを超えていない場合
企業でも上記条件を満たしていれば当プランを利用可能
企業向け Plus 有料 過去12か月の収入・資金調達が20万ドルを超えていない場合
企業向け Pro 有料 条件なし
企業向け Enterprise 有料 条件なし
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む