夕方ゲーム制作

プログラミング初心者がUnityでゲームを作る日記

Unity製アプリが遅いので軽量化した

 Unityで製作中のゲームアプリが、実機で動かすととにかく重かったので、何とかまともに動くまでに軽くしました。

 

 次にアプリを作るときに同じ罠に嵌らぬよう、やったことをここにメモしておきます。

 

 因みに自分はUnity、プログラミングともにずぶの素人なので技術的に見るべき所は無いと思いますが、まぁ一応書いときます。

 

 

最初の状態

 android実機でアプリを動かしてみると、だいたい15~25fpsといった感じで、まともな操作も覚束ないといった紙芝居状態でした。

 

 自分の超安物の型落ちオンボロスマホにはやはり荷が重いのかとも思いましたが、ドット絵調のちっさいテクスチャでここまで遅いのはやっぱりおかしいだろうと調べてみました。

 

 

 

やったこと

 

Update()を呼ばないようにした

 Profilerを見ていると、敵キャラクタが沢山出てきたとき、それぞれのインスタンスのUpdate()を呼び出しているところが結構時間を食っていることが分かりました。一個一個は小さい時間ですが、オブジェクト数が多くなってくると割と無視できないみたいです。

 

 そこで、Update()は誰か代表のクラスが受け取って、他のクラス達にそれを通知する、といった感じにすることでなるべくUpdate()が呼ばれないようにしました。

 

 これを実装した所fpsは3~5くらい改善しました。また、代表で受け取るクラスを工夫すればUpdate()が呼ばれる順番が制御できそうで、これは結構でかいおまけ効果な気がします。

 

 

isStaticを使った

 自分のゲームには、ブロック状のオブジェクトがたくさん出てくるのですが、これを一つ一つ描画してるのがまずいんじゃね?と思ったので調べた所、動かないオブジェクトならgameObject.isStatic=true;にすると一気に描画ができる、みたいな情報が見つかりました。

 

 これをやったところ、fpsは若干改善した、気がします。正直あまり目に見える変化は無かったような・・・。しかし簡単に実装できたし、やらないよりはマシと思います。

 

 

重い処理をキャッシュした

 Unityの軽量化について調べていると、色んな所でFindとGetComponentは重いぞ、という情報が目に付きました。どうやら毎フレームGetComponentするようなのは論外みたい。普通にやってました。

 

 解決方法として、FindやGetComponentの返り値を仕舞っておく変数を用意して、それを後生大事に使い回すのが良いらしい、そしてこれをキャッシュする、と言うらしい。というのが分かりました。こういう単語を知ってれば検索の手間も省けるんでしょうね・・・。

 

 実際やってみました。でもこれもなんか効果がいまいち分かりづらい。スクリプトを書き換えるのにかなり骨が折れたので、これだけ書き換えればfps1000くらい行くんじゃないかと勝手な期待をしすぎたのがアレだったのかも知れませんが。

 

 

SetActiveを使った

 改良前はUIの表示/非表示を切り替える方法が分からなかったので、Imageのアルファを0か1にして出したり消したりしていました。しかしこれはアルファが0でもガッツリ描画処理が動いていて、しかも半透明扱いでゲロ重い処理のようでした。

 

 それならUIをカメラの外に出せば描画処理が動かないのではと重い、非表示にするときにpositionのx座標を1億くらいにして遠くにぶっ飛ばすようにしてみましたが、大した効果はありませんでした。というかこれどう考えても正攻法じゃない・・・。

 

 そこで表示/非表示を切り替える処理を調べた所、SetActive(bool)という、普通にGameObjectの有効化と無効化ができるやつが見つかりました。もうメソッド名からしてハナからこれ使っとけって感じのやつですね。なんで見落としてたんだ。

 

 早速スクリプトを書き換えると、fpsが劇的に改善し、大体45~60くらいは出るようになりました。これだけ出てれば十分ですね。

 というわけで、Profilerとにらめっこしつつ色々やりましたが結局こんなしょうもないやつが主犯でした。無知って恐ろしい。

 

まとめ

 

・オブジェクトの表示/非表示切り替えには、アルファの変更ではなくSetActive(bool)を使う。アルファを0にしても普通に描画処理が動くのでめっちゃ重い。

 

・個々のオブジェクトでUpdate()を呼ぶのは控える。代表者がUpdate()を受け取って他に知らせる仕組みにする。

 

・FindやGetComponentは返り値をとっといて延々と使い回す。毎フレーム呼ばない。

 

・地形とかの動かないオブジェクトはisStatic=trueにする。

 

 

結論

これ正攻法じゃないな、と感じたら面倒がらずにGoogle検索するべき。我流はあかん。

使用した効果音素材

ゲーム制作の進捗動画を上げる際、表記が必要な素材を使っているので、こちらに書いておきます。

 

効果音素材

 

SoundBible

Free Sound Clips | SoundBible.com

"Blast" © MikeKoenig(Licensed under CC Attribution 3.0)

"Bite" © MikeKoenig(Licensed under CC Attribution 3.0)

"Electricity" © MikeKoenig(Licensed under CC Attribution 3.0)

"fire_bow_sound" © MikeKoenig(Licensed under CC Attribution 3.0)

"Torpedo_Impact" © MikeKoenig(Licensed under CC Attribution 3.0)

"Button_Press_3" © MarianneGagnon(Licensed under CC Attribution 3.0)

 

効果音ラボ

効果音ラボ - フリー、商用無料、報告不用の効果音素材をダウンロード

 

無料効果音で遊ぼう!

無料効果音で遊ぼう!

 

 

ミドルウェア

 

ADX2 LE

CRI ADX2 LE - CRI Middleware

 

Unityでタワーディフェンスゲーム制作③

進捗紹介です。

 

今回いくつかタワーを作りました。置かれたタワーが範囲内の敵を補足して、最もゴールに近い敵をターゲットにする、というやつです。

作ったタワーは以下の4つです、紹介します↓

 

ガンタワー

f:id:yu-gatasan:20180617133307p:plain

銃を備えたタワーです。標準的な能力を持ち、ターゲットに向けて弾丸を連射します。

あまり癖がなく、安価でとりあえず置いておく的な感じにしたいです。

 

サンダータワー

f:id:yu-gatasan:20180617133642p:plain

電撃を放つタワーです。このタワーは2つが一組となって攻撃を行います。ペアとなった2つのサンダータワーの間を敵が通るとタワー間に電流が流れ敵を感電させます。

実装するときは最も近いタワー同士をペアにする仕組みが結構手こずりました。こういったアルゴリズムをサクッと考えられるようにいろいろ勉強していきたいですね。

タワーの特性としては狙ったタワー同士がペアとなるように位置を考えるパズル的な要素があり、取り回しが悪いが威力は高いといった感じにしたいです。

 

迫撃砲タワー

f:id:yu-gatasan:20180617134156p:plain

放物線を描く砲弾を発射するタワーです。砲弾は着弾すると爆発を起こし、範囲内の敵にまとめてダメージを与えます。

これはゲーム制作に入る前から考えていたタワーで、放物線を描く弾道が何となくワクワク感があってなかなかお気に入りの演出とすることができました。

弾道に癖があるので能力を活かすには広い空間が必要ですが、高威力と範囲攻撃を兼ね備えている高価なタワーといったバランスを目指します。

 

ファンタワー

f:id:yu-gatasan:20180617134613p:plain

最後に紹介するこちらはファンタワー、風を生み出すタワーです。向かい風に吹かれた敵は移動速度が遅くなり、攻撃のチャンスを増やすことができます。しかし追い風の方向で当たってしまうと加速させてしまうので注意が必要となります。

こういった敵を鈍くするタワーはタワーディフェンス系ではおなじみですが、単に遅くするよりも風の方向を考える必要がある、という感じでパズル要素を足しています。たくさん重ねればその分だけ効果も高まるので、キルゾーンを作るのに使えると思います。

 

今回の紹介はここまでです。

敵が出現して、それを倒す、といった基本的なゲームの仕組みができました。

要素は少ないですが”プレイ”ができるようになったので、とても達成感があります。あとはUIなんかを作って、更にゲームっぽさを増していきたいです。

 

では。

Unityでタワーディフェンスゲーム制作②

こんにちは

製作中のタワーディフェンスゲームの状況を紹介します。

 

まず敵キャラクターのアニメーションを2つ描きました。

ブヨブヨ動くスライムとダバダバ走る何かです。

 

f:id:yu-gatasan:20180615204846g:plainf:id:yu-gatasan:20180615204822g:plain

 

勇者のくせになまいきだ。というPSPのゲームが大好きなのでその雰囲気をパクり倒して描いてみました。クオリティは雲泥の差ですが・・・

 

なんにせよ、とりあえず動かすための画像が用意できました。

 

敵の移動経路を見つける処理や敵を生成する処理、HPバーの表示スクリプトも書きました。

プログラミングの文法は覚えてきましたが、オブジェクト指向なる設計の方法がよく理解できていません。

クラスをたくさん分けると良い、ということなのでたくさん分けてみましたが、処理があっちに行ってこっちに行ってと順調にスパゲッティ化しており、これでいいのかよく分かりません。

 

ともあれ動けばいいスタンスで書き上げたスクリプトを用い、Unity上で動かしてみるとこんな感じになりました。

 

f:id:yu-gatasan:20180615205841p:plain

 

 うーん、なんかやっぱりチープな感じがありますね・・・

絵のクオリティがアレなことの他に、市販されているようなゲームとの差がどこで生まれているのかな、と頭を捻っております。

 

今回の進捗紹介は以上です。

とりあえず動くものができたので非常に楽しくなってきました。

自分で書いた通りに物が動く、というのが本当に嬉しくてたまらなく、これがゲーム制作の楽しさか、と実感しております。

 

今後もいろいろと要素を追加してきたいです。

では。

 

Unityでタワーディフェンスゲーム制作①

せっかくブログを始めたので現在作っているゲームの開発状況について書いてみます。

 

制作ゲームの紹介

ゲームのジャンルはタワーディフェンス

入り口から敵達が攻めてきて、設置したタワー達でそれを迎撃する、というアレですね。

うまい具合にタワーを設置して敵の経路を制御し、タワーがちまちま攻撃している所を見て楽しむ、というのが醍醐味のジャンル(と、自分は思う)。

自分のゲームでもそういった楽しさが作れたらいいなぁと思って鋭意製作中です。

 

最終的にはスマホのアプリとしてリリースする所まで持っていきたいです。

 

 制作したもの

 マップチップをいくつか描きました。地面とタワー2つです↓

 

      f:id:yu-gatasan:20180614230742p:plain

 

自分の絵心に全く自信がないので、これならごまかせるんじゃないかという目論見があってドット絵にしています。もちろんドット絵の温かい雰囲気が好き、というのもありますが。

 実際に置いてみるとこんな具合です↓

 

   f:id:yu-gatasan:20180614233627p:plain

 

うーん、安っぽい・・・。

まぁ、こう、遠目に、薄目で見てみれば割とそれっぽいかな?という感じ。

今後、演出を強化していけばきっと何とかなるはずです。頑張れ未来の自分。

 

以上です。

まだまだ始めたてなので紹介できる物が少ないですがとりあえず記事を書く練習として投稿させて頂きます。

お読みいただきありがとうございました。

ご挨拶

 

はじめまして。

 

夕方さんと申します。

 最近ゲーム作りを始めたので、備忘録がてらこちらにやったことや気づいたことを書いていこうと思い立ちました。

ブログをやるのもゲームを作るのも初めてで右も左も分かりませんがちびちび記事を書いていこうと思います。

 

よろしくお願いします。