Unityで作ったアプリが起動時に重くなる問題の解決

Unityでアプリを作った際に、パソコンで動かす分には特に気にならないのですが・・・

スマホにインストールしてみると起動直後にかなり重たく、かくついてしまうのでそれを解決するためにいつもやっている方法。

特に、最初からBGMを流したりしていると音が途切れ途切れになってしまったりするので割と気になる。

原因

まずそもそも起動時には処理をたくさんしなければならない上に、Unity内のAwake()やStart()で多くの初期化処理をしていると相当重い処理になってしまいます。

特に初期化処理は比較的重い処理(GameObject.Find()やPlayerPrefs.GetString()など)を繰り返す場合もあるので気をつけなければいけない部分。

解決方法

起動直後に処理が重なる、ということが問題なので
処理を分散させてあげればいいわけです。

もしBGMの音の途切れが気になるだけであれば、


AudioSource audio;

void Awake(){
  audio = GetComponent();
}

void Start(){
  audio.Play();
}

これを


AudioSource audio;

void Awake(){
  audio = GetComponent();
}

void Start(){
  //audio.Play();
  Invoke("InvokeProcess", 1.0f);
}

void InvokeProcess(){
  audio.Play();
}

こんな感じにします。

Start()でBGMを再生開始してしまうと音が途切れてしまうため、再生処理を別の関数にいれてその関数をInvokeで一定時間待ってから呼び出すようにします。

BGMをフェードインさせればより自然に再生し始めることができるし、もしそれでも気になるようであれば次の方法がオススメ。

というか僕は大体この方法を使っています。

オススメの方法

オススメの方法として、「ローディング画面を作る」という方法があります。


AudioSource audio;
[SerializedField] Image loadingImage;

void Awake(){
  audio = GetComponent();
  loadingImage.SetActive(true);
}

void Start(){
  //audio.Play();
  Invoke("InvokeProcess", 1.0f);
}

void InvokeProcess(){
  audio.Play();
  loadingImage.SetActive(false);
}

Canvasに画面いっぱいのImageを作り、インスペクタからloadingImageに指定しておきます。

「loading」って書いてある画像を用意してもいいし、無地Imageの子要素に「loading」って書いたTextを用意してもオッケー。

例としてはこんな感じ。

これを最初は画面いっぱいに表示しておいて、準備ができたら非アクティブにして処理を開始する、という方法。

これだとサウンドだけでなく視覚的な処理にも対応できるのでなかなか便利。

loading画面をアニメーションにしたりするとよりクオリティが高く感じられ、ユーザも鬱陶しく感じにくいかもしれませんね。

コメント