はじめに
キャラクターのようなオブジェクトをタイルマップの地形に乗せたいとします。
前回の記事では平坦な地形にオブジェクトを乗せました。
今回は坂道について考えたいと思います。
今回作成したプロジェクトのアセットを用意いたしましたので、
ダウンロードして確認していただくとより判りやすいかと思います。 20221220_test_slope.unitypackage
目次
準備
前回のプロジェクトを開きます。
1.坂道タイルの準備
考えるのは傾斜45度の坂道タイルです。
タイルマップの画像に以下のようなタイルを追加します。
全体ではこんな感じです(他のタイプも入れました)。
※Terrain.png ダウンロードしてお使いください
坂道を配置するルールを決めます。
今回のスクリプトを機能させるには、坂道タイルの直下には進入禁止ブロックを置きます。
2.坂道を数学のグラフに例える
坂道を"Y = aX"のようなグラフで考えてみます。
詳しくはこちらのサイトをご覧いただければと思います。
ここでは、45度の上り坂を取り上げます。
坂1タイルを抜き出すと、次のようになります。
上図の坂の面の部分は Y = X の直線と考えられます。
もし、"Box1"の接地判定点 P(px,py) が坂にめり込んでいたら、
下図のような関係になります。
地面にめり込んだ長さYを"dist"とすると・・・
処理の方針としては次のようになると思います。
45度の坂のブロックを判定後、めり込んだ長さ"dist"を戻す
これを実践していきます。
3.45度の坂のグラフをスクリプトにする
上り45度の坂はタイルマップのグリッドの交点同士を繋げばよいので、坂を構成する2点を定義します。
坂と判定点が坂にめり込んだぶんを計算して返す関数を定義します。
(ここでは取り上げませんが、下り坂も考慮しました。)
関数の中身の説明は、スクリプト内のコメントを見ていただきたいと思います。
"_offsetY"は、坂を既に登ったところから始まる坂ブロックの計算したい場合に使います。
具体的には"2マス進むと1マス上がる"ような22.5度の坂などが該当します。
今回は、"1マス進むと1マス上がる"1タイル分を考えれば良いので"_offsetY = 0"です。
4.スクリプトの完成
今までのことを"Box.cs"に落とし込みます。
横移動で坂道に入ることを考慮すると、事前に平坦な地形(進入禁止)の処理も必要です。
※Box.cs(申し訳ございませんが、長すぎるのでスクロールしてご覧ください)
簡単な解説
1.BoxのX軸の移動量を "speed.x = 0.01f" としました。
2.タイル番号の取得は数回呼ばれるため、"CheckTerrain(Vector3 _checkPos)"関数にまとめました。
3.Y軸の補正は、地形判定を行うごとに行っています(2箇所)
☆できたスクリプトを動かしてみましょう。
5.おわりに
ここまでで、なんとか坂道を登ることができました。
しかし、作成しているゲームとスクリプトの関係などが全く違うので、
判定点を"Box"の下端に設定するとおかしくなってしまいました。
原因が判らずじまいです。
ちなみに下り45度の坂の考え方はこんな感じです・・・
当初予告していたものと違う結果になってしまい申し訳ございませんでした。
最後に、ここまでお読みいただきありがとうございました。
参考サイト
※坂道の当たり判定(WORD WIDE SOFTWARE様)
https://wwsft.com/sp/slope/slope.html
とても参考にさせていただき、有難うございました。