2018-4-16

【Unity】 倉庫番作成時に学んだこと

雑な技術メモ

Unity の練習として倉庫番を作成した。

Demo

こんな単純なゲームでも、色々と学ぶことは多かったのでメモとして残しておく。

Find はアクティブな GameObject のみ返す

GameObject.Find - Unity スクリプトリファレンス

GameObject.FindGameObjectsWithTag - Unity スクリプトリファレンス

アクティブな GameObject のみしか返さないので、スクリプト側でGameObject.SetActiveでアクティブを変更したい場合は Start 時に非アクティブ化、変数に格納等の対応が必要

シーン切替時に暗くなる

Unity でシーン遷移するとライトが暗くなる問題 - 脳汁 portal

各シーンでこの対応をしないといけないので注意

Button が反応しないとき

Unity で Button を押しても反応がないとき - Qiita

Button の動作には EventSystem が必要

なんだこれ?って間違って消してしまって時間食ってしまった。

ゲームの終了方法

Unity でスタートボタン、ゲーム終了ボタンの UI を作成する | Unity を使った3 D ゲームの作り方(かめくめ)

Button の onClick に設定した関数に引数を渡したい場合

引数が必要な関数であれば、自動的にパラメータを入力するためのボックスが出てくる

Canvas の前後関係

sort order が大きいほうが手前

Unity ちゃんの表情変更

Animator にレイヤー機能があるので、これを利用することで1つの Animator に別カテゴリのアニメーションを割り当てることが出来る。

  1. Animator にレイヤー追加
  2. 追加したレイヤーの設定から、レイヤーを「faceOnly」、Weight を 1 に
  3. あとは通常と同じ

webgl がちゃんと描画されない

和文フォントの問題

Unity の WebGL で日本語を表示する - Qiita

デフォルトで適用されてるのが欧文フォントで、WebGL では和文フォントへのフォールバックがされないのが原因の模様。

とりあえず NotoJP 設定するようにしておけばいい

解像度の問題

実行ファイル起動時の画面解像度の強制変更スクリプト – Unity インターハイ公式ブログ

Build 設定の「Player Setting」から解像度等調整出来る。

似たようなシーンをプレハブを使って構築する場合の注意

シーン毎に変わらない物と、シーン毎に変わる(アタッチされたスクリプトに渡す値等)物は別のプレハブにしておいたほうが良い。

というのも、シーン毎に変わる物もごちゃまぜにしてしまうと、間違って Apply してしまって同一プレハブを使用しているシーンがめちゃくちゃになってしまうことが頻繁にあった。

基本、シーン毎に変わるものはプレハブにしないか、プレハブにするにしてもシーン毎に不変なものと別プレハブにしておいたほうが良い。

クラス、構造体を inspector で変更できるようにする方法

Unity の Inspector で変数を表示する方法まとめ - Qiita

クラス、構造体宣言の直前に[System.Serializable]を記述すればいい。

[System.Serializable]
public class PositionClass {

    public int x = 0;
    public int y = 0;
}

private な変数を inspector で変更する

変数宣言の直前で[SerializeField]を記述

[System.Serializable]
public class PositionClass {

    [SerializeField]
    private int x = 0;

    [SerializeField]
    private int y = 0;
}

アニメーションの管理に関して

例えば、enum を使用して以下のようにアニメーションの状態を定義しようとする。

enum AnimationState
{
	idle,
	walk,
	run,
	jump
}

そして、次のように UnityEditor へアニメーションの状態を引き渡す

GetComponent<Animator>().SetInteger("State", (int)currentAnimationState);

こうしてしまうと、UnityEdotor 上ではアニメーションの状態は単なる整数表現になってしまうので、非常に分かりづらくなってしまう。

なので、この手法はアウト。そもそも、UnityEditor 上で作成出来る状態遷移図の利点を生かせないので微妙。

アニメーションの遷移に関しては、UnityEditor 上で先に状態遷移図と必要なパラメータを定義し、スクリプトで随時必要なパラメータを投げる形で作成したほうが良さそう。