としるみSoftの制作ブログ

主に作っている作品の紹介や今やっている活動の紹介を書いています。おすすめポイントですらなくなっちゃった。

(UnityLearn)Adventure Gameを作ってみた1

どもです、としです。

前の更新で言っていたUnityLearnを今週から始めてみます。

やる項目はこちらです。

learn.unity.com

 

 

1.導入

learn.unity.com

UnityLearnの項目は推奨エディタのバージョンが2019か2020が多い印象がありますが、

この項目は2022を使うみたいです。

なので今回使用したバージョンは2022.3.2f1になります。

バージョンによってはアセットの導入方法が違うので、慣れない場合は絶対にバージョンは揃えた方がやりやすいです。

またUnityLearnはUnityHubの導入が前提なので、インストールしていない場合はまずは入れましょう。

チュートリアルではコース資料のファイルを手に入れて、サンプルを動かしましょうと記載されています。

が、チュートリアル内で手に入れられるファイルでは

記事に書いてある通りにプロジェクトの追加をしても無効になりますし、

そもそもパッケージファイルなので何とかする必要があります。

新しいプロジェクトを作成して、パッケージをインポートするとファイルがコピーされました。

ただ、肝心のサンプル用のシーンは入っていませんでした。

 

実際の中身

チュートリアルを見ていると説明不足になっていて補足をすると、

このパッケージファイルは実際にこの後に制作するためのアセットになります。

サンプルをプレイせずにチュートリアルを進める場合はこのアセットのみで大丈夫です。

 

それでもサンプルが遊びたい方のために方法を書いておきます。

まずはアセットストアに行き、今回のサンプルアセットをマイアセットに追加します。

assetstore.unity.com

その後UnityHubでサンプル用のプロジェクトを作成します。(2Dで)

プロジェクトを開いた後、Window->PackageManagerを開きます。

ここを押す

MyAssetを選び、さっき追加したサンプルアセットを選択してインポートします。

インポートが終わってからチュートリアルの画像のパスをたどると、

サンプルのシーンが見つかります。

これで、サンプルは遊べます。

 

2.キャラクターを作成

learn.unity.com

前にRuby'sAdventureの項目をやったのでほぼここの項目は復習になります。

基本的にキャラクターを配置して、動かすプログラムを書く項目でした。

 

まずはUnityHub上でプロジェクトを作成します。

2Dで作成するのでタイプは2Dゲームを選択して、わかりやすい名前を付けて作成すればエディターが開けます。

(アセットまわりの関係で導入の時点で終えています。)

最初にシーンを作成するようにと書いていますが、

前に読んだ本などではSampleSceneの名前を変更しても大丈夫だったので、

この辺は自分の好みで大丈夫そうです。

 

次のステップではアセットのArt->Ruby->PlayerCharacterを配置して、

位置の確認をしていました。

その後はカメラの確認をしていました。

この辺はまだまだ基礎の部分です。

 

次はキャラクターを動かすスクリプトを書く項目です。

まずはScriptディレクトリを作成して「PlayerController」ファイルを作成することからスタートです。

始めはx軸に対してどんどん右に行くプログラムを書きました。

位置を読み込んで計算して、代入するだけの簡単なプログラムになりますが、

自分の言葉でやっていることを読めるようにしておいた方が後々楽かもしれません。

Unityではプログラムを書いただけでは動かないので、

必ずそのコードを使用するオブジェクトにアタッチする必要があります。

この状態であれば大丈夫

確認や応用を試して納得できれば次に進みます。

 

3.タイルマップ

次のステップは地形用の画像データをタイルマップにして、

クリックで簡単に画像を配置していこうという内容でした。

まずは下準備としてHierarchyで右クリックして2d->TileMap->Rectangularを選択して、

タイルマップを置く下地を作ります。

タイル制作用にディレクトリを作成して、右クリックをして2DからTiles->RuleTileを選択して作成しました。

その後アセット内にあるTile1を作ったRuleTileにアタッチして使えるようにします。

Selectをクリックして画像一覧から探す

その後Windowから2D->TilePaletteを探して開いて、

NoValidPaletteのところからCreateNewPaletteをクリックして新しいパレットを作成します。

新しいパレットをさっき作ったTilesディレクトリに保存してから、

使えるようにしたタイルをドラッグドロップしてタイルパレットに貼り付けます。

同じようにもう1つもやる

何もないとわかりにくいですが、貼り付けるのはちょうど画像でタイルが表示されている部分です。

前にやったのは1つの画像を特定の大きさで区切ってタイルパレットを作っていたのですが、今回はまずはこの方式なのかもしれません。

あとはステップの通りにタイルを置いていきます。

このままではサイズが合わないので、ステップ通りに画像のサイズを修正して調整します。

タイルは置けた。キャラは隠れた。

タイルは置けましたがキャラクターは隠れたので、次はレイヤー調節を行いました。

2Dゲームは要するに紙の上に絵をいくつも重ねていく表示方法なので、

画像の順番を決める必要があります。

ステップ通りにタイルマップを下に、キャラクターを上にすればキャラクターが表示されます。

 

4.キャラクターを操作する

今まででしたら入力はUnityの基本機能でコードを入れていたのですが、

(復習しないとかなり抜けてしまっている)

このステップでは入力は「InputSystem」のパッケージを使って製作するみたいです。

パッケージのインストールはWindow->PackageManagerから探して行えば大丈夫です。

探すのに苦労した

初期画面ではプロジェクトにインストール済みのパッケージしか表示しない場合もあるので、よく探せば大丈夫です。

このパッケージは入力のコードを楽にできるようにできていて、

以前の方法に比べて比較的少ない労力でまとめることができるらしいです。

(最後にちょっとまとめてみる。)

前に入力したコードの始めのUnityEngineの後にusingでInputSystemを組み込めば、

(上に同じような並びがあるのでそこに書けば、問題なし。)

今後このコードのファイル内ではInputSystemは使えるようになります。

入力するコードは右を押せば水平値が+1.0、左を押せば水平値を-1.0にするようにして

前に作った座標変更に掛け算することでどちらに進むかを決めています。

 

チャレンジとして垂直方向を自分で入力してみようというステップがありますが、

horizontalをverticalに変更しxをyに変更、キーを上下に変えれば問題ないです。

positionはVector2ですでにyも作られているので、Vector2の初期化は1つだけで大丈夫です。

 

5.入力を最適化する

今の状態だとコントローラを使ったときなどに反応しないし、実装のために多くのコードを書く必要があるそうです。

これはとてもめんどくさいのでInputSystemの機能であるInputActionを使って、入力を最適化するのがこのステップみたいです。

 

ステップではまずPlayerControllerにpublicでInputAction型のLeftAction変数を用意して、

(public変数はStart関数より先に書く)

Inspector上のLeftActionの設定変更(歯車)でActionTipeをButtonに変更しました。

その後+を押してKeybindingを選び、対応するキーバインドを追加します。

新しいキーバインドをダブルクリックして対応するキーを入力すれば完了です。

キーを検索する時にListenボタンをクリックしてボタンを押すと押したボタンが表示されるので、これをうまく使うと検索できるようです。

これで左キーを押すとLeftActionがtureになるので条件分岐に使えるようになるので、

左キーを押したときの条件文をLeftAction.isPressed()に変更することができます。

しかし、これではキーの方向ごとにpublic変数を作らないといけないので、

コードは長くなるし手間もかかります。

そのため次のステップでひとまとめにする方法が説明されています。

 

新しく先ほどと同じようしてMoveAction変数を作成し、Inspector上にあるMoveActionの設定のActionTypeがValueになっているのを確認します。

(前はボタンが押されたかどうかだったけど、今回は値を取得するみたい。)

次に入力するボタンを追加するのですが、ここではAdd Bindingではなく、

Add UP,Down,Left,Right Compositeを追加するみたいです。

間違えないように

その後、対応するボタンを設定することで、キーバインドを設定できます。

設定が出来たらコードを記入します。

まず、Start関数でMoveActionを有効にするためにMoveAction.Enable()と記入します。

(説明だけで済まされていたので、書くのが分かりにくかった。書かないと動かない。)

その後のコードはmove変数はMoveActionの値を読み込み、

position変数に次フレームの位置を計算してtransform.positionに代入しています。

これで実行すると前と同じように方向キーでキャラクターが動きます。

この状態だとキーはInspectorで増やせるし、コードも短くて済むようになるという感じです。

 

6.フレームレートを調整する

特にPCで遊んでもらう時にはユーザーのマシンスペックによっては、

フレーム飛びが発生してゲームが遊びにくくなります。

このステップではフレームレートを調整して、パフォーマンスの改善を行うみたいです。

フレームレートについては他で調べていただいた方が分かりやすいです。

簡単に言うと1秒間に何枚絵を更新するかという感じです。

始めに提示されているコードをStart関数に入力すると、フレームレートが10fpsに固定されます。

この状態だとすごく遅く感じます。

(垂直同期を無くして、フレームを10に固定する感じ)

ただ、少なくとも前のコードに比べるとちょっと押しただけで猛スピードで行くことは無くなりました。

フレームレートは可変するものなので、固定にせずハードウェアに合わせて変化させるようにした方がパフォーマンス的にもいいです。

次のステップではキャラの移動に「Time.deltaTime」をかけるコードに変更しています。

Time.deltaTimeはUnityがフレームレートを次のフレームまで更新する時間を格納していて、かけることによってフレームレートに合わせることができるみたいです。

(詳しい説明はリファレンスを参照)

この状態だと1フレームに対して0.1しか進まないので、すごく遅い移動になります。

なので、移動の0.1fを3.0fに変更して速度を上げました。

 

ここまででチュートリアルの2章分まで終えることができました。

 

7.(やってみた)入力方法の違い

このチュートリアルでは入力をUnityの基本機能ではなく、

基本追加パッケージのInputSystemを使って書きました。

2019などのバージョンやそのぐらいを扱った書籍などでは基本機能で書いているので、

違いやコードの長さを分かる範囲でまとめてみます。

InputSystemの方は長い最初のやつではなく、最後にやったMoveActionの方で考えます。

 

基本機能ではProjectSetting内のInputManagerでまずキーバインドなどは設定でき、

Input.GetAxis()でキーの情報を読み込みます。

この時垂直と平行は別々で読み込む必要があり、ちょっとだけ長くなりますが気になる程度ではないです。

設定できるキー数は見た感じ少ない気がします。

InputSystemは始めにpublic変数を設定することでエディター内でキーを設定することができるようにしています。

キーバインドを視覚的に設定できるし、複数設定できます。

うまくいけば同じコードで複数の操作体系が組めることができそうですが、

Start関数で有効にしないといけないや設定がややこしそうという手間が感じられます。

リファレンスをもうちょっと熟読すればInputSystemの方が利便性が高いような気がするので、

今後の制作では環境に合わせて実装してみるのもいいかもしれません。

 

まとめ

項目は変わっていますが、ほとんどやることは前にやったRuby'sAdventureのチュートリアルと一緒でした。

 

toshirumisoft.hatenablog.com

この時とどのぐらい違うか、もしくはあっちこっち言っていることが変わっているかわかりませんが、

(あんまり過去記事を見直さないので)

とりあえずは最後まではやっていきます。

ただ、InputSystemについて新しく知ったのでこれはいい感じです。

うまく使えば操作の切り替えを瞬時にできそうな気もするので、

使い方はちゃんと覚えたいところです。

次は地形の配置と当たり判定になるみたいなので、

この辺はたぶんほぼ前の復習になりそうです。

 

この記事は下書きでやった日に書いていった感じですが、

記事自体は木曜日あたりにできていました。

必ず土曜日に更新ということで今回は土曜日に投稿しましたが、

別に不定期+定期更新でもいいと自分でも前に決めていたので、

次回の分からは勉強した分の内容は不定期で更新します。

どっちにしても定期更新の近況報告で伝えたいことも別に出る可能性は高いので、

内容を分けて投稿できるようにします。

 

ということで今日はこれにて!

では!