僕Unityできますよ(ドヤ顔)
はい、おはようございます。僕です。今日はUnityのできる僕がUnityをどれだけ使いこなせるかということを皆様に自慢していきたいと思います。まずは、こちらのソースコードをご覧ください。
public float speed = 100; void Update () { if(GameObject.Find("MainGame").GetComponent<MainGame>().gameStart) { if(Input.GetButton("Vertical")) { transform.position += transform.forward * speed; } } }
巷でクソコードと評判のこいつでゲームを作るなどしていこうと思います。僕はねぇ……、コードがクソなんじゃない。扱う人間の発想が貧困だからクソに見えてしまうんだって、そう思うんですよ。
まずはどうにかしたいポイントのおさらい
早速ゲーム作りと行きたいところですが、どのあたりがクソと指摘されているかを先に確認していきます。その方が、僕がUnityできるってのを示せると思いますので(無駄にハードルをあげる)。
public float speed = 100;
まずは宣言部です。初期値が100ですが、このスケール感のまま等速で動くと仮定すると一瞬で画面外に飛ぶ速さになります。
if(GameObject.Find("MainGame").GetComponent<MainGame>().gameStart){ }
一個目のif文です。GameObject.Find()
をUpdate内で使うと、以下のようにパフォーマンスとかで怒られます。またGetComponent()
は 、対象オブジェクトがあるのかを総当たりで調べるため同様にパフォーマンス上よろしくない方法になるとか言われています。
GameObject.Find()
パフォーマンス上の理由から、毎フレームでこの関数を使用することは推奨されません。
参考
GameObject.Find - Unity スクリプトリファレンス
GameObject.GetComponent - Unity スクリプトリファレンス
if(Input.GetButton("Vertical")) { transform.position += transform.forward * speed; }
二個目のif文です。上下のキー入力を取得しますが、すべてのキーで前進する設定となっています。
これらの点を踏まえると、このスクリプトは操作キャラを動かすバリバリのゲームスクリプトなのでなく、パフォーマンスへの影響が少ない数個程度のオブジェクトの中から指定のオブジェクトを特定ボタンで除外*1する知育ゲーム用のスクリプトなのではないかと推測します。
\な、なんだってー/
したがってこうです。
このようなものを作ってみました。
いないいないばぁ!!
はい……。なにこれぇ……。僕頑張ったと思う……。もうゴールしていいよね……。
ちなみに、これ自体コンパイルが通るコードなんですけど、一行目if文でMainGameに関すること書かれているせいでこれだけではエラーになってしまうので実行のためにMainGame作ってTrue返すようなクソ処理を追加してます。クソにクソを重ねるのか……。
using UnityEngine; public class MainGame : MonoBehaviour { public bool gameStart = true; }
うん、そんな感じです。僕にはいい考えが浮かばなかった……*2。