Skip to content

tasogare-88/EcoBiz

Repository files navigation

EcoBiz

HACK U 2024のプロジェクト。

無駄だと思っていること:『歩いている時間』 ユーザーが歩くことでゲーム内通貨を貯めることができ、その通貨を利用して自分の仮想の会社を経営していくアプリケーション。

Versions

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/   # 画面遷移

FireStoreのデータ(コレクション)構造

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

BaaS

  • Firebase Authentication
  • Cloud Firestore

APIやライブラリ

  • Health API(歩数計測)
  • flutter_unity_widget(Unity連携)
  • flutter_blue_plus(BLE通信)
  • freezed(データモデル)
  • riverpod(状態管理)

セットアップ

  1. https://pub.dev/packages/flutter_unity_widget の公式docsの手順に従って環境構築する。
  2. 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
  1. 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
  1. .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
    }
  1. lib/firebase_options.dartを新規作成し、Notionの#環境変数から参照。
  2. ios/Runner/GoogleService-Info.plistを新規作成し、Notionの#環境変数から参照。
  3. android/app/google-services.jsonを新規作成し、Notionの#環境変数から参照。

デバッグ手順

iOS

cd ios
pod install
cd ..
(fvm) flutter clean
(fvm) flutter pub get
(fvm) flutter build ios
(fvm) flutter run

Android

(fvm) flutter clean
(fvm) flutter pub get
(fvm) flutter build apk
(fvm) flutter run

Tips

  • Makefileを使うと便利。

参考リンク