【Flutter】 Firebaseとの連携ができず奮闘しています。3<また先が見えなくなった。~JDK周り~>

Flutterで開発がしたいです。Flutter初心者だけど頑張っています。

FlutterのJDKJava Development Kit)ってどのバージョンを使えばいいのでしょう。

今日はここで詰まったのでメモを残します。

どう詰まったか

現在どうしてもJDK14を使いたい事情が出てきて(そもそも動画コースのバグ改修をしています)。JDK8を使っていたのを、JDK14をインストールして、環境変数にJDK14のパスを設定しました。

flutter doctor -v にて、

    X Android license status unknown.
      Try re-installing or updating your Android SDK Manager.
      See https://developer.android.com/studio/#downloads or visit
      https://flutter.dev/setup/#android-setup for detailed instructions.

Android license status unknown.」というのが出ました。

qiita.com

このサイトにあるように、Androidのライセンス確認ができていない様子だということで、普通は「flutter doctor --android-licenses」で直るらしいのですが、直らない場合があるとのこと。そして私の場合はこの直らない方でした。

sdkmanager --licenses をすると

Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema
        at com.android.repository.api.SchemaModule$SchemaModuleVersion.<init>(SchemaModule.java:156)
        at com.android.repository.api.SchemaModule.<init>(SchemaModule.java:75)
        at com.android.sdklib.repository.AndroidSdkHandler.<clinit>(AndroidSdkHandler.java:81)
        at com.android.sdklib.tool.sdkmanager.SdkManagerCli.main(SdkManagerCli.java:73)
        at com.android.sdklib.tool.sdkmanager.SdkManagerCli.main(SdkManagerCli.java:48)
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.annotation.XmlSchema
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:602)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
        ... 5 more

java.lang.NoClassDefFoundError」というようなエラーが。これも先ほどのサイトに答えが書いてあり、現在のSDKのバージョンはJAVA9以降に対応しておらず、JAVA8で動かす必要があるとのことらしいです。

一応、上記サイトを進んで、下記のようなコマンドを売ってみました。

set JAVA_OPTS=-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee'

そして、flutter doctor --android-licensesをすると、

Error occurred during initialization of boot layer
java.lang.module.FindException: Module java.se.ee' not found

java.se.eeはないよ」ということで、JDK14にはこれはないのだなということがわかりました。

というわけで、JDK8を使うようにします。

【Flutter】 Firebaseとの連携ができず奮闘しています。2<原因がわかったかもしれない>

【Flutter】 Firebaseとの連携ができず奮闘しています。 - odekakeneko’s blog
前回の記事の続きです。
もうこの問題、3週間くらい奮闘しています。GWに丸何日もこの問題にささげたおかげで、もしかして解決の兆しが見えてきたのでその途中経過を書きます。

その前に振り返りから

・UdemyでFlutter学習コースを購入
・インスタグラムのクローンアプリが作れる、というコース。
Googleの認証でエラーが出た

signinSilentlyのcatcherrorで必ず下記のようなエラーコードが出る

I/flutter (18667): Error Message:MissingPluginException(No implementation found for method init on channel plugins.flutter.io/google_sign_in)

Runボタンのbuildは通るが、このエラーが必ず出てくるで消したい。ということでした。


===

話はそれますが、Udemyのこのコースの講師に質問してみたところ、

「OK,助けるよ。」

というような言葉を英語で頂き、現に未解決ながら4~5往復のメッセージやり取りをさせてもらっていて、じわじわ解決に近づいている気がします。Udemy講師親切でありがたいなぁ。

===

Firebaseプロジェクトの生成

本筋に入る前に、またちょっと話がそれます。

皆さんFirebaseのプロジェクトがどのようにGoogleに認識されているかご存じですか?
下記のエラーをご覧ください。

f:id:odekakeneko:20200505005957p:plain
普段とは別のGmailアカウントで「同じプロジェクト」を作ったらエラーになった。


確たる証拠になるドキュメントなどは見つからなかったのですが、このコースを反復しているうちにこういうことじゃないかということに気が付いて、講師に質問したら「(概ね)君は正しいよ」というような言葉をいただきました。

f:id:odekakeneko:20200505010513p:plain
Firebaseプロジェクト作った後の画面
説明します。これは最初にプロジェクトを作成してアプリと関連付ける画面でわかる人は良く見るものですね。
そこに、「com.company.appname」というAndroidパッケージ名があって、それはFlutterのappレベルのbuild.gradleからとってこれるものでした。アプリのニックネームは省略可でその下の、デバッグ用のSHA-1キーも省略可ではあるのですが、実はこれ(SHA1キー)と先ほどのAndroidパッケージ名のペアでもって、GoogleはこのFirebaseに関連付けられているアプリをグローバルに一意(ユニーク)なものとして認識しているようなのです。

そして、SHA-1キーはPCが発行するPC自身の識別番号のようなものらしく、同じPCを使っているならば何回調べても同じ番号が出てきます。

先ほどのグローバルに一意とはどういうことかというと、この(PCから成る)SHA-1キーと(「com.company.appname」という)Androidパッケージ名のペアが、世界中のGoogleアカウントの中で一つしかないということです。

最初に見せた画像は、普段とは別のアカウントでFirebaseプロジェクトを作り、同じパッケージ名とSHA-1キーを登録したときに出たエラーです。「もうすでにこのプロジェクトはあるよ」って言っています。

ちなみになんでパッケージ名とSHA-1キーの重複が起きたかというと、私がUdemy講師から学習のためにインストールしたパッケージを使って、私が私のPCで発行したSHA-1キーを使ったからです。

パッケージ名を無断で変えたらほかのエラーが起きるかもしれないし、PCはそうやすやすと変えられません。

しかも、このプロジェクト、削除しても一意のものとしてずっと残るらしいのです。

参考:Understand Firebase projects


ということで講師に質問すると「じゃあパッケージ名を変えてこういう風にして」と指示があったのでそれに従って本日エラーを解いていました。

長くなりましたが前置きは終わりです

===

object heapなんちゃらが出た


SHA1キーを発行するのに、gradlewをopen in Terminalし、「graldlew signingReport」する必要があるのですが、このSHA1キー発行でもエラーが起こりました。

Error occurred during initialization of VM
Could not reserve enough space for 1572864KB object heap


これは、Flutterがビルドをするときに、Gradleというシステムを使っているらしいのですが、そのGradleが、Java Virtual Machine (JVM)という仮想マシンを使ってビルドをしているらしい、その時に十分なスペースがなかった場合に出るエラーのようです。

gradle.propertiesに下記のような記述をして、解決します。

android.enableJetifier=true
android.useAndroidX=true
org.gradle.jvmargs=-Xmx1536M
android.enableR8=true

#↓試行錯誤の跡
#org.gradle.jvmargs=-Xmx4096M
#org.gradle.jvmargs=-XX\:MaxHeapSize\=256m -Xmx256m
#org.gradle.jvmargs=-Xmx4608M
#org.gradle.jvmargs=-Xmx2048M
#org.gradle.jvmargs=-Xmx3072M

要は、「org.gradle.jvmargs=」の後ろに「-Xmx4096M」などのなるべく大きい数値を入れて、十分なスペースを確保しようということみたいです。しかし、これは大きすぎてもいけないらしく、「-Xmx4096M」とすると、
「Invalid maximum heap size: -Xmx4096M
The specified size exceeds the maximum representable size.」
というエラーが出てしましました。「サイズが大きすぎるよ」と言っていますね。

===

ここで、ちょっとまた話が戻るのですが、
Firebaseのプロジェクトを作成してアプリと関連付けるとき、SHA1キーを登録してgoogle-services.jsonをappフォルダ下に設置した後に「アプリを実行してインストールを確認(この工程をスキップする)」という段階がきます。

f:id:odekakeneko:20200505014517p:plain

この時確認アニメーションがクルクルしたままで、他の方はこの工程をスキップする方もいるかもしれないのですが、私はここもスキップせずにクリアしたかったのです。

なので、この時点でアプリを実行していました。

Gradle周りの知識が足りないかもしれない

object heapの話に戻りますが、私が試行錯誤して、SHA1キーを発行するときには、gradle.propertiesは
「org.gradle.jvmargs=-XX\:MaxHeapSize\=256m -Xmx256m」
これだと通り、Run実行は通りませんでした。

その時のエラー内容

* What went wrong:
Gradle build daemon has been stopped: JVM garbage collector thrashing and after running out of JVM memory

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org
Finished with error: Gradle task assembleDebug failed with exit code 1

そして、Runを通すには、先ほどのgradle.propertiesに、
「org.gradle.jvmargs=-Xmx4096M」
を設定する必要がありました。
しかし、これだと「heapsizeが大きすぎるよ」ということでSHA-1キーの発行ができません。

私は、SHA-1キーがPC毎に同じであるという(一応仮説)を信じて、この「gradle.propertiesに記述するheapsizeの違い」を無視して先に進んでいました。Runが通ったので、下の画像のように、FirebaseはOKだよと言っているように見えます。

f:id:odekakeneko:20200505015948p:plain
Firebaseプロジェクト(アプリと連携)作成成功した時

しかし、SHA1キーを発行できた時のヒープサイズと、Runしてビルドが成功した時のヒープサイズが違うのです。これによってビルドされたアプリケーションにがFirebaseによって別のものと認識されている可能性もなくはない。

というわけで、もしかして私が3週間つまづいていたエラーってこういうことかなーということを書きました。

前回の記事ではドメインを取得してサイトを立ち上げまでしたのですが、ちょっとそれは意味がなかったかもしれません、、、

でも前向きに頑張ります。どうしてもFlutterで作りたいアプリがあり、Flutterがうまくなりたいのです。

【Flutter】 Firebaseとの連携ができず奮闘しています。

UdemyでFlutter学習コースを購入するのにはまっています。

最近は、インスタグラムのクローンアプリが作れる、というコースをセールで購入。

Firebaseと連携するものだった(というか未修)のですが、講習通りに行ってもFirebaseとの連携ができず、原因を探っています。

その形跡を記していきます。

Firebase OAuthとの連携は、

1.Firebaseにプロジェクトを作る
2.手順に従い、build.gradleからApplicationIDを(プロジェクト作成時記入欄に)コピペ
3.手順に従い、google.services.jsonをFlutterプロジェクトapp下に設置
4.SHA1キーを設定
5.次へに進み、アプリをRunでビルドし、Firebaseがアプリケーションとリンクできたかどうかを確認する
6.https://console.developers.google.com/OAuth認証画面より、サポートメールを設定する

以上をするとできると説明されているのですが、いろいろなところでつまづいております。

以下エラー内容をいろいろ書こうと思ったのですが、相当紆余曲折したので収拾がつかず、まとめだけ書きます。

Duplicate class が出てアプリをビルドできなかった

Duplicate class com.google.android.gms.internal.measurement.zzu found in modules jetified-firebase-analytics-impl-16.2.2-runtime.jar (com.google.firebase:firebase-analytics-impl:16.2.2) and jetified-play-services-measurement-base-17.2.2-runtime.jar (com.google.android.gms:play-services-measurement-base:17.2.2)

このようなDuplicate classというエラーがでてしまい、ビルドが通りませんでした。結論から言うと、直りました。pubsupec.yamlに登録したパッケージのバージョンを最新のものに書き換えてflutter pub getしたら、ビルドは通りました。
上記の動画学習コースで紹介されていたパッケージが最新のものではなく、それを使っていたためにエラーが起きました。

こういう場合私はstackoverflowなどの質問サイトを見ながら修正を試みるのですが、さんざん彷徨ったのでだんだん人任せになり、もう誰か答えを下さい、という感じでした。イヤイヤ、答えは自分で見つけるもんだ。

どこかのサイトに、pubspec.yamlのバージョンを上げよとあったので、自分の求める質問と違いがあるものでしたが、対応してみることに。そうしたら、ビルドが通りました!

ビルド通すのに何日かかってんだい!!(心の声)

【教訓】
pubspec.yamlのバージョンを最新にするのは基礎。ビルドにつまづいたらまずこれを疑うこと。



OAuth同意画面の設定が必要だった

ビルドが通って、Googleのアカウント認証をするためのコードをFlutterで作り、実行を押してみると、またしてもビルドが通らなくなりました。

I/flutter (18667): Error Message:MissingPluginException(No implementation found for method init on channel plugins.flutter.io/google_sign_in)

このようなログが出てきて、原因を調べてまた長ーい時間がかかりました。

githubの質問サイトにて、https://console.developers.google.com/OAuth認証画面より、アイコンとサポートメールを設定しないといけないとあったので、いやいやそれは動画コースでちゃんと設定したはず、と思い確認に行くと、、

アプリの確認ステータスに「確認が必要」というステータスが出ていました。

「アプリケーションのロゴが更新されているため、アプリ登録で Google による確認を受ける必要があります。 アプリを準備し、確認のため送信してください。」

こういうのちゃんとチェックすべきですね。原因はここか!と思いコンソールの中を見てみることに。

すると、アイコンとメールはすでに設定済みなのですが、「確認のため送信」というボタンが下部にあり、それを押さなければならないのだなと思いました。
押してみると、入力が足りない旨が出てきて、

アプリケーション ホームページ] リンク
「公開するには、ホームページの URL が必要です。」
[アプリケーション プライバシー ポリシー] リンク
「公開するには、プライバシー ポリシーの URL が必要です。」とあったので、それらを設定することに。

ホームページリンクははてなブログの技術ブログでいいかな。
プライバシーポリシーはゲームを作った時に作ったのでこちらもはてなブログに新しい記事として作って設定してみよう。

すぐに作った簡易プライバシーポリシーをこの設定個所に記述すると、、、
「無効なドメイン: URL は [承認済みドメイン] セクションの一覧にあるドメインでホストされている必要があります。」

なんだこりゃあ~。

というわけでまた設定が必要そうです。

いろいろと読み進めていると、有料の(無料でもできるかもしれませんが)サーバーをレンタルなどして、ドメインを取得してドメインを有効化し、ドメイン所有権の証明をする必要があるようです。

というわけで、この数日で、ロリポップのライトプランを契約し、ムームードメインで1年間ドメインを取得しました。

そして、有効なドメインにするために、ドメイン所有権の証明手順というものを踏みました。

ムームードメイン: TXT レコード - G Suite 管理者 ヘルプ

これに従い、ムームードメインで私が持つドメインの設定をGoogleが求める仕様に変更。

https://search.google.com/search-console
このリンクでドメインの承認が確認されるまで、1日程度待つ必要があるとのことで、現在その応答を待ち中です。

↑↑今ココ!!

【参考リンク】
Verify your site ownership - Search Console Help

Unityで図鑑のようなUIを作りたい ~ GridLayoutGroupを使ってスクロールさせて中にセルを生成 ~

こんばんは。VyseArtのトナカイです。

今回は完全に私のための備忘録記事です。

「odekakeneko 図鑑 UI 」(またはプラス「スクロール セル」)の検索ワードで引っかかったら私個人として使いやすいなと思います。

目次

現在VyseArtは新しいゲームを作成するするため打ち合わせをしております。

本日VyseArtチームで ゲーム案出し→絞り込み→一つに決める の工程が完了しまして、作りたいゲームのアイディアが決まりました^^

その後ゲーム案を具体化させたり、ゲームルールを作ったり、仕様書を作る前段階まで来ました。

良くまとまったので、さっそく帰宅してゲームに使いそうなコードを探しました。

本日探したコードは、表題の通りになります。

f:id:odekakeneko:20200119011803p:plain:w300
図鑑のようなUIを作りたい。

こちらのサイトのパクほぼリライトになります。
このサイトでは、縦のスクロール図鑑を作っていますが、
私の方では、横スクロールを作ってみました。

qiita.com

図鑑のようなUIを作るには、GridLayoutGroupを使いセルを生成していくことになります。

それではGridLayoutGroupを使って横にスクロールするUIを作ってみましょう。

図鑑のようなUIの作り方

f:id:odekakeneko:20200119012318p:plain:w300
初期画面

Create→UI→Canvas

Canvas ScalerをScale With Screen Sizeにします。


f:id:odekakeneko:20200119012422p:plain:w300
キャンバスを作る


次に、Create→UI→ScrollViewでScrollViewを作る、

ScrollViewのインスペクタから、画像の赤丸を選択すると、
Anchor Presetsが出てくるので右下の赤丸のstrechを選択。

f:id:odekakeneko:20200119012518p:plain:w500

Stretchは親オブジェクトから何ピクセル離れるか、ということらしいです。
私が作りたいのは、画面の下方に現れる図鑑なので、
Left : 50
Top : 600
PosZ : 0
Right : 50
Bottom : 50
にしました。こうすると、画像の白っぽい四角のようになりました。

今回は参考サイトとは異なり、横方向の移動だけでよいので、Scroll RectのVerticalのチェックを外して、Scrollbar verticalのオブジェクトをヒエラルキーから削除しました。

ScrollViewのViewPortの子にContentがあり、ここに画像やボタンを配置していくそうです。

ここに、GridLayoutGroupを配置していきます。

contentにAdd Componentし、
・GridLayoutGroup
・Content size Fitter
を追加します。

下記Unityのドキュメントから引用です。

以下は推奨される Content Size Fitter と Layout System を併用する方法です。

幅を可変にし、高さを固定する
要素が加えられるにつれて、グリッドが横に広がるように、グリッドを可変の幅と固定の高さで設定するには、以下のようにプロパティーを設定します。

Grid Layout Group コンポーネントの Constraint: Fixed Row Count
Content Size Fitter コンポーネントの Horizontal Fit: Preferred Size
Content Size Fitter コンポーネントの Vertical Fit: Preferred Size か Unconstrained
Vertical Fit で Unconstrained を使用する場合、特定のセルの行数に合うようにグリッドの高さを大きくするかは、ニーズに合わせて判断してください。

f:id:odekakeneko:20200119013016p:plain:w500
Grid Layout GroupとContent Size Fitterはこのように設定する
Preferred Sizeはレイアウト要素のPreferred Heightに基づいて高さを制御します。
UnConstrainedは高さにレイアウト要素に基づく制御を行わない、とありました。

あとは、下記スクリプトを作成してヒエラルキーのオブジェクトにこのスクリプトをアタッチ(普通GameManagerなどのマネージャーオブジェクトにアタッチ)し、インスペクタから
contentRectTransformにContent
buttonCellに作成したボタンを

ヒエラルキーからアタッチすればできます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;


public class TestSpawnGridLayout : MonoBehaviour
{

    public RectTransform contentRectTransform;
    public Button buttonCell;
    public Sprite spriteCell;

    // Start is called before the first frame update
    void Start()
    {
        InstantiateGridLayoutCell();
    }

    // Update is called once per frame
    void Update()
    {
        /* ここはUpdateです */
    }

    //セルを生成する
    public void InstantiateGridLayoutCell()
    {
        for(int i = 0; i < 30; i++)
        {
            var obj = Instantiate(buttonCell, contentRectTransform);
            obj.GetComponent<Image>().sprite = spriteCell;
        }
    }
}

(このスクリプトパク上記サイトのスクリプトを参考にさせていただいております。)

f:id:odekakeneko:20200119012754p:plain:w500
完成図

FlutterのLocalizationについできたこと~CupertinoDatePickerを日本語にできた~

こんにちは。VyseArtのトナカイです。

最近Flutterを学んでいます。
私はIT関連企業の事務系で社内ツールを作っているのですが、
今後、今の仕事でもFlutterつかえたらいいなという淡い期待をしていて、
ちょっとずつ勉強しています。

あとFlutterを使ってどうしても作ってみたいツールがあるんです。
SNS要素があるのですが、使ってくれた人が希望を持てるようなツールを作りたいと思っています!

続きを読む

【Unity】Loypolyの魚AIを自由に泳がす~A* Pathfinding の使い方備忘録~

こんばんわ。VyseArtのトナカイです。

( ようやくはてな記法について理解しました笑)

先日unityのアセットストアで最大70%OFFの割引セールをやっていまして、目をつけていたアセットA* PathFinding Proが半額だったので購入しました^^

 

それを使うと簡単に人工知能AIの動きが作れるということだったので、実際に作ってみました。

 

タイトルの通り現在ローポリで探索ゲームを作成中です。

 

https://youtu.be/X4dhlfHO0CU

 

UnityはNavmeshAgentという機能があって、これも人工知能に関するものなのですが、私にはどうもうまく扱えず(何かが引っかかって動かなくなってしまったり)、人工知能は一端あきらめていました。

 

このアセットは何とか動画のような形にできました。

比較的簡単に人工知能を実装できたと思います^^

 

今回はその備忘録です。


f:id:odekakeneko:20191207223835p:plain
A*オブジェクトを作成

A* Pathfinding Pro(有料です!)をアセットストアからインポートしたらヒエラルキーに「A*」という 空のゲームオブジェクトを作ります(画像の他のオブジェクトはここでは無視してください)。そして、、


f:id:odekakeneko:20191207225001p:plain
A*オブジェクトのインスペクタ

A*のインスペクタはこうなっています。AddComponentで「Pathfinder」と検索してアタッチすると、A Star Pathというスクリプトが付きます。

 

Graphの名前はたしか「Grid Graph」だったのですが「Water Graph」に変えました。

こちら私がすごいなと感じたのは、このGraph、複数で作成ができてGraphごとに取得ができるようです。

 

それの何がすごいかというと、Water Graph内だけで動き回ってほしいAIにはそのグラフの範囲だけ設定すればよいのです。

 

NavGraph gg;

gg = GetComponent<Astarpath>.graphs[0];

グリッドグラフの取得の方法…添え字を使います。

 

AIとなるオブジェクトには、SeekerとAILerpというスクリプトをつけます。
Seekerスクリプトは必須で消せません。AILerpはSeekerに依存していると表示が出ました。

(ここら辺私なりに色々彷徨いました。A*Pathfindingが壊れているのかとまで思ったのですが、自分のコードと向き合って直したところ、動画のようなものが作れました)

 

AIとなるオブジェクトにつけたスクリプトFish.csは下記のようになります。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Pathfinding;

public class Fish : Item
{
    NavGraph gg;
    float radius = 20f;

    IAstarAI ai;

    void Start(){
        //グラフを取得する
        gg = GameObject.Find("A*").GetComponent<AstarPath>().graphs[0];    //WaterGraphを取得
        ai = Getcomponent<IAstarAI>();
    }

    void Update(){
        Swim();
    }

    private void Swim() 
    {
        if(!ai.pathPending && ( ai.reachedDestination || !ai.hasPath))
        {
            ai.destination = gg.GetNearest(PickRandomPoint()).clampedPosition;
            ai.SearchPath();
        }
    }

    Vector3 PickRandomPoint()
    {
        var point = Random.insideUnitSphere * radius;

        point.y = 0;
        point += ai.position;
        return point;
    }
}

Fish.csですが、動画の動きとは少しスクリプトを割愛をしてあります(例えば最初は泳いでなくて、くるくる回っているところとか、フラグを使ってifで条件分岐するとできますね)。

私的にポイントは、関数Swim内の
ai.destination = gg.GetNearest(PickRandomPoint()).clampedPosition;
にあると思っています。
ランダムなポイントをとってくるのはA* Pathfindingを使わなくてもコードをかけるのですが、その近くのノードをとってきてVector3型で返すというのがこのアセットを使ってできることだと思います。

ほかにも、A*Pathfindingは動的にBake(このアセットではScan)ができるということで、それに関してはまだ勉強中というか効果もわかっていないところなのですが、それらもできたら掲載したいと思います。

以上。

 

最近の話 ~モチベーションが上がらなかった時は~

9月初め 銀河鉄道の夜 ~もう1つのストーリー~をリリース

9月半ば 東京ゲームショウ2019に初めて行く(小海とともに)

9月末  今後のゲームはAI(人工知能)を取り入れたいねという話になる

9月末(先週) 仕事(とラグビーW杯観戦)が忙しく開発なかなかできず

10月5日(土) 本日、進捗あまりよくなく思い悩む

 

==

 

上のような状態でして、新アプリをリリースしてから、あまり制作活動が進んでいません。

 

何かのブログで「成功するような人は呼吸をするかのように当たり前に努力をする」ということが書いてあって、私もアプリ制作で生活していきたいのだけどそのように努力できていない自分がいてじりじりとしてしまいました。

 

あまりに思い詰めて小海に電話。内容は以下です。

 

〇仕事が忙しくてアプリ制作がなかなか思うようにいかない

〇ゲーム作りはしたいけど、今後満足な収入を得ることは難しそう

〇収入が欲しいなら、今すぐブログとか書いた方がいいかも

 

小海からは以下のように言われました。

〇収益がなくても、コンテンツを自分たちで作り、それを世に出したい。一人でも共感してくれる人がいるといい。

〇周りは気になるけど、自分たちが何ができて、どう成長して、今度は何が作りたいという「自分たちベース」でいきたい

 

 

な、な、なるほど、、!!!!!

 

センターを取り戻した自分がいました。

 

==

 

ところで私はラグビーをやっていました。高校の時です。

 

何であんなに頑張っていたのだろうというくらい頑張っていた。がむしゃらでした。

 

そのあと大学に進んで、勉強がうまくいかず体調を崩したりして、そのあと何とか仕事にありつけたけど、そのあとの自分はちょっとよくわからない。

 

ほんとうは何がしたいのか、自分が好きか、ひたむきに頑張っているか。

 

忙しくなると忘れてしまうのですが、信じる気持ちは大切だなと思います。

 

大切なことは子供のころに知っていて、大人になって忙しくなると、それを手探りで思い出しながら再現させようと努力するのではないかなと思います。

 

それがかなわないでへこたれるけど、もう一度その気持ちを思い出したならば、せめて書き留めないといけないと思います。

 

というわけで、私はすごく頑張っていたということを書きます。

そして、小海という素晴らしいパートナーがいます。

 

そういうわけで、今後ともゲーム制作を続けていきます。

以上。