【Unity】RPGを作るチュートリアルその92 特定のタイル越しにイベントを起動する機能

【Unity】RPGを作るチュートリアルその92 特定のタイル越しにイベントを起動する機能

シンプルなRPGをUnityで作るチュートリアルシリーズの92回目です。

第91回では決定ボタンによるイベントの起動の仕組みを実装しました。

今回はカウンターなどの特定のタイル越しにイベントを起動する機能を実装します。

 

 

制作環境

MacBook Pro 2023 Apple M2 Max

Unity6 (6000.0.30f1) Silicon

 

作業内容と順序

シンプルなRPGを作る上でどんな作業が必要か、どんな順番で作っていくと良さそうか、別ページで検討しました。基本的にこの流れに沿って進めていきます。

 

チュートリアルの一覧

このシリーズ全体の一覧は以下のページにまとめています。

 

前回の内容

前回は決定ボタンによるイベントの起動の仕組みを実装しました。

 

特定のタイル越しにイベントを起動

前回の作業で、決定ボタンによるイベントの起動ができるようになりました。今回はそれを少し拡張して、お店のカウンターなどを飛び越えてイベントを起動する仕組みを実装します。例えば作成済みの村のマップだと、右側のお店ではカウンターが並んでいるので、この向こうにいるおっちゃんに話しかけられるようにします。

移動できないタイルを定義した時と同様に、どのタイルを対象にするのかをScriptableObjectで定義します。「TilemapManager」のクラスでこのファイルを確認して、操作キャラクターの目の前に該当のタイルがあったら、イベントの実行対象のゲームオブジェクトを取得する際に飛ばすRayの距離を1マス分追加します。

これに伴って、タイルを確認する処理やRayを飛ばす距離を変える処理などを追加していきましょう。

 

ScriptableObjectの作成

まずは飛び越えてイベントを起動するタイルの定義を作成します。Projectウィンドウから「Assets/Scripts/Data」のフォルダを開き、空のスクリプトファイルを作成します。名前は [ThroughTileData] にしました。

飛び越えてイベントを確認するタイルのデータ
飛び越えてイベントを確認するタイルのデータ

 

作成した「ThroughTileData」の中身は以下のように記載しました。

メニューからScriptableObjectを作成できるように[CreateAssetMenu]の属性をつけています。

クラス内では飛び越えてイベントを確認する対象のタイルをリストとして保持するようにします。

 

スクリプトを保存したら、Projectウィンドウから「Assets/Data」のフォルダを開き、上記のメニューのパスからScriptableObjectのファイルを作成します。名前はデフォルトの [ThroughTileData] にしました。

ScriptableObjectの作成
ScriptableObjectの作成

 

作成した「ThroughTileData」を選択し、Inspectorウィンドウから机のタイルをリストに追加します。

タイルの指定
タイルの指定

 

既存のクラスの変更

指定したタイルを飛び越えてイベントを起動できるように、以下のクラスを変更していきます。

  • TilemapManager
  • CharacterMover

 

TilemapManagerの変更

「TilemapManager」のクラスでは、今回作成したScriptableObjectへの参照用フィールドを追加して、指定したタイルが飛び越してイベントを確認するタイルかどうかを確認するメソッドを実装します。

フィールドの宣言部にて、既存の「_noEntryTileData」の下に「_throughTileData」へフィールドを追加します。

 

CanEntryTile()のメソッドでは、メソッド内でタイルを取得していた部分をメソッドとして切り出して、上記コード内のGetTilesOnPosition()に移行しました。

IsThroughTile()のメソッドでは飛び越えてイベントを確認する対象のタイルかどうかを判定しています。publicで外部から呼び出せるようにしているので、これを使ってRaycastの距離を切り替えるようにします。

 

CharacterMoverの変更

「CharacterMover」ではRayを飛ばす際に距離を切り替えるメソッドを追加しました。

GetRayDistance()のメソッドでは「TilemapManager」のIsThroughTile()のメソッドを使用して、飛び越えてイベントを確認するタイルかどうかを判定しています。その結果を受けて、該当のタイルであればRayを飛ばす距離を2マス分、そうでなければデフォルトの1マス分を返すようにしています。

GetOtherCharacter()では、distanceの値に直接1.0fを代入していた部分をGetRayDistance()のメソッドを使う形に変更しました。

 

参照のアサイン

Hierarchyウィンドウの「TilemapManager」のゲームオブジェクトを選択し、Inspectorウィンドウから「Through Tile Data」のフィールドに作成したデータをアサインします。

参照のアサイン
参照のアサイン

 

動作確認

スクリプトを保存したら動作を確認します。確認のため、ゴブリンのゲームオブジェクトをカウンターの向こうに配置しておきましょう。リポジトリと同じマップを使っている場合、「Position」の「X」を [13.5]、「Y」を [7.5] にしておくとカウンターの向こうに配置されるかと思います。この部分は必要に応じて調整ください。

ゲームを実行して、カウンターの向こうにいるゴブリンに向かって決定ボタンを押したらイベントが開始されればOKです。

カウンター越しに話せる
カウンター越しに話せる

 

今回のブランチ

 

まとめ

今回はカウンターなどの特定のタイル越しにイベントを起動する機能を実装しました。この仕組みを入れておくことで、カウンター全部にイベントを設置する必要がなくなります。

次回は操作キャラクターが触れた時にイベントを起動する仕組みを実装します。

     

ゲーム開発の攻略チャートを作りました!

CTA-IMAGE

「ゲームを作ってみたいけど、何から手を付けていいか分からない!」


そんなお悩みをお持ちの方向けに、todoがアプリをリリースした経験を中心に、ゲーム作りの手順や考慮すべき点をまとめたe-bookを作成しました。ゲーム作りはそれ自体がゲームのように楽しいプロセスなので、「攻略チャート」と名付けています。


ゲームを作り始めた時にぶつかる壁である「何をしたら良いのか分からない」という悩みを吹き飛ばしましょう!