質問するログイン新規登録

Q&A

解決済

2回答

632閲覧

Androidのゲームアプリを開発する際の設計思想について

nacchan

総合スコア8

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

設計相談

システムの設計についての相談や質問を投稿する際にご使用ください。

0グッド

1クリップ

投稿2026/02/19 20:32

0

1

テーマ、知りたいこと

Androidのゲームアプリを開発する際に、不具合、かくつき、スマホの発熱が少なく、かつメンテナンス性の高いコーディングができるような設計方法を知りたい。

背景、状況

13年間自営でシステム開発等をしております。
主に個人事業主向けの業務システムをJava言語で開発しておりましたが、これからはスマホアプリ開発を主軸にと考えています。
今回初のスマホアプリ開発(ゲーム)を始めようとしているところですが、デスクトップアプリやWEBアプリ開発と勝手が大きく違い色々と飲み込み切れていない状況です。
難しく考え過ぎているのかもしれないですが頭の中を整理するためにも、まずは僕の理解や考えを書きますのでご意見ご指摘をいただけたら嬉しいです。

Javaで開発する予定で最初はハクスラRPGのような描画頻度の少ないゲームを作り、後々は2Dアクションゲームにもチャレンジしたい。

Androidアプリ開発についての自己理解

Android Studioを触って理解したことを箇条書きにしてみます。

  • AndroidManifest.xmlのactivityタグ内にintent-filterタグを書くとファーストビューのactivityを指定できる。
  • エントリポイント自体はAndroid SDKが隠蔽していて、OSの判断でアプリのプロセスが破棄される。
  • Applicationクラスのサブクラス内のonCreateメソッドがプログラマーにとっての実質的なエントリポイント。
  • onDestroyメソッドできちんと終了処理を書かないと、ユーザーに迷惑をかけるアプリになりかねないかも。
  • Activityクラスはアプリ画面を構築するためのクラス。intentメソッドを呼ぶと他のActivityに遷移できる。
  • savedInstanceState変数はアプリ再開時の復元に必要で、スマホを横にする別のアプリを開いた等ちょっとしたことで復元が必要になるため重要。
  • Serviceクラスはバックグラウンド処理を書くためのクラスで、ここに書いたことをOS側が把握して何らかの恩恵があるんじゃないか?と思っている。
  • 描画用のコンポーネントとしてはViewはゲームに向かない。再描画中にユーザー操作を受け付けられない仕組みになってしまっている。
  • SurfaceViewは別スレッド(SurfaceHolderの実装クラス)で描画するのでViewよりはゲーム向き。
  • Open GLは3Dゲーム向き。SurfaceViewより処理が速い反面、2Dゲームを前提とした作りではない。
  • libgdxはアンチウィルスソフトに弾かれる。
  • VulkanはC++。
  • 現在はKotlinでJetpack ComposeというUIツールキットを活用することをGoogle公式は推している。
  • Jetpack Composeは再描画のタイミングをツールキット側が自動で判断する。

自分の考えと疑問点

描画関係は2DゲームならSurfaceView、3DゲームならOpen GLと考えている。
libgdxは良さそうだけど、アンチウィルスの誤作動だとしても弾かれるのはビジネス用途的にNG。
VulkanはC++の学習コストが高そうで、Composeは再描画方式がゲーム向きでないと考えている。

再描画やアニメーションのスレッド処理は、ScheduledExecutorServiceクラスのscheduleWithFixedDelayメソッドの利用を考えている。
万が一、処理が1フレームに収まらない可能性を考えると、1フレームの時間が多少ずれてもscheduleメソッドの方が良い?
Runnableでwhileループする方法はCPU消費が激しいのでNG。

ゲームの画面遷移については2通りの方法を思いついているけど、知識も経験も乏しくどちらにする決めかねている。
他にもっと良い方法があれば知りたいし、そもそもにどのようにするのが一般的なのかを知らない。

  1. 素直にゲーム画面毎にActivityとSurfaceViewを作る。
    まずはタイトル画面のActivityとSurfaceViewを作り、ゲーム画面で「はじめから」や「つづきから」をタップすると、次の画面のActivityにintentするイメージ。
    実装が楽そうでメンテナンス性も良さそう。
    半面、複数のActivityを用意することや頻繁にActivity遷移を行うことがオーバーヘッドに繋がるのではないかという懸念がある。

また、画面遷移する毎に前画面のスレッドを止めて、遷移後画面のスレッドを開始する実装にも違和感がある。
ゲーム開始から終了まで単一のスレッドを使いまわしても良いのでは?という疑問。

  1. それぞれひとつのActivityとSurfaceViewの中で描画、イベント処理等を行う。
    まずは下記のように画面の状態をenum型でラベル化する。

Java

1public enum ViewType{ 2 TITLE, OPTION, LOAD, SAVE, STORY, SETUP, BATTLE; 3}

下記のように描画、イベント処理等を行う。
画面状態に対して、SurfaceViewに描画処理するクラスやイベント処理するクラスをマッピングする。
あくまでイメージを伝えるために大雑把に書いていますので、細かい部分のツッコミは無しでお願いします。

Java

1public class GameView extends SurfaceView implements SurfaceHolder.Callback{ 2 private ViewType currentViewType; 3 //Drawerのサブクラスで画面毎の初期描画を行う。 4 private HashMap<ViewType, Drawer> drawerMap; 5 //Touchableインターフェースが実装されたDrawerサブクラスにタッチイベント処理を書く。 6 private HashMap<ViewType, Touchable> touchableMap; 7 private AnimationQueue animationQueue; 8 public GameView(Context context, int defaultFrameRate){ 9 super(context); 10 ...中略... 11 drawerMap.get(currentViewType).draw(); 12 ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor(); 13 service.scheduleWithFixedDelay(() -> { 14 animationQueue.drawFrames(); 15 }, 0, 1000000 / defaultFrameRate, TimeUnit.NANOSECONDS); 16 } 17 public final boolean onTouchEvent(MotionEvent event) { 18 touchableMap.get(currentViewType).touch(event); 19 } 20}

アニメーションは上記コードにあるDrawerクラスのコレクションとして実装する。
コレクションの要素に何も描画しないEmptyDrawerクラスを含める事もできる。
描画済みのDrawerクラス要素はコレクションから削除される。
主にタッチイベントからアニメーションが追加されたり、ループしたいアニメーションが画面表示時に追加されるイメージ。

Java

1public final class Animation extends CopyOnWriteArrayList<Drawer>{ 2 public Animation(Drawer... drawers){ 3 ...... 4 } 5 public final void drawFrame(){ 6 remove(0).draw(); 7 } 8}

現在の画面でアニメーション描画が必要になる度このキューにAnimationインスタンスが追加される。
各フレームごとにキューに追加されたアニメーションが描画される。
空になった要素(Animationインスタンス)はコレクションから削除される。
画面遷移時はキューの中身が強制的に破棄される。

Java

1public final class AnimationQueue extends CopyOnWriteArrayList<Animation>{ 2 public final void drawFrames(){ 3 if(isEmpty())return; 4 TreeSet<Integer> removeSet = new TreeSet<>(); 5 for(int i = 0; i < size(); i++){ 6 get(i).drawFrame(); 7 if(get(i).isEmpty()){ 8 removeSet.add(i); 9 } 10 } 11 for(int i: removeSet.descendingSet()){ 12 remove(i); 13 } 14 } 15}

上手く実装出来ればライブラリ化して今後様々な作品に使いまわせそうだけど、回りくどく実装する分拡張性に問題が出てきそうでもある。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

TakaiY

2026/02/20 02:00

スマホ等向けにゲームを作るならUnityあたりを使うのが定番と思いますが、そうしない理由はありますか?
u2025

2026/02/20 04:19

この質問って何から湧いて出たんだろう? そもそもGoogleで「Android ゲーム開発」ってググるだけでたくさんの情報が出てくるのに、どれも掠ってないし。 多分、Androidでのアプリ開発の図書を1冊を一通り読み終えたのだろうということは分かるんだけども。
nacchan

2026/02/20 13:32

TakaiYさん スマホアプリ開発については本当にスタートラインに立つ前の段階でして、そうしない理由も分かっていない状態ですので、もしよろしければご教示をいただけたら幸いです。 技術選定に関して自分としては、定番のものもそうでないものも多種多様な技術を知っていきながら、目的と自分自身にあったものを探したいと考えております。 ちなみにiPhoneアプリについてはコメントをいただくまでSwiftでの開発を考えていて、同様にAndroid SDKがJavaで書かれているのでJavaでやってみるかという良くも悪くも素直にって感じです。 u2025さん 僕自身過去の成功体験や今持っているスキルに引っ張られている自覚があります。 一方で新事業を始める不安により視野が狭まったり混乱しているからこその質問ではあるのだと僕自身思います。 それも人間の自然な感情のひとつとしてご理解をいただけたら嬉しいです。 ちなみに数日前に思い立ったので本は一冊も読んでおらず、むしろ「Android Java +α」で主に検索しております。
u2025

2026/02/21 04:08

個人的にAndroidアプリの開発者が増えることは好ましいことだと思います、 様々な返信から質問の趣旨が追いきれず申し訳ないですが、個人的に応援していおります。頑張ってください。
nacchan

2026/02/21 19:31

u2025さん 暖かいお言葉ありがとうございます。 僕自身新しい技術等を学ぶ力に不足がある事に改めて気づかされました。 u2025さんのようにハッキリおっしゃってくださる方がいなければ気づけなかったと思います。 これは皮肉とかではなく本当に感謝しております。
guest

回答2

0

時間とか工数とか全く考えずにただ質問を一読してのイメージなのですが。

パソコン用業務アプリから Android 用ゲームというのは、少々跳び過ぎではないでしょうか。
環境も対象も全く違うのでは手を付けるものがアレコレ有って大変そうです。
例えば先ずは業務アプリをパソコンから Android に移植する形で違いを知ってからゲームに移行するとか、逆にパソコンでゲームを作ってからそれを Android に移植する形にするとかの方が、一度にやることが少なくて済むような気がします。

Android での java 開発で書かれていることで少し書かせていただきますと、大分以前にカスタム View によるキャラクタ移動と SurfaceView に画像を書き込む形でのキャラクタ移動を比べたとき、カスタム View の方が滑らかだったことがありました。
原因は確定しなかったのですが、 SurfaceView はダブルバッファが無いだか無効だかだろうと思われました。
イメージとしては断然 SurfaceView を使うべきだろうと思っていましたが、違う場合もあるかもしれませんということで。
他に、Android アプリとしての開始は一般的には Activity の onCreate かなとか、画面遷移を頻繁にするなら Activity では無く Fragment かなとか、この辺は業務アプリの画面を作られると色々出てくると思います。ダイアログ1つ取っても、表示中に画面回転したりアプリを切り替えられたらどうなるか、対応するにはどうするかとかありますので。

そして、ゲームエンジンを使うなら Unity は確かパソコンでも出来たかと。
ゲームの業界は全く知らないですが、パソコンで作ってスマホに移す形でも『スマホ用ゲームを作る』は達成出来るのではないでしょうか。

投稿2026/02/20 17:49

jimbe

総合スコア13475

nacchan

2026/02/20 20:20

jimbeさん、ご回答をくださりありがとうございます。 拝読させていただいて、焦りすぎている自分に気づき、今ハッとしております。 たしかにパソコンで開発済みの業務アプリを学習目的で移植すれば違いだけを学べますね。 それだけではなく、スマホ用業務アプリの需要についても考え始めています。 ビジネス的にもそこを経由するのは無理なく合理的に感じています。 カスタムViewとSurfaceViewの比較はかなり興味深いです。 ひとつ確認というか質問なのですが、ダブルバッファが無いのはViewの方と把握しているのですが、僕の理解の方が間違っていそうなのでご教示をいただけたら嬉しいです。 イメージなのですが、ダブルバッファリングの有無でメモリ消費に倍近く差が出そうですし、その差が目に見える結果として現れるケースも多そうですね。 Fragmentについて調べたりソースコードを見ているのですが、画面遷移問題はこれで解決ですね! ありがとうございます! まず、Activityと比べて省メモリそうですし、さらにタブレット画面への対応も柔軟に出来そうです。 僕が知っている事での例えになり申し訳ないですが、質問内容で書いている事はSwingにはJPanelなりJComponentなりがあるのに、それらを使わずに画面遷移っぽい事をしように近いなと。。。 皆さんにゲーム開発はUnityとお勧めしていただいているのもあり、ゲームはUnityで業務アプリはKotlin&Jetpack Composeという住み分けを現在考えております。
jimbe

2026/02/21 11:34

ダブルバッファリングは基本的な View では裏でデフォルト On になっていたように思います。 ゲームとして作っていたわけでは無くて単にちょっと試してみたというレベルでしたので、実際の所使い方・作り方が間違っていただけということもあり得ます。ゲームは業務アプリとは即応性のレベルが異なりますので、その分各機能の掘り下げが必要で大変かも…ということにもなるでしょうか。 Swing で言えば Activity が JFrame で Fragment が JPanel 相当のコンテナということになりますが、 Android アプリが逃れられない "ライフサイクル" がありますので、それぞれがそれに応じた動きが出来る/求められるということになります。 Fragment が作られた動機がまさに Activity だけでは画面構成が(資源的/作り的に)難しいということでした。
nacchan

2026/02/21 20:51

ダブルバッファリングがデフォルトでOnとなると、SurfaceViewがViewの上位互換と決めつけるのはたしかに危険ですね。 双方の特徴理解と掘り下げが出来るまでは、ゲームやアプリを作りながらの比較検討が必須と考えております。 Androidの独特なライフサイクルはアプリの使われ方に起因するのかなと考えています。 デスクトップアプリではユーザーが右上の×ボタンを押してが終了しますが、スマホアプリでは今のアプリのタスクを残したまま別のアプリを起動する事も多く、スマホ自体リソース問題が常に付きまとっていると思います。 単にAndroid SDKやOSがこういう仕様だからではなく、なぜその仕様にせざるを得なかったのか?という着眼点が大事なのかなと。 一応、DocomoのDoJaでゲームを作った経験があるのでなんとなくそう思います。 UnityもJava実装も他の回答者さんが紹介してくださったGodotも、今後のアプリ開発全てにかかわる事なので、それぞれ理解を深めた上での技術選定が今の自分には必要と考えております。 その上では、Fragmentの理解と深堀りは重要と思っていて今調べております。
guest

0

ベストアンサー

まず、技術選定が必要な気がします。TakaiYさんがおっしゃているように、スマホゲームならUnityが定番になります。Javaでゲームを作った場合は、主力からは外れるので、ある程度のリスク管理が必要だと思います。

今後どのような方向に進むかによって、以下のように技術選定をする必要がありそうです。

  • 業務アプリの延長で(普通のアプリのような)ゲームを作りたい場合: Kotlin + Jetpack Compose
  • 将来的にゲーム業界の仕事もやる場合: Unity or Unreal Engine
  • スマホゲームに特化したい場合: Unity or Godot
  • 3Dをリアルに表現したり、VTuberのような3Dライブの仕事をやりたい場合: Unreal Engine
  • リスクを負ってもJavaでやりたい場合: libgdx + Java

特に、ゲームエンジンを選択しない場合は、車輪の再開発となり、ゲームエンジン相当のプログラムを自作することになるので相当なリスクになると思います。

また、スマホゲームを(売り上げて)主力事業にしたいのであれば、先に企画が重要です。これは普通のアプリ開発にも言えるのですが、競合分析や市場調査などをしないと、そもそも売り上げが期待できないからです。

※ 例えば、競合の(ハクスラRPGの作者さんの)SNSを見たり、技術blogなどを見るのも推奨します。その方がUnityを使っているのであれば、Unityでは同じゲームが作れるという保証にもなります。売上を公開している方であれば、なお参考になると思います。

いずれにしても、スマホアプリ開発は思い切った決断で、とても良いと思いますので応援しております。

投稿2026/02/20 03:17

編集2026/02/20 11:32
KT001

総合スコア751

nacchan

2026/02/20 14:29

IT001さん、ご回答をくださりありがとうございます。 こちらの事情を踏まえた上でのご回答をいただいている事伝わってきて嬉しいです。 長くなってしまいますがひとつひとつコメントをさせてください。 UnityとC#を学習する事の必要性を感じております。 世の中に公開できる出来のアプリをまずひとつ作り上げるには、Unityが低リスクで早いというのは理解できました。 Kotlin + Jetpack Composeは習得必須と考えております。 ゲームだけではなく、業務アプリや暮らしに役立つアプリの開発も考えているので。 自営である以上、自力で食べていけなくなる可能性はいつでも頭にありますので、ゲーム業界の仕事をする場合の情報もありがたいです。 車輪の再開発が一般的に批判される理由は主に下記の点と理解をしております。 ・世界で広く使われるゲームエンジンやフレームワークは使われる事で自然とデバッグがされていて安全性が高い。 ・安全性の高いものがあるのに使わず、自己実装することは余計なヒューマンエラーを生む。 ・自己実装のゲームエンジンやフレームワーク開発は有名なものより何かが優れていないと時間の無駄。 ・チームで開発している場合は、周囲の学習コストを増やすだけで成果物の品質まで下げかねない。 その点理解した上でゲームエンジン開発には興味があります。 もちろん、ある程度の貯えと実績を得た上でですが。 というのも、誰かの作った便利ツールに頼りすぎてしまい、内部的に何をしているか?を知らなすぎる事も大きなリスクと思うので。 エンジニアである以上、効率化、リスクヘッジと技術への理解の深さについて上手に折り合いをつける必要もあると考えております。 また、事情説明が足りず申し訳ないのですが基本的に個人開発なので、不特定多数のエンジニアにとってのベターより、自分にとってベストとなる武器を作ることが自身を守る差別化になるという経験もあったりします。 車輪の再開発とは別の車輪の自己最適化とも言えるかもしれないです。 企画に関してはトピックから外れてしまう事承知で少しお話させてください。 詳細は話せないですがかなり固まっていて、多様な方法でのユーザー流入ルート、ゲーム内課金までの作品世界観を邪魔しない導線、法改正の可能性を想定したクリーンなマネタイズ方式の選定まで想定しております。 競合については実際に10タイトルくらい遊んだ上で、作者さんのSNSやHPのチェックと、LINEグループやDiscord等のユーザーコミュニティへの参加はしております。 また、売り上げを公開していなくても法人化していれば、年商800万以上であることが所得税算出方法の違いから推測できます。
KT001

2026/02/21 02:03 編集

詳細を聞いて、熱意が伝わってきました。ゲームエンジンについては、「ある程度の貯えと実績を得た上で」試してみるというのは確かに良いかもしれません。Unityのチーム自体は元々ゲーム会社で、ゲームに失敗したもののエンジンの出来が良く、それを切り出したら成功したという歴史だそうです。 (「(ビジュアルノベルの)宴」や「RPG Maker Unite」のように、Unity自体に紐づくエンジンを販売するという手段もあります) また、自分にとってのベストを探すのでしたら、Godotも比較対象として試してみると面白いかもしれません。Slay the Spire 2は、Unityのライセンスのゴタゴタがあった時に、UnityからGodotへエンジンを変更しています。(そのせいで販売が遅れたという噂がありますが、3月5日にアーリーアクセスを開始するので、Godotでどんなゲームが作れるかの参考になると思います) 海外の有名な個人エンジニア(起業家)で、Pieter Levels(@levelsio)という年間数億を稼ぐ方がいるのですが、彼が言うには「95%のアプリは失敗する」そうです。つまり、5%の成功したアプリが成功の道になるとのことです。まずは色々とやってみて上手くいくか、そしてダメだった場合に振り返って5%の成功を目指すというのが重要になると思います。
nacchan

2026/02/21 20:19

ゲーム販売に失敗してもゲームエンジンそのものを販売する手段もある事と、まずはアプリを20個作ってみる事。 かなり視野というか道が開けてきました。 本当にありがとうございます。 ゲームエンジン開発及び販売を考える場合、既存品を使いやすくする(かゆい所に手が届く)製品と全く新しい製品の双方に需要があるというのは重要なポイントと思います。 Unityのライセンス問題も実は気にしていました。 僕にとってゲーム開発の基盤になったところで重要な部分の有料化や価格改定があったらと。 実際、Google等に何度かやられた苦い経験もあるので。 Godotについて調べました。 かなり革新的で僕の好みに近いです。 独自スクリプト言語という発想がまず面白いですし、僕自身コード設計に入れ子を多用しがちなので癖が合いそうです。 成功率5%は現実的でありながら、自営業の僕にとっては希望のある数字です。 自営業の生存率がおよそ10%と言われているので。 まずはその20個を効率的にリリースするための技術選定、ゲームエンジン選定が重要だと皆さん教えてくださっているんだなと。 失敗を振り返る上では、月並みですがユーザーレビューの中に答えがあるのだと思います。 僕が不具合、カクツキ、発熱にこだわるのは、そこを批判されるとゲームの面白さやアプリそのものの良し悪しについて言及してもらえないと思うためです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.29%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問