HACK U 2024のプロジェクト。
無駄だと思っていること:『歩いている時間』 ユーザーが歩くことでゲーム内通貨を貯めることができ、その通貨を利用して自分の仮想の会社を経営していくアプリケーション。
tool | version |
---|---|
Flutter | 3.22.3 |
Dart | 3.4.4 |
Unity | 2022.3.40 |
Gradle | 8.1.1 |
JDK | 17.0.13 |
CocoaPods | 1.15.2 |
iOS Minimum version | 13.0 |
lib/
├── core/ # アプリケーション共通機能
│ ├── auth/ # 認証基盤
│ │ ├── data/ # リポジトリ層
│ │ ├── domain/ # ドメインモデル
│ │ └── presentation/ # UI層
│ └── providers/ # アプリ全体のプロバイダー
│
├── features/ # 機能モジュール
│ ├── home/ # HOME画面機能
│ ├── gacha/ # ガチャ機能
│ ├── company/ # 経営機能
│ ├── communication/# すれ違い通信機能
│ └── item/ # アイテム機能
│
└── shared/ # 共有コンポーネント
├── constants/ # 定数など
├── utils/ # ユーティリティ関数
├── widgets/ # 共通Widget
└── navigation/ # 画面遷移
root/
├── users/
│ └── {userId}/
│ ├── email: string
│ ├── name: string
│ ├── createdAt: timestamp
│ ├── updatedAt: timestamp
│ └── dailyRecords/
│ └── {date}/ # YYYYMMDD形式
│ ├── steps: number
│ ├── earnedAmount: number
│ ├── totalAssets: number
│ ├── createdAt: timestamp
│ └── updatedAt: timestamp
│
├── companies/
│ └── {userId}/
│ ├── id: string
│ ├── name: string
│ ├── genre: string
│ ├── rank: string
│ ├── totalAssets: number
│ ├── stepsToYenRate: number
│ ├── createdAt: timestamp
│ └── updatedAt: timestamp
│
└── battles/
└── {date}/ # YYYYMMDD形式
└── {battleId}/
├── winnerId: string
├── loserId: string
├── winnerSteps: number
├── loserSteps: number
├── stepsDifference: number
├── amountChanged: number
├── multiplier: number # 固定値4
└── createdAt: timestamp
各featureディレクトリは、presentation/domain/dataの3層構造を採用している。
MVVMパターンを採用している。
-
Presentation Layer (
presentation/
)- View: UIの表示
- ViewModel: UIのロジックと状態管理
-
Domain Layer (
domain/
)- ドメインモデル
- ビジネスロジック
-
Data Layer (
data/
)- リポジトリ
- データソースとの通信
- Riverpodを使用
- 各機能モジュールごとにViewModelで状態を管理
- スネークケース(例:
auth_repository.dart
) - 機能モジュールは単数形
- レイヤーごとにディレクトリを分割
- Flutter
- Unity
- Firebase Authentication
- Cloud Firestore
- Health API(歩数計測)
- flutter_unity_widget(Unity連携)
- flutter_blue_plus(BLE通信)
- freezed(データモデル)
- riverpod(状態管理)
- https://pub.dev/packages/flutter_unity_widget の公式docsの手順に従って環境構築する。
android/gradle.properties
を新規作成し、以下の内容を記述。
android.useAndroidX=true
android.enableJetifier=true
# 個人のJavaのパスを指定↓
org.gradle.java.home=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home
org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError
ios/UnityLibrary/UnityFramework.podspec
を新規作成し、以下の内容を記述。
Pod::Spec.new do |s|
s.name = 'UnityFramework'
s.version = '0.0.1' # any version
s.summary = 'Unity Framework for iOS'
s.description = 'Unity Framework for iOS integration'
s.homepage = 'https://unity.com'
s.license = { :type => 'Copyright', :text => 'Copyright © 2024' }
s.author = { 'Unity' => '[email protected]' }
s.source = { :git => '.', :tag => "#{s.version}" }
s.platform = :ios, '13.0' # your minimum supported version
s.vendored_frameworks = 'UnityFramework.framework'
s.framework = 'UnityFramework'
s.xcconfig = {
'FRAMEWORK_SEARCH_PATHS' => '"$(PODS_ROOT)/UnityFramework"',
'OTHER_LDFLAGS' => '$(inherited) -framework UnityFramework'
}
end
.flutter_plugins
配下にあるflutter_unity_widget/android/build.gradle
を開き、以下の変更を行う。
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_1_8
}
lib/firebase_options.dart
を新規作成し、Notionの#環境変数から参照。ios/Runner/GoogleService-Info.plist
を新規作成し、Notionの#環境変数から参照。android/app/google-services.json
を新規作成し、Notionの#環境変数から参照。
cd ios
pod install
cd ..
(fvm) flutter clean
(fvm) flutter pub get
(fvm) flutter build ios
(fvm) flutter run
(fvm) flutter clean
(fvm) flutter pub get
(fvm) flutter build apk
(fvm) flutter run
- Makefileを使うと便利。