投稿記事

2022年 03月の記事 (4)

ものららい 2022/03/24 16:00

NPCとか


こんにちは🍎

前回は昨日の繋ぎこみを行ってそれっぽくなりましたが、今回はよりRPG感出るようにNPCについてちょっと作りこみをおこないました。(結構時間かかってしまったけど🐡)


一応ここではNPCは「構造的にはプレイヤーと同等」「自立移動する」「周りを認識するセンサーを持ってる」的なややアクション寄りの機能を持ったものを最終的に作成する予定なので、先ほどの内容を含めたものを作っていきます。

でも、RPG的なNPCって言うと移動しないで突っ立ってて会話だけできるみたいな店番してる店員みたいなのもいるじゃん!…と思うので、そういう「移動はしないけどでも何かしらのアクションはしたい」などのNPC未満のステージ上に存在する何らかのアクションをするオブジェクトは今後はStageEventとして扱っていきます。

平たく言うとこんな感じ。
StageNpc = プレイヤーと同等の機能を持つ自律的な動作をするオブジェクト
StageEvent = プレイヤーの操作に応じて何かしらのアクションを返すオブジェクト

一応将来的にはプレイヤーを追いかけたり等、もう少し複雑な動きしたりしてほしいですが、現状で使うかわからないような機能を作りこんでも良くないので、今回はあくまでRPGなどでもよくある汎用的な「目的に移動」と「ランダムに移動」に絞って作りました。

それだけでも実際動作させるとゲームっぽくなりますね🍎


「ランダムに移動」は移動先を自分の位置から適当に乱数で出せばいいので簡単ですが、「目的に移動」の方は自分で座標チェックして一つ一つ手付でやらない場合は何かしらの進路検索の機能が必要になってきます。

ただ、進路検索処理とかを自前でやろうとすると、実際とても大変(自分はやり方見当もつかない…)なので素直にunityの機能の一つであるNavigationを使用していきます。(せっかくUnity使ってるんだし

一応下記リンクで詳細わかりますがちょっと見にくいので「unity Navigation」とかで検索すると詳しく説明してるサイトとか結構あります。

Unity ユーザーマニュアル ナビゲーションと経路探索

簡単に説明すると、あらかじめNavigation Staticで設定された移動可能エリアをあらかじめ設定しておいて、障害物などを考慮した移動ルートをその都度自動的に出してくれるものです。


一応ナビゲーション使う前の準備がありますが簡単なのでさらっとご説明します。


まず移動する地形オブジェクトに対してNavigation Staticのチェックを入れます。


Navigationの設定パネルが出ていない場合は、Window → AI → Navigationにあります。


Navigationの設定パネルで一通り設定が完了したらBakeボタンを押すと画像と同じようにNavigation Staticの設定をした地形に青いエリアが出てきます。
この青いエリアがNavMeshAgentが移動できるエリアなので、途中途切れていたりしなければ基本的に問題なく目的地まで移動できます。

普通に使えば一筆書きにルートの上をなぞって進む感じで、設定次第で段差や谷などをジャンプして飛び越えたように移動するのも簡単でにできるのでとてもいい機能ですが、…今回は自前の移動システムとのあれこれがあって素直に使用できなので、開始、終点座標からルート座標配列を取得する処理を作ってそれを元に座標を順にたどるように移動処理を行って動かしています。

一応ですが、今回の使い方はあまりいい使い方とは言えない感じの結構カオスな実装してるので、ちゃんと理解したい方はちゃんと説明しているサイトを見て実装するのをお勧めします。
もうちょい素直に使えそうな感じになったらそっちに移行するかもですが、現状しばらくはとりあえずこの方式で行きたいと思います。

今回用意したNavigationの進路検索だけ使用する機能。
Script/BaseSystem/Static/RootNavigation.cs


NPCのリアクションと進路移動の動画。


おまけで進行ルートにミスがあったときにルート再検索して難を逃れる動画。


次回は自動で進行するイベントみたいなのを着手したいですが、微妙に会話のシステムとバッティングしそうなのでちょっと考え中…。


実際動作するアセットフォルダも置いておきますので、アセットフォルダを空プロジェクトに入れれば確認できます。

2022_03_24_Assets.zip (511.22kB)

ダウンロード

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

ものららい 2022/03/11 12:16

Unityで今まで作ってみた物をつなぎ合わせてみた


こんにちは🍎

前回キャラクターの基本的な動作の部分ができたので、今回は実際に今まで作った機能の「会話ウィンドウ」と「ふきだしセリフ」と「キャラクター」を使って移動してNPCと会話できるようにしてみました。

機能の繋ぎこみ自体はもともと初めから想定してたので問題は無かったんですが、今回会話処理というものの結構な実装の手間さを再確認してしまって、ここら辺の作業苦手だな~って思いました。

会話がNPCが一言しか言葉を発しないならそれなりに楽なんですが、普通は会話始まると数ページくらい文言が表示されて決定ボタンを押しながらどんどん読んでいきますよね。

実際それをしようとすると何かしらの会話データを解読する処理が必要になるので、まずそこから作ってましたが、経験上なるべく複雑なものにしたくないので今回は.txtファイルに一行ずつ命令文を書いていくシンプルな形を心がけるようにしました。(過去にjsonとかxmlとかでデータ保持して色々やってみましたが結局入力するデータの肥大化とかシンプルから遠ざかって行ったので今回はごくごくシンプルに徹しました。)

実際に会話データ Assets/TalkText_001.txt の中身にこんな記述がありますが。

name:ものほし
text:こんにちは!
text:今日はいい天気ですね。

会話データの命令文について説明しますが、「name:」で始まる行は会話ウィンドウの名前欄の文字列の変更で「text:」が会話ウィンドウのセリフ文言の変更になります。

基本的によほどの事が無い限り命令は「text:」に行くまで命令は自動的に次へ次へと行われます。

それはなぜかというと、名前の変更を行った際に処理が停止してしまうともう一回決定ボタンを押さないとセリフの表示がされないので、レスポンス的に非常にももやもやする感じになるので、決定キーを押して次の命令を行う動作は次のセリフの表示(または現在のセリフのアニメーションを完了させる)のみを行うようにしています。

実際そこら辺の処理は Assets/Script/CharacterTalk.cs や Assets/Script/BaseSystem/UI/UI_TextAnimation.cs に書いてありますが、若干仮組感あり今回もあんまり上手く実装できたとはいいがたいのでお手柔らかに。(これから使用できる命令も少しずつ増やしていければなど…)

ちなみにですが、会話データは色変えと改行タグ(<color=#ffffff>や<br>)が使えます。
操作に関しては、話しかけたり会話ウィンドウ内の決定はEnterキーでできます。


実際に動作してみたやつ。


他にもNPC周りの実装とかネタはあるんですが、今回会話データの命令の処理とかアニメーションする文字列にタグ適応とかで結構消耗してしまったので、そこらへんは次回に回そうと思います🐄


実際動作するアセットフォルダも置いておきますので、アセットフォルダを空プロジェクトに入れれば確認できます。

2022_03_11_Assets.zip (457.35kB)

ダウンロード

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

ものららい 2022/03/04 13:30

Unityでキャラクターを動かしてみた その3

こんにちは🍎

まず初めに、MeshUvControl.csに特定のタイミングで謎のMeshFilterが取得できないエラーが発生してたので、エディタ拡張の形で数値設定できるように修正しておきました。
結局OnInspectorGUIの使い方が微妙に間違ってただけですが、再生時とか終了時とかに余計な処理が走らなくなったので非効率的な初期化チェックがなくなってより良くなったと思います。(今後は気を付けたいですね🐡)
以下本題。


前回前々回でそれなりに動いてたのでもう次のテーマに行ってもいいんじゃないの?的な感じもありますが、一応まだやることあるのでその3やります。


Unity上でキャラをRigidbodyを使用してコライダーの地形判定を行って移動している際に結構悪さしてくるのがコライダーの摩擦設定だったりします。


例として素の状態でZの+方向に移動しつつジャンプした挙動です。

次に摩擦設定をセットして上記と同じ事をした時の挙動です。


自分もよくわかってなかったころは、なんか壁にこすりながらジャンプしてるとオブジェクトが引っかかって気持ちよくなかったりしてなかなか市販のゲーム見たいにならなくって何なんだろ?って思ってもやもやしてましたがコライダーに設定する「Physic Material」の設定を知ってから解決することができました。

Physic Materialって何?って方はこちら。
Unity ユーザーマニュアル 物理特性マテリアル

平たく言うと摩擦や跳ね返りを設定するもので、設定したPhysic MaterialはコライダーのMaterialにセットします。

こんな感じの。

設定を適応させたいコライダーの赤丸の部分にセットすると動作に反映されます。
※今回はわかりやすくプレイヤーキャラにセットしてます。


自分は0.1にしていますが、周りを見渡すと摩擦を0にしている人が結構いますので摩擦の数値はそこの所はお好みで設定するといいです。


とりあえずこれで解決してよかった…!と思ってるとまた新しい不具合が出てきます。(こういうのが精神的につらい…🐄)

具体的には設定した範囲の物体の摩擦が0になるので、物理的な加速、衝突や角度のついた所での落下などで一度ついた加速値が消える事がなくなります。(0.1でも消えきるまでに少しかかる)


摩擦0.1で大体こんな感じ。(0なら止まることなくすぅーっと行きます)

摩擦が無さすぎて坂を上る事も出来なくなり、さらに一度ついた加速値がなかなか消えないので困りますよね。

幸いRigidbodyには現在の速度ベクトルを設定する項目のvelocityというのがありますので、無駄な加速が起きないように設定してしまいましょう。

_rigidbody.velocity = Vector3.Scale(_rigidbody.velocity, Vector3.up);

自分で作っている現状の移動の処理では、移動中にはY方向の加速値以外は必要ないのでY以外は常に物理挙動で加速しないようにしています。


実際に上記の処理を走らせて無駄な加速が起きなくした場合の動作です。
(※自作の移動処理では実際移動の入力が切れたタイミングで上記の処理のあるループが走らなくなるので入力が切れたタイミングで坂を滑ってたりします、ここら辺の加速値の引っ張り感が少し欲しい場合は0にしないで徐々に減るようにvelocityを設定してあげれば引っ張りも残りつつきちんと移動する感じになります)


これで一通りの理想的な動きのするキャラクターの挙動ができたので、次回はこれを使用して別のことをやってみたいと思います。


実際動作するアセットフォルダも置いておきますので、アセットフォルダを空プロジェクトに入れれば確認できます。

2022_03_03_Assets.zip (446.84kB)

ダウンロード

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

ものららい 2022/03/01 12:15

Unityでキャラクターを動かしてみた その2


こんにちは🍎

前回一応ながら歩き回る所まで作成しましたが、機能的にはとてもとても最低限な物だったので今回はそこからもう少しちゃんとしたものに作りこんでみました。


今回使用してるScript一覧です。(※一部省略)
StageCharacter.cs (キャラクター機能の本体)
StageCharacter_Animation.cs (キャラクターの表示を管理する処理)
StageCharacter_Move.cs (キャラクターの移動を管理する処理)


まずざっとキャラクターの機能を機能別に分けました。
別に同じキャラクター関連の処理だし変数の管理も楽だしStageCharacter.csに処理全部書いていいんじゃない?🐫って思うかもしれませんが、後々色んな機能を追加していく中で結構ボリューム増大してくるので可能な限り分けた方がいいと思います。

アニメーションの処理と移動の処理のソースコード見てもらえばわかりますが、まだ大した事してないこの段階で双方150行くらいあるので分けないと色んな機能が混在してきて確実にスパになります。🍝

後機能的に分けることで他のプロジェクトなどで移動処理だけ欲しいなってなった際に、そのままか場合によっては数行の書き換えで使えたりするのでオススメです。


StageCharacter_Animation.cs
上記で説明していますがキャラクターの表示に関してまとめた機能になります。

一部StageCharacter_Moveに依存しているので完全に独立した物ではありませんが、移動状態や待機状態等を判断してキャラクターのアニメーションの切替を行えます。

アニメーションの登録に関してはあらかじめプレハブ化したMeshUvControl_Add_Animationで設定したアニメーションパターンを持つオブジェクトをStageCharacterにあるanimationWaitなどの変数にエディタ上で設定していただければ生成時に自動的にセットされます。


StageCharacter_Move.cs
こちらは前回のStageCharacter.csでやってたことを移したもので前回との相違点は接地の状態を認識したり必要以上に加速したりしないようになってます。

なんで接地判定が必要かというと、ジャンプを行う動きがあった場合に今ジャンプできるか?の確認をしないと空中を蹴って飛び続けることができちゃいますよね、(六式みたいな)それもを防止するのも大事ですが、接地してる確認というのはアクションゲームなどで地面を歩いてる時の減速と空中を移動してる時の減速で差をつけることができるので、ゲーム内の動きに微妙なリアルさを付けることができます。


地上の減速処理のみ

地上と空中で減速の速度を切り替え


見ていただけるとお分かりになりますが接地判定を取って地上と空中で減速を切り替えないとだいぶ違い出ますよね。(この減速に関して一応Rigidbodyの抵抗の設定とコライダーの摩擦設定で何とかする手もありますが、自分的なやりやすさ優先で今回は上記の方法で実装しています。)


あとそれに合わせてキャラクターの地形判定用のコライダーはCapsuleColliderに変更しました。
こちらは主に斜めな床とかや小さい段差の障害物などを上ったり乗り越えたりする際にBoxColliderだとガチっとハマってしまうのでハマらないで多少乗り越えられるように球形な曲線を利用した感じです。

こんな感じでぬるっと超えたりできます。


っと、ちゃんとしようとするとまだまだやる事ありますが、とりあえずここら辺で一度まとめとかないと膨大な記事になってしまうので今回はこの辺で、また次回詰めていこうと思います。


実際動作するアセットフォルダも置いておきますので、アセットフォルダを空プロジェクトに入れれば確認できます。

2022_03_01_Assets.zip (447.08kB)

ダウンロード

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

月別アーカイブ

記事のタグから探す

記事を検索