- 投稿日:2020-02-13T23:36:16+09:00
Unity勉強日誌~ブレンドシェイプ操作方法その①
はじめに。
ゲーム作ってみたいな~と思い、つい先日からUnityをさわり始めましたHITOMI2236です。今回ブレンドシェイプについて調べたのでここに記録しようと思います。個人用のメモですが、もし同じところで迷っている人がいたら、時間短縮のために読んでくれたら幸いです。
1 . ブレンドシェイプのモデルについて
ブレンドシェイプ検証用にMayaで簡単なモデルを作りました。HumanIKの各関節部分にCubeを配置しただけのモデルです。頭部の部分に簡単なブレンドシェイプをつけており、わかりやすくするために名前を「face_object」に変更しています。
blendShape_01_01.png
これをFBXで書き出します。書き出す時にはもちろんですがアニメーション項目ないのブレンドシェイプのチェックボックスをオンにしましょう。私は結構忘れます。
書き出したFBXをUnityにドラッグアンドドロップしてPrefab化し、Hierarchyに追加します。
ブレンドシェイプがついてるオブジェクトを確認してみるとInspecterに「Skinned Mesh Render」という項目が表示されているのがわかります。その中にBlendShapesという項目があり、どうやらこの数値を増やすと形が変形するようです。
2 . ブレンドシェイプを制御するプログラム。
モデルの名前は「blendShapeCharacter」,
ブレンドシェイプ情報を持っているオブジェクト名は「face_object」です。
「face_object」が持っているブレンドシェイプの名前は「blendShape1.blendAction」です。skinShape.rbusing System.Collections; using System.Collections.Generic; using UnityEngine; public class blenderShapeControll : MonoBehaviour { public GameObject head; public SkinnedMeshRenderer skinnedMeshRenderer; private float m_weight; private int m_Index; void Start() { m_weight = 0; head = GameObject.Find("blendShapeCharacter/face_object"); skinnedMeshRenderer = head.GetComponent<SkinnedMeshRenderer>(); m_Index = skinnedMeshRenderer.sharedMesh.GetBlendShapeIndex("blendShape1.blendAction"); } void Update() { if (Input.GetKey(KeyCode.A)) { if (m_weight == 0) { m_weight = 100; } else { m_weight = 0; } skinnedMeshRenderer.SetBlendShapeWeight(m_Index, m_weight); } } }Aボタンを押すとブレンドシェイプが100と0に切り替わるシンプルなプログラムです。
GameObject.Find("blendShapeCharacter/face_object");ここでブレンドシェイプの情報を持っているオブジェクトを検索して、
skinnedMeshRenderer.sharedMesh.GetBlendShapeIndex("blendShape1.blendAction");ここでそのオブジェクトが持っているスキンメッシュのインデックスを取得しているようです.
skinnedMeshRenderer.SetBlendShapeWeight(index, weight);SetBlendShapeWeightで対象のウェイトを操作する。
以上のような手順?になりました。最後に
多分クラス化しようと考えているので、フェイシャルのブレンドやインデックスの一覧取得方法など調べてみようかなと考えています。
趣味で3D作品を作っています。もしよければ見て上げてください。星つけてくれたら嬉しいな!
そして、フレンドになって技術共有しましょう!
sketchfab
- 投稿日:2020-02-13T22:30:55+09:00
VisualEffectGraphをスクリプトから発火させる。
unityのnode baseでEffectの作成が行えるVisualEffectGraphの、スクリプトから制御する方法を書き留めておきます。
準備
VisualEffectGraphをスクリプトから呼び出すために、
①using UnityEngine.Experimental.VFX;
を追加、
②public VisualEffect effect;
で変数を設定します。using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Experimental.VFX; //VFXを使えるよう定義 public class EffectFire : MonoBehaviour { public VisualEffect effect; //VisualEffect変数を設定。 void Start() { } void Update() { } }②Scene上の「Visual Effect」オブジェクトを、自身で作成したスクリプトにアタッチします。
Effectを発火させる
Effectの発火はParticleSystemと同じように、Play()を使います。
今回は、わかりやすく確認するためにWキーを押したときに発火するようにします。void Update() { void OnTriggerEnter(Collider other) { effect.Play(); } }これでEffectを発火させることができます。
スクリプトから発火させる場合には、Play()だけでは事足りない場面が多いことがあります。例えば、Effectは衝突判定がされた場合に呼び出すことが多いです。その際は、EventTrigger()を使います。
VisualEffectGraphでEventTriggerを使うためには、Node上でEvent Node/Nameを設定します(Event Nameを今回は初期のままの「OnPlay」としておきます。)そして、Event Nameスクリプト上でEvent Nameを任意のタイミングで呼び出してあげる必要があります。まずは、VisualEffectGraphのNodeの設定をします。
Nodeを開いて
①EnterKeyでNode Boxを開き、Event Nodeを追加。
②任意のEvent Nameを設定。
③Event Nodeの「SpawnEvent」と Spawn Nodeの「Start」につなげます。先ほどのスクリプトのUpdate関数に、SendEvent("OnPlay(Eventの名前は任意)")()を追加します。
void Update() { void OnTriggerEnter(Collider other) { effect.Play(); } }これで衝突判定を行った際にEffectが発火するようになりました。
(また、これらの発火をわかりやすくするために、Spawn Node の「Constant Spawn Rate」を取り除き、「Single Burst」を追加し、「Count(Min:0)」を「5」に設定します。これでEventが呼ばれた瞬間のみEffectが発火します。)
まとめ
これでVisualEffectGraphのスクリプトから簡単に発火させることができました。
ほかにもスクリプトからいじれるものは多いので便利なものを試し次第まとめていこうと思います。
- 投稿日:2020-02-13T19:43:43+09:00
Unityで音声合成を再生する (Amazon Polly)
Unityで Alexaっぽい の音声合成を試してみました。
「.Net」 に対応している AWS の音声合成サービス 「Amazon Polly」 を使います。やりたいこと
- 入力したテキストの発話
- ボイスの選択( 男性女性 / 日本語・多言語 )
下記のサイトで Alexaの音声合成を試せるので、これと同じような仕組みを検討します。
SSML Editor : VoiceFlow
Amazon Polly とは
Amazon Polly は、文章をリアルな音声に変換するサービスです。テキスト読み上げができるアプリケーションを作成できるため、まったく新しいタイプの音声対応製品を構築できます。Polly は、高度なディープラーニング技術を使用したテキスト読み上げ (TTS) サービスで、自然に聞こえるように人間の音声を合成します。何十種類ものリアルな音声を多数の言語でサポートしているため、さまざまな国に対応した音声アプリケーションを構築できます。(AWSサイトより)
Polly API に テキストを送信するだけで、Amazon Polly からオーディオストリームがレスポンスされます。アプリケーションで直接ストリーミングしたり、MP3 に保存することもできます。
AWSのアカウントが必要ですが、「1か月あたり数百万文字」までの無料利用枠があるので、無料で始められます。Amazon Polly の準備
AWSアカウントの作成
AWSアカウントがない場合は、下記からアカウントを作成してください。
AWSアカウントの作成の流れ : AWS
途中、クレジットカード情報の入力が必要です。AWS SDK を使う際に、「アクセスキー ID」と「シークレットアクセスキー」が必要になるので、アカウント作成後に、IAMからアクセスキーを作成しておきます。
AWS SDK の入手
下記から AWSSDK.Core と AWSSDK.Polly の最新版をダウンロードします。
https://www.nuget.org/packages/AWSSDK.Core/
https://www.nuget.org/packages/AWSSDK.Polly/
ダウンロードした「awssdk.core.****.nupkg」と「awssdk.polly.****.nupkg」は、拡張子を zip に変更すると解凍できます。
下記の階層から、それぞれの「.Net4.5」用DLLを取り出しておきます。
音声合成コンポーネントを作る
新規作成したUnityプロジェクトに「Plugins」フォルダを作り、先ほどのDLLを配置します。
ProjectSettings から Api Compatibility Levelを「.Net 4.x」に変更します。
下記のスクリプトを作成します。
"access-key"と "secret-key"は、自分のキーに書き換えてください。PollyTest.csusing System.IO; using System.Reflection; using System.Collections; using System.Collections.Generic; using UnityEngine; using Amazon.Polly; using Amazon.Polly.Model; public class PollyTest : MonoBehaviour { public VoiceType voiceType; public string text; private AmazonPollyClient client; private AudioSource audioSource; private List<FieldInfo> voiceList = new List<FieldInfo>(); private string fileName = "voice.ogg"; void Awake() { audioSource = gameObject.AddComponent<AudioSource>(); string voiceNames = ""; var list = typeof(VoiceId).GetFields(); foreach (FieldInfo prop in list) { voiceNames += prop.Name + ","; voiceList.Add(prop); } } private void Update() { if (Input.GetKeyDown(KeyCode.Space)) { StartCoroutine(Speak()); } } private IEnumerator Speak() { client = new AmazonPollyClient("access-key", "secret-key", Amazon.RegionEndpoint.USEast1); SynthesizeSpeechRequest sreq = new SynthesizeSpeechRequest(); sreq.Text = text; sreq.OutputFormat = OutputFormat.Ogg_vorbis; sreq.VoiceId = voiceList[(int)voiceType].GetValue(null) as VoiceId; SynthesizeSpeechResponse sres = client.SynthesizeSpeech(sreq); //save voice using (var fileStream = File.Create(Application.persistentDataPath + "/" + fileName)) { sres.AudioStream.CopyTo(fileStream); fileStream.Flush(); fileStream.Close(); } //play voice using (WWW www = new WWW("file:///" + Application.persistentDataPath + "/" + fileName)) { yield return www; audioSource.clip = www.GetAudioClip(false, true, AudioType.OGGVORBIS); audioSource.Play(); } } } public enum VoiceType { Aditi, Amy, Astrid, Bianca, Brian, Camila, Carla, Carmen, Celine, Chantal, Conchita, Cristiano, Dora, Emma, Enrique, Ewa, Filiz, Geraint, Giorgio, Gwyneth, Hans, Ines, Ivy, Jacek, Jan, Joanna, Joey, Justin, Karl, Kendra, Kimberly, Lea, Liv, Lotte, Lucia, Lupe, Mads, Maja, Marlene, Mathieu, Matthew, Maxim, Mia, Miguel, Mizuki, Naja, Nicole, Penelope, Raveena, Ricardo, Ruben, Russell, Salli, Seoyeon, Takumi, Tatyana, Vicki, Vitoria, Zeina, Zhiyu }ここでは、Amazon Polly から取得したオーディオストリームを Oggファイルとして保存して、WWW.AudioClipで再生しています。
GameObjectにスクリプトをアタッチします。
インストラクタ上で、ボイス選択 と 再生したい音声テキスト を変更できます。
スペースキーで、音声が再生されると完成です。
VoiceType を Mizuki か Takumi にすると、日本語の音声合成も可能です。