2020/04/20(月) [n年前の日記]
#1 [godot] 自機が画面外に行かないようにしたい
Godot Engine 3.21 を使ってシューティングゲームっぽいものが作れそうか実験しているのだけど。自機が画面外に行かないように補正する処理をどう書いたらいいのかで悩んだり。
これが2Dゲームなら簡単な話で。自機のX座標やY座標が、画面端を超えてないかチェックして、超えてるなら画面端の座標で自機の座標を上書きしてしまえばいい。
でも、3Dゲームの場合、どうすればいいのか…。
例えば、こんな感じの画面にしたいなと思ったとして。
自機が画面外に行かないようにするということは…。
この、赤い台形状の範囲内でしか動かないようにすればいい。でも、この範囲をどうやって求めたらいいのか。みたいな。
カメラの位置、角度、画角、そして、自機が移動する平面のy座標も決まってるとして。どうやって計算しよう…。
などと悩んでたけど、図を眺めてるうちに、中学生レベルの数学でも解けそうな気がしてきた。
しかし、Godot Engine の Camera の画角って、水平画角なのか、垂直画角なのか…。Blender に合わせてあるなら、水平画角かな…。たぶん。自信無いけど。
_mieki256's diary - Unityとblenderの画角だか視野角だかField Of Viewだかそのへんの話
(※ 2020/04/21追記。Godot Engine は水平画角、垂直画角を選べるっぽい。Camera の Keep aspect がソレ。デフォルトでは垂直画角になってる。)
これが2Dゲームなら簡単な話で。自機のX座標やY座標が、画面端を超えてないかチェックして、超えてるなら画面端の座標で自機の座標を上書きしてしまえばいい。
でも、3Dゲームの場合、どうすればいいのか…。
例えば、こんな感じの画面にしたいなと思ったとして。
自機が画面外に行かないようにするということは…。
この、赤い台形状の範囲内でしか動かないようにすればいい。でも、この範囲をどうやって求めたらいいのか。みたいな。
カメラの位置、角度、画角、そして、自機が移動する平面のy座標も決まってるとして。どうやって計算しよう…。
などと悩んでたけど、図を眺めてるうちに、中学生レベルの数学でも解けそうな気がしてきた。
しかし、Godot Engine の Camera の画角って、水平画角なのか、垂直画角なのか…。Blender に合わせてあるなら、水平画角かな…。たぶん。自信無いけど。
_mieki256's diary - Unityとblenderの画角だか視野角だかField Of Viewだかそのへんの話
(※ 2020/04/21追記。Godot Engine は水平画角、垂直画角を選べるっぽい。Camera の Keep aspect がソレ。デフォルトでは垂直画角になってる。)
◎ 別の方法。 :
Godot Engine の
_Camera
には、unproject_position() というメソッドがあって、コレを使うと、渡した3D座標(グローバル座標)が、2Dで表示してる画面上のどの位置になるかを取得することができる。
つまり、自機の座標を渡して2D画面上での座標値を得て、その座標値をチェックすれば…。自機が画面内/画面外のどちらに居るか、そのぐらいならざっくりと判定することはできる。そして、もし画面外に居るなら、画面内に入るように座標を補正してやることで、自機が画面外に出るのを防げるはず…。
と思えてきたので試してみたのだけど。補正時にガクガクしちゃうのだな…。自機移動時の変化量と、画面外に出た時の補正量が異なってるのが原因だと思うけど。
まあ、一応この方法でも、最低限画面外に出ない状態にはできたので、他に手が思いつかないならコレで済ませるのもアリかも。
ちなみに、プロジェクト設定の表示画面サイズは、以下で得られる。
以下が参考になった。
_How to get the screen dimensions in GDScript? - Godot Engine - Q&A
つまり、自機の座標を渡して2D画面上での座標値を得て、その座標値をチェックすれば…。自機が画面内/画面外のどちらに居るか、そのぐらいならざっくりと判定することはできる。そして、もし画面外に居るなら、画面内に入るように座標を補正してやることで、自機が画面外に出るのを防げるはず…。
と思えてきたので試してみたのだけど。補正時にガクガクしちゃうのだな…。自機移動時の変化量と、画面外に出た時の補正量が異なってるのが原因だと思うけど。
まあ、一応この方法でも、最低限画面外に出ない状態にはできたので、他に手が思いつかないならコレで済ませるのもアリかも。
ちなみに、プロジェクト設定の表示画面サイズは、以下で得られる。
- 横幅 : ProjectSettings.get_setting("display/window/size/width")
- 縦幅 : ProjectSettings.get_setting("display/window/size/height")
以下が参考になった。
_How to get the screen dimensions in GDScript? - Godot Engine - Q&A
[ ツッコむ ]
以上です。