Spe3’s blog

不定期更新。纏まりのない文章。それでも良ければ立ち寄ってください。

C#単体でのゲーム作りは勧めないという話(2021/7/27)

■まえおき

 C#単体でゲームを作ろうとしたときの話

 使ったのは「C#Windowsフォーム」で、WPFではない。エディタはVisual Studio Codeになる

 単体というのは、UnityやDXライブラリ、その他ライブラリを用いないという意味

 プログラミング経験が豊富な経験者ではないので、間違っていることもあると思うが、逆を言えば初心者がなぜ躓くのか。同じ初心者として挫折する前にもっと良い手段を見つける手助けになればと思う

■結論

 致命的な問題は「シーンの切り替え」の実装難易度になる

 逆を言えば問題点はそれだけ。ゲーム特化のエディタと違い座標の指定しづらさやレイアウトのやりづらさはあるが、やぼったいデザインを除けば一通りの機能は揃っていて、ボタンや画像の表示等の手段には困らない(逆を言えば、ゲームには使わないだろう余計なものまで表示されて目が回る人も多そうだが

■具体的な問題点1:通常のWindosフォームアプリの形式がゲームに合っていない

 C#でアプリケーションを実装する際、一つの画面内でシーン*1を切り替えることは稀だと考えている。というのも、C#のアプリケーションは基本的にシーンを切り替えることはなく、フォーム*2を切り替えることで機能を実装する

 しかし、それをゲームでやられるとどうなるか

 

 ゲームを開始し、スタートを押すとそのウィンドウが消え、別なウィンドウでゲームが始まる。装備を変更しようとすれば別なウィンドウが立ち上がる

 

 ウィンドウが立ち上がったり消えたりするのを繰り返すのは、スタート画面とメニュー画面でコントローラーを持ち替えさせるというのに近い。もちろんそこまで極端なものではないため遊べないとは言わないが、遊びづらいのは間違いないだろう

■具体的な問題点2:シーン切り替えの実装に向いていない 

 先ほどの内容から、フォームを切り替える通常のWindosフォームアプリの形式でゲームを作るのは悪手だということは理解してもらえたと思う

 そうなるとC#でもシーン切り替えができるようにしたいと考えるのが妥当だ

 Windosフォームに元からある機能を用いる場合、パネルと呼ばれるコントロール*3を一つのフォーム内に複数のパネルを用意し、1パネルを1シーンに割り当て、表示するパネルを切り替えることになる

 しかし1パネルを1シーンとして1画面に複数存在させるというのは無理があった

 Visual Studio CodeWindowsフォームのプログラムをする場合、フォームのレイアウトをUI側から作ることになる。ウィンドウサイズ等はプログラム側から表示時に変更できるとはいえ、実行時とかけ離れたレイアウトで完成品を想像することはいささか難しい。そのうえ重ねずに表示した場合、表示位置を変更するという余計な手間までかかるのもナンセンスだ

 そして何よりも大きな欠陥は、レイアウトを作る際に、コントロールを非表示にしたり、操作を受け付けなくしたりできないことだ

 デザインや機能を考えていくうえで、後から忘れていたり思いついたりしたことを実装したいと思う時がある。そう言った時、上に2枚も3枚も重なったパネルをずらし、他のパネルの誤操作に気を付けながら下のパネルを編集しなおすこと。そのうえでまたパネルを基の位置に戻すことは、無駄な上に手間だ。そのうえVisual Studioではパネルの位置を座標で決めるのが些か面倒で、手動でパネルを動かした方が早い。しかし手動はブレるもので、細かい調整に手間と集中力を割かれる。それが一度ならいいが、そういった作業は繰り返しやることになるというのが常だ

 シーンもといパネルを複数、同じ画面内に存在させ、それを同じ位置で表示切替するというのがC#のWindowフォーム環境でいかに面倒なのか、これである程度理解してもらえたのではないだろうか

C#単体に拘る必要は無い

 プログラムが上手くいかなくて詰まり、試行錯誤を繰り返して疲れるならまだしも、ゲーム作りのモチベーションを維持できなくなるほどストレスフルな環境で作業を続けるのはお勧めできない

 とはいったものの、この記事の作者はUnityが苦手だ。多機能故に操作項目が多く、必要な機能だけを記憶し作業できるようになるまでの慣れが非常に苦労する

 なので初心者はUnityのような多機能なエディタを使うのではなく、自分の作りたいゲームのジャンル(アクションやRPGなど)に合ったエディタを探し、それでゲームを作ってみることをお勧めする

(とはいえ、それに失敗した人に言われても説得力は薄いのだけれど)

■あとがき(蛇足)

 C#でゲームを作ってみたという記事や動画は、意外と多い。しかしそこには沼がある

 そもそもああいったものは、プログラミング初心者が、ゲームという成果物を作る過程を通してプログラムのやり方の初歩を学ぶためのもので、このプログラミング言語ならゲームを作れますよというものではない(のだろう)

 しかしそのことが初心者に理解できるのかと言えば違う。加えてC#に至ってはさらに厄介な問題が立ちはだかる

 ひとつは、WPFWindowsフォームか。なんならUnityありきなのに見出しにUnityと書いてないものもあるので、それを含めるとさらにややこしい

 C#のメジャーなエディタであるVisual Studioを扱う上でもそうなのだが、C#にはWindowsフォームでプログラムを書くだけでなく、WPFという書式に用いることができる。しかしそこでの記法はWindowsフォームと全く異なっている

 それだけならばたいした問題はない。しかし検索する上では同じC#であり、検索結果には2つの異なるものの紹介が混在する状態になる。多少知識があれば見分けられる範囲だが、プログラミングを始めたいという初心者には些か酷な状況には間違いない。簡単にゲームを作れればなんでもいいというわけではなく、調べる気概があるにも関わらず、調べても自分の求める記載がなかなか見つからない。あるいは調べたものが自分の環境と違うことに気付けないが、それでもとりあえずエディタに入力してみる人もいるだろう。しかしそれで動くはずもなくよくわからないエラーが出るというのを繰り返す

 そのころにはもう、その人はプログラミングに苦手意識を持ってしまう。惜しいが、それが慣れない環境で四苦八苦した自分の率直な感想だ

 そしてそのことを自覚せず、ゲームを作ってみたという動画は上がり続けている。そのほとんどは、シーンの遷移が無い単純なものであり、ミニゲームならともかく市販されているゲームに近いものを形にする上では何もかも足りない。しかしそれに気付けるのは、何時間も浪費した後だ。調べた時間が無駄とは言わないが、プログラミングの知識は基本的に暗記ではなくその場で調べながら作ることの方が多いので、苦労が報われることは滅多にないのも事実だ

 だからこそこうして記事に残すことにした。この記事を読んだ誰かが時間を無駄にしないことを願う

*1:「スタート画面」「メニュー画面」「ゲーム本編」など、明らかに構造の異なる場面のこと

*2:ウィンドウを形作っているもの。この中にコントロールなどを追加していく

*3:画面内で表示されたり動作したりするものの総称。他プログラムではオブジェクトと呼ばれることが多い