UnityとBlenderで作ったニャンターとネルギガンテを戦わせたい⑥


こんにちは、管理人のねまきです。

 

今回はニャンターに近接の連続攻撃を実装し、せっかくだから武器を持たせてみるのである。

あと現在コロナ自粛真っただ中なのでニャンターにマスクをつけようと思ったがやめた。猫の耳にマスクってどうやってかけるのか分からないからだ。絶対に可愛くならない。

 

話は逸れたが苦戦しながらもなんとか実装した連続攻撃がこちらだ。

f:id:mko0123098:20200525000955g:plain

連続攻撃

なんか、西日が眩しすぎない?

 

うん、俺にしてはなかなかの出来である。モーションはかなり様になっているし、連続攻撃の判定受付もデバッグを繰り返しかなり実機に近いものになった。

だが、逆光が半端無いというか陰影が強すぎるというか、こういうの専門用語で何というんだ?

とにかく逆光になるとニャンターの姿がほとんど見えない。

いや現実は確かにこんな感じに見えるのかもしれないが、ニャンターをプレイする人は俺も含めて「可愛いニャンターの後ろ姿に癒されるのも醍醐味である」と思っているはずである。これではニャンターなのかコナンの真犯人なのか分からない。

ライティング?というのか?背面にライトを配置するなどして調節せねば。今後の課題である。

 

 そうそう、せっかくだから備忘として連続攻撃判定の実装の仕方を残しておくのである。

 ・Attackトリガーをアニメーターのパラメータとして作成

 ・攻撃間の遷移条件にAttackトリガーを設定

 ・遷移の終了時間を設定する ← ここがキモ

 

色々と調べた結果、どうやら遷移の終了時間をトリガー判定として評価してくれることが分かった。つまり以下の部分を「入力判定としての開始時間」に調整するのである。

f:id:mko0123098:20200525002825p:plain

アニメーターの終了時間設定

だがこれ、受付開始時間をボヤっとは設定できるが、終了までフレーム単位で厳密に判定したい場合はどうするのだろう?今はニャンターの連続攻撃くらいだからボヤっとしてても良いが、例えば格ゲーの入力判定などはこうはいかないはずである。

ここからここまで、というフレーム単位のシビアな判定を取れなければいけないはずだ。

いや、そうでなくてもニャンターにもフレーム回避なるものが存在するし、そのようなシビアな判定が必須である。これは検討すべき課題である。

あ、俺のニャンターは回避上手の術が必須である。プロハンはつけんかもしれんが。

 

そしてなんとかアイスボーン風のUIを実装し、貫通ブーメランやメガブーメランのモーションもつけてみた。

 

次回はいよいよネルギガンテを作ってみたいと思います。

読んでくれてありがとうございました。

 

 

 

UnityとBlenderで作ったニャンターとネルギガンテを戦わせたい⑤  モンスターハンターワールド:アイスボーン

こんにちは、管理人のねまきです。

 

前回までの俺のニャンターは武器を所持していなかった。

これではネルギガンテどころかクンチュウすら倒せないので今回やっと武器を持たせてみる。

手順を調べたところ以下のような感じで実装できるよう。

 ・Blenderにて武器となるボーンを作成

 ・そのボーンにも武器の動きとしてアニメーションを設定

 ・Unityへインポートして武器オブジェクト(メッシュ?)をアタッチ

 

ふむふむなるほど。

なんとなくイメージは沸いたのでさっそくやってみる。

 

Blenderにて武器となるボーンを作成

②そのボーンにも武器の動きとしてアニメーションを設定

f:id:mko0123098:20200524174325g:plain

攻撃モーションに武器となるボーンをつけてアニメーション

なかなか良い感じだ。

カブラネコデンデンだったらネルギガンテ相手でもスタンを奪えそうだ。

ちなみに水色っぽく光っているのが武器のボーンだ

 

次に

③Unityへインポートして武器オブジェクト(メッシュ?)をアタッチ

f:id:mko0123098:20200524174909p:plain

Unityへ武器ボーンも含めてインポートしたところ

ん?ちょっと待て。

ボーンてUnityのシーンビューで見れないの??

そう、俺の環境のせいなのか他に方法があるのか分からないが、Unityでボーンが表示されないのだ。

困った。確かに俺が作った「buki」というボーンはヒエラルキーに表示されているからインポートはされている。そして俺の期待値では上記画像の赤ペンでなぞったような感じのボーンが可視化される予定であった。

 

しかし可視化されないため

「ボーンに合わせて武器メッシュの位置を合わせてアタッチする」

という事が非常に困難な状態に。

 

攻撃モーションに合わせてひたすら微調整を繰り返す、という力技をとれないこともないが、やってられない。そこで脳死状態で3Dオブジェクトのシリンダーというものをアタッチしてみる。すると。。。

f:id:mko0123098:20200524175938g:plain

シリンダーをアタッチしてスケールと位置調整だけでいけた。。。

なんかちゃんと追従しているじゃないか。

 

詳しい仕組みは調べたがよく分からなかった。もし分かる人がいたら教えていただきたい。なんとなく、以下のような仕組みな気がする。

 ・武器ボーンの始点終点とUnityが検知してくれる

 ・子オブジェクトとしてメッシュをアタッチすると位置と回転親オブジェクトを参照(コピー?)している

 ・大きさだけはユーザが好きに決めてねー

 

 

とにもかくにもこれで俺のニャンターは見た目棒きれであるが武器を手に入れた。

 

 

この調子で気合で他の攻撃モーションにも武器ボーンを追加していく。

f:id:mko0123098:20200524212607g:plain

攻撃3

f:id:mko0123098:20200524212611g:plain

ダッシュ

せ、背中に棒が串刺しになっている。。
あと空中攻撃のジャンプ低くない?

 

だが気にすることはない。何故なら俺はニャンターで近接攻撃は使わないから。

というのは冗談で実際ダブルクロスのプレイ動画を見ても武器が少し体から離れて宙に浮いている。

これはつまりオブジェクトを完璧に体に密着させたアニメーションを作るのはプロでも難しいということだ。だから俺なんぞができなくて当然なのだ。

そうだと思い込むのだ。

 

そういえば、BlenderからUnityへエクスポートした際にうまく作成したアニメーションが読み込まれなかったりする。

どうもランダムに発生しているような気がするが。。。

うまくいく時もあるのだ。もう少し様子を見よう。

 

今日はここまで。

読んでくれてありがとう。

次回は連続攻撃の実装をしたいがその前に武器のモデルを作りたい。。。

 

 

 

 

 

UnityとBlenderで作ったニャンターとネルギガンテを戦わせたい④  モンスターハンターワールド:アイスボーン

こんにちは、管理人のねまきです。

 

 

 

やっとニャンターの近接攻撃モーションを作った。

f:id:mko0123098:20200524135806g:plain

1撃目

f:id:mko0123098:20200524135811g:plain

2撃目

f:id:mko0123098:20200524135815g:plain

3撃目

f:id:mko0123098:20200524135818g:plain

4撃目

f:id:mko0123098:20200524135820g:plain

5撃目

な、なかなか様になってるじゃん。。!

 

ここまでやってきて思ったのだが、アニメーションを作る作業はなかなか大変だ。

楽しい。確かに楽しいが俺の場合攻撃モーションひとつ作るのにだいたい30分から1時間かかる。

もっと技術力があればIKを足したりポージングしやすいリグを作りこんだりして効率化できるのだろうが、いかんせん俺は1ポーズを全て手付で行っているからだ。

 

そして苦労しながらできたモーションを眺めているとあることに気づく。

 

このニャンター武器持っていないぞ

なんとこんな初歩的なことに気づかずここまで来てしまった。。。

せっかく攻撃モーションを作っても肝心の武器が無いじゃないか!

欲を言えば白疾風の武器を持たせたいが後で差し替えるとして、とりあえず棒でもなんでも良いから持たせねば。

 

普通のやり方がどうなのかわからないが、Blenderで武器も作ってしまって武器にもリグ仕込んで一緒にアニメーションをつけるのだろうか?

それともモデルだけインポートしてUnity側でスクリプトで座標を制御させる?

分からん・・・調べてみよう

 

 

連続攻撃ってどうやって実装すんの?

モーションはできた。なかなかの再現性である(俺的には)

しかし、連続攻撃の判定はディレイ中にボタン入力を判定して次のアニメーションに遷移させるはずだ。

俺が作ったモーションをそのままつなげてもダメなのだ。

おそらく、Unity側で各アニメーションの進行状態を探り、「ある期間中に攻撃ボタンが押されたら次のモーションに遷移」 or 「そうでなければIdle状態に戻る」のような処理を実装するのだろう。

 

ゲームプログラミングが楽しくなってきた

ゲームプログラミングとはなんと大変で、なんと楽しいのだ。

俺が本業で行っている業務アプリとは雲泥の差である。業務アプリなんて極端な話、「登録したものが画面に出る」それだけである。クリエイティブな要素などほぼ無い。

WEB系の開発ならばユーザー目線で画面の動きを作る、とかかなりのクリエイティブ要素がありそうだが俺の本業はそうではない。

ただクライアントの要件に沿って

 

長い設計

少しの実装(自由度などほぼ無い)

かなり長いテスト

 

を繰り返すだけなのだ。もう、ガチガチでお堅いのだ。

少々愚痴を言ってしまったが、作業を先に進めよう。

 

 

しかし今日はここまで。

読んでくれてありがとう。

次回は武器を持たせる、連続攻撃を実装する、あたりをやってみるとするか

UnityとBlenderで作ったニャンターとネルギガンテを戦わせたい③  モンスターハンターワールド:アイスボーン

こんにちは、管理人のねまきです。

 

前回はついに俺のニャンターが歩き出したが、実戦ではのんびり歩いている暇などあるまい。

そう、ニャンターはほとんど走っているのである。

 

 

だから、俺のニャンターも走らせるのである↓

f:id:mko0123098:20200522180728g:plain

走るニャンター

 

は、走っている!俺のニャンターが。。!

 

 

この勢いで前回の宣言通り、「右スティックでぐりぐり動かせるカメラ」を実装する。

まぁー苦戦したさ

 

①カメラから見た奥側が前方向であるということ

俺も最初は何を言っているか俺もわからなかったが特にTPSのカメラの概念はこれ前提で成り立っている。

スティックを倒したとき、キャラクターが向いている方向に進むのではなく、カメラが向いている方向に進むのである。ふむ、確かに言われてみればそうだ。

もし、キャラクターが向いている方向に進むのであれば、それはいわゆるラジコン操作(PS時代の旧バイオと言えば伝わるか)のような動きになる。

ちなみに俺はあの時代のバイオが好きだ。RE2、RE3も好き。バイオ4は認めない。敵もゾンビじゃないとヤダ

 

②カメラの上下移動は頭上で止める。

頭上、もしくは足元までカメラが移動したらそこで止める処理を入れる。

ニャンターやってて頭上までカメラ移動させるってあまり無いが、操作性はかなり大事なポイントだ。違和感はなるべく消していく。こんな感じだ↓

        // 垂直回転の更新
        var localAngle = transform.localEulerAngles;
        localAngle.x += Input.GetAxis("Vertical Stick-R") * verticalTurnSpeed;
        //上下の角度制限
        if (localAngle.x > maxLimit && localAngle.x < 180)
            localAngle.x = maxLimit;
        if (localAngle.x < minLimit && localAngle.x > 180)
            localAngle.x = minLimit;
        transform.localEulerAngles = localAngle;     
 

 

 

 

そしてニャンターカメラが実装された 

f:id:mko0123098:20200522183741g:plain

 プ、プロハンが操ってるみたいだ。。。!

ネルギガンテの飛び上がって突っ込んでくる技(技名忘れた)を華麗に避ける姿が目にうかぶ。

もし喰らってももういちドングリで復活でき

 

今日はここまで。

次回はいよいよ攻撃モーションを作っていこう。

読んでくれてありがとう。

 

UnityとBlenderで作ったニャンターとネルギガンテを戦わせたい②  モンスターハンターワールド:アイスボーン

こんにちは、管理人のねまきです。

 

前回は待ちのアニメーションを作ってUnityで再生させることに成功した。

そこで今回は「歩く」モーションを作ってPS4コントローラで操作させてみる。

 

 

さっそく歩くモーションと作ってUnityで動かしてみた

f:id:mko0123098:20200522164349g:plain

ぬらぬら歩くニャンター

う、動いている、俺のニャンターが。。!

 

なんか違うって?気にするな。それっぽければ良い。どうせニャンター操作時はほとんど歩かないからそんなに気にならんはずだ。←

 

自分の作ったキャラが(正確にはパクリだが)、自分で作ったアニメーションで、自分のインプットで動くのは感動ものである。

 

なんか棒とか平面とか余計なものが混ざってるが後で消すから気にしないでほしい。

これはBlenderでアニメーションを作る際の位置の目安に使っていたオブジェクトをそのままUnityにインポートしたためだ。

 

 

今回のポイントは以下である。

 

Blenderでアニメーション作成

とにもかくにもアニメーションが無ければ始まらないのでダブルクロスのプレイ動画を模写して作ってみる。

f:id:mko0123098:20200522170131p:plain

Blenderでアニメーション作成画面

あらかじめダブルクロスをプレイし、歩いているニャンターを正面と横から撮影した動画を二つ用意し、それぞれBlenderの背景としてインポートして作業した。

このほうが正確にトレースできる。俺は横と正面の2つの動画をインポートした。

最初は脳内で思い出しながらやってたが似ても似つかなかった

動画を参考にしても若干違うが

これ、やってみると意外と楽しいのだ。ポーズ作るのは意外と地味な作業だが俺には合っている気がする。

 

 

②Unityへインポートしてアニメーションコントローラをアタッチ

f:id:mko0123098:20200522171209p:plain

アニメーションコントローラ

アニメーションコントローラを作り、歩きのイントロ部分と、リピート部分のステートに分けて作成。そしてそれぞれのモーションを割り当てた。

綴りが色々間違っていたり突っ込みどころ満載だが何も気にすることはない。プレイには影響が無い裏側の部分だ。

なんだかゲームプログラマになったようだ。(世のゲームプログラマさん、ごめん)

 

 

スクリプトを作成し、コントローラの左スティックで歩かせる

早速はまった。ここまで割とさくさく来てたが、遷移条件のフラグやら遷移のタイミング等の理解が浅くこれまでの作業と比べて難易度がガンと上がった。

 

だが前に進めねば。

俺のニャンターはまだ待ち状態しか取れず、ネルギガンテを発見すらしていないのだ。

とりあえずInputManagerなるものを開き、PS4コントローラを割り当てる。

 

f:id:mko0123098:20200522172009p:plain

この画面でコントローラのすべてのボタンを割り当てていく

なお、Xboxのコントローラーを使うのがUnity界隈では常識?らしいがPS4コントローラだ。何故なら俺はそれしか持ってないからだ。

 

そしてスクリプトを作成する。

要するに「これが入力されたらこう動く」のようなシステムを作るのだ。

        hori_L = Input.GetAxis("Horizontal Stick-L");
        var_L = Input.GetAxis("Vertical Stick-L");

スクリプトのアタッチなど細かいところは省くが、Horizontal Stick-L が左スティックの左右入力、Vertical Stick-L が前後入力を検知してくれる。

そして

            transform.rotation = Quaternion.Slerp(transform.rotation,
                       Quaternion.LookRotation(refCamera.hRotation * -velocity),
                       0.02f);

このように書けばスティックを倒した方向へニャンターを回転させられる。

最後に

transform.position += refCamera.hRotation * velocity;

こんな感じで書けばキャラのポジションなるものを毎フレーム毎に進めてくれるらしいのだ。細かいことは気にしなくて良い。動けば良いのだ。

 

 

そして待ちの状態の時にスティック入力があったら歩く、という状態をフラグで実現させたのがこちら↓

f:id:mko0123098:20200522175331g:plain

待ち状態からスティック入力で歩く

あ、歩いている。俺のニャンターが。。!!

あのクエスト終了までボケっと待っていることしかできなかった俺のニャンターが自分で歩いているのだ。これは大きな前進である。それにしても哀愁ただよう無味無臭ニャンターである。

 

 

今日はここまで。

読んでくれてありがとう。

次回はプロハン必須のカメラコントロール機能を実装するぞ

 

 

 

UnityとBlenderで作ったニャンターとネルギガンテを戦わせたい①  モンスターハンターワールド:アイスボーン

やぁ、管理人のねまきである。

f:id:mko0123098:20200522154313p:plain

ど素人がBlenderモデリングしたニャンター(のつもり)

 

突然だが悉くを滅ぼすネルギガンテニャンターで倒してみたくなった。

そこでUnityとBlenderを駆使してとニャンターとネルギガンテを作ってみることにした。

 

だって、ニャンターでネルギガンテを倒したいから。

 

ゲームの公開は今のところ考えてないがモチベーション維持のために進捗を書いていく。

早速Blenderニャンターを作成してUnityへインポート。

f:id:mko0123098:20200522152847p:plain

Unityへインポートしてみた

。。。なんだこのウナギみたいな体表は。。。

我が家のペットの猫のアメリカンショートヘアの毛色を素人が参考にしてテクスチャを作るとこうなるのである。

まぁ素人だ、こんなもんだろう。とりあえずそれっぽく動けば良しとする。

 

 

 

Blenderでアニメーションの作成

さぁ、次はアニメーションの作成だ。

とりあえず、待ちのポーズ = いわゆるIdle状態を作ってみる。

いろんなサイトを読み漁り悪戦苦闘しながら作ったアニメーションがこれ↓

f:id:mko0123098:20200522161712g:plain

WaitGIF

なんかとっても気持ち悪い動きをしているが大丈夫だ。カメラが引けば分かりはしない。呼吸というより首のアイソレーションをしているように見える。。。

 

 

今日はここまでにしよう。

次回は歩くモーションをつけてPS4コントローラで動かしてみるか。

読んでくれてありがとう。