読者です 読者をやめる 読者になる 読者になる

ムラサメ研究ブログ

主にゲームやプログラミングのログ

WebAssembly 調査!

WebAssembly

新年一発目は WebAssembly

今年(会社自体は6月はじまりなので 2016年度下期)に、会社の方針として C++アセンブラの高度な技術を一番の武器に活動することを決めました もちろん今までのようにゲームが主軸になると思いますが ゲーム&ビジネス限定せず 今まで以上にC++を頑張ろうとおもいます

そんな中で気になるものが WebAssembly

今までJavaScriptしか動かなかったブラウザにおいて、ネイティブに近いバイナリフォーマットが制定されたようです 一言でいうと とても速くなるらしいですが、ほかにも色々な似たテクノロジがあるので 簡単にまとめます。 間違ってる部分あったらごめん

最初のJavaScript

元来ブラウザは静的な表現しか出来なかったが、JavaScriptの登場により、動的に変更する事ができるようになった Mozillaが開発したが、すぐさま IESafariと追従し、後にGoogleChromeを作った際も対応していた 当初は 個人のホームページで遊び要素程度に思っていたが、ブラウザを使ったビジネスアプリやサービスが増え JavaScriptは主役になったが、インタプリタ実行のため非常に遅かった

Flash(ShockWave)

Adobe ブラウザ上でネイティブのように動くVMの先駆け 息が長くほとんどのブラウザでサポートされていたが、突然Macが対応を終了しHTML5

JavaApplet

Sun ブラウザ上で動くJavaVM

ActiveX

Microsoft。 他のブラウザが対応しなかったため IEの特定バージョンでしか動かない COMテクノロジ(.netの前身)VM上で動く

v8エンジン

GoogleJavaScriptを高速実行するためのエンジンを開発 JITコンパイルにより ロード時にネイティブコードに変換されるため 実行速度は非常に速い また サーバサイドにJavaScriptを使った node.jsも作られる

HTML5WebGL

HTMLが色々と見直され 色々と高速かつ便利になり、Flash等のVMが不要になった ブラウザ上で高速な描画が可能に。 OpenGLES2.0とほぼ同機能がJavaScriptで提供された。

ES6

JavaScriptは、小さなものを作るには楽だが、大規模開発には色々と問題がある 変数は基本的に全部グローバルであり、ネームスペースの概念がない オブジェクト指向に慣れている人には Classが存在しないのも使い勝手が悪い それらの問題を解決するために、JavaScriptの新しい規格が登場した しかも Babelなどを使い、ES5にトランスパイル可能なので 古いブラウザでも実行可能に

NaCl

Googleが作った。 LLVM技術を使い、Emscripten等で C++からブラウザ用のネイティブバイナリを作り、ブラウザ上でネイティブ実行される ネイティブなので当然とても速い ただし、対応していないブラウザでは実行することができない WebAssemblyと同じ思想のように思えるし、WebAssemblyよりも速いかもしれないが Chrome以外に搭載されず 消える運命に。

Asm.js

Mozilla製。 NaClに対抗して作られた 型情報付きのJavaScriptサブセット JITコンパイルにより劇的に高速になったJavaScriptだが、型情報がないためネイティブには全く歯が立たなかった。 型情報を追加することで、ネイティブのおよそ1.5倍程度の速度まで迫ることができた しかも 非対応ブラウザでも普通のJavaScriptとして動作する ただし、人間が手で書くには困難なため、C++等からEmscriptenを使い変換する

WebAssembly

GoogleMozillaMicrosoftApple が共同開発!! NaClに似た思想で、JavaScriptバイナリにする おそらく NaClと違い完全にネイティブコードにせず、中間言語にとどめ 各社ブラウザがJITコンパイル しやすくしている Asm.jsと同じく 型情報も持っている。ネイティブと比較し1.1~1,2倍程度らしい ここで勘違いしてはいけないのは、バイナリになったから実行速度が上がるわけではない事。 元々JITコンパイルされているので、JavaScriptは実行速度は速い 速くなるのは バイナリコードになりデータ量が少なくなったことと、中間言語なのでコンパイル時間が劇的に向上する事によるものである おそらく、ロード時以外はあまりAsm.jsと変わりがないと思われる 今現在は C++からLLVM経由でコンパイルする事しかできないが 順次色々な言語で対応される Rustが対応開始したらしい

まとめると

今まで色々とJavaScriptの高速化や ネイティブアプリの実行があったが、ブラウザ各社の足並みが揃わず終了したが WebAssemblyはほぼすべてのブラウザメーカーが共同開発しているため、期待がもてる JavaScriptはAsm.jsで 型付け可能になり十分高速化されたが 中間言語バイナリ化することで データロード速度、コンパイル速度が向上した 現在は C++からコンパイルする必要がある

現状出来る事

C++で出来ることはだいたい出来るようです STL、pthread、OpenGLSDL・・・ などなど

今後追加予定

共有メモリを使った高度なスレッド ゼロコスト 例外処理 fixed-width SIMD GC/DOM などなど 新機能が追加予定のようです

現状でも色々できそう

次はWindowsでビルド環境つくるぞ

今度記事かくけど、Macやめましたので Windows10で環境構築しようとおもいます

http://webassembly.org/getting-started/developers-guide/

The instructions on this page are applicable to Linux and Mac OS X systems. Similar instructions for Windows systems are forthcoming.

公式ページでは LinuxMacでの手順はあるが、Windowsは また今度ね! とのことだが おそらくWindowsでも問題ないので 挑戦する!

Begin 2017年

2017年はじまりました まず2016年の振り返りを形式上行う

2015年に スマホのマージャンゲームのソーシャルサーバ&マッチングサーバを請けたものの残り作業で 1月2月は、そちらの作業に費やした

3月あたりは休暇を取りつつ、大手のゲームメーカーより JavaScriptWebGL向けのゲームのモック作成の仕事

5月から激動。大手ゲームメーカーの案件を受託し UnrealEngine4でゲーム開発 フロントの開発と、サーバー側のスーパーバイザーやモック、仕様などを行い従業員もMAX8人いれ 大がかりなプロジェクトになった そのまま 12月までその案件一筋で活動する まったく動いていなかったプロジェクトをチームビルディングを半分変更し立て直し ゲームとして見せられるものは作った 本当は今年も継続する予定だったが、技術ではない 社内政治的なものにまきこまれ 継続不可能になったりして、今考えても 社長としての正解はどれだったか判らない。

2017年は 絶賛プロジェクトを探し中 ありがたいことに 10ほどすぐに案件の話があったが 元々1月というのは 案件の話はくるが決まることが少ない。 実質2月からの仕事を選ぶ期間と思っている

今 色々な案件をもらい、持ち帰りにするか常駐にするか、事業内容で色々と悩んでいる

2017年は 残ってくれたみんなに 安心してもらうために、安定したチームつくりを目指そうと思う あとは会社の強みを決める 色々話した結果

C++アセンブラに強い ゲームエンジンカーネルが作れる C++による超高速リアルタイムサーバが作れる

このあたりかなー と思い、それらに合致する案件2社を第一希望に据えて交渉中

2017年もC++、WebAssembly 等を中心に頑張ります

【今更だが】 CComPtrのoperator&でassertで落ちる場合は read目的なら .p()を使うといいぞ

はじめに

なぜいまさらCOMなのか? と言われると DirectXを触っているからである

CComPtrとは?

COMオブジェクトを扱いやすいようにした テンプレート。 いわゆるスマートポインタ

COMは、shared_ptrのような参照カウント方式のスマートポインタだが、shared_ptrと明らかに違うのは 参照カウントのメンバとメソッドが、shared_ptrの場合は shared_ptrが持っているが COMの場合は オブジェクトのベースクラス IUnknownオブジェクトが持っている点である ゆえに COMオブジェクトを shared_ptrで運用するのは あまり効果的でない

boost::intrusive_ptr は、オブジェクトに参照カウントを保持するスマートポインタに対応しているので CComPtrにかえて使うことも出来る

基本的には

void intrusive_ptr_add_ref(IUnknown* p) { p->AddRef(); }
void intrusive_ptr_release(IUnknown* p) { p->Release(); }

のように、参照カウンタアクセス関数を置き換えれば良い

CComPtrを使う

基本的には、今まで生ポインタで扱っていたものを置き換えればよい

ID3D11Device                *device;
ID3D11DeviceContext         *context;

D3D11CreateDevice( ほげほげ, &device, ほげ, &context )


...

context->Release();
device->Release();

CComPtr<ID3D11Device>                 device;
CComPtr<ID3D11DeviceContext>          context;

D3D11CreateDevice( ほげほげ, &device, ほげ, &context )

と、するだけでよい。

変わったのは CComPtr を使い、スマートポインタにしたこと (x)->Release() がなくなったこと

の2点。

CComPtrでは、値の代入時に Addref()が呼ばれ参照カウントをインクリメントし スコープから消えると Release()が呼び出され参照カウントがデクリメントされる ので、Releaseをする必要がない。

たとえ例外等でRelease呼ぶ前にスコープが消滅しても Releaseが呼ばれるようになった とても安全!

もちろんこの後 device->ほげ と、通常のポインタと同じように使うことが出来る

operator&問題

上記の CreateDeviceでは、新規にオブジェクトを作成したので問題が生じなかったが たとえば オブジェクトのポインタを必要とする時は問題が発生する

通常は、元々中身はCOMオブジェクトへのポインタであり、Create時以外は ポインタのポインタを使うことがないのだが DirectXでいえば、バッファー、テクスチャ配列、レンダーターゲット配列等で ポインタのポインタが必要となるケースが有る たとえば

ID3D11Buffer      *vertexbuffer;

...
device->CreateBuffer(&bd, &InitDatta, &vertexbuffer);

...
context->IASetVertexBuffers(0, 1, &vertexbuffer, &stride, &offset);

を愚直にCComPtrにすると

CComPtr<ID3D11Buffer>     vertexbuffer;

...
device->CreateBuffer(&bd, &InitDatta, &vertexbuffer);

...
context->IASetVertexBuffers(0, 1, &vertexbuffer, &stride, &offset);

となるが、device->CreateBuffer の部分で、DebugAssertion Failed! が発生する

f:id:murasame-labo:20161212153806p:plain

コードを追っかけると

    T** operator&() throw()
    {
        ATLASSERT(p==NULL);
        return &p;
    }

CComPtrでアドレスを取る時(operator&)は、内部ポインタが 非NULL時は Assertで落ちるようになっている

おそらく、内部ポインタが存在する時に Create等でポインタを書き換えると元のポインタがリークするので そのための警告と思えるが 今回の IASetVertexBuffersは、ポインタを書き換える事はない。単純な参照なので Assertを突破したい

が、スマートポインタ等でよくある get()等がみつからない この場合は ポインタの内部メンバ pを直接参照するといい

CComPtr<ID3D11Buffer>     vertexbuffer;

...
device->CreateBuffer(&bd, &InitDatta, &vertexbuffer.p);

...
context->IASetVertexBuffers(0, 1, &vertexbuffer, &stride, &offset);

これで問題ないコードができた

Unreal4.14 ノンフォトリアルに挑戦中

UnrealEngine4 ノンフォトリアル

はじめに

一般的に Unrealといえばフォトリアルなものに強く、アニメなどの ノンフォトリアル(NPR)には弱い というイメージが有り たしかに当たってるのだけど

GUILTY GEAR Xrd -SIGN- にて、UnrealEngine3ではあるが、かなり完成度の高い NPRが動いています

頑張れば出来るんです

NPRに関しては フォワードレンダリングのほうが圧倒的に有利なのですが まずはデファードで何処まで出来るか追求したいですね

でも自分でコードかかないよ!

アンリアルフェス2015で下田さんの発表した NPR アンリアルフェス2015横浜で公開したNPR、トゥーンのアルゴリズムと使い方詳しく解説するよ(*´∀`)う - Qiita

これを実装していこうとおもいます

NPR_Materials

という名前です

UnrealDeveloppersNetworkに入らないとダウンロードできそうにないのかね・・・ おこられたら消そう

とりあえず NPR_Materials Ver0.2をダウンロードし Contentフォルダにコピーします すると コンテンツブラウザに表示されるように・・

f:id:murasame-labo:20161206192954p:plain

導入方法

PP_NPRを右クリックし CreateMaterialInstanceを行う PP_NPR_Inst が作成される

Volume PostProcessVolumeにて ポストプロセスを作成し f:id:murasame-labo:20161206205759p:plain

BlendablesのArrayに 先程作った マテリアルインスタンスを設定 f:id:murasame-labo:20161206205742p:plain

実行

f:id:murasame-labo:20161206205913p:plain

な・・なんと たったこれだけで、アウトラインと トゥーンシェーディングができてしまう 簡単!!

その後は Qiitaを見て色々と調整しましょう

アウトラインはけっこうキレイに出ていますね! トゥーンも 法線いじればキレイに出そうです

ポケモン サンムーン戦記

ゲーム

ゲームのプレイ日記も書くよ! ゲームプログラマやさかい

Myポケモン戦記

最初

ムーンに決定。理由は同じシェアハウスに住んでいる住民がサンを買ったので ニャビーで始める。理由は シェアハウス住民がモクローだったので 火にした

最初は捕まえたポケモンで適当PT 最初の固定PTは ニャビー、コイル、キャモメ

とにかく、コイルが頑丈で強い。はがね&デンキ すばらしい 地面は4倍食らうけど、地面以外にはめっぽう強い コイルを序盤に得たのは大きかった

マケンカニー、ニャースを追加 マクノシタが頑丈強く 固定入り。 現時点で ニャビー、コイル、キャモメ、マケンカニ、ニャースマクノシタ

そろそろ卵を持ち歩くため かくとう&水かぶってる マケンカニを捨てる 水と戦うために アマカジ、ネマシュ育てる ニャースニャビーにお別れ

コイル、キャモメマクノシタ を固定にし その他は色々と使い分ける この期間が結構長い。なにげに良いパーティーだと思う

ゴース手に入れた。結構期待できる。 マクノシタに限界が見えたので、ヌイコグマに変更 サトシゲッコウガも操れるようになったので そろそろパーティーへ 暫くつかってないニャビー 使いたいけどあまりバランス的に必要じゃない スターマン手に入った。有能

今後の育成

コイル(デンキ、はがね) ゴース(どく、ゴースト) キャモメ(みず、ひこう) ヌイコグマ(ノーマル、かくとう) タマザラシ(みず、こおり) ディグダ(じめん、はがね)

が、今そこそこ育ってるなかでバランス良さげだけど、今後バランスPT見直したい。

その他強い&育っている ニャヒート、ゲッコウガ は育てる

ネマシュ、マクノシタ、アママイコ あたりは レベルそこそこあるので 育てる

コイル(デンキ、はがね) ゴース(どく、ゴースト) ヌイコグマ(ノーマル、かくとう) ドジョッチ(みず、じめん) デリバード(ひこう、こおり)

このあたりも オールマイティー

岡山と東京のIT事情

半分ネタなので おこらないで・・

自己紹介

小学校1年の頃 岡山大学医学部の目の前 鹿田の イナバ小児科の前で 60キロで走る乗用車にはねられ かすり傷の 大怪我をしたのが 事故はじめです 自転車は真っ二つに曲がって、体は車のボンネットで跳ね返り 推定3メートル以上の高さから アスファルトに落ちたんですけど 人間 頑丈ですね ちゃんと頭を打たず 回転で衝撃をゆるめて かすり傷ですよ

跳ねた人は慌てて 車にのせて、目の前に岡大医学部あるのに 表町のほう 川崎病院に送ってくれました お詫びのお菓子おいしかったです

侘び石はよー! ってかんじ

次の事故は、去年原付きで60キロ出して居眠り運転して、ガードレールに衝突しましたね 手袋してたので、かすり傷すらなかったんですが、受け身を取った時に力を入れすぎて 骨が剥離骨折してしまいました もし 骨が筋肉の力に耐えてたら 60キロでバイクで事故ったのに かすり傷すらしなかった! って威張れたのに 悔しいです

なので 牛乳を毎日飲むようにしました

そんなわけで、高校まで岡山市育ち。大学3ヶ月で中退してから なんとなくゲーム作りたくて東京に出てかれこれです

東京のIT事情

結論からいうと、大都会岡山のITは素晴らしい。江戸時代以前、吉備大国時代より大都会であった。 東京も なかなかにIT大国であるが、やはり一馬身ほど足りていない

ITとは何か? IT IT イット イート Eat! つまり 食事の事です

では信じられない東京の IT事情を

うどん

まず東京には うどん屋なるものが存在しない。 ここ数年に、さぬきうどんブームが来て、はなまるうどん丸亀製麺というチェーン店はやってきたものの 基本的に 蕎麦屋のサイドメニューとしてしか 存在しない

大都会岡山では、植民地うどん県で生産される コシの強いうどんを常食しているが 東京の人は 黒くてコシのない 蕎麦というものを食べる この黒い蕎麦というものは 冷でワサビを入れると 結構旨いのだが、温を頼むと 真っ黒な醤油スープの中に黒い麺がはいって、しょっぱい 蕎麦屋でうどんを頼むと だいたい やわらかく ぶよぶよと 黒い汁をすった物体が出て来る f:id:murasame-labo:20161205040259j:plain

我々の知っている、カツオベースの黄金の透き通ったスープとは かけ離れたものが出て来る

そして、うどんのセルフサービス店は存在せず、ぶっかけうどんも ほとんど全滅である

ただ、最近は 丸亀製麺はなまるうどん が出てきて、セルフサービスが無い以外は問題はなくなった

お好み焼き

東京ではお好み焼き=お酒のおつまみ という認識のようである 多くの店が 17時以降にお酒のおつまみとして提供する 昼間から営業しているお好み焼き屋も もんじゃ焼きのサイドメニュー扱いであり 4人卓でセルフスタイルで焼く事を強要される。必ず 大阪スタイルだ。 f:id:murasame-labo:20161205040440j:plain

東京で最初に食べたお店は とてもひどく 大阪スタイルのお好み焼きに 蕎麦がほぐして入っており、蕎麦と小麦粉を混ぜて焼き ねぎ焼きは 白ネギを小麦粉に混ぜてお焼きにしていた

ただ、広島から来た勇者たちが、本場のお好み焼きを作っているお店が何件かあり そこに行けば必ず 広島人と仲良くなれるので もし東京に出る事になったら、そのお店を探しておくと良いだろう

ソース

東京ではブルドッグソースという、酸っぱいソースが好まれる f:id:murasame-labo:20161205041005j:plain 甘いものが好きな岡山人の口には たいてい合わないと思われる もちろん私はオタフクソースが大好きだ

ラーメン

東京ではコッテリ脂だらけのラーメンばかりである 好きな人は好きだと思うが、大都会岡山人にとっては あまり好ましくない 新橋に岡山ラーメンがあるので、どうしても食べたい時はそこへ駆け込め! f:id:murasame-labo:20161206104452j:plain

デミカツ丼

東京のカツ丼は醤油ベースである f:id:murasame-labo:20161205041509j:plain 岡山人の愛するデミカツ丼はどこにもない・・・ やまとも だても 東京にはない・・ あまりに存在しないので、自分で調理するしかない ありがとう クックパッド!!

東京もいいとこあります

お寿司

瀬戸内海の幸が豊富な岡山もお寿司は非常に美味しいですが 金と人口にものを言わし、日本中の良い食材が集まる東京ですから 北海道から九州までの、美味しい魚が豊富 東京きて食に困ったら、とりあえず 寿司か刺身食べておけば間違いない

お肉

こちらも 金と人口でビンタして、北海道から九州までの 有名和牛を取り揃え はっきりいって 肉の分野では東京が一番かも

海外料理

日本以外、世界中で 東京以上に色々な国の料理が、現地と同じ それ以上のクオリティーで食べられる そんな都市は存在しないんじゃないでしょうか 少なくとも 私の行ったことのある10カ国では、東京に匹敵するグルメタウンは存在しなかった

明日は

Uemmra3 さん 中国山地を越えた反対側から(仮) だそうです。 とっとりぃ???

何番煎じか UnitychanをUnreal 4.14で読み込む。 アニメーションステートマシン作成

UnrealEngine4

はじめに

何番煎じか不明だが UnityChanモデルの読み込み 触った感じ 4.14になっても ほとんど変わってないので 本当に何番煎じか・・

前回は UnityChanが操作できるが Tポーズなので 今回は 待機モーション、ジャンプ等を作る

最低限のアニメーション設定(待機、Jump)

Unitychanのボーン情報を使ったアニメーションBluePrintの作成

f:id:murasame-labo:20161204155120p:plain

名前を BP_AnimUnitychanにしました

ThirdPersonCharacterのAnimationを 先程のBlueprintに設定 f:id:murasame-labo:20161204155226p:plain

BP_AnimUnitychanをダブルクリックし AnimGraphを開き New StateMacheneで ステートマシンを新規に作り FinalAnimationPoseに繋ぎ ステートマシンの結果が反映されるようにする f:id:murasame-labo:20161204155717p:plain

待機モーション ステートマシーン作成

ステートマシンをダブルクリックする New StateJuを選び Idleと名前をつける

Idleステートをダブルクリックし Idleを実装する

Play xx で再生するアニメーションを選ぶ 無難なのは unitychan_WAIT00 なのでとりあえずそれを。

実行すると今までTポーズだったのが 待機モーションになっている

もちろん 歩きもジャンプも実装されてないので常に待機モーション。 時々Tポーズが一瞬出るのが気になるが とりあえず待機は完成 f:id:murasame-labo:20161204162816p:plain

ジャンプ

StateMacheneにジャンプを追加 f:id:murasame-labo:20161204162707p:plain JumpStart、JumpLoop、JumpEnd の3つのステートを作成し 図のように繋ぎます この矢印の方向にしか ステートはかわらないので、矢印重要!

矢印の上の記号は、遷移するための条件を指定するもので、あとで設定します

そして JumpStart、Loop、End にアニメーションを設定したいのですが問題発生 UnityChanは その3つが分離されてないので、分離しなければなりません

CreateAnimComposite

アニメーションの部分再生を使います

コンテンツブラウザのUnityChan_Skelton右クリックし、Create->AnimationComposite できたAnimationCompositeを Unitychan_Jump00B_Start にリネーム ダブルクリックする (アニメーションモンタージュでも出来そうだが、どちら使うのがいいのかな?)

右下のAssetBrowserから unitychan_JUMP00Bを選ぶ

f:id:murasame-labo:20161204162715p:plain

タイムラインをクリックすると Detailsが出るので、StartTime EndTimeを入れる 例えばわたしは Start0.3 End0.7にしてみた f:id:murasame-labo:20161204223358p:plain

本当は ジャンプ前のしゃがみモーションや、着地時のしゃがみモーションがついているので、それも再生行いたいが 少し処理が必要になるので、後日ということで

同じく Loopは Start0.7 End0.71、 Endは Start1.0 End1.85に

f:id:murasame-labo:20161204170021p:plainf:id:murasame-labo:20161204170025p:plain

Jumpステートマシンにアニメーション設定

ステートマシンより JumpStart、JumpLoop、JumpEndをダブルクリックし、アニムグラフを表示 それぞれにCompositeを設定する 補間では出てこなかったのでその場合はAssetBrowserから引っ張ってくると良い

f:id:murasame-labo:20161204181731p:plain

ステートマシン 条件追加

このまま実行しても IdleからJumpに遷移しないため 条件追加していきます

色々なやり方あると思いますが、今回はAnimationのTickで、空中かどうかでみます おそらく、ジャンプではなく落下も考えると ジャンプボタン押したかの判定で行うようになるかもしれません

アニメーションブループリントの Variablesに bool型のIsInAir変数を作る。デフォルト値はfalseで

BluePrint作成。アニメーションブループリントのEventGraphiで、キャラが空中の場合上記フラグを立てる

f:id:murasame-labo:20161204180821p:plain

ステートマシンの、IdleからJumpStartへの遷移をダブルクリックし、 IsInAirフラグが立てば遷移するようにする

f:id:murasame-labo:20161204181101p:plain

StartからLoop、EndからIdleには、アニメーション終了したら遷移するよう 以下のBluePrintを使う f:id:murasame-labo:20161204182250p:plain

LoopからEndはとりあえず IsInAirがFalseになった時にしておこう・・・ f:id:murasame-labo:20161204183439p:plain

実行するとジャンプするが、StartとEndが繰り返されるので、StartとEndは Loopを外す

とりあえずは出来た

歩き/走り

待機モーション ピクピク対応

待機モーションが一瞬Tポーズ出るので 上記と同じように AnimationCompositを使い Wait00の頭を抜いて再生する。 例えば StartTime0.1 EndTime2.95

Idleステートマシンのモーションにそれを設定すると ピクピクがなくなる

やること

ブレンドスペース1Dを使う。 ブレンドスペース1Dは、1つのパラメータにより アニメーションを合成できる 2Dだと2つのパラメータで合成。3D以降は予定されているが未実装

今回は Speedパラメータを使い、Idle->walk->run を合成する

とりあえず慣例にしたがい Idleステートマシンを Idle/Runにリネーム

Spped

Speedパラメータを設定

アニメーションブループリントのVariableにて float型のSpeed変数作成 EventGraphにて Velocityの大きさを渡す

f:id:murasame-labo:20161204225040p:plain

BlendSpace1D

ボーンを選び Create->BlendSpace1D を選択 例えば unitychan_BS1Dという名前にした

これをダブルクリックするとBlendSpaceが開かれる 左上の DisplayEditorVerti をチェックし 画面中央右の X Axis Labelに Speedを。 Rangeは グレーマンにみならって 0-375にした Speed0に Wait0 (AnimationCompositeやMontageは指定できなかったのでTポーズが出る・・) Maxに Run、間にWalkを入る あとで画面動かしながら 確認しよう

f:id:murasame-labo:20161204231251p:plain

ステートマシンに反映

Idle/Run ステートのピンを 先程作った BlendSpaceに変更する またSpeedパラメータを渡す

f:id:murasame-labo:20161204231659p:plain

実行するとそれっぽい動作をするはず

問題点

Wait0ポーズの開始時のTポーズが出てしまう (BlendSpaceに AnimationCompositeもMontageも指定できなかった) ジャンプ着地時に動いたら滑ったようになる