テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】Timelineでキャラクターの「表情」を変更する時の注意点

今回はTimelineで表情を変更する場合の注意についてです。

 

 

Timelineでキャラクターの動き等を変更していると「表情」も変更したくなります。例えばちょっとした会話シーンで表情を変更するのは、よくある事です。

 

Unityでキャラクターの表情を変更するアイディアは3つあります。

  • Textureを差し替える
  • BlendShapeを使う
  • Boneでなんとかする

今回はBlendShapeを使用するケースを想定していますが、Boneで使用した場合も少し関わりがあるかもしれません。

下のように予期しない不思議な表情になる場合は、多分この問題です

f:id:tsubaki_t1:20180702224226j:plain

またそれ以外でも少し自分が引っかかった問題について紹介します。

 

Case 1.表情のキーがセットされない

TimelineでAnimationClipをAnimationTrackに登録しても登録されない…という場合です。
これは正確にはAnimationClipが登録されているが、登録されているように見えないという問題で、キーがAnimationClipの0フレーム目にしか打たれていない場合に発生します。

f:id:tsubaki_t1:20180702225132g:plain

端的に言えば表情は変化しないのでAnimationClip0フレーム目にしか要らないので、データ節約のためにこのような形を取ることがあります。

解決法は2つで、1つ目が配置後に頑張って引っ張る、2つ目がAnimationClipに少し眺めのキーを打っておくというものです。
どちらでも良いですが、個人的にはキーを2番目の方が良い気がします。*1

 

Case 2.  表情が変化しない

さて表情のAnimationClipをセットした所ですが、次は「表情が変化しない」という現象が起こるかもしれません。

これはTimelineのAnimation実行順が問題となります。
どうもAnimationTrackは上から順に実行するらしく、上のAnimationClipの動作は下のAnimationClipの動作で上書きされるみたいです。

f:id:tsubaki_t1:20180702225737g:plain

このため最終的な表情は一番下のOverrideに設定しないと無効化されます。

Case 3.  表情がおかしな感じになる

最後に表情がおかしな感じになる場合です。
例えば表情が一切変化しなる場合や、歯茎をむき出しにするような異常な表情になる場合はこれが当てはまります。

これはTimelineにはWrite Defaultsの機能が無い事が原因です。

tsubakit1.hateblo.jp

WriteDefaultsがあればTimeline起動時の設定を初期設定としてキーを打ってないアニメーションを保管してくれるのですが、Timelineではソレが無い為、キーがなければ値を加算してしまいます。

f:id:tsubaki_t1:20180702230948g:plain

解決法は単純で、変化しないキーも含めてキーフレームを全て設定しておく事です。特定の表情のキーフレームを明確に設定しておくことで、変な表情になることを回避出来ます。
ただ同時にキーを打ったプロパティは他のAnimationClipから変更できなくなるので、複数の設定を持つ場合は注意が必要です。

f:id:tsubaki_t1:20180702231121j:plain

*1:特にUnity2017ではコレをマイナス方向に引っ張るとエディターが落ちるというバグが起こっていました。Unity 2018では今の所再現していません

【Unity】Nested PrefabやPrefabエディターが追加、新しいPrefabワークフローを触ってみた

f:id:tsubaki_t1:20180621224234j:plain

Uniteベルリンにて、Nested Prefabが可能になるプレビュービルドが公開されたので触ってみました。

追記:Unity 2018.3にて搭載されています

 

 

Prefabの階層化が出来るようになった

UnityではPrefabの中にPrefabを配置すると、親のPrefabに統合されるという問題がありました。

例えばPrefab AとPrefab Bという異なるキャラクターにPrefab Cという共通の武器を持たせた場合、反映するとPrefab Cという情報は失われ統合されます。結果、Prefab Cの内容を書き換えようと思ったらPrefab A・Bを探して書き換えるといった手間が発生することになります。

f:id:tsubaki_t1:20180621232109j:plain

 

新しいPrefabのワークフローではこのPrefabのネスト問題が解消し、良い感じに出来るようになりました。

Prefabの親とPrefabの子は明確に分けて設計出来るようになっていて、Prefabの親を変更した場合でもPrefabの子のユニークさは維持されるようになっているみたいです。

f:id:tsubaki_t1:20180621232135j:plain

f:id:tsubaki_t1:20180621230043j:plain

 

例えば2つのPrefabの中に共通のテキストプレハブを配置して、中身を書き換えてみます。Prefabが異なりますが、色を変えればちゃんと反映されています

f:id:tsubaki_t1:20180621231445j:plain

f:id:tsubaki_t1:20180621231217g:plain

 

またPrefabをGameObject側で変更した場合、何がどう変更したのかといった差分が見れるようになったみたいです。

f:id:tsubaki_t1:20180621231207j:plain

 

Prefabのバリアント

Prefabは基本的に他のPrefabとは異なるものとして扱われました。例えばImageのプレハブを複製した場合、元となるPrefabを更新しても他のPrefabには反映しません。

 

新しいPrefabワークフローではPrefabバリアントという機能が追加されました。これはPrefab毎にユニークな値を持ちつつも、変更していない内容は共有する…といった物みたいです。
例えば下のUIは上がオリジナル、下がバリアントなPrefabです。2つは独立した異なるPrefabなのですが、オリジナルを変更するとバリアントのPrefabも反映されています。

f:id:tsubaki_t1:20180621233532j:plain

f:id:tsubaki_t1:20180621233357g:plain

これは、例えばオリジナルなユニットを作った後バリアントでユニットを量産しておけば、オリジナルのユニットを変えれば全てのユニットに反映する…といった感じで使えそうです。

 

Prefabエディターの追加

通常Prefabを操作する場合は、編集用シーンに配置して操作等をしていた訳ですが、Prefab用エディターが新しく追加されました。

Open PrefabやPrefabボタンのダブルクリックでシーンとは独立したPrefabエディターが開き、編集出来るようになっているみたいです。

f:id:tsubaki_t1:20180621234140g:plain

 

プレビューのダウンロード

下のページよりダウンロード出来ます。

unity3d.com

【Unity】Unity 2018.2で「C# プロジェクト "Assembly-Csharp"は、このコンピューターにインストールされていない」が出たので、その対処

f:id:tsubaki_t1:20180617025211j:plain

Unity 2018.2にてVisual Studio経由でソースコードを編集する際、C#プロジェクト"Assembly-CSharp"はこのコンピューターにいんすとーるされていない。".NET Framework、Version=4.7.1"を対象にしています。」といった感じのダイアログが出ました。
↑のダイアログが出ると、ソースコードを追加する度にダイアログが出てきて、例え「今後この操作中にメッセージを表示しない」しても何度でも出てきます。

それの対処法についてです。

 

対処法

対処法は簡単で、.NET Framework Version=4.7.1のターゲットパックをVisual Studioに入れれば良いです。

 

ということで、パックを入れていきます。

f:id:tsubaki_t1:20180617025634j:plain

まず、ツール>ツールと機能を取得(T)を選択します。
すると暫くしてワークロード一覧が出るので「個別のコンポーネント」タブを選択します。
一覧から.NET Framework 4.7.1 Target Pack」を選択し、「変更」ボタンを押します

この後、実行中の処理が云々とか言われるかもしれませんが、無視して続けても問題なかったです。

f:id:tsubaki_t1:20180617025439j:plain

これでダイアログが出なくなりました。

 

Macの場合

Macの場合はこちら

tsubakit1.hateblo.jp

【Unity】C# Job SystemからECSのEntityやComponentDataを追加・削除・変更する指示を出す

今回はECSのComponentDataの追加や削除・変更といった動作をJobSystem上から指示する方法についてです。

 

 

C# Job SystemからComponentDataの追加・削除等を指示する

ECSは処理を並列処理しやすいように作られています。ただしEntityの追加や削除、ComponentDataの付け替えといった動作はメインスレッド上で行われなければいけません。
ただしEntityの追加や削除の判定は非同期でも問題ないので、そういった判定自体は非同期で行いEntityの削除等はメインスレッドで行う…をやってみます。

考え方的には、非同期でEntityに対するタスクを溜め込んでおき、後で一気に処理するといった感じです。

 

試しに作ったのは下のような感じで、マウスの近くにあるEntityを削除するだけの簡単なモノです。ただしチェックは総当たりしているのでEntityの数によっては非常に長い時間がかかりそうな物です。
(例えば40万個のEntityで試した所、毎秒80msのチェックコストが発生しました)

f:id:tsubaki_t1:20180614223808g:plain

BarrierSystem

この部分をバックグラウンドに持っていくため、EntityCommandBufferSystemを使用します。EntityCommandBufferSystemでEntityCommandBufferを作成し、EntityCommandBufferにコマンドを詰め込んでおけば後で実行してくれます。 

サンプルコード

 

gist.github.com

IjobParallelFotやIJobProcessComponentDataで使用するには?

使用できません。基本的にIJobのみ使用できるみたいです。

https://forum.unity.com/threads/how-to-get-an-entity-in-ijobprocesscomponentdata.532573/#post-3505943

使えるようになりました

tsubakit1.hateblo.jp