ゲームプログラマがKotlinでアプリ開発をしてみて

## はじめに
ゲームプログラマとして仕事をしてきたのですが、先日初めてKotlinとJetpackComposeを用いたAndroidアプリ開発を行いました。
はじめは今まで使った言語（C,C++,C#）との違いに戸惑いましたが、慣れるとなかなか快適に感じる使用感でした。

しかしゲームのクライアント開発がメインの身としては、現場でKotlinを積極的に活用することは難しい気がします。KotlinはJabaとの互換性があるためサーバーでは有効な選択肢らしいのですが、立場上活用する日は遠そう…

ただ、もし個人開発でアプリを開発する場合は一つの選択肢になりそうだったので、その理由などを書いていきます。

## Kotlin（&JetpackCompose）とは
簡単に言うとJavaを使いやすくした言語らしいです。
2011年に登場したらしく比較的若い言語のよう。

今回はAndroidStudioと組み合わせてAndroidアプリ開発を行うという案件だったので、JetpackComposeというフレームワークも使用しました。
すごくざっくり言うとUIに関するコードを簡単に書けるようになるもの。
慣れないうちはクセが強く感じて戸惑いましたが、慣れるとなかなかな快適にコードを書けました。

今回はこの組み合わせでアプリ開発をした感想を書いていきます。
文法などの細かい話はこの記事では触れないのでご了承を。

## メリット


### 慣れれば直感的にUIを実装できる
まずは適当なUIの実装例を記述。

``` Test.kt

@Composable
fun TestUi(){

    Column(
        modifier = Modifier
            .fillMaxSize()
            .padding(50.dp),
        verticalArrangement = Arrangement.SpaceEvenly
    ){
        val buttonModifier = Modifier
            .fillMaxWidth()
            .height(50.dp)

        Button(
            modifier = buttonModifier,
            onClick = { /*タップ時の処理1*/ }
        ){
            Text(text = "Button1")
        }
        Button(
            modifier = buttonModifier,
            onClick = { /*タップ時の処理2*/ }
        ){
            Text(text = "Button2")
        }
        Button(
            modifier = buttonModifier,
            onClick = { /*タップ時の処理2*/ }
        ){
            Text(text = "Button3")
        }
    }
}

```

上記の命令だとこんな感じのレイアウトになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941860/efbe8f7d-7c70-a555-54fa-56589ee0bfbc.png)

やっていることは画面にボタンを並べていくという処理で、さらに誤解を恐れずに言うと感覚としてはUnityと一緒です。
UnityではCanvasの子にUIを配置していき、ものによっては更に子にTextなどを追加します。

上記のコードはそれと一緒です。
Columnというこの要素を縦に並べるものを置き、子にボタンUIを配置しています。
ボタンの子にはテキストを置き、なんのボタンかわかるように文字を表示しています。
このように、どんどん入れ子にする形で記述してUIを置いていきます。

サンプルコードだけではいまいち実感が湧きづらいと思いますが、やっていることはシンプルなのと、コードだけで完結するのでプログラマにとってはかなり楽です。


### 配置が楽
ではボタンなどを具体的にはどのように配置しているのかというと、引数で渡しているModifierという型に情報を設定して決めたり、その他引数で指定していきます。

例えばColumnに渡しているModifierにはFillMaxSizeを設定し、描画範囲を画面全体にします。
さらにverticalArrangementにどのような並びにするかを指定して配置していきます。

どのような配置の設定やルールがあるかは覚える必要があるので大変ですが、何があるのかさえ分かれば細かな計算などせずにそれっぽい形にすることができます。


### 情報の受け渡しがとても楽
stateやremenberを活用して記述することによって、情報の保持や受け渡しがとても楽になります。
例えば以下のように記述します。

```Test.kt
@Composable
fun TextUI(){

    val textState = remember { mutableStateOf("テキスト") }

    /*
        ここでいろいろ処理を行う
    */

    Column(){

        Text(text = textState)
    }
}
```

一見するとローカル変数である文字列をつかっているだけのように見えます。
ですがstateやrememberを組み合わせて使うことで、値の保持と変更の検知をすることができます。
なので計算や条件によって得た文字列textStateに代入するとUIの表示が変更され、値も保持されます。

この機能を活用するにはComposableやライフタイムの特徴を知る必要がありますが、その壁を越えれば非常にシンプルな構文で情報のやり取りをすることができます。



### 演出がすでに実装されている
例えばボタンを押したときに色が変わるなど、各UIの演出がすでにある程度実装されています。
そこだけだとUnityと一緒じゃん！　と思うかもですが、他にも画面切り替えなどにも演出が入っています。

細かな話に聞こえますが、演出の実装は個人開発をしていると地味に面倒なところです。
シンプルながらも違和感のない演出がすでに実装されているので、アプリ開発に専念できるのはうれしいです。


## デメリット
### コードが冗長になりやすい
UIを入れ子にして記述していく都合上、コードが長くなりやすいです。
もちろん対策できたり、仕方ない部分はあります。
・当たり前だが、関数化してUIを使いまわしたりファイル分けできる
・コードがシンプルなので煩雑は印象をあまり受けない
・そもそもUIをコードで実装する都合上ある程度は冗長になる

ですがゲームエンジンなどでUIをグラフィカルに配置する開発に慣れていると、どうしてもUIを実装する記述が増える分コードが長くなり違和感を覚えます。


### デザイナーとの連携がとりづらい
JetpackComposeを使用している場合は、UIの実装がコードのみで完結します。
そのため、デザイナーが直接配置などの調整をする場合は苦労します。

もし連携が必要な場合はJetpackComposeを使わずに、もともと備わっているグラフィカルUIツールを使うことをお勧めします。


### Androidアプリのみの開発になる
iOSアプリを作るにはMacOS(Swift)が必要なため、どうしてもAndroidのみ対応のアプリを開発することになります。
個人開発だといっそAndroidのみと割り切る選択肢もアリですが、どちらも対応したい場合はUnityなどを使ったほうが楽かもしれません。

一応誤解のないように伝えると、Androidアプリ以外も開発はできます。
ベースがJavaなのでWindowsアプリなどにも使用できます。
あくまで今回はアプリ開発という視点でのお話です。


## Unityと比べてどうなのか
本題です。
ゲーム開発が本業の身としては、個人でアプリ開発をするにしてもおそらくUnityとの比較をすることになると思います。
いろんな視点があるかと思いますが、今回は個人開発で一番のネックになる"コスト"という点に重きを置いて主観を述べます。

### Unity
〇Android,iOSへの対応が楽。(場合によってはPC版も)
〇描画性能を活かしたリッチな表現ができる
〇柔軟性があるので、ゲームライクなエンタメアプリを作りやすい
×トランジションの演出など一部自分で用意する必要がある

### Kotlin
〇アプリに必要なレベルの演出であればUnity以上に実装されている
〇JetpackComposeを使えば簡単にきれいな画面設計ができる
〇Composableを理解すれば変数などの情報受け渡しがとてもシンプルに済む
×スマホアプリ開発の場合Androidのみの対応になる


個人的には、
汎用性を求めるならUnity、
Androidアプリに限定されるが手軽なのがKotlin、
といった印象を持っている。

最終的には自分に合う方を選ぼう。


## Unity as a Library(UaaL)について
Unityを使ってアプリ開発をした場合Kotlinにしたくなることは中々ないと思いますが、
Kotlinでアプリを作っていて後からリッチな表現をしたくなることはあるかもしれません。
そうなったら作り直すしか…と思いきや便利な解決策があります。
それがUaaLです。

簡単に言うと、Unityの処理をライブラリとして書き出すことができるというもの。
なので書き出したUnityライブラリを使うことによって、Kotlinで作ったアプリに後付けで3D描画などをさせることができます。

新しいアプリを作るときに描画処理が必要ならUnityで始めれば良いですが、もしKotlinで開発を始めた後にリッチな演出をしたくなったときは有効な方法だと思います。