メインカテゴリーを選択しなおす
ウィザードリィライクのダンジョンゲームを作る!(9):戦闘の流れをつくる。
今回から戦闘、BattleSystemを作っていきます。 基本的な形は、しまづさんの、 youtube.com がベースになっています。 大きな違いは、ソロ戦闘ではなくパーティ戦なので、Player側もEnemy側も複数いるため、かなり処理が複雑になっている事と、各Manager・ControllerとUniRXを使って連携しているところでしょうか。 いわゆる、Model-View-Presenterパターンに似た構造を取っています。(厳密にはちょっと違うけれど・・・) また、しまづさんのyoutubeは、作成時期のせいだと思いますが、Stateパターンの組み方をenumをSwitch分岐して…
ウィザードリィライクのダンジョンゲームを作る!(8):キャラクターの設計をつくる。
今回から戦闘、BattleSystemの本体を作っていきます。 基本的な形は、しまづさんの、 youtube.com がベースになっています。 あたりまえですが、しまづさんのYouTubeは基礎の解説なので、ソロ戦闘です。 自分としては、いずれはウィザードリィみたいに、自由にキャラクターを入れ替えて、 好きなパーティ構成でダンジョンを探索するゲームを目指したいので、 今回作るゲームも、プレイヤー側二人、敵は複数、というパーティ戦で頑張りたいと考えています。 他にも、パーティ戦なので、コマンドを選択したら即実行ではなく、全キャラクターの行動選択→キャラクターの速度順に実行 という形にしていきます…
ウィザードリィライクのダンジョンゲームを作る!(7):カスタマイズ可能なコマンドメニューを作る。
前回までで移動は一段落したので、いよいよ戦闘ができるようにしていきます。 ウィザードリィライクという事で、ターン制のコマンド型の戦闘になるのですが、 そのためには、当然ですが、コマンドを選択するためのコマンドメニューが必要です。 基本形は、しまづさんのYouTube youtube.com の#15で説明されている方法になりますが、 こちらを応用して、汎用性を高めていこうと思います。 尚、 上記のしまづさんのYouTubeシリーズは、一部チャンネルメンバー限定になっています。 『ウィザードリィライクのダンジョンゲームを作る! 』 を書くに当たって、チャンネルメンバー限定部分の内容まで踏み込んで…
ウィザードリィライクのダンジョンゲームを作る!(6):壁判定と扉を開ける仕組みを作る。
今回こそは壁判定と、扉を開けるところまで進みます。🤣 というか、実はほぼ基礎的な仕組みはできていて、要は、特定の座標がなんなのか調べる仕組みを描画に使うのか、移動判定に使うのか。という違いなだけです。 移動する方向・移動先の座標が必要になるのは、前々回くらいの通りです。 なので流れとしては、PlayerController-classで、移動方向や移動先を計算しているWalk関数と、移動に関する描画と消去・実際の移動を行っているWalking関数との間に、壁チェックの関数を追加するイメージになります。 public void Walk(float y) { if(y > 0.4f) { tar…
ウィザードリィライクのダンジョンゲームを作る!(5):ステートパターン導入
前回で、ダンジョンの描画範囲の仕組みまで作成できたけれど、まだ壁や扉お構いなしにどんどん貫通して歩けてしまう🤣 ので、そろそろこれを解決しておこうと思いましたが、 まずはPlayerController-classでしか使っていなかったInputSystemを、今後のためにManagerを作って独立させるのと、 ついでに、習ったばかりのStateパターンを、PlayerController-classに組み込んでおこうと思います。 今後、戦闘やらなんやらで、InputSystemはあちこちのclassで使うようになりますし、PlayerController-classとDungeonManag…
ウィザードリィライクのダンジョンゲームを作る!(3):複数のObjectPoolをまとめて管理しやすくする。
ウィザードリィライクなゲーム作成。 今回は複数のObjectPoolをまとめて管理しやすくする方法を紹介します。
前回でダンジョンの基本の描画はできたので、今回は更に描画範囲を広げて、よりダンジョンらしくしていこう。 描画範囲を広げるにしても、要は、基本の描画をfor文で回していけば良い。 using UnityEngine; public class DungeonBuilder : MonoBehaviour { public DungeonMap map; [SerializeField]GameObject wall; [SerializeField]int drawingSize;//初期位置の東西南北をどれくらい描画するか void Start() { map = new DungeonMap…
スタジオしまづさんのハイクラスを受講して、ダンジョンの自動生成のやり方を学んだことで、 unityを勉強しようと思いたった元々の目標、ウィザードリィの様なゲームを作ってみたい。という思いが強くなってしまった。 一応、unityを始めて一番最初にダンジョンゲームは作って見たのだけど。。。 https://unityroom.com/games/dungeon20230726 c#を全く知らない状態で、見様見真似で作って見たけれど 狭いダンジョンなのに処理が重い。 コードは無駄が多く、同じ処理を何度何度も書いている始末。 おまけに、プレイヤーがちょっと想定外の操作をすると、簡単にすぐバクる。と散々…
昨日の実験をしただけでずいぶんUniRXへの理解が進んだ気がする。 ・・・気がするだけだけど😅 今までは、変数を通知してくれるのがUniRXだと、漠然と思っていたけれど、 それはむしろ副産物で、本質はイベントを作ることができ、任意のクラスでそれを購読して イベント駆動型のプログラミングを可能にしてくれるという方がいいみたい。 今日は、昨日の@toRisouPさんの記事の qiita.com を実験してみた。 昨日は文字列を通知するSubjectだったけれど、今日は特に値を持たない、イベントとして通知だけを行うUnit型の実験 まずは通知側 using UnityEngine; using R3…
「UniRX/UniTask完全理解」(ISBN-10:4048930753) ちょっと前に買ったまでは良かったけれど、いかんせん素人には難しくて理解しきれず、完全にほったらかし状態😅 今回、R3の実験をしていて興味が湧いたので、今更ではあるけれどUniRXをきちんと勉強してみようと思う。 今の所の理解は、UniRX(R3)でできるのは、変数の変化を通知できるという程度。 変数をReactiveProperty化することで、値が変わった事を購読側で検知できる様にできる。 ただ、これは、UniRXの全てなわけではないらしい。 というわけであっちこっちのサイトや動画にあったものを実験してみようと思…
UniRXを現代に合わせてより洗練した形に再定義・再実装したR3。 ただ、素人向けの情報がまだまだ少なく、ちょっとした事をするのも苦労する有様です。 配列変数の変化を購読したかったのですが、ちょっと、いやだいぶん苦戦したので、 備忘録として残しておきます。 UniRXでは、配列変数もReactiveCollectionでObservableでき、Observer側(購読する側)は ObserveReplace().Subscribeで通知を受け取る事ができました。 ところが、R3環境では、ReactiveCollectionがなくなっているので、他の方法を使う必要があります。 色々と実験したの…
α版のデバッグをしよう(バグの原因特定と解決②):3Dアクションゲームを作ろう(21)
敵に勝利しジェムを取り戻せ!、3Dアクションゲーム作成中。 α版のデバックをしよう!
プレイヤーを誘導しよう!案内役の導入。:3Dアクションゲームを作ろう(19)
敵に勝利しジェムを取り戻せ!、3Dアクションゲーム作成中。 案内役の導入。プレイヤーを誘導しよう。
ここ最近は、ブログを書ける進捗すらもないほどに、ずっとTimelineに悩まされていていました😅 どうにかこうにか形になってきたので、備忘録も兼ねて、まずはドロップダウンリストについて纏めておこうと思います。UnityにもUIとしてドロップダウンが搭載されてはいるけれど、使ってみると案外設定が解りにくい。 ドロップダウンを紹介しているサイトは数多くあるけれど、肝心な箇所の説明がなかったり、足りなかったりしたので、 あっちこっちのサイトから情報をかき集めてくる必要があった。まずは、標準的なドロップダウンリストといえば、こんなイメージだけど フォントや表示エリアの設定が、それぞれ別のObjectに…
TimelineでAnimationClipを動作させる時の問題点と解決策:3Dアクションゲームを作ろう(18)
敵に勝利しジェムを取り戻せ!、3Dアクションゲーム作成中。 TimelineでAnimationClipを動作させる時の問題点と解決策
カーソルでボタンを操作しよう!:3Dアクションゲームを作ろう(17)
敵に勝利しジェムを取り戻せ!、3Dアクションゲーム作成中。 設定画面の作成(2)カーソルでボタンを操作できる様にする。
Audio Mixerとスライダーの連携:3Dアクションゲームを作ろう(16)
敵に勝利しジェムを取り戻せ!、3Dアクションゲーム作成中。 設定画面の作成(1)AudioMixerのボリュームをSliderで調整。
ゲームの顔になるタイトル画面をつくろう(2):3Dアクションゲームを作ろう(15)
敵に勝利しジェムを取り戻せ!、3Dアクションゲーム作成中。 Timelineでオープニングムービー作成。
ゲームの顔になるタイトル画面をつくろう(1):3Dアクションゲームを作ろう(14)
敵に勝利しジェムを取り戻せ!、3Dアクションゲーム作成中。 ゲームタイトルの決め方。キーボードで操作できるメニューの作り方。
ドラゴンの吹っ飛ばし攻撃修正: 距離によって影響具合に変化をつける:3Dアクションゲームを作ろう(12)
敵に勝利しジェムを取り戻せ!、3Dアクションゲーム作成中。 衝撃波の修正〜
3Dアクションゲームを作ろう(11):ドラゴンの作成継続中:プレイヤーを引き離す技を作成
敵に勝利しジェムを取り戻せ!、3Dアクションゲーム作成中。 今日はドラゴンを作り込みました。衝撃波実装!
3Dアクションゲームを作ろう(9):GameOverの実装(1)水に落ちたらGameOverにする。
敵に勝利しジェムを取り戻せ!、3Dアクションゲーム作成中です。 今日は川に落ちた時の処理を作成しました。
3Dアクションゲームを作ろう(8):PostProcessingとフリーのテクスチャを使用して雰囲気を格段に良くする。
画面イメージ改良!Post Processingとフリーテクスチャでゲームの雰囲気を改善しよう!
しまづさんのUdemyを参考にして、攻撃コンボを作る過程でスタミナを作り込んだ。 こうなってくると、そろそろただの四角形で作ったHPとスタミナのバーが不恰好に見えてきたので、UIを作り込んでおく事にした。UIはアセットストアで、一眼見て、雰囲気がとても気に入ったSteampunkUIを使っている。 assetstore.unity.comスチーム関係ない世界観のゲームだけど、そこは気にしない🤣 雰囲気が良ければいいのだ😆右上は3Dアクションゲームを作ろう(6)で作成したレーダー画面。 ただ、普通に映しただけでは縁もない状態で見栄えが悪いので、Render Textureを使ってUIのRaw I…
unityroom.com橋広コウさんも、同じく流星咲斗さんの動画シリーズで勉強して作品を公開されたので、早速遊んでみた。 その作品の中で、敵レーダーがあったのが、とても便利で感銘を受けたので、自分でも作ってみる事にしました。まず、レーダー用のカメラを作成し、Player Objectの子供に設定する。 レーダー用のカメラは、ある程度の高度のプレイヤーの真上から、プレイヤーを撮影するようにする。 次に、その映像を同時にゲーム画面に表示させるのだが、これは調べてみると、案外簡単に設定できた。ただ、これだと、単に上空からの映像になってしまって分かりにくかったので、レーダーに映るObject(Pos…
流星咲斗さんの【3Dアクションゲーム】作り方。 動画シリーズでの勉強は今日の#15 『敵をロックオン』で最後。 まだ、 #11 『ゲームオーバー表示を実装』 #13 『制限時間の実装』 #14 『スコアを作る』 #16 『ゲームを 書き出す』 といくつかの動画はやっていないけれど、サイドビューアクションゲームで学んだことと 重なる部分と思えたのでパスした。さて、#15 『敵をロックオン』 www.youtube.com3DARPGを遊ぶには是非とも欲しい機能だ🤩作り方もそれほど難しくなく、サクッと実装する。 これで、一応ロックオン機能の完成ではあるのだけど、 敵をロックオンしていると、カメラが…
流星咲斗さんの【3Dアクションゲーム】作り方の続き〜今日は、 #9 『プレイヤーのHPの実装』 #10 『敵をウロウロさせる』 #12 『地形を変える』 を学習。#11 『ゲームオーバー表示を実装』については、 見た感じ、ほぼほぼサイドビューアクションゲームと同じ感じだったので、飛ばした😁あとは、#13 『制限時間の実装』、#14 『スコアを作る』、#15 『敵をロックオン』、#16 『ゲームを 書き出す』 だけど、 #13、#14、#16は他のゲームと同じ感じっぽいので、飛ばすと思う😁#15はぜひやりたいので、明日これをやって、あとは自己流に修正していく感じかな〜といっても、実はもう相当、自…
今日は、流星咲斗さんの【3Dアクションゲーム】作り方の #8 『HP(体力)』これもシューティングゲームやサイドビューアクションゲームで散々作ってきたHPバー。 3Dでの実装は初めてだったが、基本的な構造は同じだった。ただ、HPバーの向きが敵と同じ方向になってしまうため😅、見辛くて仕方がない。 これについては研究の必要がありそうだ。あとは、敵を攻撃した時があまりにも寂しかったので、攻撃がヒットした場所にエフェクトを表示させるようにしてみた。OnCollisionEnterとOnTriggerEnterで衝突座標の取得方法が違うようで、 OnTriggerEnterだと、こんな感じらしい。 Ve…
今ひとつサイドビューアクションゲーム作りのきぶんが乗らないので、新しいゲームの作り方を勉強することにした😅 飽きっぽいのが、僕の良くないところ🤣youtubeで再生リストでまとまっているのを見つけたので、流星咲斗さんの【3Dアクションゲーム】作り方を勉強してみよう。 www.youtube.com今日は、 #1 『移動できるようにしよう!』 #2 『アニメーションの切り替え方法』 #3 『敵を出す方法』 をやってみた。基礎の説明ではあるけれど、人によってスクリプトの書き方が違っていて、これはこれで勉強になる。 それにしても、アセットをそのまま使うのでよければ、3Dフィールドを作るのがこれほど楽…
Playfabでのランキング実装の続き。あのあと、色々と実験していて判ったことだが、 var guid=System.Guid.NewGuid(); でのGUID生成は、毎回起動のたびに行われるので、今のままでは起動するたびに、Playfabに新しいアカウントが登録されてしまう。 これは流石に都合が悪いので、ゲーム起動時のランキング取得は管理者用のアカウントで行い、ランキングインした時だけプレイヤーアカウントを生成するようにした。 これで、無数にアカウントが生成されるのを多少は制限できると思う。ゲーム終了時に今回のスコアと、取得しておいたランキングのスコアを比較してランキングインしたかどうかを…
前回も書いたけど、ニフクラでのランキングはどうにも、しっくりこなかったので、Playfabでのランキング実装をやってみることにした。まずはPlayfabのアカウント登録だが、僕の環境では普通に検索すると、AzurePlayFabが先頭に来てしまうが、とりあえずこれは別物。 PlayFabのアカウント登録は、ここになります。https://developer.playfab.com/en-us/sign-up利用料金は非常に難解で、僕には理解しきれませんでしたが、オンラインサロンの皆に聞いた限りでは、料金請求された事がないそうなので、そこまで気にする事はないのかも。 むしろ、料金発生するくらい遊…
スタジオしまづさんの1Wゲームジャムへ作品を出展しました😆unityroom.com皿割りシューティングです。 今まで学んできた要素を詰め込めるだけ詰め込んでみました。 InputSystem でキーボードでもマウスでもコントローラーでも遊べるようにできました。 ちょっと操作しづらいけどスマホでも遊べちゃいます。皿を割った時に出る時の得点表示は、最後まで苦労したところ。 何せ、今まで3DでUIを使ったことがなくて、座標をどういうふうにしたら良いのか分からない。 nekojara.city を参考にやってみたけれど、なぜかUIの座標が桁違いな値になってしまう。 ちょうど、今週の水曜が、しまづさん…
皿割りゲームを作っていて、どうにも不満が。弾の速度が遅くて、どうしても弾を撃つタイミングが難しい。かといって弾を早くすると、colliderの判定が間に合わず、貫通してしまう問題が発生してしまう。Rigidbodyの衝突判定の設定を変更する方法もあるみたいだけど、どうせなら、いっそcoliider判定をやめてRaycastで判定することにしてみた。 RaycastHit[] hits; private void Shoot() { //表現として弾を発射する。 GameObject _bullet = Instantiate(Bullet,transform.position,transfor…
しまづさんの1Wゲームジャム。 www.youtube.com決められたテーマに沿ったゲームを一週間で作成するイベント。前回のUnityroomのジャムは、まだ勉強不足だったから断念したんだけど、今回は参加することにした。 テーマは「割る」 発表の瞬間に湧いたイメージは、皿🤣ということで、サイドビューアクションゲームは、ちょっとお休みして、皿割りゲームを作ってました。youtu.be勢いに任せて、ここまで作りました😆ざっくり作った様で、今まで学んできた要素が結構ちりばめられてます😁 InputSystemでキーボード、ゲームパッドにも対応させてます✌️ あとちょっと微調整して完成かな〜 時間制…
サイドビューアクションゲームを作ろう(14):遠隔攻撃してくる敵
レベルアップもできる様なったので、罠をサクッと作成。youtu.beこの辺りは特に悩む事もなく実装できる様になったのが嬉しい😄 ダメージをあたえるダメージトラップと、一撃死のデストラップを作成する。 とりあえず、現段階では動作はアニメーション機能に任せることにした。次は遠隔攻撃してくる敵。 実はこれも、そんなに悩まずに実装できた。 基本の動きは他のEnemyと同じなので、他のEnemyのスクリプトをちょこちょこっと改造するだけで良い。 違うのは、遠隔攻撃の矢を生成してやるのと、生成時のEnemyの向きに応じて、矢の向きを変える事、そして、矢の方向に動かしてやること。まず、アーチャーのスクリプト…
サイドビューアクションゲームを作ろう(13):レベルアップ(下書き)
アイテムに引き続き、レベルアップ機能を作成した。 といっても、エフェクトなどはまだ勉強していないので、とりあえず今日のところは下書き状態に留めた。レベルアップだけならば簡単で、要は経験値が、次のレベルに必要な分量溜まっていたら、経験値を0化して、各ステータスを上昇。次のレベルに必要な経験値を更新してやれば良い。Item ManagerでアイテムやEnemyの経験値加算処理するように組んでいるが、 これだと、Item Managerで経験値管理までしなくてはならない。 なので、レベルアップの処理は、EXPバーのPlayerEXP_BarとGame Managerに任せる事にした。EXPバーに任せ…
サイドビューアクションゲームを作ろう(12):アイテム生成完成
ブログへのスクリプトコードの記載方法だけど、迷い迷って、結局、はてなブログの特権である、「はてな記法」に頼る事にした。 もっといい方法が見つかれば、そっちに変えるかもしれないけど、しばらくはこれでやってみようと思う。 さて、サイドビューアクションゲームの続きだけど、暫定だったアイテム生成を完成させた。ちょっと悩んだけど、ScriptableObjectのEnemy Data Tableに、それぞれのEnemyのアイテム出現率を設定した。 敵を倒したタイミングで、EnemyからItem ManagerにEnemy Noを渡し、 Item Managerは受け取ったEnemy Noを使って、Ene…
今日は昨日作成したアイテムに効果を実装する。 昼間のうちに考えておいた構想は、ざっくりと、こんな感じ。 ・ItemGeneratorをItemManagerに改名・アイテムの効果の分類を作成・ItemDataのScriptableObjectにアイテムの効果分類と効果数値を追加。・アイテムを取得した時、ItemManagerのGetItemメソッドで処理するようにする。・ダメージ表示の仕組みで、アイテム効果を表示させる。 ItemManagerの改名やら、ScriptableObjectの改造やらはサクッと完成したけれど、ダメージ表示の仕組みでアイテム効果を表示させるのが、何気に大改造だった。…
敵に倒され、敵を倒しと、できる様になったので、次は敵を倒した時にランダムでアイテムを出す機能を実装する事にした。 ぼんやりと考えていたのが、ItemDataを作っておき、そこにGameObjectを格納しておく。 敵を倒したタイミングで、ItemGeneratorが、乱数で出現アイテムを決め、ItemDataからGameObjectを取得してきて、敵の位置にInstantiateさせる。 倒した敵によって出現しやすいアイテムを決めてやれば、雑魚からは雑魚いアイテム、中ボスからは良いアイテムを出しやすくさせることができるだろう。 ItemGeneratorは他のステージでも使い回すためにシングル…
サイドビューアクションゲームを作ろう(9):UnityActionでHPバーを制御する。
敵を倒せる様になったので、今度はプレイヤーも倒されるようにした。 Sliderを使ったHPバーはシューティングゲームで作成した事があるので、今回はSprite Rendererを使った方法。 基本的な方法はSliderと同じ。Sprite Rendererはlocalscaleを変化させてバーの増減を表す。 作ってみた感じ、自分としては、Sprite Rendererの方が扱いやすく感じた。 さらに、今回は以前から実験をしようと残課題にしていた、Unity Actionを実装してみた。 HPバーの更新をUpdateメソッドから切り離すための実装である。 プレイヤー側のスクリプト(今回の話題に関…
サイドビューアクションゲームを作ろう(3):落下判定と敵の実装
どのようなサイドビューアクションを作るか、おおよそのイメージが固まってきた。 昨日までのプレイヤーでは、ちょっとイメージと違うので、プレイヤー用のアセットを、Hero Knight - Pixel Artに変更。 れーさんの、最初は下書きで作成する。という、教えに背いたから、いきなりのこのやりおなしである😅 ・・・でも、まぁ、イメージって大事だし😆(反省してないw) アニメーションも、最初から作り直しになったけど、ちょうどいい復習になったから、これはこれで良しとしよう🤣 で、昨日のMedieval Warrior Pack 2にも、Hero Knight - Pixel Artにも落下中のスプ…
サイドビューアクションで、ちょっとした困り事ができたので、それを調べる間、ScriptableObjectの実験をする事にした。 ScriptableObjectというのは、要は、シーンやスクリプトとは別扱いの、データベースのようなものらしい。 例えば、ある種類、仮にスライムが、スライムA ・スライムB・スライムC・スライムD・・・と多く存在するとして、そのスクリプトにMaxHPと処理用のhpの2つの変数を記載すると、それぞれのスライムのスクリプトに、MaxHPという同じ変数が存在する事になるため、メモリを無駄に消費してしまう事になる。 そこで、共通の数値であるMaxHPは、他のデーターベース…
サイドビューアクションゲームで、攻撃判定を作ろうとして、はたと困った。 武器にColliderをつけて、敵にぶつけ、敵のダメージメソッドを呼ぶためには、敵のスクリプト名が必要になる。 ところが、敵が一種類ならともなく、何種類も敵がいれば、当然、敵のスクリプト名も変わってくる。 例として、SlimeにSlime Managerスクリプトがあり、ここにダメージ処理用メソッドOndamageがある。 BanditにはBandit Managerというスクリプトがあり、ここにもダメージ処理用のOndamageがある場合、 Colliderがぶつかった敵のスクリプトのOndamageメソッドを呼ぶために…