cacaponがゲームエンジンを使おうとすると壁にぶつかるわけ
最近ゲーム作りにハマっているcacaponなのですが、
どうしても、Unity,Unreal Engine4 を使って作ろうとすると
分からなくて壁にぶつかることがあります~ 特にUnreal Engine4~
というのも、cacaponが知っているゲーム作りの考え方が
ゲームエンジンで作っている時に、うまく表現出来ないことが
多いのです~
今回の記事は、cacaponの考え方を書き、
何で一致しないのかを備忘録として残しておこうと思います~
①cacaponが知っているゲーム作りの考え方とは?
一言でいうと、「無限ループの中に、描く部分と更新する部分がある」です。
例えば、次のような画面と入力装置があるとしましょう~
このゲームは
矢印キーを入力されると、プレイヤーが動くゲーム
を考えています~
RPG然り、パズルゲームのカーソル然り、
色々な場面で出てきそうなパターンかとcacaponは思います~
ではどうやって実現するか?ですが…
大きく考えなければいけないのが
- どうやって画面に描くの?
- どうやって入力を受け付けるの?
の2点になります~ ではそれぞれ見ていきましょう~
・どうやって描くの?
まずは、画面の部分から見ていきましょうか~
仕組みとしては、
超高速でまっさら(今回だと真っ黒?)にしてから描きたいものを描く
という感じになります~
今回のをコードっぽく書くとこんな感じですね~
関数 描く():
画面をまっさらにする関数()
四角を描く関数(プレイヤーのX位置、プレイヤーのY位置、色)
無限ループ
描く()
無限ループ終わり
上のをゆっくり動かすとこんなイメージになります。
これを目に見えない速さで繰り返し描いているのが、
ゲームの描く部分だとcacaponは思っています~
・どうやって入力を受け付けるの?
描く部分は出来ましたが、これだけだとコントローラをいくら押しても
プレイヤーを動かすことができません。
何故なら、コントローラの入力を受け取る部分が出来ていないからです~
ではどうやって受け取る部分を作ればよいのでしょう?
仕組みとしては、
「とあるキーが押されているか押されていないかを
無限ループの中で監視する」という感じですね。
今回のをコードっぽくするとこんな感じでしょうか?
関数 描く():
画面をまっさらにする関数()
四角を描く関数(プレイヤーさん.xの位置、プレイヤーさん.yの位置、色)
関数 更新する():
もしも ←キーが押されたら:
プレイヤーさん.動く(-1,0);
もしも ↑キーが押されたら:
プレイヤーさん.動く(0,-1);
もしも →キーが押されたら:
プレイヤーさん.動く(1,0);
もしも ↓キーが押されたら:
プレイヤーさん.動く(0,1);
クラス プレイヤーさん():
持っている情報:
xの位置 = 0
yの位置 = 2
出来る事:
関数 動く(xの移動量、yの移動量):
自分.xの位置 = 自分.x位置 + xの移動量
自分.yの位置 = 自分.y位置 + yの移動量
無限ループ
更新する()
描く()
無限ループ終わり
更新のイメージはこんな感じでしょうか?
コードで実現すると大変なのが「とあるキーが押されているか」を
判定する部分なのですが、これはゲームのライブラリなんかで
サポートされている事が多いです~ ありがたやなのです~
ただ、この更新部分は結構めんどくさくて、
値が範囲からオーバーしないようにするにはどうしたらいいの?とか
一回押したら一歩だけしか進めないようにするには?
いやいや、長押しが続いたら一定テンポで進めたいとか
結構考えることがいっぱいあります~
因みに、上のコードには安全対策の処理がないので、
ボタンを押した途端、感知した回数だけ移動するので、
超高速で画面外に消えることになるでしょう~
こんな感じで、ちっちゃいゲームでコード上な感じで作る分には
作るイメージが湧いてくるのですが、
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年後に見返したときに、「ああここで詰まってたけど、今は楽勝っス!」
ってなっていたらいいなぁ~