|
執筆バージョン: Unreal Engine 5.7
|
こんにちは!
みなさん、釣りは好きですよね!?
今回は、簡単な釣りゲームを作ってみましょう!
その1の完成イメージはこちら!
それでは早速つくってみましょう!
必要なブループリントを用意
コンテンツブラウザを右クリックして、「ブループリントクラス」→「アクタ」を選択し、「BP_FishingRod」を作成します。
同様に、エサのアクタ「BP_Bait」と、釣りをする池のアクタ「BP_Pond」を作成。

釣りざおの作成
BP_FishingRodをダブルクリックで開いたら、釣りざおのメッシュを追加していきます。
スタティックメッシュコンポーネントを追加し、「RodMesh」と名前を付けます。

RodMeshをクリックし、右側の詳細パネルでトランスフォームの「回転」を(0.0, -30.0, 0.0)、「拡大・縮小」を(0.05, 0.05, 1.5)に変更します。
スタティックメッシュを「SM_Cylinder」に変更します。

そしたらコリジョン → コリジョンプリセットをCustomに変更し、Pawnのコリジョンを無視するように変更します。

これが竿になります。
次は釣り糸をつくっていきます。
RodMeshを選択した状態で追加ボタンを押し、ケーブルコンポーネントを追加して「String」と名前を付けます。

追加したら、詳細パネルで以下のように変更します。
- 位置:(0.0, 0.0, 100.0)
- End Location:(0.0, 0.0, 0.0)
- Cable Length:50.0
- Enable Collision:True

釣りざおをプレイヤーキャラクターに持たせる
釣りざおの見た目ができたのでプレイヤーキャラクターに持たせて確認してみましょう。
すべて/コンテンツ/FirstPerson/Blueprintにある、BP_FirstPersonCharacterを開き、矢印コンポーネントをFirstPersonCameraの子に追加します。
名前を「RodPoint」とし、位置を適切な場所に変更します。

イベントグラフを開き、画像のようにBeginPlayからBP_FishingRodをスポーンしてRodPointにアタッチする処理を実装します。

ここまででプレイしてみると、このような感じになっているはずです!
釣りエサをつけて投げる機能をつくる
ここまでできたら、次は「BP_Bait」を開きます。
BP_Baitには、球のコンポーネントを追加して「BaitMesh」と名前を付けます。
スケールを(0.1, 0.1, 0.1)に変更し、好きな色のマテリアルを割り当てます。

一旦はこのままでOKです。
BP_FishingRodにもどり、必要な変数を作成します。
- IsFishing:釣り中かどうかの判定用のBoolean型の変数
- DefaultRotation:通常時の釣りざおの角度を取っておくRotator型の変数
- CastRotation:キャストしたときの釣りざおの角度を指定するRotator型の変数
- CurrentBait:現在使用しているエサのアクターを参照するためのアクタ型の変数

ブループリントのイベントグラフを開き、釣りを始めるためのカスタムイベント「Start Fishing」を下の画像のように作成します。
タイムラインで竿の向きを動かし、終わったタイミングでエサを出して飛ばし、釣り糸の長さを伸ばす処理をしています。

追加するタイムラインは、長さ0.3秒かけて、Floatが0.0から1.0になるように設定しています。
呼び出している関数「Spawn and Attach Bait」と「Launch Bait」の中は画像のようになっています。
- Spawn And Attach Bait関数では、BP_Baitをスポーンし、メッシュを釣り糸の終端にアタッチしています。

- Launch Bait関数では、BP_Baitのメッシュの物理を有効にし、インパルスをかけて発射しています。

次は、釣りを終了するイベント「End Fishing」を下の画像のように作成します。
このイベントでは、竿をタイムラインで引き上げて、終了したらエサを消して釣り糸を竿に戻す処理をしています。
こちらのタイムラインも0.3秒かけてFloatが0.0から1.0になるようにつくっています。

また、開始時点の竿の回転をDefault Rotationに格納する処理と、釣りざおの状態をみて釣りを開始するまたは終了するイベントも実装します。

BP_FirstPersonCharacterを開き、左クリックをしたら上で作成したOnActionイベントを呼び出すようにします。

ここまででプレイするとこうなります!
左クリックで投げて戻せます。
釣りができる池の作成
釣りざおがあったら、釣り堀が必要ということで作成していきます。
まずはBP_Baitを開き、魚がかかった時のイベント「OnTookBait」を実装します。
Vector型変数BaitStartLocationを作成し、タイムラインでピクピク動かしています。

タイムラインの中はこんな感じにしています。

つづいてBP_Pondを開き、スタティックメッシュコンポーネントを追加し、「PondMesh」に名前を変更。
スタティックメッシュをSM_Cylinderに変更し、サイズを(3.0, 3.0, 0.1)に変更。
好きなマテリアルを割り当ててください。

詳細パネルのコリジョン → コリジョンプリセットを「OverlapAllDynamic」に変更します。
イベント → OnComponentBeginOverlapとOnComponentEndOverlapのイベントを追加します。

BP_Baitのオブジェクト参照変数のBaitInPondを作成し、画像のような処理を実装します。
PondMeshにオーバーラップしたアクタをBP_Baitにキャストできた場合、BaitMeshの物理を無効にして、エサのアクタの参照を保持して「StartFishing」イベント(この後実装します)を呼び出します。
PondMeshからエサのアクタが離れた場合、「EndFishing」イベント(これもこの後実装します)を呼び出します。

StartFishingイベントはこのような実装になっています。
TimerHandleを保持する変数「TakeBaitTimer」とエサにかかっているか判定するBoolean型の変数「IsTookBait」を作成し、
ランダムな時間待ってから、BP_BaitのOnTookBaitイベントを発火しています。
また、エサにかかってから一定時間経過したらエサにかかった判定をFalseにしています。その後まだエサが有効な場合は再度同じ処理をします。

つづいてEndFishingイベントの実装です。
待っていたタイマーと、エサのアクタの参照を削除し、エサにかかっているかどうかに応じてPrintStringで結果を表示しています。

ここまでできたら、BP_Pondをレベル上に適当に配置して、「その1」は完成です!
次回は、ランダムな魚がつれる機能を追加していきます!