Posted at

【Unity】【初中級者向け】単純な写経に疲れたあなたへ


写経とは?

プログラミング修行僧による瞑想のような行為である(ちがう)。


はじめに

本記事は、僕が Unity を始めるにあたり、 Unityの教科書 Unity2019完全対応版 2D&3Dスマートフォンゲーム入門講座 (Entertainment&IDEA) を扱った勉強法を紹介する記事となります。

ただ写すだけだとどうにも身にならないし退屈なんだよなぁという方におすすめです。

対象としては、ある程度プログラミングは書けるし、ゲーム作りにも興味あるけど、何から手を付けたらいいかよくわからんのよねー。という人。


環境


  • Windows 10

  • Unity Hub 2.1.0

  • Unity 2019.1.14f1

  • Visual Studio 2017

  • GitHub Desctop


今回の対象の教科書について

とりあえず Unity 始めたいなと思って、最初は何もなくてもいけるやろとタカをくくっていたわけですが、撃沈しました。

それで適当に検索したところ評判の良いこちらの教科書にいきついた流れです。


  • 章立てで別のゲームを作るようになってる

  • ゲーム作りに必要な概念が学べる

  • 挿絵があって読みやすい

評判が高いだけあってかなり良書です。


この教科書にマッチした勉強法

章立てで作ることになるテーマのゲームを 「教科書を見ずに」自分で作る 以上です。

最初の教科書のテーマは「占いルーレット」でした。

そのままゲームテーマを丸パクリというのもコンプライアンス的にまずいのかなぁという思いもあり、数字当てルーレットに変えました。

成果物

kurukuru3.gif

レポジトリ

https://github.com/mentol310/MyRouletteGame


手順


1. クラス設計する

まず何よりも設計が大事です。

設計の見通しが立っているだけで最後までやりきれるかがだいぶ変わってきます。

↓の記事を参考にしました。

グローバルゲームジャムでクラス設計をやった話2019

roulette_class.png

最終的に、 Input, Output namespace はクラス化しない方が今回はシンプルかなと思ってクラス化を避けたりしましたがおおよそ最初に立てたこの設計通りに出来上がりました。

クラス図には、web 版の plantuml かけるツール planttext を利用しました。

ユーザー登録もできて uml 管理機能もありとても便利です :hand_splayed_tone2:


2. git レポジトリを作成する

基本 git は cli 操作でやってたんですが、今回 GUI の GitHub Desktop を使ってみました。

GitHub のアカウントでログインしたら後は New Repository から生成先ディレクトリを選択して、レポジトリ名を入力します。

Unity テンプレートの .gitignroe も選択可能なので便利でした。


3. ゲームを作っていく

あとは作っていくのみです。

今回は以下の流れでようやっと出来上がりました。

(実装にあたり UniRX を使ったためアセットストアからDLしました。)


  1. 画面中央に円(ルーレットホイール相当)を置く(ここから詰みそうで泣きました)

  2. ホイールの中に円(ボール相当)を置く

  3. ボールがホイールの中で回るようにする

  4. ボールの状態(止まってる/回ってる)をホイールで購買できるように

  5. テキスト入力欄を置く

  6. テキスト入力状態が購買できるように

  7. テキスト入力状態によりボタン制御を行う

  8. ボタン制御によりボールが回るように

  9. 四角形の上に数字が表示されるように(出目相当)

  10. 出目をプレハブ化

  11. ホイールの子要素として、プレハブ化した出目を動的に生成する

  12. ボールに一番近い出目を取得できるように

  13. ボールに一番近い出目出力をボール位置の変動に伴い変動するように

  14. 止まった出目と予想値が当たってたら当たり、ハズレてたらハズレが表示されるように

todo として最初やろうかなと思ってた掛け金の処理とか回す対象を入れ替えれるようにする対応を行おうと思いましたが、一旦このテーマでこれ以上の知見を得るのは難しそうなので完としました。

ほぼほぼ 0 からのスタートだったとはいえだいぶかかりました。。。

詰まったところは以下です。


画面中央に円(ルーレットホイール相当)を置く

Asset > Sprites > Circle から作成できます。

Unity で何かしらのオブジェクト = 全て「GameObject」という先入観が何故かあり、GameObject メニューをずっといじってたんですが、「ないじゃん!」となって泣いてました。


ホイールの中に円(ボール相当)を置く

オブジェクトが重なっているため、Order in Layer で描画順を調整する必要があります。

さっき円の作り方はわかったしこれは楽勝やろ!と思ってたんですが、「ホイール相当の円しか表示されない」という状態になりました。

「手前に写したいオブジェクトの Order 数値を上げる。」で解決しました。


ボールの状態(止まってる/回ってる)をホイールで購買できるように

クラス設計にて 「ディーラーがホイールを監視してホイールの上で転がってるボールが止まったら~」と Dealer から Wheel 越しに Ball.State を Subscribe する必要がありましたが、なんか色々エラーが出て参ってました。

この辺の話になります。


四角形の上に数字が表示されるように

「壁に文字を表示」だったり「オブジェクトに文字を貼り付ける」だったり検索すると情報はたくさん出てくるんですが、どうもうまくいきいませんでした。

調べてみると、「World Space 設定にした Canvas 毎オブジェクトの子要素とする。その後、大きさと位置を調整する。」というのがありました。

この「大きさと位置」ではっきりした数値が書かれてるところが中々なくて認識不足が原因でした。

ひとまず位置は全部 0, scale は x, y を 0.02 へ width, height を 680 x 480 へとすれば見えるようになります。


その他得た知見

詰まったところも多々あれば素直に調べた記事通りやると実行できた!というのも多かったです。


  • [SerializeField] をつけるとクラスとしては private で閉じてるけど UI からは設定できるというのができて安全

  • ReactiveCommand への BindTo でボタンと紐付けできる

  • RotateAround 第二引数で回転方向を選べる

  • Time.deltaTime は前フレームから経った時間の取得

  • Visual Studio のインテリセンスはかなり高い(昔 2007 とか扱ってた時の重い、扱いづらいのイメージがあったので革新的でした)

  • 文字列変換埋め込み便利 $""

  • Linq, UniRX の基本的な知見

...... etc


最後に

何気なくやってみるかでやってみた割にはかなり多くの学びがありました。

「何か」を始めるスイッチを探してる人にホントおすすめです!

あとC#たのしい :raised_hand: