cacaponがゲームエンジンを使おうとすると壁にぶつかるわけ

最近ゲーム作りにハマっているcacaponなのですが、
どうしても、Unity,Unreal Engine4 を使って作ろうとすると
分からなくて壁にぶつかることがあります~ 特にUnreal Engine4~

というのも、cacaponが知っているゲーム作りの考え方が
ゲームエンジンで作っている時に、うまく表現出来ないことが
多いのです~

今回の記事は、cacaponの考え方を書き、
何で一致しないのかを備忘録として残しておこうと思います~

①cacaponが知っているゲーム作りの考え方とは?

一言でいうと、「無限ループの中に、描く部分と更新する部分がある」です。

例えば、次のような画面と入力装置があるとしましょう~

f:id:cacapon:20191108180645p:plain

このゲームは
矢印キーを入力されると、プレイヤーが動くゲーム
を考えています~
RPG然り、パズルゲームのカーソル然り、
色々な場面で出てきそうなパターンかとcacaponは思います~

ではどうやって実現するか?ですが…
大きく考えなければいけないのが

  • どうやって画面に描くの?
  • どうやって入力を受け付けるの?

の2点になります~ ではそれぞれ見ていきましょう~

・どうやって描くの?

まずは、画面の部分から見ていきましょうか~
仕組みとしては、
超高速でまっさら(今回だと真っ黒?)にしてから描きたいものを描く
という感じになります~

今回のをコードっぽく書くとこんな感じですね~
関数 描く():
    画面をまっさらにする関数()
 四角を描く関数(プレイヤーのX位置、プレイヤーのY位置、色)

無限ループ
 描く()
無限ループ終わり

上のをゆっくり動かすとこんなイメージになります。

f:id:cacapon:20191108183938g:plain

これを目に見えない速さで繰り返し描いているのが、
ゲームの描く部分だとcacaponは思っています~

・どうやって入力を受け付けるの?
 

描く部分は出来ましたが、これだけだとコントローラをいくら押しても
プレイヤーを動かすことができません。
何故なら、コントローラの入力を受け取る部分が出来ていないからです~

ではどうやって受け取る部分を作ればよいのでしょう?

仕組みとしては、
とあるキーが押されているか押されていないかを
無限ループの中で監視する」という感じですね。

今回のをコードっぽくするとこんな感じでしょうか?

関数 描く():
    画面をまっさらにする関数()
 四角を描く関数(プレイヤーさん.xの位置、プレイヤーさん.yの位置、色)

関数 更新する():
 もしも ←キーが押されたら:
  プレイヤーさん.動く(-1,0);
 もしも ↑キーが押されたら:
  プレイヤーさん.動く(0,-1);
 もしも →キーが押されたら:
  プレイヤーさん.動く(1,0);
 もしも ↓キーが押されたら:
  プレイヤーさん.動く(0,1);

クラス プレイヤーさん():
 持っている情報:
  xの位置 = 0
  yの位置 = 2
 出来る事:
  関数 動く(xの移動量、yの移動量):
   自分.xの位置 = 自分.x位置 + xの移動量
   自分.yの位置 = 自分.y位置 + yの移動量

無限ループ

 更新する()
 描く()
無限ループ終わり

更新のイメージはこんな感じでしょうか?

f:id:cacapon:20191108200327g:plain

コードで実現すると大変なのが「とあるキーが押されているか」を
判定する部分なのですが、これはゲームのライブラリなんかで
サポートされている事が多いです~ ありがたやなのです~

ただ、この更新部分は結構めんどくさくて、
値が範囲からオーバーしないようにするにはどうしたらいいの?とか
一回押したら一歩だけしか進めないようにするには?
いやいや、長押しが続いたら一定テンポで進めたいとか
結構考えることがいっぱいあります~

因みに、上のコードには安全対策の処理がないので、
ボタンを押した途端、感知した回数だけ移動するので、
超高速で画面外に消えることになるでしょう~

こんな感じで、ちっちゃいゲームでコード上な感じで作る分には
作るイメージが湧いてくるのですが、
cacaponがUnityなりUnreal Engine4なり最近よく使われるであろう
ゲームエンジンを使ったとたん、良く分からなくなるのです~

その理由を考えてみたところ、以下の理由が当てはまるかなと思いました~

1.描画の部分がゲームエンジンによるところが多く、理解していない

コードだと関数で描画()にして無限ループにすればいいってわかるのですが、
ゲームエンジンの場合
オブジェクト置いて、動かして~っていう感じみたいで、
たぶんそういうやり方をうまく理解していないんじゃないかなと
cacaponは勝手に思っています~

2.更新部分と描画部分を結び付けられない

cacapon的にはここが一番ネックだと思っています~
最近、Unityの方は少し理解できて来たのですが、
置いたオブジェクトと、動かすための部分(スクリプトとかブループリントとか)
の紐づけ方がよくわかっていないことが多いです~

スイッチを押したら、オブジェクトAに火をつける
みたいな動作を

コードだと流れでイメージにすることができるのですが、
Unityはスクリプトの実行順を指定できるしまだナントカ…
Unreal Engine4では…???…という感じなのです。

3.使う関数が多すぎる
色々な場面で対応できるようにするために、UnityもUnreal Engine4も
沢山関数が用意されています。ただ、それが何なのか理解しておらず、
それが壁になることもしばしばです~
ただ、これに関しては慣れもあるかなと思います~
cacaponも最初エクセルの関数とか全然覚えていなかったのですが、
沢山使っていくうちに、sum以外の関数も覚えていきましたし…
たぶんそれと同じなのかなと思います~

4.GUIベースで記述するプログラミングがよくわからない
今まで扱ってきたプログラミングが全てコード上で行うものなので、
Unreal Engine4のブループリントのように、
要素をくっつけていって動かすという
仕組みの考え方がまだ自分の中で怪しいです。
ココの問題は2,3の問題と深く結びついてそうなので
余計にこんがらがってそうです。

5.3Dに慣れていない
作ってきたのが、2Dのレトロゲームばっかりだったので、
3Dのゲーム作りにそもそも慣れていないというのもありそうです~

…む~、なんか前途多難な感じがしますね~
とりあえずはピンっと閃くまで3Dの簡単なゲームを作っていくっていう
感じが解決法になるでしょうか?
特にGUIで動作部分が作れるUnreal Engine4で作ると
理解が深まりそうです~ とりあえず頑張ってみます~

…1年後に見返したときに、「ああここで詰まってたけど、今は楽勝っス!」
ってなっていたらいいなぁ~