ちゃこブログ

お絵かきとUnityとBlenderと日記

【Unity】UIElementsちょっとだけ入門してみた

 UnityEditor拡張に力を入れて学習してきた身としては、UIElementsはモノにしなくてはならない技術だという使命感はあります。しかし、CSSやらXMLやらにあまり馴染みがなく、USSとUXMLに向き合うのは結構なモチベーションがないと学習が捗らないものです…というのもIMGUIでGUIをゴリゴリ書くのもまだまだアリだと感じているからです(´・ω・`)

 このような理由でUIElementsの門をくぐれないでいる日々が長らく続いておりました。
Unity2019で生成できるサンプルや公式動画の解説を見てもピンとこなくて心が挫けそうになったとある日、あるサンプルを見つけたことでUIElementsへの入門にこぎつけることができました!

  • 超おすすめUIElementsサンプル
    • Inline C#
    • C# + USS
    • C# + USS + UXML
    • with IMGUI
  • 軽~くUIElementsを使ってGUI実装してみる
    • IMGUIをVisualElementに組み込むときの注意点
  • 個人的なまとめ
  • 感想
続きを読む

【Unity制作日記】【Blender2.8】アーマチュアの回転をUnity上で正常な値にするBlenderのエクスポート方法

タイトル長いです。
最近はVTuberVR文化の浸透でBlenderとUnityに関する知見はものすごく広まってそうですよね。私には相変わらず時代遅れな知識しかなくて焦りすらもないです。( ˘ω˘ )
タイトル通りですが、Blender&Unity関連で困った現象があったのでメモメモです。

Animation Riggingの勉強中

CEDECでUnity2019.3のAnimation Riggingを見てからずっと触っています。以前からProcedual Animationにとても興味がありましたが何から始めていいかわからず何もできてなかった中、この機能を見かけて入門出来そう!と思ったので勉強中です。

学習中、Hipボーンを追従させるRigをNinjaのExampleプロジェクトを参考にセッティングしてました。しかし設定は同じはずなのに完全な追従が行われない…RigのWeightも問題ありませんしなぜだ…
f:id:charcotte:20191001225924g:plain

原因を見てみるとモデルのスケルトンのスケールがメッシュの大きさと比較してめちゃくちゃ小さかったんですよね。Unity上でアーマチュアの大きさを1にしたところ、リグにしっかり追従するようになりました。
f:id:charcotte:20191006144547p:plain
Blenderファイルを確認したら、確かにアーマチュアがめっちゃ小さいサイズになってました。きっと作業中にデカすぎるという理由で小さくしたんだったかな…
いざスケールを修正してFBXを書き出し直してみるとスケールは治ったけど-90度回転はなんでか治らない。Animation Rigのサンプルで公開されているニンジャのモデルでは、メッシュもスケルトンも全部統一されていたので、全部修正しようと思いました。

続きを読む

【Unity】CustomPackageManager作った

久々のブログ更新です。

最近の開発でPackageManagerを利用することも多くなり、また自分で作ったプラグインもPackage化を行って利用しています。最近ではEC2の無料枠インスタンスでVerdaccioを起動して自分専用のprivate npm Registryを作成して快適な個人開発ライフを送っています。

Packageの管理方法としてnpm registryかgitを利用することが主流になってきています。ProjectにUnity公式以外のPackageを追加するためには、manifest.jsonに適切な形式でPackageの情報を記述する必要があります。追加だけでなく、Git管理の時は更新するときもいちいちmanifest.jsonを開いて編集しなくてはなりません。せっかくスマートにAsset管理するのにPackage化してるのに、ちまちまmanifest.jsonの編集をする作業、まさに虚無です。

github.com

まぁこういうツール探せばどっかにあるかなと思いましたが、とりあえず自分用に作っちゃいました。manifest.jsonをUnityEditor上で直接編集するツールです。機能としては、

  • Packageの追加・編集
  • Registry URLの追加
  • Git Packageの更新
  • scopedRegistryの追加・編集

f:id:charcotte:20190922023014p:plain

Windowに項目を追加するほどでもないかと思い、PreferenceにUIを作ってみました。ここのPackage一覧に表示されるのはcom.unity以外のものです。もし自分のPackageにcom.unityとか付けてたら表示されないので注意です。

GitのPackageの更新の機能も実装しています。Gitから引っ張ってくるPackageがあると、manifest.json内にlockという項目が出てきます。Package追加時点での最新コミットのハッシュ値が記載されます。Packageを最新にしたい場合、lockの中にあるPackage情報の削除を行うことで勝手に最新のコミットをひっぱってくることができます。このlock内Package削除が非常に手間なので、右クリックで削除して更新してくれる機能を実装しました。

ScopedRegistryについては、Scopesの編集を後から行えるようにしてます。自分でたてたnpm registryに適当なPackage名でじゃんじゃんpublishしてたらScopesが大変なことに…いやだってPackage名はcom.作者名.Asset名にしたいから多種多様になるじゃんね?というわけで後からScopesの追加をできるようにしてます。

manifest.jsonの追加で時間ロスしてる人にはオヌヌメです。一気に作ったからバグだらけかもしれませんが…( ˘ω˘ )

【Unity】【C#】MessagePackCSharpのコードジェネレーターのエラー回避方法について

※作業環境:Windows10、VisualStudio2017/2019、Unity2018.3.14f

GitHub - neuecc/MessagePack-CSharp: Extremely Fast MessagePack Serializer for C#(.NET, .NET Core, Unity, Xamarin). / msgpack.org[C#]

  • V1.7.3.6のCodeGeneratorのエラー
  • 新しいCodeGeneratorを取得する
    • コードジェネレーターの生成
      • global.json
      • Directory.Build.props
      • TypeCollector.cs
      • publish.bat
    • コードジェネレーターを使う
  • 余談
続きを読む

【Unity制作日記】EndLayoutGroup: BeginLayoutGroup must be called first.対処方法

 EasyAssetBundleツールの制作で、EditorWindow上のボタンを押してAssetBundleのビルドを走らせると必ずEndLayoutGroup: BeginLayoutGroup must be called first.というエラーが発生していました。

 これを回避するために、GUIUtility.ExitGUI()という関数を利用すると良いみたいです。実際に、ビルド処理を書いた直後にこの関数を呼び出してみたらエラーが出なくなりました。

if( GUILayout.Button( "Build" )) {
    var processor = new EasyAssetBundleBuildProcessor( SelectedData );
    processor.Build(); // ビルド処理
    GUIUtility.ExitGUI(); // 直後に記述
}

参考:
https://forum.unity.com/threads/endlayoutgroup-beginlayoutgroup-must-be-called-first.523209/

【Unity】UnitySceneMenu ver2.0.0をリリース!

UnitySceneMenu ver2.0.0をリリース

 UnitySceneMenu ver2.0.0をリリースしました。
UnitySceneMenuは私のお気に入りのアセットで、これがないと開発に困るレベルに使い込んでます。利用していて発見したバグや不便に感じたところをすべて解消したのがver2.0.0になります。とてもパワーアップしたので是非試していただきたいです!

assetstore.unity.com
github.com

  • UnitySceneMenu ver2.0.0をリリース
    • ver2.0.0のあれこれ
      • シーンをGUIDで管理
      • 基本シーンの数を設定できるように
      • メニューでビルド設定を管理
      • ReorderableListからTreeViewへの移行
      • 一度AssetStoreで審査落ちちゃったよ
続きを読む

【Unity制作日記】Preferenceウインドウ Unity2019対応

 Editor拡張でPreferenceウインドウに設定等を追加することがあると思いますが、Unity2019で実装方法が思いっきり変更になってるのでメモ。

docs.unity3d.com

Unity2019.1で[PreferenceItem]が利用できなくなったので、後継の実装となる[SettingsProvider]を使ってスクリプトを書き替えていきます。すべて上記のリファレンスに全部書いてある通りです。

従来のコード
[PreferenceItem( "UnityEditorMemo" )]
public static void PreferenceView() {
   // GUIコード
}
新しいコード
[SettingsProvider]
public static SettingsProvider PreferenceView() {
    var provider = new SettingsProvider( "Preferences/UnityEditorMemo", SettingsScope.User ) {
        label = "UnityEditorMemo", // メニュー名やタイトルで利用される
        guiHandler = ( searchText ) => {
            // ここに従来のGUIコードを転記
        },
        keywords = new HashSet<string>( new[] { "UnityEditormemo" } ) // 検索でヒットさせたいワード
    };
    return provider;
}

f:id:charcotte:20190328001659p:plain

 2018から見た目の変更はなさそうですが、コードは結構変更になってますね。SettingsProvider属性をつけた関数がSettingsProviderクラスを作成して返すような流れになっています。

 SettingsProviderの第一引数に設定ウインドウ内のメニューのパスを指定します。PreferenceウインドウであればPreferences/を先頭につけるのがマナーっぽいです。パスを掘り下げればツリービューの階層が作れるので何かに利用できそうです。ここで指定したパスはどこにも表示されず、Preference以下のメニューの並び順に使われているようです。メニューはアルファベット順に並ぶみたいなので、順番を早くしたい・遅くしたいとかがあれば適当な文字列を入れるのもアリなのかもしれません。
 第二引数はPreferencesウインドウに設定を追加するか、Projectウインドウに追加するかを指定します。Projectウインドウにメニューを追加することを考えたことがなかったので、使うかどうか微妙な感じです。

Preferences/HOGEHOGEのPreferencesのスペルを間違えると鬱陶しいことになるので、パスは必ずPreferences/の直下に入れた方がよさそうです。

f:id:charcotte:20190328001847p:plain

 Unity2018.3でもSettingsProviderは利用できるようでした。[PreferenceItem]が死ぬのは2019.1からなので今のうちにSettingsProviderに書き換えてしまうのもアリですね。

 リファレンスのEditor実装がIMGUIが利用されたものになってるので、こっちもそろそろちゃんと勉強しなきゃなと感じました。( ^)o(^ )