
Unityが思ったとおりに動かん!!
書籍やサイトを見ながら実際にゲームを作ってみようと思っても、中々上手くいかない!という方は多いと思います
かくいう私も、思ったとおりに動かないことはしょっちゅうです
そこで今回はUnity初心者がやりがちなミスと、その解決方法をご紹介しようかと思います
Unity初心者がついやりがちなプログラミングミス5選

スペルミス!!

プロのプログラマーでも日常茶飯事、よくあるミス1位は「スペルミス」です
プログラムは基本的に全ての文字を正確に書かないと動作しません
例えば、次のようなミスがあります
アルファベットの大文字、小文字
アルファベットの大文字、小文字も正確に書かないといけません
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
例えば、Unityでよく見る「Start()」や「Update()」は先頭が大文字である必要があります
勢いあまって関数を消してしまって、あとから手書きしたりすると間違っていたりします・・・
普通に英単語ミス
単純に英単語を間違っている場合も多いです
「data(データ)」と「date(デイト)」とかですね
英単語がうろおぼえだったり、単純に打ち間違えだったり、原因はいろいろですが、よ~く見ると違うじゃん!というのは結構多いです
Unityスクリプトの関数名称の間違い
「Start()」や「Update()」などはUnityが提供する関数であるため、1文字でも間違っていると動作しません
「Start()」や「Update()」は単純なのでまだ良いのですがOnCollisionEnter()や「GetComponents()」など結構長い単語になると、とたんに間違える可能性が高くなります
例えば「GetComponents()」であれば末尾の「s」がある場合とない場合で、動作が異なるため注意が必要です
また、「OnCollisionEnter()」は「OnCollisionEnter2D()」といった別バージョンの関数もあります
参考にしている書籍やサイトなどがある場合は、一字一句間違いがないことを確認することが大事です
また、自分自身でUnityの関数を探した場合は、Unityのスクリプトリファレンスを見直して関数の名称や使い方があっているか確認しましょう
間違わないために

VisualStudioを使っていたら「入力補完」の機能を使いましょう
「入力補完」機能を使うと、先頭の文字を入力しただけで予測候補が出てきて、選択することで自動入力が行われます

それと、私がよくやるのは「検索」による文字チェックですね
スペルミスがありそうな単語をソースコード検索して、ひっかかるかを確認します
もし検索結果に出てこなかったら、その単語は間違っているというわけですね
publicやSerializeFieldにオブジェクトを設定していない
これは私もよくやってしまうやつですね
何回やるんだというレベルでやります(笑)

こんな感じでpublicに設定した変数があるとき

これをInspector上で設定していなくてエラーという状況です
この状態でbulletオブジェクトにアクセスしようとするが、bulletオブジェクトがないのでエラーになります
また、異なるパターンとして

このようにpublicの変数にソースコード上から初期値を設定しているとき

Inspector上から異なる値を設定しているということを忘れるというミスも時々あります
この場合はInspector上からの設定が優先されるため、ソース上の値で動かずに「?」となります
これらの対策としては、まあ・・・Inspectorでちゃんと設定しようという身も蓋もない対策ですかね
括弧閉じてない
これは初心者あるあるではありますが、プロでもやるときはやります
private void Test()
{
// 左キーを押し続けていたら
if (Input.GetKey("left")
{
timeElapsed = 0.0f;
}
}
例えばこんなソースコードのときです
1つ閉じられていない括弧があるのですが、お気づきでしょうか?

エディタ上で見ると色づけさされて分かりやすいですね
ifの括弧が閉じられていません
このように括弧()や中括弧{}が閉じられていないといことは意外と多いのでご注意ください
VisualStudioでは画像のように間違っているところに赤いニョロニョロ下線がでるので、これがないかよく確認すると良いでしょう
usingが足りない

よく抜けているのは、このようなusingの記載ですね

通常はこの3行が書かれていることが多いのですが、唐突にusingが増えている場合があるので注意が必要です

私の肌感で忘れることが多いのは「using UnityEngine.UI」の記述かなと思います
これはUI系のクラスを扱うときに必要になる場合があります
参考にしている書籍やサイトなどがあれば、usingの記述に漏れがないかも確認しましょう
ちなみに、usingは名前空間という概念の指定に使う機能です
興味がある方は調べてみると理解が深まるかと思います
複製したオブジェクトとれてない
初心者がサクッっとゲームを作るときに起きやすいミスです
慣れてくるとオブジェクトの管理方法は事前に設計したりするので起きにくいのですが、最初はよくあるミスではないかと思っています
gameObject = GameObject.Find("Enemy");
こんな感じで名称を直接指定して、ゲームオブジェクトを指定するパターンのときに

検索対象である「Enemy」がプレハブから複数作られるオブジェクトだった場合に起き易いです
具体的にいうと
といった現象が起きてエラーになる、という感じです
これは「Enemy」というプレハブが複製されたとき、名称が「Enemy(Clone)」のように変化することが原因です
なので「ゲームオブジェクトが取得できない」という点に関しては、まあこんな感じで一旦は取得できます
gameObject = GameObject.Find("Enemy(Clone)");
また、「ゲームオブジェクトを複数取得したいのに1個しか取得できない」ということに関しては「GameObject.FindGameObjectsWithTag」や「FindObjectsOfType」を使うように変えれば解決します
(※やりたいことによってだいぶ変わるので具体例は割愛します)
まあそもそも、ゲームオブジェクトの検索は処理速度が遅くなる原因になるのであまりやるべきではないのですが、サンプルゲームなどを軽く作るときに気を抜いているとついやってしまいがちです
かくいう私もちょいちょいミスります(笑)
まとめ

というわけで「Unity初心者がついやりがちなプログラミングミス5選」を紹介しました
初心者とはいいましたが、実際は現場でもよくあるミスなので注意が必要ですね
ではまた!
コメント