身体はUnityで闘争を求める② ライフルとミサイル

ライフルとミサイルを実装しました。

銃弾やミサイルをかっこよくする為にパーティクルと音をかっちょよくつけました。

それと、武器切り替えのシステムを実装しました。
ACVDの武器持ち替え型か、ACfaの背中武器切り替え型で悩みましたが
ミサイルやキャノンは背中についてたほうがかっこいい!という私の考えからACfa型になりました。とはいえ、欲張りに武器持ち替えも有りの武器6個持ちハイブリッド型に今後なるかもしれない。

武器入れ替えの今後の課題は、アニメーションの切り替えを滑らかに行うこと。
現状、狙い撃つときはFinalIKで動作し、アイドル中はアニメーションで動作している。そのため、アニメーションとFinalIK切り替え時の動作が不自然になってしまっている。これといっしょに、FinalIKによる腕の動きが瞬間移動になってしまっているのをなおしたい。どうしたら良いのだろうか・・・

ロボアクションゲーム 作った3DCGモデルを動かしたりスラスターエフェクト入れたり

前回作ったモデルを自分の操作に合わせてかっこよく動くようにした

以下ができたもの

足が地面に接地するようにFInal IKを使っている。
武器を敵に向けるのもFinal IK。
使い方としては先に関節の可動角度を制限するコンポーネントを付けた後に、
どこからどこまでのボーンをIKとし、どこを目標とするか設定する。
公式の以下の動画を見ればやっていることがなんとなく分かると思う。

ただし、バージョンが新しくなり、CCDIKのスクリプトの設定の仕方が少々違うようだ。
この動画にはないが、先端の目標座標となるオブジェクトを選べるようになっている。
この目標座標をロックオンした敵に設定すれば銃口は敵に向いてくれるし、地面の座標を設定すれば、良い感じに膝と股関節を曲げてくれる。
地面の座標はRayCastメソッドを使って取得する。
以下参照。
Unityを使った3Dゲームの作り方(かめくめ):UnityのIKを使って足の位置と角度を地面に合わせる機能

あと、移動に合わせてアフターバーナーの大きさや向きを制御する。
以下の記事にある標準アセットのアフターバーナーを改造して使用する。
【Unity】Unityエディタに標準で付いてくるパーティクルエフェクトの幾つか

スクリプトからパーティクルの大きさやスピードを変えてアフターバーナーの見た目を動的に操作する。
色なんかも変わるようにしたら見た目が楽しそう。

人型メカの3DCGを作成

今週の三連休を使って、3Dロボアクション用のモデルを作成しました。

思いの他いい感じ!強いて言うなら胴がでかい気がする。

自分の3DCG作品の2体目!VRChatのおかげで億劫だった3DCGに手を付けるきっかけができてよかった。

参考にロボ系プラモデルの画像見まくってたらプラモデル欲しくなってきた。
置くところが無いので買えませんけど。

UVカットとテクスチャの作業がこの先にまっている、これも3連休中に終わらせたかったな。

それと、Final IKをUnityのアセットストアから購入しました。
このメカちゃんをFinalIK使ってかっこよく動かしていきたいと思います。

VRChat用に自作アバターをBlenderで作成

先日、VRChatを初めてプレイ。
普通のVR対応のコミュニケーションツールと侮っていたが、
何もかもが想像以上にすごい。
VR空間上での他者とのコミュニケーションそのものが遥かに未来を感じる体験であったことと、ワールド&アバターの持ち込みの自由度が異常。

と、いうわけでオリジナルアバターを作成してVRChatの世界を闊歩すべく、
初めての3DCG作成をしていきますヨ!

まずはどんなアバターを作るかをイラストで描いて決めます。
というわけでクリップスタジオの無料試用を用いて描いた!ドン!

アンドロイド娘!
普通にモンスターとかカッコいいロボットにしようかとも思ったけど、
人間と同じ骨格にしないとフルボディトラッキング時に綺麗に動けないので
仕方なく女の子のロボットに(言い訳)

後は後ろとか横から見たときどんな感じかをイラスト化

このときに3DCG作成時の下地になるように三面図っぽく作成

VRChatの場合は上図Aポーズよりも下図Tポーズのほうがいいらしいので修正。

そんなわけでBlenderをSteamからインストールして早速3DCG制作開始

その際には以下のZen先生の動画と

以下のWebサイトを参考にBlenderの基礎を学びながら作業しました。
かんたんBlender講座 – 高知工科大学

制作工程・・・

お顔をワニでも分かる口座に従って作成

三面図の下地に沿うように体を作成(参考:かんたんBlender講座 – 高知工科大学)

身体全体がとりあえずできた。

パーツごとにUVマッピングしていく
このとき、綺麗にUVマッピングしていくようにカット位置を指定しいく必要がある。かんたんBlender講座を参照。
マッピングできたらクリップスタジオでテクスチャの色付け。 

 

顔が恐怖を覚えるほどに不気味ブサイクなのでガンガン修正 可愛くなった

そしてボーンを各パーツごとに対応付けしていく。
これでボーンの動きに合わせて身体が動いてくれる。
また、VRChatでの使用を想定している場合、公式で配布しているモデルのボーンを流用すると良い。自分でボーンをいちから作ると、VRChat上で予期せぬ動きをする場合が多々ある。
以下、公式の配布モデル

あとはテクスチャの影を入れたり、髪にボーンを加えたりブラッシュアップしていく。
シェイプキーで表情差分を作成。VRChat上ではこのシェイプキーを用いた表情差分で、口パクを表現できる。本当は16種類の表情差分を作る必要があるのだけれど、5種類の差分を作ればそれの使いまわしで十分にそれっぽくなる。(sil,aa,th,oh,ou)

あとはVRChatに対応したバージョンのUnityをインストールし、VRChat用のSDKをインポートしたりなんなりしてVRChat上にアップロードできる。
その詳しい方法は以下を参考に。
VRChat用人型アバターを作ってみた

そしてVR空間上についに降り立った俺氏。


想定以上にお尻がセクシーになってしまった。
とはいえこれで遂に一から自分の力で仮想空間上の自分を作ることができた。
ここまでにかかった時間は
まったり作業でイラストに10~15時間
Blenderでの作業で30~40時間
UnityでのアップロードとVRChatでの仕様把握に数時間といったところか。

総評:VRChat最高かよ

Unityで2Dモデルのアニメーションをさせる方法の備忘録

キャラクターの制御に合わせてモデルをアニメーションさせたい
Unityではその実現にAnimationとAnimatorを使う
また、モデルの作成にはAnima2Dを使用した。

ざっくり言うと

①ペイントツールでモデルを描いて

関節毎とかにバラバラにして保存(1枚のテクスチャにまとめなくてもよい)

②Anima2Dでゲーム上のモデルの骨格とスプライトをリンク付けしながら作成

③Animationでモデルの動きを作成し、 AnimationClipとして保存

④Animatorで作成した色んなAnimationClipを制御し再生する

①ペイントツールでモデルを描く
描いた後に関節とか稼働する場所毎に画像を切り分けます。
パーツ毎にレイヤーを分けて描いちゃえば後が楽。

②Anima2Dでゲーム上のモデルの骨格とスプライトをリンク付けしながら作成
Anima2Dによるボーンの作成は以下の記事を参考にしてください。
Anima2Dでキャラクターアニメーションを作ろう!編 – SEGA TECH Blog

また、上記記事では複数のパーツをTexturePackerやSpriteUVなどを使って、1枚のテクスチャーにパーツを配置していますが(パッキング)。
私はUnityのパッキング機能Sprite Packerを使っています。Sprite Packerを使ったほうが、後々パーツの修正を行いたいとき等に簡単にできますし楽です。多分。
パッキングについては以下の記事を参考に。
【Unity開発】Sprite画像とSprite Packerまとめ【ひよこエッセンス】

③Animationでモデルの動きを作成し、AnimationClipとして保存
Animationの作成は以下の記事が分かりやすかったです。
Anima2D入門〜実践(アニメーション作成)編〜
上記記事のポーズ作成、コントローラの作成は行っていません。
アニメーションさせたいオブジェクトにAnimatorコンポーネントを追加し、
Animator上で新規AnimationClipを作成し、保存しています。

また、上記記事にも書いてありますが、AnimationClipの特定フレームになったとき、対象オブジェクトの持つ関数を呼び出すことができます。(イベント機能)
例えば、走るアニメーションの足が地面に着く瞬間に足音の鳴る関数を読んだり、剣を構えて振り始める瞬間に攻撃判定オブェクトを生成する関数を呼び出したりといった使い方ができます。ただし、注意として呼び出せる関数に制限があります。制限の内容は引数がひとつであるという点です。ふたつ以上も対応して!
イベント機能については以下の記事が分かりやすい。
Unity : AnimationClipに合わせて処理をしたいなら

④Animatorで作成した色んなAnimationClipを制御し再生する
以下の記事を参考にしました。
Unityのアニメーターコントローラーの使い方
Animatorのときもそうでしたが、基本的に2Dでも3Dでもやることは変わりません。

だいたいこんな感じでアニメーションを実装できるかと思います。
URLを貼りまくるだけで仕事した気になれますねぇ!

ドット絵の2Dアクションゲームを作りたくなった

3ヵ月ぶりくらいの投稿

3Dアクションゲームを作っていたが、3Dモデルの作成に腰が引けてしまい
2Dアクションゲーム(ドット絵調)の作成に逃走。
そのうえトロフィー厨としての血が騒いでしまい以下のゲームに没頭してしまっていた。
・The Crew2
・God of War
・The Surge
・No Man’s Sky
・Dead by Daylight
・NieR: Automata
・ペルソナ5

2Dアクションゲームとしては以下のようなものを作成した

以下からダウンロードして遊べます
https://ux.getuploader.com/xnextxnextx/download/1

3Dのアクションゲームを作成したときのノウハウでほとんど作成することができた。
ただし、アニメーション等は今まで触っていなかったので
次回記事にて新要素を備忘録用にまとめていく。

いじょ。

ミサイルを追加

前回、敵(タレット)を作成したので、攻撃のバリエーションを増やす為にもミサイルを追加します。

ミサイルスクリプトでは以下の処理をする。
・移動処理(目標に一定角速度以下で回転しながら巡行)
・衝突を検知したら削除★
・有効時間経過で失速し落下★
・ダメージ等必要な情報を渡したり渡されたり★

★の部分は以前作成した弾丸スクリプトと同じなので、
継承を使いたいと思います。
親クラスとしてShotクラス、
その子クラスにBulletクラス、Missileクラスといった感じに作成します。

以下のようになりました。

以下のようにミサイルタレットを作成できました。

 

敵ユニットを作成

そろそろ敵ユニット(タレット)を作成し、プレイヤーを攻撃させてみようと思う。
攻撃によるダメージ判定処理は過去記事の通り実装済み
弾でダメージを与える
この処理をプレイヤーにも追加すればお互い攻撃でHPが減るようになる。

なので今回は
・タレットの動作制御(砲塔回転,射撃命令)
・タレットの射撃処理(弾丸の発射)
のスクリプトを作成する。

タレットの動作制御
タレットの動作制御として以下を実現する。
・目標角度まで一定速度以下で旋回を行う。
・目標角度はプレイヤーの偏差射撃位置とする。
・プレイヤーが一定角度以内かつ射程距離内に入った場合は射撃命令(武器クラスに)。

一定速度以下で目標角度まで旋回する処理はVector3.RotateTowards関数を用いて実現した。詳細は以下。
http://tama-lab.net/2017/06/unityでオブジェクトを回転させる方法まとめ

タレットの射撃処理
タレットの射撃処理として以下を実現する。
・射撃命令により弾丸の発射。
・発射後、次弾発射までクールタイムを設ける。
・タレットの動作制御に必要な射撃情報を渡す。
過去に実装したプレイヤー用の武器スクリプトを流用しながら作成。

あとはプレイヤーとロックオン対象のHPをUIに追加するなど細々とした部分を作成しました。
そんで以下のようになりました。

以上です。

アーマードコアっぽいカメラの実装

カメラが自プレイヤーを遅れておっかけてくれるようにしました。
主に参考、というより以下のサイトのコードをそのまま持ってきました。
【Unity5】AC4系のようなカメラワークを再現する – N煎ログブログ

こちらの記事のコードをSubカメラを撤廃してそのまま実装しました。
ただそのままでは移動の際にカメラがカクついてしまっていて自分のプロジェクト用に修正が必要な部分もありました。

カメラのカクつきは以下のサイトが参考になりました。
FixedUpdateとUpdateごちゃまぜでTransformをいじるとカクつく – 考え中

プレイヤー移動の更新間隔、カメラ移動の更新間隔、ディスプレイの更新間隔をうまいことあわせないとカクつきが発生してしまうようでした。
全てUpdateにしてしまうと物理演算の処理間隔がカメラ移動の更新間隔やディスプレイの更新間隔と合わなくてカクつきが発生してしまうようです。
そこで更新間隔を固定値にするFixedUpdateを利用すると良いみたいです。このFixedUpdateをディスプレイの更新間隔とだいたい一緒にしてあげればうまいこといくみたい?

そんでこんな感じになりました

このまんまだと上下を向いたときにプレイヤーが全然見えなくなってしまうのでカメラの目標地点をプレイヤーの向いている角度によって変える必要がでてくる。
また、プレイヤーを常に中心とするのを目標とするのではなく、X軸方向の目標値には多少の余裕を持たせたい。(プレイヤーを真ん中ではなく右よりとか左よりのまんまにしたり)

CameraPositionTargetオブジェクトに以下のコードをアタッチして対応しました。

値の調整とかがまだできるようにしてないから稚拙なコードだけど・・・
こんな感じになりました。

旋回速度とかも考慮して細かい値はまだ要調整

以上です。

ロックオン対象のList管理と偏差射撃の実装

ペルソナ5をやっていて開発が滞っていた。

前回ロックオン機能を実装したが、敵が複数であった場合を想定しているロジックではなかった。
なので今回は複数の敵をロックオンできるようにかえていく。
具体的にはロックオンサークル内に入った敵をListに追加していき、管理する。
そして敵を撃破したり、サークル外に行った場合はListから削除する。
このList内に一定時間以上存在していたオブジェクトがロックオンされたものとして判定する。
また、ロックオンマーカー等の情報もこのListで一括管理する。
なので自作の構造体を作成し、Listのクラスはこの構造体を使用する。

偏差射撃については
以下を参考に作成
http://redhu.hatenablog.com/entry/2015/04/05/000305

一か月前の作業内容なのでまとめかたがかなり雑ですが以上です。