tanaka's Programming Memo

プログラミングについてのメモ。

Unityの命名規則とエディター設定

2023/8/18 あれこれ調べてprivate変数の前に_を付ける記法はまだ採用が少なかったので元に戻しました。

2023/8/17 情報が古くなったので一部改訂しました。

  • プライベート変数はキャメルケース_からはじまるキャメルケース 2023/8/18に取り消し
  • パブリック変数は原則としてプロパティーにすることを追記
  • 変数は名詞、インターフェースは形容詞、関数は動詞からはじめる、boolは疑問形にする
  • イベントの命名ルールを追記

この記事は、Unity #2のカレンダー | Advent Calendar 2019 - Qiitaの7日目の記事です。

qiita.com

前日の記事は、@ma_shさんのGraphView完全理解した(2019年末版) - Qiitaでした。

qiita.com


色々な言語を渡り歩いていたことで、変数名やら関数名の書き方になんとなくルールはあるけどその時の気分でブレる、というのが最近の状況でした。Unityのアセットでも違うし・・・。

ぼちぼちちゃんとしようと思い、Unityではどんな感じなのかを調べてみました。併せて、Visual Studio Community(多分Codeとか他のエディターでも使える)で自動的に規則をチェックしてくれる設定ファイルも用意してみました。

目次

まず結論

あれこれは後回しにして、今回まとめた内容です。

大文字と小文字のルール

  • Unityで作成するアセットやクラス名、メソッド名、プロパティー名など、原則としてはパスカルケース
    • PascalCase (単語ごとに頭文字を大文字で書く)
  • メンバ変数、ローカル変数、パラメーター(引数)は、キャメルケース
    • camelCase (パスカルケースの頭文字を小文字にした版)
  • インターフェースは頭文字をIにして、パスカルケースで続ける
    • IMyInterface
  • Unity以外で作成する画像や音声データなどは、小文字のスネークケース
    • snake_case (小文字のみで、単語の区切りはアンダースコア_)

Visual Studioなどで、自動的にやるには以下の手順を。

  • Unity用の.editorconfig | たなかゆうを開いて、.editorconfigという名前で、Unityのプロジェクトフォルダー直下に保存
  • Unityからプロジェクトを開いて、何かスクリプトを開く
  • プロジェクトメニューから、既存の項目の追加をクリック
  • コピーした.editorconfigファイルをダブルクリックして追加

以上で、エラー一覧ウィンドウのメッセージのところで、規則違反を確認できます。

命名規則違反の例

名前に使う単語

  • 変数名は名詞。ただし、bool型の場合はiscanをつけて疑問形にtrueやfalseで答える形にする
  • 関数名は動作を表す動詞ではじめる。これもbool型を返すものについてはIsCanHasなどを頭にもってきて疑問形にする
  • インターフェース名は形容詞
  • イベントのデリゲート名は、処理前なら進行形の動詞、処理後なら過去形の動詞を付ける
  • デリゲートをInvoke()するための関数はOnを頭につける

public変数について

原則としてpublicな変数は使わず、値を公開したい場合はプロパティーを使います。

// 読み出しだけなら => か自動実装書式が便利
int _myData;
public int MyData => _myData;

public int MyData2 {get; private set;}

// 読み書きなら自動実装書式
public int MyData3 {get; set;}

これらをまとめたサンプルを以下のリポジトリーで公開しています。

GitHub - am1tanaka/Unity-Code-Style-Guide: A inspirational C# code style guide for Unity projects

以下、お暇ならどうぞ。

命名規則とは

ファイル名やクラス名、変数名などをつける時の規則のことです。

一番の役割は問題を予防するためでしょう。Unityの場合であれば、ファイルやフォルダー名にはユーザーフォルダーも含めて日本語にしない!というのがあります。常に問題になるわけではありませんが、WebGLだとビルドに失敗する爆弾を抱えることになります。Unity1週間ゲームジャムの締め切り間際に時々、断末魔がTLに流れますが、そのような事態を防ぐことができます。

プログラミングの場合は、変数や関数がどのようなものか予想しやすくするということが挙げられます。ぱっとコードを見てなんとなくやっていることが予測できればバグの予防や保守性の向上に繋がります。また、変数や関数名を考えるのが苦手な人は多くて、そういう人たちには命名のヒントになります。

バイブルはUnity Communityに決めた!

まずは宗派を決めます。なるべくオフィシャルの近くで議論されているところがいいなぁということで、Unity Communityのものを柱にすることにしました。

http://wiki.unity3d.com/index.php/Csharp_Coding_Guidelines

調べると大体ここが出てくるので、総本山と見てよさげです(シングルトンのひな形などもあちこちで散見しますが、自分はUnity Communityのものを利用しています)。 → 2023/8/17現在、ページが消えてました。

和訳は @shun-shun123 さんがしてくださっています。

qiita.com

新しいドキュメントがUnity公式から公開されて、2023/8/17にこちらに乗り換えました。

Create a C# style guide: Write cleaner code that scales | Unity

Unityにおける命名規則

個人的には、かっこの位置とか細かいことは全く気にならない(違いに気づけない)ため、Visual Studioさんにお任せです。ということで、重要なのは命名規則のところです。以下に抜粋。

  • ハンガリアン記法は使わない
  • 接頭語(, m, s_, etc)は使わない使うか使わないかを決めて、その方針を一貫させる
  • ローカルとメンバ変数を判断するときは"this"を使う
  • メンバ変数にはキャメルケースを使う(e.g myData)
  • パラメータにはキャメルケースを使う
  • ローカル変数にはキャメルケースを使う
  • 関数、プロパティ、イベント、クラス名にはパスカルケースを使う(e.g MyData)
  • インタフェースの名前は"I"から始める
  • enums, classes, delegatesの先頭は文字で修飾しない

原則としては、マイクロソフトC# プログラミングガイドに従おう、ということだそうです。こちら、とても参考になります。

docs.microsoft.com

そして日本の場合、

  • 日本語や全角文字を使わない

も加えておくのが良いでしょう。せっかく規則を作るのだから、要らぬ混乱の元は断ち切っておくのが吉。

ハンガリアン記法DirectXの頃は使ってたなぁ。その下の「接頭語は・・・」や「enums, classes, delegatesの先頭は・・・」もハンガリアン記法ですよね。昔は今みたいにコードの説明を自動的に表示してくれるなんてしてくれなかったので役立ちましたが、今どきの頭のよいエディターは全部表示してくれるから確かに要らない気がします。時代に合っていてよいですね。インターフェースのIが生き残っているのは趣深い。

パスカルケース

ざっくりとまとめると、基本的にはパスカルケースを採用しています。パスカルケースは、単語の頭文字が大文字であとは小文字で書く方法です。

// :
PascalCase

というような感じです。

キャメルケース

メンバ変数、ローカル変数、パラメータ(引数)にはキャメルケースを使います。キャメルケースとは、最初の文字が小文字のパスカルケースです。

// :
camelCase

となります。ルールはこれだけで、列挙子や定数、プロパティなども、ここに登場しないものはパスカルケースです。統一されていて守りやすい規則でいいですね!

staticと公開範囲はどっちが先?

// こんな順番のと
static public int staticFirst;

// こんな順番のがある
public static int staticSecond;

アセットの中身見てると、ちょいちょい前者の順番を見かけます。そう書いてもVisual Studioさんが逆にしちゃうのでもっぱら後者を使ってます。C# プログラミングガイドでも後者の順番でしたので後者でよさそうです。

docs.microsoft.com

ファイル名の命名規則

Unityで作成するファイルはビルドされてるのでこれでいいのですが、画像や音声など外部から読み込む可能性のあるファイルについては別規則の方がいいかも・・・という気がします。Linuxなどでファイル管理する場合、大文字小文字が入り乱れるのはなんとなく気持ち悪いし・・・。ということで、Unity以外のツールで作成するリソースについては、他の命名規則の方がいいかもしれない、ということで探したところ、クラスメソッドさんの以下の記事がよさそうです。

dev.classmethod.jp

命名規則の必要性などについても、しっかりと書かれております。

ファイル名やレイヤー名はスネークケース

スネークケースとは、単語をアンダースコア(_)でつなげる書き方のことです。上下にうねうねして見えるのが蛇っぽいからとかなんとか。

// :
snake_case

Linuxファイルシステムは大文字と小文字を区別するため、大文字小文字を混ぜたファイル名のつけ方をすると、同じファイルのつもりが別のファイルになってしまっていたというような問題が発生します。さらにその状態で大文字小文字を区別しないWindowsとやり取りするとえらいことになります。ということで、識別がしやすい小文字に統一するのが一般的だと思います。そして、こちらでも日本語は封印されています。

単語の並べ順や単語数は、プロジェクト次第で決めることになると思います。リソース数が数十程度の小さなプロジェクトなら名称_目的や行動[_通し番号]で、あとはフォルダー分けするぐらいでしょうか。

haku_walk_00.png
haku_walk_01.png
block_albedo.png
block_normal.png

何千とか何万のリソースを使うプロジェクトでは、カテゴリーや種類なども含めたり、解像度によってリソースを切り替えたい場合などもそれ用の記載が必要になると思います。プロジェクトの規模や、扱うリソースの複雑さ次第で、適した命名ルールを決めていくことになると思います。綺麗に種類ごとに並ぶような命名方法が使いやすい方法だと思います。

コード規則を自動化するEditorConfig

規則を決めても、守られているかを人力でチェックするのは辛いです。これを自動化してくれるのがEditorConfigです。

editorconfig.org

docs.microsoft.com

仕様に従って作成した.editorconfigという名前のテキストファイルをプロジェクトフォルダーに入れておくことで、命名規則やかっこの位置などについてのチェックをしてくれます。Visual Studioをはじめ、コードエディターなら大体機能を持っていると思います。以下、Visual Studio 2019 Communityで作成した設定ファイルです。

この.editorconfigをUnityのプロジェクトフォルダーの直下に置いておけば、エラー一覧のメッセージに以下のように規則違反があれば表示されるようになります。

命名規則違反の例

ただ置くだけでは機能しないかもしれません。その時は、以下の手順でプロジェクトに読み込みます。

  • プロジェクトメニューから、既存の項目の追加をクリックします
  • コピーした.editorconfigファイルをダブルクリックして追加します

以上でプロジェクトに設定が読み込まれて規則のチェックが動作すると思います。それでも表示されない場合は、エラー一覧ウィンドウのメッセージボタンの右にあるコンボボックスを確認してください。IntelliSenseが含まれていない場合は動作しないので、ビルド+IntelliSenseにしてください。

改行コードの不一致の修正

改行コードがLFやらCR+LFやら混在しているとUnityがwarningを出します。上記の.editorconfigでは改行コードをWindowsに統一する設定をしているので、警告が出たスクリプトVisual Studioで閉じて開けば修正してくれます。

規則をカスタマイズする

この設定ファイルはざっくり作ったもので、運用はこれからなので抜けがあるかも知れません。.editorconfigを直接書き換えるか、Visual Studioで設定を編集することができます。

Unityからソースコードを開いて、ツールメニューからオプションを選んで、左のメニューからテキストエディタ > C# > コードスタイルを開くと、設定を確認できます。

コードスタイルの設定

設定方法はコガネブログさんで紹介されています。

baba-s.hatenablog.com

まとめ

Unityで作成するアセットやファイル、クラス名、メソッド名などは、原則として頭文字を大文字で表すパスカルケースにします。

メンバ変数、ローカル変数、パラメーター(引数)のみは最初の文字が小文字で、それ以外は単語の頭文字を大文字にするキャメルケースにします。

Unity以外で作成する画像ファイルや音声ファイルについては、単語の区切りをアンダースコア(_)で区切って、小文字の英語と数字を使うスネークケースを採用することにしました。

.editorconfigはとても強力です。うっかり名前を付け間違えても教えてくれるので、チームで共有すると便利です。

この方針で運用してみて、何か出てきたら見直していこうと考えています。これまで微妙にブレていた方針が統一されてすっきりしました。

見落としや誤り、こっちの方がいいよ、というところがございましたらお知らせいただければありがたいです!

明日は、@su10さんの番です!!

参考・関連URL

1週間ゲームジャム「さがす」に参加して(後記)

秒速忍者-箱入り娘編-

秒速忍者-箱入り娘編- | フリーゲーム投稿サイト unityroom

ランキングが発表されました!なるほど~というのが沢山並んでいたり、あれ?あの作品は?というのがあったりでドラマがあります。

目次

雑感

今回はランキングに拘らずなるべく最小手で参加を、という目的でした。結果としてはその通りになって総合30位には入りませんでした。しかし、楽しさと操作性で30位以内に入れました^^ ご評価下さった皆様、ありがとうございました!

f:id:am1tanaka:20191027202324p:plain
楽しさ28位

f:id:am1tanaka:20191027202405p:plain
操作性23位

ランキングに入るのは300を超える作品のうちの30位までです。偏差値でいえば62とか63。そんな中に、あの手数でランクインできたのは嬉しいことでした。特に楽しさの部門でのランク入りはゲームの本分なので喜んでおります。

みんなの評価

ランキングに入らなければ価値はないのか?そんなことはありません。皆さんの評価こそ大切だと思います。

f:id:am1tanaka:20191027202424p:plain
みんなの評価

このグラフが得られるのはUnity1週間ゲームジャムに参加する大きなメリットです。すべての項目で3.5超えを目指してみてください。達成できていれば、例えランクインしていなくても十分に良い成果だと思います。もし、下回っている項目があってもガッカリする必要はありません。取り組むべき課題が見つかったということなので喜ばしいことです。対策を心がけて、次の1週間ゲームジャムで目標を達成すればレベルアップができます。

参加の様子はこちらにまとめました。準備をして企画を工夫すれば、参加は難しくありません。日頃からアイディアを考えておいて、良いタイミングの開催の時にインパクトがあるものを叩きこんでみてください!次の目標が見つかるかもしれませんし、開発者のつながりを作るきっかけになるかも知れません。

次回に向けて(パート2)

次回はデジゲー博も終わってますし、1年生を本格参戦させる回なので自分も本腰を入れられる、かも知れません。前回のブログで一度まとめましたが、皆さんの作品を遊んで感じたことを改めまして整理。

  • 音の同期はやっぱり強い
  • 少しのパラメーターで種類を増やす
  • 色を合わせる、消す
  • 数で耐久性があるやつ
  • パワーアップの爽快感
  • 企画が強ければポストプロセスはなくても大丈夫(しかし、自分の場合は画面作りが強くはないので、頼った方がいいか)

次回の自分の課題は、パワーアップやコンストラクションかなぁ。苦手なやつ。音を同期させる。画面はプリミティブで大丈夫。色要素も使えればいいんだけど、下手に混ぜるのも混乱してよくないのでこれはテーマ次第で。いつも弱い斬新さをちょっと意識したい。企画も含めた素振りをしておきたいです。

最後に

遊んで下さった皆様、素敵なアセットを開発して下さったクリエイターの皆様、ありがとうございました。ゲームを公開した皆様、お疲れさまでした。自分ではゲームの消化が捗らないのですが、ぱふもどきさんのライブ中継を拝見して大いに助かっています!今回もいいゲーム開発の素振りができました。このような場を作って下さったnaichiさん、ありがとうございました!

関連URL

www.youtube.com

1週間ゲームジャム「さがす」に参加しました!

f:id:am1tanaka:20191020173914p:plain

さきほど投稿が終わったので、前回さぼったブログを~。

今回公開したのはこちら。

秒速忍者-箱入り娘編-

秒速忍者-箱入り娘編- | フリーゲーム投稿サイト unityroom

  • マウスで忍者を操作します
  • 忍者で箱を横切ると箱を叩ききれます
  • 姫やBBAが隠れている箱があり、その箱を壊すと中から隠れていたキャラが飛び出してきます
  • 姫をクリックすれば任務完了!殿様からの評価をもらえます
  • BBAを間違えてクリックすると、殿様の激昂を買って打ち首になるので気を付けてください!

といった感じです。ざっくりと開発の流れを振り返ります。

目次

参加の経緯

今回参加のきっかけはこちらの発表をしたことでした。

「素振り程度の感じでうっかり参加すると吉ですよ~」と発表した手前、そのぐらい力を抜いた参加を今回はできないか、ということでチャレンジしてみました。負担を分散するため一週間前から少しずつ動きはじめました。

フライング期間

フライングブログ1日目

am1tanaka.hatenablog.com

今回は個人的にはデジゲー博の準備、学校はDATフェスタという学園祭の準備で全然時間が避けそうにありません。が、参加はしたい。 ということで、徹底的に目的を絞った上でフライングで準備を進めて、なんとか参加することを目指します。あれこれ忘れそうなので作業メモを公開しつつ進めてみます。

昨日こそ丸一日使ってしまいましたが、今日も含めてほぼ作業しない日もあったので、これはうまくいったと自己評価しています。前日に投稿が完了するという、ずっとやりたかったこともできて満足。

当初掲げた目標です。

  • 実作業1時間+進捗メモ執筆。企画などは移動時間を活用
  • ランキング入りは目指さない!!
  • 参加者(特に初参加)のみなさんの作品をなるべく遊んで評価やコメントする
  • 実験要素を一つ導入して、あとは徹底的にコンパクトに

最初のはほぼ完遂。二番目も力を入れすぎないために意識しました。三番目はこれからやります。最後のは途中で方針変更をしました。あとはアセットの棚卸しと発案素振りで終わり。この時はまだ手持ちのアセットを使う方針でした。

フライング2日目

am1tanaka.hatenablog.com

アセットのテストをしたり、アイディアの具体化をする過程で、今回の最終的なテーマである「初級者が使える程度の技術でなんとかする」という方針が浮かびました。これにより、今回の参加の方向が決まりました。

フライング3日目

am1tanaka.hatenablog.com

1年生の夏休み前にやった内容をリストアップした上で、企画を検討していました。この時は、以前から考えていたプリミティブな図形だけで感情表現をすることを考えてました。作業らしい作業はしてません。

フライング4日目

am1tanaka.hatenablog.com

マルズラットを考えてました。タイトル案が好き。企画がいつものように無機質で無感情になっていったので、顔を出してテンションを挙げたのでした。床の解決策はすでに用意していたので、テーマ次第ではこれで作ったと思います。

フライング5日目

am1tanaka.hatenablog.com

台風を無事に生き延びてのブログ。前日は、一階が浸水する、屋根が飛ぶ、家が倒壊する、といったことを本気で想定して備えていました。とりあえずプロジェクトを作成して、必要なアセットの読み込み、ビルド、unityroomへの登録などを済ませてお題を待ちました。

そういえば、このブログを書き始めた時点ではUnity2019.1対応だったのが、ブログを書き終えて公開前のチェックをしたらUnity2019.2に対応してたのでした。

1週間ゲームジャム期間

初日!

お題が「さがす」に決定!先に考えていたマルズラットでもゴールの星を探すようにすればまあ行けるけど、とりあえず新企画の検討!

  • 「さ」が「す」になっているのを直していくとか、赤坂をさがすとか、言葉遊び系
  • 砲撃して相手の場所を探るような対戦ゲーム系
  • ランダムで適当に結果を出す診断系
  • スズメを探したり、コサギのガサガサのシミュレーションなどの生き物系
  • クラッチを元に、沢山のものを壊しまくって、あっという間に勝負を決める系

以上のようなのをつらつら考えているうちに、とにかく沢山パーティクルで散らしたれ、という最後のスクラッチアイディアが残りました。

プログラムの難易度は低い。沢山壊れるから気持ちよさそう。キャラを出してネタもできそう。

そんなことで決めました。

初日はメイン作業が押してしまったため、寝る前にちょこっとだけ作業。1時間ぐらいで以下のような原型を作って寝ました。

2日目

この日も殆ど進まず。姫のドットを置いただけでした。

3日目

3日目でようやくプログラミングっぽいことを。

今回、はじめてワンシーンでやってみました。ガチャガチャっと作るとやっぱり初期化が混乱しがちな印象ですが、遷移が速いのはいいですね。もう少しセンスよく上下左右にシーンを配するなどすると、かっこよくなりそう。今後の課題です。

4日目

ランキングを組み込んでました。

順位を表示したかったのでちょっと改造したり。ここまでゲーム動かしてないじゃん^^;

5日目

一気にゲーム部分が完成しました。

18時ぐらいから作業開始して、25時ぐらいまでやってたもよう。途中あれこれしながらだけど5時間ぐらいはやってたかな?

6日目

積み残していた、ネットランキングと画像ツイートの連携を中心に仕上げ。

この日の時点ではBBAを捕まえてもタイムロスだけでしたが、アップした動画を見て、なんか地味でネタ不足に感じたので、いっそゲームオーバーにすることにしました。タイムによってメッセージを変えたりも、この日に思いついて突っ込みました。

ということで、投稿予約!

最終日

今日です。積み残しは以下のやつ。

  • フルスクリーンにすると、アスペクト比が違うモニターで表示が崩れる問題
  • マウスを素早く動かすと、箱の切り残りが発生する
  • チュートリアルがない

マウスを素早く動かすのへの対応は、Physics2D-RaycastNonAlloc - Unity スクリプトリファレンスで瞬殺。

苦戦すると思っていたアスペクト比が違う時の対応ですが、今回利用していたPixelPerfectCameraで簡単に対応することができました!( Class PixelPerfectCamera | Package Manager UI website )

あとは、最後にゲームバランスを調整するために箱の数を減らしてカメラを調整した時に箱の大きさが相対的に大きくなってしまったので、それを修正して完成!

今回の1週間ゲームジャム、完了となりました。

アスペクト比が変わることへの対応

苦戦すると思っていたアスペクト比が違う時の対応ですが、今回利用していたPixelPerfectCameraで簡単に対応することができました!( Class PixelPerfectCamera | Package Manager UI website )

f:id:am1tanaka:20191020171130p:plain
Pixel Perfect Camera

これのCrop Frameの設定が最高で、チェックを入れておくとアスペクト比が異なる場合に、Cameraのビューポートを自動的に調整してReference Resolutionアスペクト比を維持して、画面外になる場所は黒くしてくれます。これでゲーム画面は対応完了です。

あとはUIですが、これはCanvasの下にPanelを置いて基準となる解像度にして、ボタンや文字などをそのPanelの子にすることで自動的に解決しました。

まずはお約束のCanvasCanvasScalerの設定をします。解像度を設定して、Expandにしておきます。

f:id:am1tanaka:20191020171759p:plain
Canvas Scaler

その下にPanelを置いて設定します。今回の基本解像度は960x540なので、Panelをそのサイズにしています。配置は画面中心にしています。子供の要素をこのPanelを基準にレイアウトすることで、アスペクト比や解像度が変わっても大丈夫です。

f:id:am1tanaka:20191020171610p:plain
Canvasの設定

次回に向けて

次回は1年生に積極的に参加してもらうタイミングなので、自分も参加予定だなぁと・・・。技術縛りがあったことで、企画側で何かインパクトを出さねばならない、というのを普段より意識しました。これはよい体験だったと感じたので、次回も意識したいところです。

改善点としては、土曜日に難航したツイート周りやアスペクト比への対応は、本来はゲームジャム期間前に準備できることでした。また、ツイートした時のキャッチーさが足りないのはいつものことですが、今回もダメな感じでした。ということで、一応、次回に向けて。

  • キャッチーな画面について研究
  • フレームワークを整理
  • 使えそうな技術のリサーチ

こんなところでしょうか。

まとめ

今回の最大の目的である、メインの作業であるデジゲー博の準備には殆ど影響なく参加できました。ここ最近、小難しいゲームが続いていたので、短時間でランキング競争ができる作品を作ってみたかったので、その点は欲求が満たせました。

技術的には特殊なことは殆どしていませんが、以下は1年生に教えていないものでした。

  • Pixel Perfect Camera
  • Physics2D.RaycastNonAlloc
  • Animationのイベント

Animationのイベントは取り入れようかな?と感じました。なくてもやりようはありますが、知っていれば簡単に解決できる演出や動きがあるので、知っておいた方がいいかなと思いました。

あとは、当初の目的の一つであった、参加者の皆さんの作品をあれこれ遊ぶ、というのをできる範囲ですが、やっていこうと思います。

参考・関連URL

unityroom.com

unityroom.com

TextMeshPro向け ASCIIコード+JIS第1水準の文字

TextMeshProを使う時にフォントアセットを作成します。その際に使える限りの文字を定義してくださっているありがたいファイルが公開されてはいるのですが、容量食うし、テスト段階ではほどほどのやつでいいのです。ざっと探したのですが見つからなかったので自作しました。

※2020/7/1 ~を追加しました

※2020/6/25 半角スペース、全角スペース、©記号を追加しました

◆ココを開いて、Rawボタンをクリックして、表示されたテキストを全てコピーしてTextMeshProのFont Asset CreatorCustom CharactersCustom Character Listのところに貼り付けてご利用ください。

以下の文字セットで、約3,580文字です。

  • ASCIIコード(0x21~0x7F)
  • 記号、英数字、かな(01区~08区)
  • 第1水準漢字(16区~47区)

ほぼ全ての日本語を利用したい場合は、@kgsiさんのUnityのText Mesh Proでほぼ全ての日本語を表示させる - Qiitaをご覧ください。

フォントアセットの作成

WindowメニューからTextMesh Pro > Font Asset Creator を選択してダイアログを開いてフォントアセットを作成します。

Sampling Point Size48、というのを見ますが、大きな文字を使わないメッセージ用のフォントなどにはそれほど解像度が高い必要はないように思います。Render ModeにSDFAAが追加されてフォントアセットの作成速度が爆速になったので、一度、Sampling Point SizeAuto Sizingで作成してみて、その値を使うのがよさそうです。

設定例

まずは以下の設定で試してみるとよいと思います。

  • Sampling Point Size
    • Auto Sizing
  • Padding
    • 5
  • Packing Method
    • Fast
  • Atlas Resolution
    • どちらも2048
  • Character Set
    • Custom Charactersにして、Custom Character List欄に、上記のRawでコピーした文字列を貼り付け
  • Render Mode
    • SDFAA
  • Get Kerning Pairs
    • チェック

以上でGenerate Font Atlasボタンを押してフォントアセットを作成して、完成したらSaveボダンで保存します。

これで表示してみて、文字が粗く見える場合は、Atlas Resolutionの一方を4096にして再生成して確認して、まだ駄目そうならどちらも4096にして生成する、という流れがよいかと思います。

本番用

基本設定は省メモリのままで、以下だけ変更します。

  • Sampling Point SIze
    • 試作した時に表示されるPoint Size
  • Packing Method
    • Optimum

以上でGenerate Font Atlasボタンを押してフォントアセットを作成して、完成したらSaveボダンで保存します。Optimumは生成に時間がかかるので、Sampling Point SizeAuto Sizingでやるとめちゃくちゃ時間がかかります。Fastの時に確認したサイズを設定するのがよいでしょう。

まだ解像度が足りない場合

一辺が4096を越えるとフォントアセットのサイズが巨大になる上にスマホなどで動かない機種が出てくると思います。使用する文字を確定した後に、それらの文字だけを含めたフォントアセットを作成することを検討するとよいと思います。

文字一覧の作り方概要

JISコードで欲しい範囲をループで回して、 http://unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/JIS/JIS0208.TXT のファイルから対応するUnicodeを取り出して、文字表示するツールをVisual C#で書きました。

参考URL

Unity1週間ゲームジャムへの道 前日

f:id:am1tanaka:20191013221535p:plain

昨日は台風で最大警戒していたため作業無し。いよいよあとちょっとでお題発表です!その前にできる最低限の準備をしてしまいましょう。

目次

Unityバージョンの確認

unityroomで使えるUnityの最新版は2019.2.xです。バージョンを決めてしまいましょう。

  • ビルドの速さ、機能の多さ、パフォーマンスの良さを重視するなら、Unity2019.2の最新版
  • Unity公式を信じて安定版を選ぶなら、Unity2018.4の最新版
  • 短期間だしリスクを減らしたいなら、今お使いのやつ。ただしUnity2019.3以降は除く

今回、自分は複雑なことはやらないので不具合は出なかろうということで最新の2019.2.9でいってみます。

本来は一番安定しているはずの2018.4.9ですが、不具合があるというのをTLで見たことがあります。自分が使っている範囲では問題は起きてないのですがちょっと不安です。安定を求める場合は、今お使いのバージョンを使う方が無難かも知れません。

バージョンを決めたら、必要に応じて本体とWebGLのパッケージをインストールします。

プロジェクト作成とGitHubやUnity Collaborateへパブリッシュ

お題が発表される前なのでタイトルは決まっていませんが、自分の場合は1週間ゲームジャムの時期でプロジェクトを作成してしまいます。今回は2019年の10月開催なので、u1wgj-1910のような名前でプロジェクトを作成しています。

プロジェクトを作成したら、すかさずGitHubやUnity Collaborateなどでバージョン管理を開始するのがオススメです。一人で開発する場合はコンフリクトのリスクもないので、作業を進めたらすぐにコミットとプッシュをしておけばいざという時になんとかなります。

ビルドテストとデプロイ

WebGLビルドはいろいろ起きるので、一度ビルドしておくのがよいです。

プラットフォームをWebGLに切り替え

プラットフォームはあとで切り替えると時間がかかるので、最初にWebGLに切り替えてしまいましょう。

Player Settings

WebGLに切り替えたら、Player Settingsで以下のようなものを設定しておきます。

  • Company Name
  • ResolutionのDefault Canvas WidthとHeight
    • 解像度がすでに決まっていたら解像度もこの時点で設定します。まだ決めてない場合は、unityroomのデフォルト値である960x540にしておくと楽です
  • Unityのバージョンが古い場合、Memory Sizeの設定が必要かも知れません。256MBにしておくとunityroomのデフォルトのサイズになるので楽です

あとは適宜、必要そうな項目があれば。

仮プログラム

何も表示しないと動いているか分からないので、Time.timeを表示する以下のようなスクリプトを作って、Main Cameraにアタッチします。

  • HierarchyウィンドウからMain Cameraを選択します
  • InspectorウィンドウからAdd Componentをクリックして、New Scriptをクリックして、DrawTimeという名前でスクリプトを作成します
  • スクリプトを以下のものに差し替えます
using UnityEngine;

public class DrawTime : MonoBehaviour
{
    private void OnGUI()
    {
        GUI.Label(new Rect(20, 20, 100, 40), Time.time.ToString());
    }
}
  • 上書き保存してUnityに戻ります

以上で実行すると、起動してからの経過秒数が表示されます。

f:id:am1tanaka:20191013213717p:plain
経過秒数を表示

以上できたら、WebGLでビルドしてエラーが出ないことを確認します。エラーが出たら、ニムさんの以下のブログなどで原因を探してください。

nimushiki.com

日本語のフォルダー名やファイル名を使っていることが一番可能性が高いです。特に、ユーザー名が日本語というのは致命的です。新しく半角英数のユーザー名の新しいユーザーを作るとかしか対策がない場合があるので、早めの確認が必要なのです。

注意

ビルドが成功したらDrawText.csスクリプトは不要なので、Main CameraからRemoveして、ファイルを削除してください。

unityroomへアップロード

unityroomへアップロードするには、Twitterアカウントが必要です。詳しいアップロード方法は以下のnaichiさんのブログをご参照ください。

blog.naichilab.com

以上で、無事に動作が確認できれば安心です!

これを締め切りギリギリにやろうとすると、思わぬ不具合にぶち当たることが多々あります。まだ本格的に作業を始められないこの時間を使ってやっておくのが吉です。

使うであろうアセットをインポートしておく

TextMeshPro

TextMeshProは使いますよね。ということで、以下をやっておきます。

  • WindowメニューからTextMeshPro > Import TMP Essential Resourcesを呼び出して、Importをクリックします

f:id:am1tanaka:20191013213206p:plain
TextMeshProの初期設定

WebGLはフォントを組み込まないと日本語が表示されません!@thorikawaさんの以下のブログを参考に、とりあえず汎用的に利用できそうな日本語フォントを作成しておくとよいです。

qiita.com

フリーフォント探しはcolissさんのこちらがオススメ。

coliss.com

ネットランキング

ネットランキングは組み込んでおいた方がいいです。naichiさんの以下のブログの通りに進めれば、20分もあれば組み込めるはず。

blog.naichilab.com

画像付きツイート

やまださんがimgurという画像共有サービスを利用した画像付きツイートのライブラリを公開してくださっています。

github.com

ユウさんが手順を丁寧に書かれておりますので、こちらをご参考に。

unity-senpai.hatenablog.com

-1日目まとめ

ここまでの作業は、どのような企画であっても共通の手順なので事前に行っておくと吉です。

  • Unityのバージョンの決定とインストール
  • プロジェクトの作成とGitHubやUnity Collaborateへのパブリッシュ
  • プラットフォームをWebGLに切り替え
  • Player Settingsを設定
  • WebGLビルド
  • unityroomへアップロード
  • よく利用するアセットやサービスのインポートと動作確認

あとは必要に応じて、シーンの切り替えやら、音声の再生やら、よく使うアセットなどをインポートしておくとよいでしょう。

さて、あと少しでお題発表です。参加される皆様、頑張りましょう!!

参考URL

Unity1週間ゲームジャムへの道 -3日目

f:id:am1tanaka:20191011214907p:plain

昨日まとめた方針を元に案出しをしました。

目次

マルズラット(仮)

考えていくに従って無機質なアイディアに流れがちになり、もっとテンションの高いやつを・・・!と顔をいくつか描いているうちに、困った時に頼りになるスネークゲームが頭をよぎりました。

f:id:am1tanaka:20191011210740p:plain
マルズラット(仮)

1画面の1ボタンゲーム。

  • 丸いやつ一匹でゲーム開始
  • ゲームを開始すると、右か左に一定速度で移動を始めます
  • クリックでジャンプして、ジャンプ中にクリックするとすぐに降下します
  • 画面端に辿り着くと、移動方向を反転します
  • 床には下や横からはぶつかりません
  • 緑のエサを取ると、スピードとジャンプ力がアップして、子分が1匹つきます
  • 取ったエサは、一定時間が経過すると特定の範囲内に復活します
  • 青いのにぶつかるか、子分に衝突するとゲームオーバーです
  • ジャンプ力を上げて、画面上部にある何かを取るとクリアです
  • クリア時の子分の数がボーナスになります
  • ネットランキング対応

安全にクリアするには、なるべく早くクリアした方がよいですがスコアが伸びません。リスクを冒して、エサを集めまくって、ギリギリでゴールを目指します。

マルネット(仮)

f:id:am1tanaka:20191011211609p:plain
マルネット(仮)

もっとあっさり、多人数で遊べないかと考えたやつ。

  • 8人ぐらいで遊ぶ
  • 方向と力を決めて、一斉に発射
  • 床に穴が開いているとか、爆弾があったりして、そこに接触すると脱落
  • さいごまで生き残った人が勝ち

ネットワークに対応できるのかや、ルールがまだぼんやり。いずれ作ってみたいけど今回ではないかな?どうかな?

その他

f:id:am1tanaka:20191011211936p:plain
その他企画

思いつくままに落書き。昨日考えていたタイミングものとか、パワーと方向をタイミングで決定する三段跳びとか、仕分けとか、フラッピーバード的なのとか、シューティング的なのとか。どんどん無機質な感じになっていったので多分ボツ。

でも最初のタイミングを合わせるやつの絵面は面白そう。

-3日目まとめ

マルズラットは床が曲者。UnityEngine.PlatformEffector2D - Unity スクリプトリファレンスを使うと楽にできるのですが、1年生の講義で扱ってません。使い方は簡単で、マニュアルを読めば十分使えるレベルなのでまあいいか。

企画の弾込めはある程度できた感じがします。週末に余裕があれば、シーン遷移などの素振りをやります。

明日は記録的な台風がやってくるとのこと。ある程度の備えはしましたが、うちは古くて耐震強度とかいうレベルではないので何があるか分かりません。なんとか耐えてくれますように。台風が上陸する地域の皆様もくれぐれもお気をつけて。

Unity1週間ゲームジャムへの道 スタート:-4日目

f:id:am1tanaka:20191010231654p:plain

フライング3日目です。昨日最後に考えた、初心者が使える技術縛りの企画はどうかということで、1年生の前期にやった内容を整理していました。

目次

1年生の前期にやったことの振り返り

こんな感じでした。

プログラミング

  • 変数、計算、分岐、繰り返し、配列、ユーザー関数
  • 乱数
  • マウス、キーボード操作
  • カメラ(背景色、FOV、Orthographicなど)
  • UI、レイアウト
  • シーン遷移
  • Rigidbody
  • マテリアルとPhisicsMaterial
  • オブジェクトの構築方法(親に移動や物理。子にモデル)
  • CollisionとTrigger
  • タグとレイヤー
  • 生成と破棄
  • ネットランキング
  • BGMとSE
  • static

アセット関連

  • 組み込みの3Dオブジェクト
  • 無料のアセットストアやgithubのアセット
  • 音フリー素材
  • フリーフォント
  • TextMeshPro
  • pps
  • パーティクル
  • アニメーション
  • probuilder

改めて振り返ってみて、重要な項目はちゃんとやっていたということでほっとしました。

ざっくりと方針

この縛りでも案1は作れそうではあるけれど、世界観とかキャラインパクトでなんかできないかとか。前回のTana Tomoさんのキメラのやつとか、つながるの時の週末リキオさんのあうーのとかが凄くよかった。

キメラのやつ unityroom.com

あうーのやつ unityroom.com

といいつつ、アセットを作る時間も割きたくはないので、何か良き手はないものか。現段階で思い浮かんでいること。

  • 脱力系にできないものか
    • 円だけでキャラクター性を出したい
  • 作りはワンシーンで
    • 初期化が面倒なので、リトライのどこかの時点でシーンを読み直す
  • ネットランキング前提
  • ワンボタン
  • さくっと繰り返し遊べる感じ
  • やや不条理

円の顔に円で目を描いて、それで表情を出したい。それが面白くなるような動き、そして、その動きを使ったルール。ジャンプとか、シャッフルして目ががちゃがちゃになるとか、沢山いるのが見てくるとか。

沢山並んでいるのはいいかも。動きをタイミングよく真似する?

ジャンプの衝撃で目がビヨンビヨンするのでも面白いかな?タイミングよく何段もジャンプしていくとか。

-4日目まとめ

PPSとProBuilderは使えるし、一通りのことはできそうです。有料アセットは今回は使いませんが、GitHubに演出系も色々あるので案外不自由しないかも。

明日はこれをベースに引き続きアイディアを出して、可能ならサムネイルを描く。ワンシーンの素振りもできれば。台風対策が第一ですが。今日はこれまで。

参考作品

unityroom.com

unityroom.com