UnityC#使ってはいけないクソ機能列伝
- BTA(Kelorin Jo)
- 2020年10月19日
- 読了時間: 5分
更新日:2021年1月20日
UnityのC#には
一見便利そうでも、一定ラインから先に進化が絶対に不可能なダメな機能が確実にあって
(コードとかメソッドとかクラスとか、そんな横文字つかうと伝えたい人に伝わらなくなるので「機能」と表記します)
安直に素人ゲーム作る分にはいいけど、それをもっと快適にしよう・プロトタイプから本格ゲームに移行しようとしても、コードの大幅見直しを余儀なくされる。された!
しかしプログラム初心者はそんなことわかるはずもなく、過去の記事を見て真似して、
一見うまく動くから大はしゃぎで忘備録を書いちゃって情報をロンダリングしてしまい、
クソ機能が廃止されず受け継がれる負の連鎖を起こしてるのではという気すらします。
煮ても焼いても食えず、結局原始的な方法でやるほうがマシだった、そんな機能をまとめます。
Time.timeScale ゲーム中の時間を遅くするまたは止める機能。
これでポーズメニューや演出を作ろうとすると詰みます。 僅かな例外を除いて、特定の物だけ止めることができないようです。
完全に時間を止めるとデルタタイムが使用不能になり、ポーズ画面のアニメやBGMが制御不可または困難になるなど、とにかくデメリットがやべえ!
スローにしてもバレットタイムになるわけではなくコマ送りになって、見栄え悪い
プレイヤーの操作とNPCの行動だけ止めたいとかならこいつを使わず、手動ですべてのオブジェクトを止めたり動かしたりを管理するしかない、となりました。
なおクロノスというアセットがあって、これがバレットタイムや一部止めとかできるのですけど、使ったことはないです(有料の時に買って使いこなせないうちに無料になった…)
Input.anyKeyDown タイトル画面とかで、どんなキーでも押せばいい時に使ったけど、
ボタン押しっぱなしに対応できません。
ゲームオーバー→リトライ表示→タイトル画面が一瞬ですっ飛ばされてしまった。
キーを離した時に発動してほしいけど、anyKeyUPはないみたいです。
特定のキーやボタンを押して離すのを待ち受ける仕様にするしかないでしょうか?
(加えて一定時間入力受け付けない仕様にしようとするも、なぜかカウントタイマーが無視されるという症状に悩まされてるのですが、因果関係は不明)
OnDestroy() オブジェクトがDestroyで削除されると発動する機能です。
倒すとエフェクト出してアイテムをドロップする敵のように、オブジェクト削除と同時に別のプレハブを作る用途に使います。
ツクールやGameMakerでも当たり前にやる常套手段であり、同様の感覚で使ったわけですが、
Unityだけは、てめえこのやろう…
ステージクリアやリトライなどでシーンチェンジする時、これがステージ内に残ったオブジェクトに強制発動してしまいます。シーンチェンジ処理中にオブジェクト生成してしまったら赤エラーで止まってしまいます。 根本的対策は、はなからこの機能を使わずタイマーの変数なり作って同等の機能を自作するしかないという。
アニメーションのイベントキー
アニメーションに、外部のメソッドを任意のタイミングで実行できるイベントキー
しかしメソッドがあるコンポーネントがアタッチされてないと、赤エラーで止まります
イベントキーはプロジェクト上のアニメーションクリップにダイレクトに仕込めるけど、そのイベントキーの内容の指定はシーンに使われてるアニメーター上からしか行えない
この仕様な時点でもう嫌な予感しかなかったけど、使ってみたら案の定、外部メソッドを認識する条件が厳しいというか、どうも不具合で認識できない面もあるようで だめだこりゃ。
スクリプトからアニメ再生させて同時にタイマーで測ってイベント発動させる方が安全なようです。
string型と文字列を扱うもの全般
文字列の変数は、加工はもちろん参照しただけでメモリをドカドカ無駄遣いするそうな。
無駄遣いしたメモリのクリーンナップの処理が追いつかないと、ゲームが一瞬止まります。
アニメーションコントローラのステート名や、当たり判定に使うタグ名すらアウトとか、まじかよ…!?
そういったものは名前に相当する固有ID=ハッシュで扱えばセーフらしい。
では、GameObject.SendMessage("メソッド名") …つまりインスペクタでよく使ってるイベントも該当するんだろうか?これ使えないと生きてけないんですが。
まあ毎フレーム使わなければセーフだよね…?
PlayerPrefs
簡易のセーブ機能が使えるのですが、ほんとに簡易でint Float Stringの3種類だけしか記憶できない上に、保存先がレジストリという
無料で汎用性が高く暗号化もできるセーブ機能を自作しようとして禿げ上がるぐらいならEasySave買いましょう。
Resourcesフォルダ
フォルダの中身がビルド時にすべて入れられてしまう、公式が「使うな」と警告するほどのクソ仕様です。
自分が気をつけてもストアで買ったアセットが要警戒です。
とあるUIのアセット買ったら、数千ものアイコンがResourcesフォルダに入っててアホかとなった。
せいぜい数個しか使わない画像をなぜ全部のせしようと思った!!!??
間違いなくまだまだいっぱいありますねこれは…
私が実際にアプリを作らないと発見できないので、不定期に追記していきます。
はじめからビジュアルスクリプトで作ってたら、こんなくだらないことで悩まされなかったのでしょうか?
しかし、痛い目を見た後では対策できるから、ビジュアルスクリプトに移行しようってならない。覚え直す余力がない。
だれか。「ビジュアルスクリプトなら幸せになれるって決定的な証拠」を教えてほしいです。
Comments