トマシープが学ぶ

Unity/VR/AR/デザイン好きのミーハー 記事内容は自分用のメモです

Modern UI Packよかった【Unity】

Modern UI Pack

かっこいいUIパーツが入ったパック

定価20ドルだけど、なぜか90%オフで2ドルで買えた。

購入後に見ても20ドルなので、なんで90%オフになってたかよくわからない・・・

と思ったら、昔無料版を持ってた人は2ドルで買えるらしい。

trsasasusu.com

仕事で使ったけど、とてもよかったよ.

一覧

アセットページ見ろよって感じだけど、一応スクショ全部とった。

デモシーンに入ってる。

f:id:bibinbaleo:20210321212219p:plain

ウィンドウ

f:id:bibinbaleo:20210321212014p:plain

トグル。丸いトグルって独特。これの真ん中をチェックマークを●にしてラジオボタンみたいにも使った。

f:id:bibinbaleo:20210321212018p:plain

ToggleSwitch

f:id:bibinbaleo:20210321212021p:plain

スライダー

f:id:bibinbaleo:20210321212025p:plain

ローディング!

f:id:bibinbaleo:20210321212028p:plain

通知。いろんな出方がある

f:id:bibinbaleo:20210321212032p:plain

動かせるウィンドウ

f:id:bibinbaleo:20210321212035p:plain

タブ

f:id:bibinbaleo:20210321212038p:plain

ポップアップみたいな感じ

f:id:bibinbaleo:20210321212041p:plain

f:id:bibinbaleo:20210321212043p:plain

アイコン!ありがたいけど欲しいのにないのもあった。退出とか

f:id:bibinbaleo:20210321212046p:plain

InputField。これも使った。PlaceFieldが上にギュンって移動する

f:id:bibinbaleo:20210321212050p:plainページ移動みたいなやつ

f:id:bibinbaleo:20210321212053p:plain

ドロップダウン。これはスクリプトから使いにくくて使わなかった

f:id:bibinbaleo:20210321212056p:plain

アニメーションアイコン。

f:id:bibinbaleo:20210321212059p:plain

ボタン。クリックした時その部分が丸く光るのでおしゃれ

f:id:bibinbaleo:20210321212102p:plain

使い方

入れる

f:id:bibinbaleo:20210321211527p:plain

TextMeshProも入れる

f:id:bibinbaleo:20210321211524p:plain

ヒエラルキーで右クリックから追加できる。でもどれがどんな動きかよくわからなくて、よくでもシーン見に行った

f:id:bibinbaleo:20210321211521p:plain

注意点

TextMeshPro

テキスト部分は全部TextMeshProなのでそのままだと日本語使えない

f:id:bibinbaleo:20210321211518p:plain

日本語フォントを変換しないといけない

f:id:bibinbaleo:20210321212819p:plain

 初めて日本語フォントをTextMeshProで使ったけど大変だった。

bibinbaleo.hatenablog.com

黒背景用

基本的に黒い背景用に作ってあるので、明るい背景の時はUIの色を変えないといけない・・・

一気に色などを変える

ModeruUIPackの設定ウィンドウから、パーツの色合いを一気に変えられる。

Tools>ShowUIManagerから開く

f:id:bibinbaleo:20210321213219p:plain

ここで色を変えたら、その種類のUIに全部反映される

f:id:bibinbaleo:20210321213223p:plain

f:id:bibinbaleo:20210321213656p:plain

ほら

f:id:bibinbaleo:20210321213659p:plain

 

反映は各パーツについているこのMUIP Managerで行われる

f:id:bibinbaleo:20210321212825p:plain

個別に変える

反映してほしくない時、個別に色を設定したい時はこのコンポーネントを消去したらいい。

逆にこれがついていると、子の色などを個別に変えても反映されない

f:id:bibinbaleo:20210321213830p:plain

スクリプトから反映

スクリプトからの反映がしやすいかは、どうなんだろう・・・

ProgressBar

たとえばプログレスバーに、今のパーセンテージを入れる時

f:id:bibinbaleo:20210321214033p:plain

デフォルトだとSpeedが5になってて勝手にパーセンテージが進むので0にする。

f:id:bibinbaleo:20210321214038p:plain

あとはこのProgressBarを参照して、CurrentPercentに数字を入れたら動いた気がする。

ドロップダウンは独自の形式;;

f:id:bibinbaleo:20210321215520p:plain

動的にアイテムを追加するのよくわからなくてやめた気がする。

まあできるんだろうけど

f:id:bibinbaleo:20210321215517p:plain

普通のuGUIのを使ってくれたら、検索も楽なのに〜

f:id:bibinbaleo:20210321215714p:plain

Toggleは普通のuGUIのToggleだった

f:id:bibinbaleo:20210321214320p:plain

 

全部は触ってないのでどんな感じかわからない〜

AnimationIconも使おうとしたけど、勝手にアニメーションされて結局使わなかったりした

 

The type or namespace name 'iOS' does not exist in the namespace 'UnityEditor'【エラー】

問題

The type or namespace name 'Callbacks' does not exist in the namespace 'UnityEditor'

などのエラーが出てiOSビルドできない。

Callbacksのところは'iOS'とか'PostProcessBuild'など8つぐらいある

この人と同じような感じ

forum.unity.com

Editorフォルダには入っている。

解決

EditorフォルダをAssets直下に置いたらビルドできた

根本原因はasmdfをちゃんと設定していないせいだった

bibinbaleo.hatenablog.com

 

 

bibinbaleo.hatenablog.com

 

【Unity⇨Xcode】frameworkのエラーとPostProcessBuild【XXX framework: No such file or directory】

assetstore.unity.com

エラー

AgoraのSDKが含まれるものをUnityiOSビルドして、Xcodeでビルドしたらエラーが4つ出る。

error: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.4.sdk/AgoraEngine/Plugins/iOS/AgoraSoundTouch.framework: No such file or directory

たまにうまくいってもアプリ起動した瞬間落ちる

Library not loaded: @rpath/AgoraSoundTouch.framework/AgoraSoundTouch

 

ググる

qiita.com

Editorフォルダには入れている

forum.unity.com

docs.agora.io

解決

frameworkを読み込めていなかった。

XcodeのTarget -> BuildPhases -> Embed Frameworksに各frameworkがあるけど、それのパスがおかしい

(画像はイメージです)

f:id:bibinbaleo:20210309213027p:plain

改めて+マークからframeworkを追加したあと、以前のを消すといい。

根本原因

根本原因としてはUnityでframeworkを配置し直すスクリプト(BL_BuildPostProcess.cs)でAssets直下設定のパスになっているのに、それ以外の場所に置いていたから。

const string defaultLocationInProj = "AgoraEngine/Plugins/iOS";

このパスを書き換えるか、Assets直下に置くか・・・

PostProcessBuild

BL_BuildPostProcess.csはPostProcessBuild

PostProcessBuildというのはUnityビルド後にする処理をかけるやつみたい。

mushikago.com

XcodeのBuildSettingなど書ける

www.slideshare.net

へ〜

ジャンプするアニメーションを作りたかった【Unity】

HumanoidモデルをジャンプさせるAnimationを作りたい

AnimationClipのAnimatorの項目

身体を持ち上げるだけなので、AnimationClipで自力でできるかなと思ったけど、逆にどのパラメーターをいじればいいのか分からない。

f:id:bibinbaleo:20210308142300p:plain

Transformだとボーンじゃなくてオブジェクト自体の位置が変わるからダメ。

Animatorをいじれば、他のHumanoidアバターにも適用できるのかなと思ったけど、項目の意味が分からない。

TODFってなんだ~

forum.unity.com

3dofとか6dofのdofみたい。よくわからないけど

docs.unity3d.com

JumpHeightという項目もあったけど、動かしても変わらない。

Unitychanモーション

UnitychanモーションのJumpしているときの動きを見たけど、SprineのTransformが変わってた。

Animation見たけど項目多すぎてわからない

f:id:bibinbaleo:20210308150831p:plain

VeryAnimation

VeryAnimationで作るのが良さそう。

ただ、ジャンプって回転じゃなくて移動だけど、移動もできるのかな?

bibinbaleo.hatenablog.com

移動できなかった・・・

f:id:bibinbaleo:20210308161350p:plain

 

Unityの自動スクロール

ScrollViewの下にコンテンツがたまっていったときに、一番下にスクロールして最新のコンテンツが見えるようにしてほしい。LINEみたいな感じ

Scrollbar

観察してたらScrollbarのValueの0~1でスクロール位置が決まっている。

f:id:bibinbaleo:20210308173347p:plain

docs.unity3d.com

DirectionをButtonToTopにしているときは、Value=0で一番下に行く!

ならコンテンツが追加されたときにValueを0にしたらいい

_Scrollbar.value = 0.0f;

docs.unity3d.com

これでやったけど、完全には下に行かない・・・少し下に下がるけど数値が0にならない;;

 

この人もチャット追加時に、スクロールバーの位置を変えている

scrollPos.y = Mathf.Infinity;

uniblo.biz

scrollRect.verticalNormalizedPosition

ググったら他の方法もあった

application.hateblo.jp

scrollRect.verticalNormalizedPosition = 0.0f;

docs.unity3d.com

これは内部的な値なんだろうか。

これでも試したけど、Scrollbarと同じような挙動で、少し下に行くけど完全にはいかない。

コルーチン使う

ここで議論されていた

forum.unity.com

スクロールrectを更新するのに1フレームかかるため、コードはおそらくUpdateでのみ機能します。そのコードをコルーチンに配置し、フレームの終わりを待つと、機能するはずです。

だって。

1フレーム??チャットが追加されるときに1回呼び出すだけじゃダメなのか?

スレッドにあったコード。コルーチンで1フレーム待って、Canvasのフォーカスしたあと、スクロールバー動かして、再度Canvasフォーカスしている

  1. // Called at the end of instantiation function.
  2.     IEnumerator ForceScrollDown () {
  3.         // Wait for end of frame AND force update all canvases before setting to bottom.
  4.         yield return new WaitForEndOfFrame ();
  5.         Canvas.ForceUpdateCanvases ();
  6.         comScroll.verticalNormalizedPosition = 0f;
  7.         Canvas.ForceUpdateCanvases ();
  8.     }

docs.unity3d.com

他のコメントには2フレーム待っているものもあった

  1.            // auto-scroll
  2.            if (gameObject.activeSelf)
  3.            {
  4.                StartCoroutine(AutoScroll());
  5.            }
  6.        }
  7.  
  8.        private IEnumerator AutoScroll()
  9.        {
  10.            LayoutRebuilder.ForceRebuildLayoutImmediate(container);
  11.            yield return new WaitForEndOfFrame();
  12.            yield return new WaitForEndOfFrame();
  13.            scrollRect.verticalNormalizedPosition = addNewToTop ? 1 : 0;
  14.        }

私の場合は1回呼び出すだけで動いた

            // スクロールバーを一番下にする。
            StartCoroutine(ForceScrollDown());
        }

        IEnumerator ForceScrollDown()
        {
            // 1フレーム待たないと完全に実行されない
            yield return new WaitForEndOfFrame();
            _ScrollRect.verticalNormalizedPosition = 0.0f;
        }

これは良いやり方なのだろうか?

AnimatorをセットしているHumanoidのボーンをスクリプトでいじりたい【AvatarMask/LateUpdate】

Animatorがついているボーンのtransformをスクリプトからいじれない

基本はAnimator経由でアニメーションさせるけど、頭の向きだけスクリプトからボーンのTransformをいじって動かしたい

f:id:bibinbaleo:20210304211708p:plain

Animatorをつけていない状態だと動かせる。

f:id:bibinbaleo:20210304211538p:plain

f:id:bibinbaleo:20210304211534p:plain

Animatorをつけていると、動かせない

インスペクタで直接いじってもダメ

AvatarMask→失敗

AvatarMaskをつけて首はAnimationさせなければ良いかと思いきや、うまくいかない

f:id:bibinbaleo:20210304212829p:plain

そもそもNeckのBoneはAvatarMaskの頭と胴体どっちに含まれるのか。どっちもダメだったけど

f:id:bibinbaleo:20210304211820p:plain

それとも下のTransformで設定すべきなのか。でもTransformにVrmArmを設定しても何も出てこない

f:id:bibinbaleo:20210304211843p:plain

同じ人いた

 うーん?

docs.unity3d.com

LateUpdate

ググったらLateUpdateでスクリプトからいじっている記事が多かった

tsubakit1.hateblo.jp

www.ame-name.com

gomafrontier.com

確かにLateUpdate内でやったら動いた。

void LateUpdate()
{
if( Input.GetKeyDown( KeyCode.Space ) ){
Neck.localRotation= Quaternion.Euler(0.0f, 0.0f, 10f);
}
}

アニメーションが行われた後にやるからか

gametukurikata.com

最後に

LateUpdate使わない方法ないのかな?

UniRxでLateUpdateってどうやるんだろう

 

非人型にBoneをいれてUnityでHumanoidで動かしたかった【Unity】

人型ではないモデルにBoneを入れてUnityでHumanoidにしたい

shop-0761.hatenablog.com

Mixamoはダメだった

BlenderでBone入れ

BlenderでBoneを追加している

nn-hokuson.hatenablog.com

ボーン

アドオンのRigifyを入れて

f:id:bibinbaleo:20210302113625p:plain

Shift+AでアーマチュアからBone追加。Human(Meta-Rig)だと複雑すぎるので基本>BasicHumanにした

f:id:bibinbaleo:20210302113525p:plain

こんなBone

f:id:bibinbaleo:20210302113530p:plain

Sprineが多すぎるので1つ消した。本当はもっとシンプルでいいんだけど、どれくらいまで消していいかよく分からなかった

メッシュと関連付け

あとはメッシュ>Bone選んでペアレント>自動ウェイトでできる・・・

blog.yumineko.com

けどボーンを動かすとメッシュが変形してしまう。まあウエイトとはそういうものだけど・・・変形させずに角度だけ動かしたい

f:id:bibinbaleo:20210304222128p:plain

あとメッシュが体と頭が親子関係になっているものにBoneを入れたいんだけど、親子関係を保ったままいい感じに動かすにはどうしたらいいのか。親が動いたら子も追従して欲しい

f:id:bibinbaleo:20210304222131p:plain



以前受けたBlenderのUdemyで服を体に追従させるときの方法があったから、それをやったけどうまくいかない

ウェイトを使わずにカクカク動かしたい。

チャイルドコンストレイント(だめ)

bookyakuno.com

チャイルドコンストレイントやったら、Blenderではいい感じに動いた。

Sprine5を頭に紐づけて、Sprineを体に紐づけた

でもUnityに読み込まれないのでダメ

(追記)ボーンごとにウエイト計算

今は全てのボーンにメッシュが影響を受けているからややこしい

首のボーンからのみ頭を動かすようにしたい

こちらの方法でやったら、ボーンごとにメッシュの設定できた。

reflectorange.blog.jp

ボーン>メッシュで選んでウエイトモードに行って、Ctrlを押しながらボーンを選べばいい

あとウエイト>全てを正規化にしたらなんかいい感じになった

f:id:bibinbaleo:20210304223232p:plain

honopun.hatenablog.com

いい感じに追従するようになった

f:id:bibinbaleo:20210304223237p:plain

あと編集モードで頂点を選んで、ボーンのウエイトを個別に変えられる。いらないのは×で消す。

他の頂点まとめてこの値を変えるときは、頂点を選んだ後、一つの頂点だけ2回押す。するとその頂点がアクティブになって、その値が他のに反映される

f:id:bibinbaleo:20210304224918p:plain

できた!立方体は動かなくなった!

f:id:bibinbaleo:20210304224903p:plain

でもこれだとSpine(ボーンの一番親)を動かしてもついてこなくなるので、Spineだけウエイト1にした。

と思ったら何故かarmも1になってた・・・修正した

f:id:bibinbaleo:20210304230222p:plain


Unityへの書き出し

普通にfbxに書き出したけど、Boneの位置や角度がおかしかった

こちらの設定やった

3dcg-school.pro

変わったのかは分からない・・・

Unityで設定(Configure)

Humanoidにする

f:id:bibinbaleo:20210302114444p:plain

Configureを見る

f:id:bibinbaleo:20210302114331p:plain

Configureはうまくいってても、SceneビューでBoneの位置がBlenderで設定したものと違う。

PoseでResetすると正しくなるけど、

f:id:bibinbaleo:20210302114535p:plain

腕のないモデルなので腕周りが赤くなる

f:id:bibinbaleo:20210302114736p:plain

このままでも進める。

問題1:メッシュとBoneが紐づいていない

チャイルドコンストレイントで紐づけたメッシュとBoneがUnityだと紐づかない

そういうものなのだろうか

そういうものらしい

 一応ImportConstrainという設定はあった。でもだめだったっぽい

f:id:bibinbaleo:20210302121204p:plain

しょうがないので、Unity上で直接Sprine4の下にHeadメッシュを置いた

もしくはAnimationRiggingのコンストレインを使って手動で設定してもよさそう

docs.unity3d.com

(追記)解決

追記したボーンごとの計算でちゃんとウエイトつけて解決した

f:id:bibinbaleo:20210304230210p:plain

問題2:Animation入れると沈む

Animatorを設置していない状態だと、Sprine4などBoneは正しく頭の位置にある。

Boneの親のmetarigのTransform

f:id:bibinbaleo:20210302121639p:plain
なのにUnity-chanAnimationのWaitを再生したら、全体的に沈む

f:id:bibinbaleo:20210302121636p:plain

 

 

最後に

今回はAnimationさせたかったというよりは、Animator.GetBoneTransform.Headしたかっただけなので、あまり問題なさそう

bibinbaleo.hatenablog.com

でもせっかくだからちゃんとAnimationさせたいな

teratail.com

あとBlenderでBone入れるとき手動で入れたほうがいいのかな〜

VRMモデルの頭の高さを取得したい⇨Animator.GetBoneTransform.Head

VRMモデルの頭の高さを取得したい

qiita.com

 

Animatorからボーンの位置取れるんだ!これで頭の位置とれるじゃん!

        anime = VRMModel.GetComponent<Animator>();
transHead = anime.GetBoneTransform(HumanBodyBones);
transFoot = anime.GetBoneTransform(HumanBodyBones.RightFoot);
    // transFoot.position.yが高さになる!

docs.unity3d.com

できた!すご~知らなかった

カメラをWASD+操作で移動するとき空を飛ばないようにしたかった【Unity】

これを参考にカメラの移動制御をしたのだけど、上や下を向きながら進むとその方向に移動してしまう。地下に行ったり空に行ったり

qiita.com

移動はY軸方向には行わず、地上だけを移動してほしい。

pos.y = _CameraHeight;

として高さを固定したら、高さが一定になるけど、上や下を向きながら進むときの移動速度が落ちる。

f:id:bibinbaleo:20210222112411p:plain

多分本来水平の矢印方向に進む分が、赤い線の分しか進んでいない。

回転と移動の軸を分けたらいいのだが。

_camTransform.rightに移動量を掛けているのがよくなさそう

gametukurikata.com

squmarigames.com

 

結局移動はCinemachineを使うことにした

bibinbaleo.hatenablog.com

 

最後に

Unity始めたての時のunity1weekで作った脱出ゲームも移動しようとしたら空を飛ぶので、もういっそじぶんは蝶々ということにしようって空を飛ぶ形式にした;;

bibinbaleo.hatenablog.com

UnityServerBuild

Server Build

docs.unity3d.com

コマンドラインのオプションを全く使わずに、ビジュアル要素 (ヘッドレス) なしのサーバー用のプレイヤーをビルドします。これを有効にすると、UNITY_SERVER 定義を持つマネージスクリプトがビルドされます。これにより、アプリケーションにサーバー固有のコードを書くことができます。

だって

PCのBuildSettingのところにServerBuildのチェック入れたら良さそう

f:id:bibinbaleo:20210225094325p:plain

こんな項目あるの知らなかった🙄🙄

これでビルドしたら、黒い画面が出てきた

 

サーバーアプリをビルドするには、同じくScripting Define Symbolsで”SERVER”を定義した状態で、ビルドセッティングでServer Buildにもチェックを入れます。あとTarget Platformも普通はLinuxを選びます。(まあGameLiftではWindowsのEC2インスタンスも使えるのでその時はWindowsです) それでビルドすればOKです。

UnityでGameLiftを完全攻略 その2 公式サンプル編 – soy-software

 Linux・・・

最後に

サーバー建てたらできるよと言われてよくわからなかったので、下の方法で建てたけど見当違い過ぎて恥ずかしい><

qiita.com

 

ChinemaChineでTPSとFPSの切り替え【Unity】

Cinemachine

Cinemachineというカメラワークをいい感じにできるUnity公式アセット

docs.unity3d.com

存在は知ってたけど、映像作品作る用だと思って触ってなかった。

でもキャラクターのFPSやTPSに使えるらしいので触ってみる!

light11.hatenadiary.com

セットアップ

こちらの記事を参考にセットアップしました

light11.hatenadiary.com

PackageManagerで入れる

f:id:bibinbaleo:20210219170844p:plain

カメラにBrainをつける

f:id:bibinbaleo:20210219170447p:plain

Chinemachine>CreateVirtualCameraで仮想カメラを作る。

f:id:bibinbaleo:20210219170827p:plain

このコンポーネントがついた空のオブジェクトができる

f:id:bibinbaleo:20210219170444p:plain

仮想カメラで設定した値(位置)がMainCameraに送られるので、MainCameraは動かしても意味がない

FPS・TPS設定

こちらを参考に設定する

bboydaisuke.wp.xdomain.jp

www.youtube.com

仮想カメラのFollowをキャラクターにする。LookAtの対象はなし

f:id:bibinbaleo:20210222100618p:plain

 

BodyはTransposer。FollowOffsetはキャラのいい感じの場所に設定。

Dampongを全部0にするとカメラが遅れてついてくることがなくなる。

f:id:bibinbaleo:20210222100621p:plain

Aimは動画だとPovにしていたけど、あれはマウスの位置に追従してカメラが回転する。

既にドラッグで角度を回転させるようにしていたのでSame As Follow Targetにしたらキャラクターの角度に合わせてついてくるようになった

 

TPSにするにはFollowOffsetのZを後ろにしたらいい

f:id:bibinbaleo:20210222102511p:plain

f:id:bibinbaleo:20210222102550p:plain

スクリプトで切り替え

スクリプトからのTPS,FPSの切り替えはこんな感じでFollowOffset.z の値を変えればいい

    [SerializeField] CinemachineVirtualCamera _VCam;
    private CinemachineTransposer _transposer;
    void Start()
    {
        _transposer = _VCam.GetCinemachineComponent<CinemachineTransposer>();
    }
    public void ChangeFPS()
    {
        _transposer.m_FollowOffset.z = 0.1f;
    }
    public void ChangeTPS()
    {
        _transposer.m_FollowOffset.z = -1f;
    }

f:id:bibinbaleo:20210222164105p:plain

FollowTargetをスクリプトから設定する

読み込んだVRMをFollowしたい。スクリプトから設定できるのかな?

forum.unity.com

できた

using Cinemachine;

~~

[SerializeField] CinemachineVirtualCamera _VCam;

_VCam.Follow = playerObject.transform;

 

回転だけスクリプトから制御したい

AimをSame As Follow Targetにしたらキャラクターの回転に合わせてカメラも回転するけど、上下方向に向かない;;

キャラは上下には回転しないからね

 

上下方向のカメラ移動だけスクリプトからやりたい

AimをNothingにしてVirtualCameraの回転をスクリプトで制御したらできる!

tsubakit1.hateblo.jp

qiita.com

 

XD⇨Unity試す

XDファイルをUnity上に変換してくれるアセット試す

こちらを使ってみる

 以前別のを試したことはある

bibinbaleo.hatenablog.com

使い方

github.com

www.youtube.com

XD設定

XDにはプラグインとか必要ない。

書き出しマークつける

エクスポートするアートボードに書き出しマークをつける。こんな機能あったんだ

f:id:bibinbaleo:20210220132400p:plain

これつけないと何も読み込まれない。

 

w3q.jp

ちなみにアートボード名にスラッシュが入っているとUnityに入れた時にスラッシュでフォルダが分かれてた

f:id:bibinbaleo:20210220132930p:plain

オブジェクトに名前をつける

後ろにButtonとつけたらUnityに読み込んだときにButtonコンポーネントがつくらしい

一覧

https://github.com/kyubuns/AkyuiUnity/blob/main/Manual/Manual_ja.md#xd%E5%A4%89%E6%8F%9B%E8%A6%8F%E5%89%87

f:id:bibinbaleo:20210220130739p:plain

 

 

上のやつはうまくいかなかったので、下みたいにシンプルにしたらうまく行った

f:id:bibinbaleo:20210220134253p:plain

Unity

環境:Unity2020.2,Mac

 

 

PackageManagerでインポート

https://github.com/kyubuns/AkyuiUnity.git?path=Assets/AkyuiUnity

https://github.com/kyubuns/AkyuiUnity.git?path=Assets/AkyuiUnity.Xd

f:id:bibinbaleo:20210220130257p:plain

Createから設定ファイルを作る

f:id:bibinbaleo:20210220130745p:plain

f:id:bibinbaleo:20210220130907p:plain

ここにXDファイルをDragするとプレハブなどができる

f:id:bibinbaleo:20210220134357p:plain

Canvasを作ってその下にプレハブを置いたら見えた

f:id:bibinbaleo:20210220134400p:plain

Buttonにはちゃんとボタンついてた

f:id:bibinbaleo:20210220134404p:plain

適当に昔作ったやつを入れたらエラー出てプレハブできなかった

f:id:bibinbaleo:20210220133117p:plain

 

モーフアニメーションを再生する方式のリップシンク【Unity/VRM】

アニメーション再生方式のリップシンク

NEOKETでのリップシンクは音声を検出したら口のモーフと体のアニメーションが再生されるという方式でした(VRではどうだったんだろう?)

あとアバターの上にしゃべっているマークも出てて分かりやすくて良かったですね。

f:id:bibinbaleo:20210210134421p:plain

こういう方式は初めて見ました。正確なリップシンクにしないという方法もあるのか~

 

でもそれって、モーフ名が同じじゃないと用意したアニメーションはできないのかな?

VRM共通のやつでできるのかな?

なんかVroidStudioと同じシェイプキーじゃないと動かない情報も

やってみる!

こちらの記事を参考に、VRMで共通で設定されているBlendShapeのパラメーターの数字を変えて簡易的なアニメーションを作れました。

qiita.com

スクリプトからBlendeShape変更

また変わってた。SetValueの中にCreateFromPresetというのが推奨だって。

proxy.SetValues(new Dictionary<BlendShapeKey, float>
{
    {BlendShapeKey.CreateFromPreset(BlendShapePreset.A), 1f}, // [0, 1] の範囲で Weight を指定
    {BlendShapeKey.CreateFromPreset(BlendShapePreset.Joy), 1f}, // システム定義の表情は enum で指定
    {BlendShapeKey.CreateUnknown("USER_DEFINED_FACIAL"), 1f}, // ユーザ定義の表情は string で指定
});

vrm.dev

昔はImmediatelySetValueが推奨。さらに昔はSetValueだった。

blendShapeProxy.(BlendShapePreset.A, 0~1の数値);

bibinbaleo.hatenablog.com

Updateでやるなとか突っ込みどころはあるけど一旦動く。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using VRM;

public class PresetLipSync : MonoBehaviour
{
    private VRMBlendShapeProxy _proxy;

    [Range(0, 1)] public float _A_Value;
    void Update()
    {
        DoLipSync();
    }
    private void DoLipSync()
    {
        if (_proxy == null)
        {
            _proxy = GetComponent<VRMBlendShapeProxy>();
        }
        else
        {
            _proxy.SetValues(new Dictionary<BlendShapeKey, float>
                {
                    {BlendShapeKey.CreateFromPreset(BlendShapePreset.A), _A_Value}, // [0, 1] の範囲で Weight を指定
                });
        }
    }
}

_A_Valueの値を0~1の範囲でアニメーションなどで変えたら口パクする

 

これをVRMに貼る

f:id:bibinbaleo:20210212100316p:plain

アニメーション作る

Animationウィンドウを開く

VRMを選択した状態でCreate。名前を付けて保存

f:id:bibinbaleo:20210212100609p:plain

AddPropertyからさっき作ったスクリプトのValueを+

f:id:bibinbaleo:20210212100544p:plain

0,1,0,1って値変えていく。キーを選択して値を変えるだけじゃなく、線もその時間のところに移動させないと値が変わらない気がする

f:id:bibinbaleo:20210212101120p:plain

遷移Animator作る

VRM選んだ状態でAnimationClip作ったら勝手にモデル名と同じAnimatorが作成されてた。でも使いにくいから新しく作った

f:id:bibinbaleo:20210212101721p:plain

これをVRMに付けて再生すると、例の沈んだ体になった状態でパクパクする

f:id:bibinbaleo:20210212101724p:plain

これになるのってアニメーションがHumanoidじゃないからだと思うけど、パラメーターだけのアニメーションをHumanoidにするのってどうするんだ??

レイヤー設定

AvatarMaskというのを使えばできた!と思ったら別にAvatarMaskはいらなかった。

レイヤーを分ければいいだけだった。

でもメモしておく

gametukurikata.com

Create>AvatarMask作成。顔だけ緑にする

f:id:bibinbaleo:20210212103230p:plain

Animatorで新しいレイヤー作ってさっきのマスクを設定Weightを1にする

f:id:bibinbaleo:20210212103155p:plain

新しいレイヤーのほうにリップシンクのアニメーション。

f:id:bibinbaleo:20210212112032p:plain

BaseのほうはWalkとかIdelとかデフォルト用のアニメーションを設定しておく。

f:id:bibinbaleo:20210212103604p:plain

これで歩きながら口パクできた!!

f:id:bibinbaleo:20210212103539p:plain

トリガー設定

今のままだとずっとパクパクするので、トリガーをOnにした時だけ口パクするようにする

まずParameterを作って置く

f:id:bibinbaleo:20210212105416p:plain

LipSyncレイヤーのほうに空のStateを作り、そこからリップシンクへ遷移させる

f:id:bibinbaleo:20210212105335p:plain

遷移の入るほうはHasExitTimeのチェックを外し、即遷移するようにする。あとConditionsでトリガー設定

f:id:bibinbaleo:20210212105527p:plain

出ていくほうはHasExitTimeにチェックを入れる。口パクアニメーションが終わったら自動で出ていく。

f:id:bibinbaleo:20210212105555p:plain

detail.chiebukuro.yahoo.co.jp

 

これでTriggerをスクリプトやボタンなどからオンにしたら、口パクアニメーションが再生される~~~やったー!!

f:id:bibinbaleo:20210212105208p:plain

f:id:bibinbaleo:20210212110442g:plain

Trigger

Triggerのオンはスクリプトだと

AnimatoeController.SetTrigger("トリガー名");

Animator-SetTrigger - Unity スクリプトリファレンス

ーーー

とりあえずボタンから簡易的にやる方法だとこの設定でノンスクリプトでできる

f:id:bibinbaleo:20210212105858p:plain

口パク回数

作ったアニメーション自体は2回口パクするやつだけど、Animatorの出ていくときのTransition設定で、ExitTimeを増やして再生回数を増やせば増える。

f:id:bibinbaleo:20210212110240p:plain

最後に

アニメーション分からない・・・でも新しいこと知れた。アバターマスクは今回は必要なかった。

ToggleGroup機能をスクリプトからオフにする方法がない【Unity】

ToggleGroup

UnityのToggleGroupは各Toggleをまとめてラジオボタンみたいに一つしか選択できないようにする機能

docs.unity3d.com

f:id:bibinbaleo:20210202151559p:plain

つまりこの機能がオフならチェックボックスみたいに複数選択可能で、オンならラジオボタンってこと!だと思った。

動的に切り替えたい

同じToggleGroupをラジオボタンみたいに扱うとき(ToggleGroupの機能有効)とチェックボックスみたいに扱うとき(ToggleGroupの機能無効)をスクリプトから切り替えたい。

試した事

なのでスクリプトからToggleGroup.enabled=falseにしたら、インスペクタ上はちゃんとオフになっているのに、変わらずラジオボタンみたいに動く><

f:id:bibinbaleo:20210202151605p:plain

なんでや~~

 

スクリプトから操作しているからタイミング的な問題なのかと思って、新しいシーンでインスペクタ上でやってみたけど、同じように無効にならない

 

ToggleGroupがついているスクリプトごとオフにしたけどダメ。何ならAllowSwitchOffの挙動まで反映されるやん!なんで!!逆に何がオフになるんだよ

f:id:bibinbaleo:20210202152023p:plain

ToggleGroupのenabledによると

「有効であれば更新され、無効であれば更新されません。」

だって。更新って何だろう?

 

各ToggleにToggleGroupがセットされている時点で、ToggleGroupのオンオフは関係ないのだろうか?

f:id:bibinbaleo:20210202151802p:plain

ToggleGroupの中身

中の実装普通に見れた。

Updateとかで中の状態を更新しているわけではなく、最初しか呼ばれなさそう

f:id:bibinbaleo:20210202164557p:plain

f:id:bibinbaleo:20210202164929p:plain

ちなみにtoggleの使い方も説明してあった

f:id:bibinbaleo:20210202164407p:plain

解決方法1

チェックボックスにするとき、各ToggleのgroupをNullにする

_Toggle.group = null;

ラジオボタンにするときは、ToggleGroupをセットする

_Toggle.group = _ToggleGroup;

一応これで想定通りの動きはした

Toggleはfoerachなどでまわす

話し合い

ToggleGroupの話し合いはここで行われていた。

forum.unity.com

AllowSwitchOffの項目も、このスレッドの結果実装されたみたい。

 

そして後半のほうで

「'allowMultipleSelection'を使用できる可能性はありますか?これにより、トグルグループをオフにできるかどうかだけでなく、ユーザーが複数の選択肢を選択できるかどうか、およびグループ内で少なくとも1つのトグルが許可されるかどうかを制御できます。」

と聞いている人がいる!私も欲しい!!!!

でも結局実装されなかったのかな?

最後に

他の方法としてはToggleGroupからToggleをUnregisterして、またRegisterし直すとかかな??

でもScriptからRegisterもうまくいかなかった気がする。

他にいい方法があったら教えてください。

Unityでprivateリポジトリのパッケージ参照しようとしたらGitの認証せよと出た【Mac】

UnityPackagesでprivateリポジトリを参照しているプロジェクトをMacで開こうとしたら

You may need to set up a Git credentials helper
to access a private repository.

とエラーが出る。プロジェクトは開けるけど、当然packageは入っていない。

エラー文ググっても、同じものが出てこない!!こんなことって・・・

認証 

どうしたらいいんだ?

認証情報を保存する必要がある?

httpsだと認証情報が必要みたい

git-scm.com

コマンドプロンプトに打ってみたけど反応がない

$ git config --global credential.helper cache

コマンドがないといわれるわけでもなく、何も起きない

これを入力した後に、リモートリポジトリにアクセスするとパスワードを求められて、入力したら保存してくれるみたい。

でも私コマンド普段使ってないよ!!

www.tecmint.com

osxkeychain

macなのでosxkeychainというモードを使えるらしい。

git credential-osxkeychainで入っているか確かめられる。

docs.github.com

Usage: git credential-osxkeychain <get|store|erase>

って出たので入っているということかな?

リポジトリ入れ直し

 ローカルリポジトリ消去して、再度入れなおしたら直った

よく見たら最初のUnityエラー文にも、入れなおしたらいいかもって書いてた気がする