UnityEditor(MacOSX)でPlugins機能を使う方法
UnityのDocumentがいまいちでツラかったので、補足情報をまとめます。
公式Document
関連Blog
公式Documentにのっとったやり方
- MacOSXでサポートしてるloadable bundleという形式(拡張子は.bundle)を使う
- XCodeのビルド設定で、"Mach-O Type"を"Dynamic Library"にする
- "Architectures"を32bitと64bitのUniversalにする
- "Build Active Architecture Only"をNoにする
- Assets/Plugins に置いてDllImportする
非公式だがこれでも動く、というやり方
- dylibをビルドして、格納するときに拡張子をむりやり.bundleに書き換える
- libHoge.dylibだったら、Hoge.bundleなどとする
- この方法だとPlugins以下にフォルダ作って置いて、相対パスで指定してもDllImportがうまくいく
Editorで動かすときの注意点
Editorの停止はアプリの終了とは処理が異なるので、
pluginの終了処理をEditor向けに入れる必要があります。
終了処理がなされず、初期化済みなままEditorが停止してしまいます。
Listなどのコレクションを返すメソッドを作るとき、nullを返さないこと
Before: nullを返す場合
void Start()
{
List<string> names = GetNames();
names.ForEach(obj => /* do something */ );
}
List<string> GetNames()
{
if (/* something */)
return null;
List<string> names = new List<string>();
/* add names */
return names;
}
こんなふうになってると、GetNames()からnullかえってきたときにエラーになります。
当然ですが。
After1: 呼び出し側でハンドリングする
たとえば、以下のように直すと動きます。
void Start()
{
List<string> names = GetNames();
if (names != null)
names.ForEach(obj => /* do something */ );
}
List<string> GetNames()
{
if (/* something */)
return null;
List<string> names = new List<string>();
/* add names */
return names;
}
これだと、呼び出す度にチェックしなければなりません。
実装するときにチェックを忘れてしまって、nullが返ってくるケースを
考慮し忘れた、なんてことがよくあります。
After2: nullじゃなく、空リストを返す
一方、以下のとおり直しても、動きます。
void Start()
{
List<string> names = GetNames();
names.ForEach(obj => /* do something */ );
}
List<string> GetNames()
{
List<string> names = new List<string>();
if (/* something */)
return names;
/* add names */
return names;
}
空リストなど、コレクションで値を何も入れず初期化した状態は、
空なので、後続でforeachなどのループ処理をしても
処理されずスルーされます。
この方が呼び出し元でのミスもなくなり、幸せになれます。
ちょっとした一手間が大事、という良い例です。
Entity Component Systemについてまとめてみる
自分は、Unityが初めてのクライアントアプリだったので、
「こういう風に作るのか〜」
程度の感想しかなかったですが、どうやらゲーム開発に向いたアーキテクチャーで、
Entity Component System(以下、ECS)と呼ぶらしいです。
といっても、UnityはECS風であり、ECSそのものではない様子。
エンティティ・コンポーネント・システム - Wikipedia
とはいえ、初心者にとっては、厳密さより根っこの理解が大事に思えるので、
初学者に向けてまとめてみます。
プロダクトが複雑になればなるほど、継承よりも委譲に頼っていく方が筋が良いという話
オブジェクト指向を意識して開発を進めていくと、継承を使う機会がちょいちょい出てきます。
でも、継承を使って開発していくと、以下のようなときにハマります。
※ Effective JavaはJava知らなくても勉強になるのでオススメ
つまり、「継承は、親クラスの実装詳細を把握してないと書けない」ということです。
オブジェクト指向の特徴に「カプセル化(情報隠蔽)」という言葉がありますが、
継承したときの、子クラスから見た親クラスは、カプセル化(隠蔽)されてないわけで、オブジェクト指向の特徴とは矛盾してしまっています。
そりゃそうか、と言ってしまうとそこまでな話ですが、
割と重要な事実ではないでしょうか。
これは、委譲であればそんなことはないのです。
以下のブログは、そのことをとてもわかりやすくまとめています。
上記のブログで、コンポジションと言っているのが委譲です。
このような思想をコンポーネント指向と言ったりもするようです。
「オブジェクト指向は、1つのクラスが人に例えられる(擬人)けど、コンポーネント指向は、1つのクラスが部品になり、部品の集合がオブジェクトと見なされる」
というところです。
例えば、「銃を打てる人」を表すときに、以下のように構成が変わってきます。
直感的にも、継承ツリーを意識せずに実装できるのは、メリットと感じられるのではないでしょうか。
ここまで説明すると、UnityがECSの思想に基づいて作られていることがなんとなくイメージできるかと思います。
- ゲームオブジェクト: Entity
- ゲームオブジェクトに紐づくスクリプト達: Component
という位置付けになります。
じゃあどう実装するのか
具体的にどう実装してるのか、というのは、以下が参考になるので
こちらを参照ください。
以下はUnity特化です。非公式ですが、わかりやすいです。
そもそもどうやってSceneを作っていくべきか、大いに参考になると思います。
おまけ
UnityのECSって微妙じゃね?という議論を垣間見れます。(英語読めればw)
上記ブログで触れられた Artemis Entity Component System
Artemis Entity System Framework - Entity Systems Wiki
ちなみに、Unityの上に動く自作ECSも公開されたりしてます笑
動画もあり、熱量を感じられます。
ぼくもこの程度の知識しかないですが、参考になればうれしいです。
ゲームプログラマー向けのサウンド入門を目指して
自分は仕事でゲーム開発する際に、サウンドから入りました。
たまたまそういうアサインだったのです。
ただ、基礎がまとまってなくて結構苦労したのを覚えています。
ググッてもあんまり情報が出てきません。
まだ、おそらくじぶんの知らない部分もいっぱいあるけれど
全然知らない人がこれから取り組むときに参考にできるものを目指して
まとめてみようと思います。
※Unityで使えるサウンド機能についてもちょこちょこ触れてます。
前提
- サウンド自体は、別のだれかが作ってくれる
- わたし(読者)は、それを適切に取り込まないといけない人
例1: どのファイル形式で、とか
例2: どれくらいのサンプリングレートで、とか
ファイル形式
一番良い音質になるのは当然非圧縮形式ですが、それだとBGMのような再生時間の長いもので問題が起きます。
例えば、wav形式であれば
- 5分 (=300秒)
- 44100Hz (サンプル数/秒)
- 16bit (bit/サンプル数)
- 2ch (2つ分)
だと、
300 * 44100 * 16 * 2 = 52920000 (Byte) = 52.92 (MB)
となり、1つのBGMでこんなに重いと100個で5Gになってしまいます笑
サウンドだけでこんな容量になってしまうと全体のアプリの容量も増えて非常に困るわけです。
例えばiPhoneの一番少ないストレージだと16GB (でしたっけ)なので、
サウンドだけで5GBだと困るし、アセットをダウンロードするにも異常に時間かかります。
なので、BGMのような大容量ファイルは圧縮形式にした上で、
適切に音質をコントロールしつつ、できるだけ容量を下げる必要があります。
WAV (WAVEとも書く)
MP3
- Moving Picture Experts Group (MPEG !) というワーキンググループが開発
ー 専門家の集団らしい - 圧縮形式
- mp3の技術には特許があり、利用すると訴訟リスクがあり、あまり使われていない (はず)
- なのにUnityではiOSでビルドするとoggというサウンドファイル形式がmp3に変換されてしまう…
ー UnityではAIFF, WAV, Ogg, MP3の4種類サポートで、圧縮形式はOggとMP3の2種類しかないから詰んでる
特許云々の話は以下にまとまっております。
実際にMicrosoftが訴訟されたりしています。
MP3のライセンス問題はその後どうなったのか : Timesteps
iOSでビルドすると云々の話は以下です。
ちなみにUnityでサポートしてるサウンド形式については、以下に書かれています。
Ogg
- Xiph.org Foundation (ザイフォ財団)という非営利団体が開発
- パテントフリー (特許なし)
- 圧縮形式
すばらしいですね。Oggを利用する、という結論でよさそうです。
AAC
音質(と容量)を決める重要な指標
ファイル形式とは別に、音質を許容範囲まで下げることで容量を減らすこともできます。
容量を減らす必要がなかったとしても、サウンドライブラリ・エンジンの仕様で指定した形式のデータでないとそもそも再生できなかったりするので、各指標を把握するのは必須です。
サンプリングレート/サンプリング周波数
1秒あたりのサンプルデータ数。
アナログデータは連続ですが、デジタルデータは非連続なのです。
サンプルデータ数を増やすほど、アナログデータの音に近づきます。
ちなみに、音楽CDは44.1kHz/16bit (こっちはビット深度。後述)らしいです。これを超えたやつがハイレゾ。
ビット深度 /量子化ビット数
サンプリングデータ1つあたりのデータ量(bit)のこと。
CDで使っている16bitなら、2^16で0-65535の値でデータを表現できる。
8bitとかにすると音が雑になって、ノイズが出る(らしい)。これを量子化誤差と呼ぶ。
ビットレート
単位はbps (bits per second)。1秒にどれくらいのデータ量が処理されるかを表す。
音楽CDの目安は128kbpsだとか。
こちらとか聴いてみると面白いかも。
チャンネル数
よく言われるモノラル/ステレオのことです。ステレオだと2チャンネル使います。
モノラルで再生できるものならモノラルで納品されるので、それを把握した上で組み込む必要があります。
ゲーム開発でよく出てくるサウンド周りのキーワード
あとはざっとまとめます。
ポイントループ
同じBGMをまるっとループ再生するのではなく、指定したポイント(ループポイント)からループして再生することがよくあります。
サウンド作成ソフトで、ループポイントを指定できて、それはバイナリファイルのコメント部分に直接埋め込まれています。
WAVEで納品されて、例えばoggに変換するときにループポイント指定部分が除かれてしまったりしないように注意する必要があります。
Wavosaurというフリーソフトがあるので、これを使って変換すれば(CUIじゃなくて面倒ですが)ポイントループを引き継いで変換できます。
同時再生数
SEを何かのアクションに合わせて再生させるとき、最大いくつまで再生出来る、という設定を入れることで音が重なりすぎて変な音になることを防ぐ仕組みがあります。
・・・なければ作る必要があります汗
フェードイン/アウト
これくらいできないと、ゲームとして結構微妙な演出になります。
あれ、もっとあった気がするけど思い出せない・・・汗
また書きます。
最後に
また後日、追記して一部具体的なやり方についても書きます。
ゲーム開発初心者のWebエンジニアがUnity×C#で開発するために1年間で読んだ9のモノ
私がアプリでゲーム開発をするようになったのは2014年の夏でした。
もう1年が経ったので、今まで読んだモノ(本だけでなくWebも)をまとめてみます。
当時のスキルセットは、
です。
右も左もわからない頃
0. まずはWebで
Unity公式のTutorialが楽しく学べるようになってます。
Unity - Tutorial - 2D Shooting Game
まずはこれに沿ってUnityを動かしてみるのが良いです。
他にもドットインストールをちょっと見てみましたが、退屈かもしれません。
1. まずはひよこ本から
有名みたいですね、ひよこ本。
私はUnity4で開発しているので、以下を読みました。
Unity自体をどう触るのか、という超初歩が学べます。
GUIのEditorで実装する感じが最初は抵抗ありましたが、もう慣れました。
筆者の労働環境はUnity4ですが、
今やUnity5が出てしばらく経つので、こちらの方が良いと思います。
Unity5入門 最新開発環境による簡単3D&2Dゲーム制作
- 作者: 荒川巧也,浅野祐一
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2015/07/29
- メディア: 単行本
- この商品を含むブログ (1件) を見る
2. ざっくり学んだ後に実際のゲームを触ってみる
会社の先輩が、「深イイ」と言っていたのでこちらを読みました。
当時の自分にはよくわからなかったですが、
「手触りをよくするために、どういう実装にしたのか、というのが非常に勉強になる」
と仰っていたので、本当はある程度慣れてから読む本かもしれません。
ただ初心者でも、「Unityで完成したゲームを触っていじってみる」ことができるのが良いと思います。
素材がどこかのサイトからダウンロードできて、プロジェクトを開いていじれるのですが、「こうやって作ってるんだ〜」と、何かと気づきが得られるかと思います。
3. C#を覚える
ぼくはだいたい「なんちゃら最速マスター」みたいなページを読んで覚えてます。
なんかタイトルがキャッチーで情報もスリムなので、さくっと読んで覚えるかーという気分になります笑
同僚は、以下をお勧めしておりました。
ぼくの場合は、ググったらたまたま以下に出会って読むことは多々ありました。
ので、どっちにしても出会うことになると思います。
4. 3Dグラフィックスの雰囲気を感じる
これはコンソール業界にずっといた方から勧めてもらいました。
ゲームグラフィックス 2013 CGWORLD特別編集版 (Works books)
- 作者: 久代忠史,高木貞武,宮田悠輔,オガワコウサク(有限会社グリグリ),CGWORLD編集部,ワークスコーポレーション書籍編集部,弘田写真事務所
- 出版社/メーカー: ワークスコーポレーション
- 発売日: 2013/09/09
- メディア: 単行本
- この商品を含むブログ (1件) を見る
3Dグラフィックスってどんなかんじなのか、
どんなものが注目されているのか、眺めるだけなのですが
なんとなく意識が高まります。笑
自分はエンジニアなので直接こういうものを作ることはないのですが、
自分の関わるプロダクトがどういうものなのか、感覚が掴める気がします。
最新のものだと以下ですかね。
5. 3D技術の歴史とキーワードを把握する
4. とも近いですが、「自分の作るものがどういうものなのか」よくわからなかったので、以下を読んでキーワードを把握するようにしました。
こちらでも触れてますね。まとめも知識不足で意味不明になってますね笑
でも、シェーダーもよくわかってなかったので、俯瞰して技術要素がどうなってるのか把握するのにはよかったと思います。
ある程度慣れてから
6. C#のイケてる書き方ってどんな感じなんだろう
てことで、読んだのが以下。
「 Effective 〜」は有名みたいで、これも周囲は読んでるし、レビューもよさげだったので読んでみました。
C#らしい書き方で大事なこと、が書いてあります。
でもちょっと難しいかも。わかるのもありますが、わからない項目も結構ある。
勉強にはなりました。
7. ゲームっぽい書き方ってどんな感じなんだろう
と思って読んだのが以下。
割と基本的な内容らしく、そういうレビューも多かったんだけど、
わかりやすいし分量もちょうどよくて、面白かった。
オブジェクト指向やデザインパターンに詳しい人には不要らしいけど、
自分はそういう人ではなかったので勉強になった。
もっとガチで勉強するならCode Completeの方がいいらしい。
Code Complete 第2版 上 完全なプログラミングを目指して
- 作者: スティーブマコネル
- 出版社/メーカー: 日経BP社
- 発売日: 2014/04/02
- メディア: Kindle版
- この商品を含むブログ (10件) を見る
上ってことは下もあるのか・・・と自分は敬遠してる笑
8. そもそもC#の言語仕様って・・・
と、慣れてきて気になったころに読む本。
- 作者: ベンアルバーリ,ブラッドメリル,ピータードレイトン,Ben Albahari,Brad Merrill,Peter Drayton,竹内里佳
- 出版社/メーカー: オライリー・ジャパン
- 発売日: 2002/07
- メディア: 単行本
- クリック: 51回
- この商品を含むブログ (13件) を見る
薄いのが良いです。持ち歩くのも全然問題ない。
ちょっと暇なときに読むのがよいカジュアルさです。
9. 実はJavaがC#に似てるので、Javaの技術書も良い
インターフェースと抽象クラスで分けるコードの書き方が正しいのか疑問に感じて2chで聞いたら「Effective Javaを読め」と言われて読んだら面白かったので
読んでなかったら是非。
EFFECTIVE JAVA 第2版 (The Java Series)
- 作者: Joshua Bloch,柴田芳樹
- 出版社/メーカー: 丸善出版
- 発売日: 2014/03/11
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (9件) を見る
個人的には、この本が一番アタリだったかも。
staticクラスの使い方やらインターフェースの使い方、やらが、しっかり書いてあって、そういう思想的なことを学べなかったので、こういう本を読むのは大事だと思う。
ネット読んでるとJavaとC#の違いに苦しむ人がいるみたいだけど、LLから入った人がみたらだいたい一緒ですね。笑
まとめ
いかがでしたでしょうか。
誰かの参考になれば、それ以上のことはありません。
【確定申告】2016年に向けてサラリーマンのための確定申告について予習しておく
筆者はサラリーマンやりつつも、ちょこっと副業やったり株やったりしていて
収入があるので確定申告せねばなりません。
今回は本ブログのメインテーマからは外れますが、その話を予習すべくまとめてみます。
目次
- サラリーマンに確定申告は無縁と思っているあなたへ
- 出産したとき (=医療費控除)
- 家やマンションを買ったとき (=住宅ローン控除)
- ふるさと納税したとき (=寄附金控除)
- ちなみに、これらは「所得控除」なのでご注意を
- 副業してるとき (=雑所得)
- 株とかFXとかしてる (=申告分離課税)
- まとめ
サラリーマンに確定申告は無縁と思っているあなたへ
全くそんなことはありません。
目を覚ましてください。笑
例えば、ざっくり以下のとき確定申告するとお金が返ってきます。
万単位で返ってくることもあります。
- 出産したとき
- 家やマンションを買ったとき
- ふるさと納税 (これはやるなら当たり前)
また、ざっくり以下で会社以外の収入が20万以上のときは確定申告してないと脱税です。
- 副業してる
- 株とかFXしてる
さて、どうして確定申告すべきなのか、それぞれ見て行きます。
その前に、前提として対象読者を記載しておきます。
- 年収が330万以上900万以下の方
すなわち、
で言うと、税率20-23%の方です。税率が収入によって全然違うのです。
出産したとき (=医療費控除)
出産してなくても、ひどいケガなどでお金がかかったときは「医療費控除」が適用できます。
10万以上かかった医療費全額 (× 2割)
が返ってきます。※保険で補填された金額は除く必要があります。また、出産一時金の42万円も除く必要があります。
以下、正しい情報です。(超分かりづらいですがw)
No.1120 医療費を支払ったとき(医療費控除)|所得税|国税庁
例えば50万医療費がかかってれば、
(50万 - 10万) ×0.2 = 8万(所得税率:20%を掛けてます)
となります。
ちなみに非常に細かいことではありますが、通院のための交通費についても、控除の対象になります。
具体的な金額が知りたい場合は、こちらのサイトで簡易計算することができるようです。
家やマンションを買ったとき (=住宅ローン控除)
これ、買えばなんでも控除が適用できるわけじゃないです。ざっくり
- 木造なら築20年以内
- 鉄筋なら築25年以内
- ローン10年以上組んでる
- 50平米以上ある
で適用可能です。条件細か過ぎ!
税制って超細かいのです。
詳しく知りたい方はこっちがオススメです。
年最大40-50万程税額から控除されるそうです。
結構デカいですねー。自分は築50年物件を買ってしまったので対象外です笑
ちなみに、住宅ローン控除は、「税額控除」といって所得税を算出後に引いてくれる、イケてる控除です。他には、株の配当金に適用される配当控除などがあるらしいですが、難しすぎて私もよくわかってません汗
ふるさと納税したとき (=寄附金控除)
ふるさと納税って、実は結構複雑な仕組みなんです。
これは2016年の確定申告で使える情報ではないのですが、
「ふるさと納税とは何ぞや」ということが理解できます。
ふるさと納税の控除額(=最終的に返金される金額)は、
- 所得税の寄附金控除
- 個人住民税の寄附金控除
- 個人住民税の寄附金控除の特例
の合計なんです。これが合計「負担は2000円で、最大で住民税の約20%相当額まで返金される」
と言っているのですから、非常に難しいです。
とりあえず住民税の約20%まで返金される
とざっくり覚えておきましょう笑
※正しくは、ふるさと納税をした次の年の6月の住民税から、最終的に返金される金額が差し引かれます。
ちなみに、これらは「所得控除」なのでご注意を
これらの情報は、
収入(所得)を得ていることが大前提
であることに注意です。なので、基本的にはサラリーマンに優しい制度なのです。
最終的に計算した結果(所得)に対して、以下ページの表を使って計算します。
実際はさらに複雑に計算されてるので、難しいことは考えず、こちらで先に所得金額を計算してみましょう。(平成26年版だけど参考にはなる)
「所得金額」が、控除前の金額です。
では、次へ進みます。
副業してるとき (=雑所得)
税制上、収入のことを「所得」と呼びます。所得には以下の種類がありますが、
難しいのでスルーでよいです。
副業は、以下のように覚えておくといいと思います。
事業所得か雑所得の違いは、あいまいですが、定常的に収入があるかどうかです。
ただ、サラリーマンの方が事業所得として申告すると、住民税の通知書が会社に届いたときに会社の経理の人バレる可能性があるようです。
なので、サラリーマンの方は、よほど副業で稼いでない限りは雑所得がオススメです。
雑所得は、給与に足されて所得税を計算します。
ここの金額がでかくなると税金も当然増えます。
株とかFXとかしてる (=申告分離課税)
扱いが特殊なようで、他の所得と分けて計算することになっています。
No.1463 株式等を譲渡したときの課税(申告分離課税)|所得税|国税庁
こちらによると、もうけた収入の20%支払う必要があります。利益を確定させない場合などは、株価が上がっていた場合でも、確定申告する必要はありません。
まとめ
- とにかく税制は超細かくて難しい! (困ったら詳しい人に聞く!)
- 控除は所得金額以上にはならないので先にどれくらいか計算しておく
- 副業してる方は脱税にならないように税制を学んでおきましょう
まとめると薄くなりますが、大事なことはすべて細かいです。
こちらを入り口に、勉強していただけたら幸いです。
.git/indexが壊れたときの対処法(の続き)
ある日、gitコマンドを実行したらエラーが返るようになった
Jenkinsを使ってUnityのiOS/Androidビルドやアセットバンドルビルドを
実行しているのはよくあることだと思うのですが、とある日
$ git status error: bad signature fatal: index file corrupt
このようなエラーがかえってくるようになり、ジョブが失敗し続けるようになってしまいました
ぐぐってみると、対処法が出てきたのでやってみました。
$ rm .git/index $ git reset $ git status error: bad signature fatal: index file corrupt
あれ、なおらない・・・
HEADの状態がおかしいのではと思い、git reflogしてみた
aeb40d6 HEAD@{0}: checkout: moving from b182e69ba8377b48eef37ba0edf6aeb46fb5fb7e to aeb40d6
b182e69 HEAD@{1}: checkout: moving from fda39c5be148812a5bab309284aa571186ce2057 to b182e69ba8377b48eef37ba0edf6aeb46fb5fb7e
あれ、HEADのコミットハッシュがおかしい・・・
ということで、
git reset --hard HEAD@{1}
をすることでなおりました。
HEAD@{1}とかの記号が分からない方はこちらを読むとよいです。
まとめ
- HEADの状態が壊れてるときは、.git/indexを再作成してもリポジトリが修復しない
- HEADが壊れているときは、git reflogで壊れてなかった過去を見つけてgit reset --hardする