Twitterでも呟きましたが初心者がゲームを作りたいと考えたとき、迷わずUnityを使って開発をするのがいいです。
ゲーム作り初心者はやっぱり最初はUnityを触るのがいいかなーと改めて思った。
Unityはそれはそれでお作法があって難しいとこはあるけど、描画関係の処理をコーディングなしで出来るのがとてもよい。
まずはUnityでちょっとしたゲームを最後まで作り上げ、完成させたという体験を積み重ねるのが大事。— ぺんたん@コメダでアプリ開発 (@pengoya) May 12, 2019
上記のような内容のツイートですが、Unityを使っても複雑なゲームを作るのはやはり難しいです。
ですが、簡単なゲームであれば圧倒的に楽に作れます。
僕の経験を踏まえてその理由をお伝えします。
ゲーム開発で初心者がUnityを使うべき理由
理由は至ってシンプルで、主に以下の点になります。
- iOS、Android、windowsなどの複数のプラットフォーム向けゲームを一度に作れる
- 画像描画などゲームを構成する機能をコーディングなしで実装できる
それぞれについて僕なりの見解を紹介します。
スポンサードサーチ
複数のプラットフォーム向けに作れる
いわゆるクロスプラットフォーム、マルチプラットフォームと呼ばれるもので、1つのプロジェクトで異なるOS向けにゲームを作ることができます。
もしUnityのようなマルチプラットフォームに対応したものを使わずに作ろうとした場合、iOSならiOS向けの開発環境と開発言語で、AndroidならAndroid向けの開発環境と開発言語で作っていかなければなりません。
つまり開発コストが大幅に削減可能
ここで言う開発コストとは、単純な開発にかかるプログラミング期間に加えて、開発環境や言語の習熟機関も含めています。
習熟がなかなか厄介で、初心者が新たに別の開発言語を使えるようになろうとするとそこそこ大変です。
スポンサードサーチ
描画処理をコーディングなしで実装できる
これ、本当に素晴らしいです。
画像をドラッグ&ドロップするだけで簡単に画像を表示できちゃいます。なんなら拡大縮小、回転なんかもマウス操作で楽々できます。
Unityを使わない場合の画像描画だと…
Android向けに僕が開発したサカガミ3というゲームがありますが、このゲームはUnityを使わずJavaで開発しました。
その際、画像を描画するだけでものすごく…本当に大変非常に苦労しました。
どのくらい大変かというと…僕がJavaで画像を描画するために作った関数を見てください。
void drawImageGL(int tex_id, float sx, float sy, float scWid, float scHei, int left, int top, int w, int h, int alpha, int vPos, int vUv, int uCol, int tHnd, int bindTexId){ float u = ((float)left + 0.10f) / RES_WIDTH; float v = ((float)top + 0.10f) / RES_HEIGHT; float u_w = ((float) w - 0.1f) / RES_WIDTH; float v_h = ((float) h - 0.1f) / RES_HEIGHT; texCoords[0] = u; texCoords[1] = v + v_h; texCoords[2] = u; texCoords[3] = v; texCoords[4] = u + u_w; texCoords[5] = v + v_h; texCoords[6] = u + u_w; texCoords[7] = v; //フリップモードによって変える if(flipmode == FLIP_HORIZONTAL){ texCoords[0] = u + u_w; texCoords[2] = u + u_w; texCoords[4] = u; texCoords[6] = u; }else if(flipmode == FLIP_VERTICAL){ texCoords[1] = v; texCoords[3] = v + v_h; texCoords[5] = v; texCoords[7] = v + v_h; } sy -= scHei; //上下さかさまに描画してるから表示位置がずれる。その補正 //頂点座標 vertexs[0] = sx; vertexs[1] = sy; vertexs[2] = sx; vertexs[3] = sy + scHei; vertexs[4] = sx + scWid; vertexs[5] = sy; vertexs[6] = sx + scWid; vertexs[7] = sy + scHei; // テクスチャ0にtextures[0]をバインド if(bindTexId != tex_id) glBindTexture(GL_TEXTURE_2D, tex_id); // gl変数texture0に0を設定 glUniform1i(tHnd, 0); // 長方形のテクスチャ変数設定 glEnableVertexAttribArray(vUv); glVertexAttribPointer(vUv, 2, GL_FLOAT, false, 0, texCoords); // 長方形の頂点変数設定 glEnableVertexAttribArray(vPos); glVertexAttribPointer(vPos, 2, GL_FLOAT, false, 0, vertexs); //色情報をユニフォーム変数に変換 float a = (float)(alpha) / 255.0; glUniform4f(uCol, 1.0f, 1.0f, 1.0f, a); // 長方形を描画 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); // 変数解除 glDisableVertexAttribArray(vUv); glDisableVertexAttribArray(vPos); }
画像を描画するためだけにこれだけのコードが必要です。
と言いたいところですがこれだけでは全然足りず、他にも初期化処理などしているためもっと行数が多くなります。
Unityを使わないと画像描画が大変な理由
Javaを使った開発でも、上記で紹介した長いコードを書かずにもっと簡単に画像を描画する方法はあります。
ありますが…パフォーマンスが非常に悪いです。ありていに言えば処理が重いです。
そのためOpenGLという描画処理が得意なライブラリを使った方法で実装する必要がありました。
さらにNDKという、よりネイティブな方法を使っていましたが…ここは難しくなるので割愛します。要は処理速度を求めるととても手間がかかるということです。
Unity以外に方法はないのか
有名なところで「Cocos2d-x」があります。
僕がCocos2d-xではなくUnityを推す理由としては、比較して使っている人が多い…つまり情報が豊富だからです。
困ったときに情報が出てきやすいというのは、初心者にとってとてもありがたいですからね。
ある程度ゲーム開発に慣れたら、用途によってそれぞれを使い分けたり、それこそUnityを使わずに開発してもいいと思います。
スポンサードサーチ
ゲーム開発初心者がまず目指すところ
とにかく簡単でも何でもいいからゲームを1本最後まで作ること。これに尽きます。
最後まで作ると成功体験が蓄積される
1本ゲームを作り上げるとゲーム開発者としてのレベルが上がります。これほんと。
新たに次のゲームを作り始めたときに開発のスピードがかなり上がっていることに気づきます。
これは初心者に限らずだと個人的には思っています。マジでレベルアップしてます。
誰かに遊んでもらえる
ゲームが完成していれば誰かに遊んでもらえます。なんだったらストアに公開だってできます。
そうすると面白かった!、ここが不満だ!などの評価をもらえたりします。
面白いと言ってもらえるととても嬉しいし次の開発への非常に大きなモチベーションになります。
反対にダメな点を指摘されるとへこみます。へこみますが、改善すべき点として素直に受け取ることで、次はより良いものが作れるようになります。
とにかく初心者はUnityでゲーム作りのレベルアップをしよう
まずはUnityを通じてゲーム作りの基本的な部分を学び、そして慣れること。
さらに最後まで完成させるという経験を積みレベルアップしていくことで、よりクオリティの高いゲームが作れるようになっていきます。
とにもかくにも、まずは作って完成させることが大事です。そのためにUnityは最適だと思いますので、これからゲームを作ってみようと考えている初心者の方は検討してみて下さい。
スポンサードサーチ
Unity初心者へのオススメ本
最後に、僕が読んで非常に分かりやすかった本を紹介します。
Unity初心者だけでなく、ゲーム開発初心者にも非常に分かりやすい内容です。本の通りにサンプルのゲームを作るだけでUnityの基本的なところが理解できます。