Release Specification / Ver1.4.0

クラリィのぷくぷくシャボン玉はこび 仕様書

Ver1.4.0 は、そばにいるだけだったクラゲが「間に合わない一球」を助けてくれるところまで進化したリリースです。 海の光を時刻スライダーで連続的に選べる操作、GameSceneのクラリィの髪揺れも加え、遊びやすさと水中の生命感を磨きました。

Unity 6000.5.6f1 / URP UI Toolkit iOS / Android bundleVersion 1.4.0
New: Jellyfish Rescue New: Ocean Light Slider Update: Clarie Hair Motion Minor Update / 1.4
Ver1.4.0 タイトル画面
クラゲアイコン

ゲーム概要

基本体験

プレイヤーはクラリィを操作し、頭の判定エリアでシャボン玉を弾いてスコアや距離を伸ばします。 操作はシンプルですが、ヒット音、破裂音、端末振動、Bubbleのぷにょ変形、海中演出により「触って気持ちいい」反応を重ねています。

  • 頭の中心に近いほど高得点・高精度。
  • Normal / Time Attack / Center Hit の3モード。
  • 落下・時間切れ・規定ヒットでリザルトへ遷移。

作業用体験

Clock Mode / Pomodoro / Timer は、海中の美しさとクラリィのかわいい動きを活かした「眺めるゲーム」機能です。 Ver1.4ではプリセット式だった海時間を連続スライダーへ更新し、勉強・作業・休憩の背景として好みの光を細かく選べるようになりました。

  • タイトルは実時刻・季節に連動する海を表示可能。
  • 設定/ポーズから4:30〜24:00を15分刻みで選択。
  • クラゲコンパニオンは癒やしに加え、1プレイ最大2回まで落下を救助。
  • ゲーム中の髪が移動・停止・旋回へ控えめに遅れて、ふわっと揺れる。
正式名称
クラリィのぷくぷくシャボン玉はこび / Bubble Pop
ジャンル
海中カジュアルアクション、チル作業用ゲーム、時計/ポモドーロ/タイマー補助
対象端末
iOS 15.0以上 / Android Min SDK 33、Target SDK 36。
現行バージョン
bundleVersion: 1.4.0 / iOS 1.4.0 / Android versionCode 137
主な実装方針
Unity Input System、UI Toolkit、URP、イベント駆動、PlayFabランキング、モバイル触覚フィードバック。

Ver1.4.0 リリース差分

Ver1.4.0 の中心は「クラゲが実際に助けてくれる体験」です。 1.3で追加したクラゲと24時間の海を遊びへ接続し、GameSceneのクラリィにもタイトル画面らしい髪の生命感を持たせるマイナーアップデートです。

区分内容主な実装
新規クラリィが走っても届かない落下だけをクラゲが判定し、ワープして下から1回弾く身代わりヘディング。JellyfishRescueDirector / HeadingBall.RescueBounce()
新規ワープの伸縮・粒子演出、救助後の上昇退場、20秒後の補充待ちを追加。JellyfishCompanion / JellyfishWarpEffect
新規救助成立位置へ「くらげがひろってくれた!」を約2秒表示するUI Toolkit吹き出し。JellyfishRescueHud / Manager
更新海時間の5プリセットタブを「現実/デフォルト」と「カスタム時刻」の2モード+4:30〜24:00スライダーへ変更。SettingsController / PauseController
更新15分刻みの時刻をシーン別保存。1.3までの設定は日中12:00、夕焼け16:45、日没17:30、夜21:00へ自動移行。GameSettingsStore
更新カスタム時刻では実際の太陽高度から仰角を求め、昼の連続スライドでも影と光が変化。OceanTimeOfDayCycle.SolarSunPitch()
新規GameSceneのクラリィへ軽量な髪物理を自動付与。移動・停止・旋回へ遅れて62セグメントを固定60Hzで更新。ClarieHairMotion / ClarieHairChains
調整Normalでクラゲが増える距離を20 / 55 / 120 / 260mへ再調整し、登場間隔を広げた。Game_Normal_Endless.unity

画面・素材ギャラリー

Titleから作業用モード、衣装、ランキング、モード選択、各ゲーム画面、リザルト、設定、ストアへ進む従来の並び順を維持した代表ギャラリーです。 Ver1.4で追加したクラゲ救助とゲーム中の髪のカットは、既存画面の流れを崩さないよう最後に配置しています。

明るい日中のVer1.4.0タイトル画面Title 1.4.0 / Daylight

10:30の明るい海でUnity Game Viewを再収録。1.4.0表記とホーム導線を確認。

時計・ポモドーロ・タイマーClock / Pomodoro / Timer

時計、ポモドーロ、タイマーを切り替える作業用モード。

衣装クローゼットCloset

貝がら残高と衣装カードを表示し、クラリィの衣装を切り替え。

ランキングRanking

距離ランキングと自分の順位を表示。実機ではPlayFab名簿を確認。

ゲームモード選択Mode Select

Normal、どまんなか、タイムアタックの3モードをタイトル下部から選択。

NormalゲームプレイNormal

ゲームシーンでBubbleを弾く通常プレイ。バブル、クラリィ、距離、ヒット数、貝がらHUDを表示。

Center HitゲームプレイCenter Hit

15回制の中心ヒット。命中率、スコア、ヒット回数を表示。

Time AttackゲームプレイTime Attack

60秒制の距離チャレンジ。タイマー、距離、夜の海時間HUDを表示。

リザルトResult

距離、スコア、平均、拾った貝がら、復活/再試行/シェア導線。

海の光カスタム時刻スライダーSettings / Ocean Light Slider

従来のSettings位置を1.4の画面へ差し替え。「カスタム」と10:30の時刻表示を確認。

ストアStore

ゲーム内/ストア課金タブ、広告削除・衣装購入・購入復元。

クラゲ救助とゲーム中のクラリィVer1.4 / Jellyfish Rescue & Game Hair

1.4の追加カット。救助メッセージとクラゲ、GameSceneでふわっと動く後ろ髪を収録。

ゲームモード

Normal icon

Normal Endless

Bubbleを落とすまで続く基本モード。距離、ヒット回数、命中率、スコアを伸ばす。海時間の既定は 日中

  • スコア、総移動距離、最大/平均精度を記録。
  • 同じ位置での放置連続ヒットはコンボガードで抑制。
  • 落下/破裂でリザルトへ移行。
Time Attack icon

Time Attack

60秒でどれだけ距離とスコアを伸ばせるかを競う短時間モード。海時間の既定は

  • 時間切れまたは落下で終了。
  • テンポ重視。ランキング/シェアとの相性が高い。
  • ポーズ画面から海の光をカスタム時刻へ即時変更可能。
Center Hit icon

Center Hit

15回のヘディングで中心精度を競う採点モード。海時間の既定は 夕焼け

  • 中心ほど高得点。端でも最低命中率を保証。
  • 連続高精度でコンボ倍率が上昇。
  • Bubbleの水平移動はランダム方向で、中心狙いを成立させる。

Bubble 挙動 / 当たり判定 / Shader 詳解

Bubble は HeadingBall の物理、BubbleEffect のヒット変形、 BubbleShader の透明膜、BubbleBurst の破裂演出で構成されます。 Ver1.4でも中核ロジックは維持されています。

通常モードの跳ね返り

  1. Bubble が HeadingZone に衝突する。
  2. 頭ローカル座標へ変換し、中心からの offset を求める。
  3. centerThreshold 内は真上、外側は衝突方向へ Slerp して角度を付ける。
  4. targetHeightY と滞空倍率から垂直初速・カスタム重力を計算。
  5. 水平速度を更新し、Bubble の linearVelocity へ反映。

放置コンボ防止

Normal / TimeAttack では、前回とほぼ同じ頭ローカル位置で連続ヒットした場合に comboGuardDistancecomboGuardMaxRepeats で放置判定します。 閾値を超えると命中率を0にし、ランダム水平ナッジでループを崩します。

Center Hit は毎回ランダム方向へ飛ばすため、同じ位置での放置ループが成立しにくい設計です。

当たり判定と命中率

localHitPos = zone.InverseTransformPoint(ballPos) offsetXZ = new Vector2(localHitPos.x, localHitPos.z) offset = offsetXZ.magnitude accuracy = CalculateAccuracyScore(offset) hitColor = CalculateHitColor(localHitPos)
項目通常 / TimeAttackCenter Hit
命中評価中心からの距離でスコア化。精度は色にも反映。CenterHitAccuracy(offset)。中心100%、端でも最低保証。
跳ね返り方向中心は上、外側はヒット方向へ角度をつける。採点と跳ね返りを分離し、毎回ランダム水平方向へ飛ばす。
二重判定衝突判定と状態管理で抑制。centerHitHitCooldown 0.3秒
壁反射壁衝突時はステージ内へ戻す。水平方向だけ反射し、テンポを保つ。

シャボン玉 Shader

透明膜とFresnel

BaseColor、Alpha、Fresnel を組み合わせ、外縁ほど光る薄膜感を作ります。 命中方向の色は MaterialPropertyBlock 経由で個体へ反映し、共有Materialを汚さない設計です。

ぷにょ変形

BubbleEffect.TriggerHitSquish(finalDir) が衝突方向を渡し、 _SquishProgress を減衰振動として更新します。 Shader は _HitDirection 軸を縮め、直交方向を膨らませます。

Shader/Material パラメータ役割
_BaseColorBubble本体の薄い色。ヒット色と元色をブレンドする。
_FresnelColor外縁の発光色。命中方向・反応の気持ちよさを視覚化。
_SquishProgressヒット直後の変形量。時間経過で0へ戻る。
_HitDirectionどの方向へ潰すか。物理反射方向に対応。
_Surface / _SrcBlend / _DstBlendURPの透明描画/アルファブレンド。パーティクルやクラゲMaterialでも手動設定が必要な箇所あり。

Ver1.4 海の光スライダー / 24時間サイクル

OceanTimeOfDayCycle は時間帯Profileをキーフレームとして並べ、現在時刻に応じて海の色・フォグ・ライト・HUD・魚の見え方を滑らかに補間します。 Ver1.4では同じカーブをユーザーが時刻スライダーで直接たどれるようになりました。タイトルは実時刻、ゲームシーンは各モードの既定Profileを「デフォルト」として維持します。

Ver1.4の海の光カスタム時刻スライダー
Unity Game View / Title設定 / カスタム 10:30
1.4 UI replacement

5つの時間帯タブを、時刻そのものを選ぶUIへ変更

上段のモードボタンで 現実時刻(ゲーム中はデフォルト)カスタム を切り替えます。 カスタム時だけ太陽〜月のスライダーが有効になり、つまみの上へ 10:30 のような確定時刻を表示します。

入力範囲4:30〜24:00
確定刻み0.25h = 15分、全79段階
ライブ反映ドラッグ中も海・フォグ・光源・HUD・魚を即時プレビュー
保存単位Title / Normal / Time Attack / Center Hitの4スロット
Night
白み始め前
Dawn
日の出
Day
昼プラトー
Gold
夕方
Sunset
日没
Night

時刻ソース

RealTime端末の DateTime.Now と実日付。タイトル向け。
Fixed_fixedProfile を常時適用。ゲーム3シーン向け。
Manual_debugHour スライダー。調整・プレビュー用。
Custom設定/ポーズの時刻スライダー。共有Profileから24時間カーブを組み、指定時刻で固定。

季節モデル

愛媛県伊予市/松山相当の値をもとに、夏至と冬至の日の出・日の入りをcosで補間します。 Fixedモードでは安定したゲーム画面を優先し、季節係数は0.5で固定します。

夏至日の出 4:58 / 日の入り 19:23
冬至日の出 7:10 / 日の入り 17:05

既定キーフレーム

#Profile基準Offset意味
1NightSunrise-0.5h日の出30分前、白み始め。
2DawnSunrise0h夜明けのピーク。
3DaySunrise+1.5h完全な昼へ。
4DaySunset-2.5h昼プラトー終わり。
5GoldenSunsetSunset-1.5hゴールデンアワー。
6SunsetSunset-0.75h夕焼け・薄明。
7NightSunset+0.5h完全な夜。

soft-only 適用

ランタイムでは OceanUnderwaterSettings.ApplySoftTo() を使い、色・強度・フォグなど軽量な値だけを反映します。 最後に ApplyExternalEnvironmentChanges(false) を呼び、光柱・粒子・カースティクスの再生成を避けます。

カースティクス配置保護

TitleとGameではTerrain高さが異なります。共有Profileが groundY を上書きすると光模様が床下へ潜るため、 applyCausticsPlacement がONのときだけ配置を適用します。

設定 / ポーズの「海の光」セレクタ

現実時刻 / デフォルトカスタム🌞 10:30 🌜

スライダーの仕組み

UI Toolkitの標準Sliderではなく、既存のLiquid Glass意匠を保つ VisualElement として実装しています。 SettingsとPauseは同じ入力アルゴリズムを持ち、違うのは保存先のシーンスロットだけです。

1Pointerを捕捉

PointerDown でCaptureし、画面外へ指が出てもドラッグを継続します。

2X座標を0〜1化

左右の操作余白を除いた幅で localPosition.x を正規化します。

3時刻へ変換

Lerp(4.5, 24, n) で4:30〜24:00の生時刻を求めます。

415分へ丸める

Round(hour / 0.25) × 0.25。範囲外はClampし、変化した段だけ通知します。

5その場で再評価

OnOceanTimeOfDayChanged を受けたCycleが ApplyNow() し、海を即時更新します。

6リリース時に保存

PointerUp / PointerCaptureOut の1回だけ PlayerPrefs.Save() を呼びます。

usableWidth = sliderWidth - (edgePadding × 2) n = Clamp01((pointerX - edgePadding) / usableWidth) rawHour = Lerp(4.5, 24.0, n) customHour = Clamp(Round(rawHour / 0.25) × 0.25, 4.5, 24.0) label = HH:mm // 例: 10.5 → 10:30、24.0 → 24:00 ドラッグ中: SetOceanCustomHour(scene, customHour, persist:false) 指を離す : SetOceanCustomHour(scene, currentHour, persist:true)
Pointer X 0〜1正規化 4:30〜24:00へ変換 15分へスナップ Profile区間を評価 描画+光源を更新
シーンモードOFF時カスタム時刻キーUI導線
Title現実時刻+季節settings_ocean_custom_hour_title設定画面
NormalEndlessDaysettings_ocean_custom_hour_normalポーズ画面
TimeAttackNightsettings_ocean_custom_hour_timeattackポーズ画面
CenterHitGoldenSunsetsettings_ocean_custom_hour_centerhitポーズ画面

連続操作

  • 範囲は 4:30〜24:00、刻みは15分。
  • ドラッグ中は persist:false で即時プレビューし、指を離したときだけ PlayerPrefs.Save()
  • カスタム時刻では太陽仰角を伊予市相当のモデルから再計算。昼のプラトー内でも光と影が変わる。

1.3設定の移行

旧5タブは初回参照時に自動移行します。日中→12:00、夕焼け→16:45、日没→17:30、夜→21:00。現実はそのまま現実/デフォルトとして保持します。

Directional Lightはどう傾くか

カスタム時刻では、Profileの色補間とは別に太陽高度を計算し、主光源の X回転だけ を更新します。 Quaternion.Euler(sunPitch, 0, 0) なので、朝から昼は光が上から差す方向へ深く傾き、午後は逆順で浅くなります。 Y(方位)とZ(ロール)は常に0で、東から西へ横切る方位回転は行いません。

カスタム時刻によるDirectional LightのX回転 朝夕は最低28度、10時30分は約50.5度、南中は約58度へX回転が傾く概念図。 水平線 / 海面基準 8:00 X = 28°(下限) 10:30 X ≈ 50.5° 12:09ごろ X ≈ 58.0°(南中) 16:45 X = 28°(下限) Xだけ可変 Y = 0° / Z = 0°
概念図。数値はゲームシーンの基準季節 seasonT = 0.5(日の出6:04 / 日の入り18:14)で算出。

太陽高度からX回転を求める

緯度は伊予市/松山相当の φ = 33.76°。季節モデルの日の出・日の入りから赤緯δを逆算し、選択時刻の太陽高度eを求めます。

solarNoon = (sunrise + sunset) / 2 H0 = ((sunset - sunrise) / 2) × 15° δ = atan(-cos(H0) / tan(φ)) H = (hour - solarNoon) × 15° e = asin(sinφ sinδ + cosφ cosδ cosH) dayPitch = max(e, 28°) weight = InverseLerp(-2°, 6°, e) sunPitch = Lerp(authoredPitch, dayPitch, weight)

赤緯を独立した天文データから持たず、既存の季節別日長と整合するよう日の出時の高度0°から逆算します。

代表時刻の傾き

時刻太陽高度e適用するX回転
4:30-19.3°Nightの作り込み角度
8:0023.8°28.0°(下限)
10:3050.5°50.5°
12:0958.0°58.0°
14:0048.8°48.8°
16:4518.4°28.0°(下限)
18:140.0°Profile角度75%+28°を25%
21:00-33.1°Nightの作り込み角度

28°の下限

太陽が低い朝夕に光を水平近くまで倒すと影が極端に長くなるため、日中として扱う区間はX回転を28°以上に保ちます。10:30〜14:00付近は実際の太陽高度をそのまま使います。

地平線付近はProfileへ戻す

太陽高度が-2°以下ならプリセット角度、-2〜6°はプリセットから計算角へ滑らかに移行します。Dawn / Sunset / Nightの作り込んだ見え方を壊さず昼の連続変化だけを足します。

非カスタム時: Titleの現実時刻、および各ゲームモードのデフォルトでは solarHour < 0 のため、この実高度補正は行わずProfileの光源角度を使用します。 実高度による連続X回転は、ユーザーが「カスタム」を選んだときだけ有効です。

Ver1.4 クラゲコンパニオン救助

クラゲは普段クラリィの周囲を静かに漂い、クラリィが走っても確実に届かない落下だけを引き受けます。 助けると決めたら縦に伸びて消え、バブルの下へ現れて真上へ弾き、役目を終えた1匹は上方へ去ります。

登場と回数制限

時間スケジュール15, 45, 180, 600秒。タイトルでは15秒で1匹、45秒で2匹、3分で3匹、10分で4匹。
Normal距離20, 55, 120, 260m。"Bubble"タグの移動距離で順に増える。
救助上限1プレイ maxRescuesPerPlay = 2 回。無限救済を防ぐ。
補充待ち救助した1匹が去ってから rescueReturnDelay = 20 秒後に補充可能。

発動条件

残り時間低い迎撃点まで概ね 1.2秒以内になってから判定。
届かない判定反応時間0.22秒と走行可能距離を見積もり、さらに0.7m以上不足する場合だけ。
画面内rescueRequireOnScreen が既定ON。見えない場所で勝手に救わない。
迎撃高さ足元から0.85m。バブル半径0.635mを考慮した地面すれすれの高さ。

1回の救助フロー

Attached / Approaching
普段はそばで漂う
WarpOut
縦に伸びて消える
WarpIn / Rescuing
下から浮上
RescueBounce
真上へ立て直す
Leaving
上方へ退場

プレイを横取りしない

  • 落下地点を追い回すエスコート機能は実装を残しつつ既定OFF。
  • クラリィの反応時間・現在速度・最高速度から「まだ間に合う」場面は見送る。
  • 救助後は水平速度を0にして真上へ弾き、次の一球を自分で追える時間を作る。
  • RescueBounce() も通常の OnHeading を通るため、スコア・SE・振動・難易度更新は共通。

演出と成立保証

  • 泳いで横断せず、WarpOut → WarpIn の伸縮と粒子で救助地点へ移動。
  • 残り時間が短い場合はワープ時間を比率維持のまま短縮。
  • 一度引き受けた救助は、落下寸前なら迎撃点へ寄せて成立を優先。
  • 成立位置へUI Toolkitの吹き出しを約2秒表示し、何が起きたかを明示。
Bubble descent prediction: HeadingBall.TryPredictDescent(interceptHeight) compare remaining time with Clarie reaction + reachable distance If Clarie cannot reach: closestCompanion.BeginWarpRescue(appearBelowBubble, interceptPoint, speed, timeBudget) companion contacts Bubble → HeadingBall.RescueBounce() JellyfishCompanionManager.OnBubbleRescued(worldPosition) JellyfishRescueHud.Show("くらげがひろってくれた!") companion.Leave()

GameSceneのクラリィ髪モーション

TitleのUnityChan SpringBoneと同じ先端Verlet・長さ拘束・回転合成を、ゲーム本編向けの軽量ドライバ1個にまとめました。 走り出し、停止、旋回に毛先が少し遅れて追従し、従来の固定的な髪へ控えめなふわっと感を加えます。

自動セットアップ

  • RuntimeInitializeOnLoadMethodManager の二重保証で、PlayerController を持つクラリィへ自動追加。
  • Title / NameRegisterには追加せず、既存の SpringBone があるモデルも必ずスキップ。
  • TitleとGameで12本のチェーン定義を ClarieHairChains から共有。

軽量化と安全補正

  • 62セグメントを1コンポーネントでまとめ、固定60Hzで更新。
  • 身体コライダーとの最大約800距離判定/フレームを省略。
  • 移動93%・旋回35%を仮想先端へ継承し、残りを柔らかな遅れとして使う。
  • 最大偏角42°、0.6秒のソフトスタート、1.5m以上の瞬間移動で履歴リセット。
項目既定値役割
stiffnessForce / dragForce0.015 / 0.9Title互換の戻る力と減衰。
dynamicRatio / motionScale0.7 / 0.81計算結果の最終反映率。ゲームでは揺れ幅を控えめにする。
strandVariation0.0812毛束へ微差をつけ、左右2塊への同期を崩す。
outwardForce0.00022毛先を頭の外へ保ち、身体側への巻き付きを軽減。
inwardBendReduction0.3顔・首・胴体側へ入る曲がりだけを30%戻す。

GameScene版は衣装コライダーを持たないため、全衣装での貫通は目視確認対象です。ヘディング衝撃用の AddImpulse() は拡張点として用意されていますが、Ver1.4時点では未接続です。

搭載機能一覧

ヘディングゲーム

Bubble衝突、スコア、距離、命中率、難易度ランプ、コンボガード、壁反射、破裂。

モード選択

Normal / Time Attack / Center Hit をTitleのカードから選択。

Clock Mode

時計、ポモドーロ、タイマー。作業用・勉強用の眺める体験。

Jellyfish Rescue

時間/距離で増えるクラゲが、確実に届かない落下を1プレイ最大2回まで救助。

Settings

BGM、SE、振動、海の光モードと4:30〜24:00の時刻スライダー。UI Toolkitで構築。

Pause

再開、タイトル復帰、カスタム時刻変更。timeScale=0でも海へ即時反映。

Ranking

PlayFabでランキング取得。未ログイン時はローカル表示。

Store / Ads

リワード広告、バナー、広告削除IAP、購入復元。

出現する魚の種類 / 頻度 / 特徴

FishParticleManager のデフォルト定義は13種です。画像素材が確認できる魚は12種で、 Oyabiccha は定義に存在しますが画像ファイルは今回未確認です。 ほぼ全魚種が avoidCenterArea = true で、プレイヤーとBubbleの通り道を避けます。

ソラスズメダイ

ソラスズメダイ

重み1.5、3〜7匹。青い高頻度差し色。

キンギョハナダイ

キンギョハナダイ

重み1.5、3〜7匹。暖色アクセント。

キュウセン

キュウセン

重み0.7、0〜2匹。低めの高さ。

チョウチョウウオ

チョウチョウウオ

重み1.2、1〜4匹。Hovering。

ハナゴイ

ハナゴイ

重み0.85、2〜4匹。紫ピンク。

キビナゴ

キビナゴ

重み0.8、5〜12匹。速い銀色の流れ。

マアジ

マアジ

重み0.65、2〜5匹。中層回遊。

イサキ

イサキ

重み0.55、1〜3匹。落ち着いた中型魚。

メバル

メバル

重み0.5、0〜2匹。海底近くでゆっくり。

マダイ

マダイ

重み0.95、1〜2匹。愛媛らしさ。

カワハギ

カワハギ

重み0.5、0〜2匹。StopAndGo。

ブリ

ブリ

重み0.25、0〜1匹。低頻度の見せ場。

魚種同時表示出現重み群れ動き特徴
Sorasuzumedai3〜71.5SmallGroup 2〜5GentleWave青い差し色。見せ場の多い高頻度枠。
Kingyohanadai3〜71.5SmallGroup 2〜5GentleWaveオレンジ系。ソラスズメダイ相当の頻度。
Kyusen0〜20.7NoneGentleWave砂地・岩場。低めに出る。
Chouchouuo1〜41.2NoneHoveringふわっと漂う観賞魚枠。
Hanagoi2〜40.85SmallGroup 2〜4GentleWave紫ピンクで色幅を追加。
Oyabiccha2〜40.85SmallGroup 2〜3GentleWave定義あり。画像ファイルは未確認。
Kibinago5〜120.8LooseStream 4〜8FastStraight銀色の小魚の流れ。
Maaji2〜50.65LooseStream 2〜4FastStraight自然なスピード感。
Isaki1〜30.55SmallGroup 2Straight落ち着いた中型魚。
Mebaru0〜20.5NoneHovering岩場・海底近く。
Madai1〜20.95NoneStraight愛媛らしさの主役魚。奥でも小さくしすぎない。
Kawahagi0〜20.5NoneStopAndGo止まる/動く変化。
Buri0〜10.25RareSmallGroup 2〜3FastStraight低頻度の大型回遊魚。実効重みは背景補正でさらに控えめ。

貝がら通貨 / 衣装コレクション

魚図鑑と同じ海のコレクションとして、10種の貝がらを用意しています。貝がらはクラリィの衣装と交換するゲーム内通貨です。 Normal Endlessではフィールドで拾い、Time AttackとCenter Hitではプレイへの集中を優先してリザルト報酬として獲得します。

モードフィールド貝がら獲得条件報酬リザルト表示
Normal Endless表示(同時5個)Playing中に接近して拾得貝がらごとの value(現行は1)貝がらアイコン + 「拾った貝がら +N」
Time Attack非表示60秒を完走3 + floor(ヒット数 / 10)、最大8貝がらアイコン + 「獲得した貝がら +N」
Center Hit非表示15回のヘディングをクリア6 + floor(最終スコア / 100,000)、最大10貝がらアイコン + 「クリア報酬 +N」

Normalの貝がらはプレイ開始時、または自分で拾った貝がらの20〜35秒後の再出現時だけに現れます。 未取得の貝がらをプレイヤー移動に合わせて再配置しないため、理由のない突然出現を防ぎます。

貝がらの種類一覧

SeashellDecorSetup.shells で一覧管理します。各定義は名称、テクスチャ、価値、出現重み、サイズ補正、色補正を持ち、 現行の10種はすべて価値1・重み1です。

青貝

青貝

価値1 / 重み1

アサリ

アサリ

価値1 / 重み1

アワビ

アワビ

価値1 / 重み1

ベニガイ

ベニガイ

価値1 / 重み1

ヒオウギガイ橙

ヒオウギガイ(橙)

価値1 / 重み1

ヒオウギガイ紫

ヒオウギガイ(紫)

価値1 / 重み1

イトカケガイ

イトカケガイ

価値1 / 重み1

サクラガイ

サクラガイ

価値1 / 重み1

サザエ

サザエ

価値1 / 重み1

ツメタガイ

ツメタガイ

価値1 / 重み1

貝がらで手に入る衣装

既定の「いつものワンピース」に加え、集めた貝がらで7着を交換できます。交換後はクローゼットから試着・装備でき、 タイトルとゲーム中のクラリィへ即時反映されます。

チェックスタイル

チェックスタイル

20 貝がら

ボーイッシュ

ボーイッシュ

50 貝がら

パジャマ

パジャマ

70 貝がら

夏ワンピ

夏ワンピ

120 貝がら

クラシックドレス

クラシックドレス

200 貝がら

チャイナドレス

チャイナドレス

300 貝がら

着物

着物

400 貝がら

有料課金で手に入る衣装 / 広告削除

iOSのStore「ストア課金」タブでは、貝がら交換とは別に衣装と広告削除を購入できます。 価格はストアの商品情報を優先して表示し、下記はカタログに設定された表示用の目安です。

学園制服

学園制服

目安 $1.00

アラビアン

アラビアン

目安 $2.00

魔法使いの服

魔法使いの服

目安 $2.00

プリンセス

プリンセス

目安 $2.00

商品商品識別子(公開用)内容価格 / 復元
広告削除••••••••バナー・インタースティシャル等の広告を削除。ストア表示価格 / 非消耗型・購入復元対応
学園制服、アラビアン、魔法使いの服、プリンセス••••••••購入後はクローゼットで試着・装備。ストア表示価格 / 非消耗型・購入復元対応

有料衣装のストア表示はiOS向けの仕様です。Androidでは同じ衣装を貝がら交換として扱い、iOS有料衣装の交換数は基準価格の一律2倍です(学園制服 1,000、アラビアン/魔法使いの服/プリンセス 各2,000貝がら)。

技術仕様

エンジン
Unity 6000.5.6f1、Universal Render Pipeline。
入力
Unity Input System。モバイル向けタッチ/仮想入力、プレイヤー移動。
UI
UI Toolkit(UIDocument、UXML、USS)。UGUI Canvasは基本使用しない。
描画
Bubble Shader、URP透明描画、UnderwaterDecorSetup、Renderer Feature、Particle System。
水中演出
カースティクス、光柱、浮遊粒子、スクリーン屈折、深度フォグ、魚群、サメ、救助クラゲ。
キャラクター
TitleはUnityChan SpringBone、GameSceneは ClarieHairMotion の軽量62セグメント髪モーション。
保存
PlayerPrefs。音量/BGM/振動、海の光モード・カスタム時刻、広告削除状態、ローカル統計など。
オンライン
PlayFabログイン/ランキング/Statistic送信。未ログイン時はローカルフォールバック。
収益化
AdMobリワード/バナー、IAP広告削除、購入復元。
ネイティブ
iOS/Android触覚フィードバック、Store Review、Native Share、iOS表示名ローカライズ。

スクリプト構成

GameSceneLogicManager.csHeadingBall.csPlayerController.csPauseController.csGameMode.cs。ゲーム進行、Bubble物理、救助通知、入力、ポーズ、モード/海時間シーン区分。
Settings / UISettingsController.csGameSettingsStore.csJellyfishRescueHud.cs、UXML/USS。音量・振動・海の光スライダー・救助吹き出しを保存/表示。
Ocean TimeOceanTimeOfDayCycle.csOceanCycleBootstrap.csOceanTimeOfDayProfile.csOceanTimeOfDayProfileSet.cs、Editor。24hサイクル、カスタム時刻、太陽高度、soft-only適用。
JellyfishJellyfishCompanion.csJellyfishCompanionManager.csJellyfishRescueDirector.csJellyfishWarpEffect.cs。生成、追従、落下予測、ワープ救助、退場・補充。
Clarie HairClarieHairMotion.csClarieHairChains.csClarieHairSpringBoneSetup.cs。Game用軽量髪物理、Titleとのチェーン定義共有、Editorセットアップ。
Bubble EffectsBubbleBurst.csBubbleEffect.csBubbleRemnant.csBlobShadow.cs。破裂、ぷにょ変形、残骸、影。
Sea LifeFishParticleManager.csSeaLifeDecorSetup.csSeaLifeStreamingDecor.csSharkSpawner.csSharkSwimmer.cs。魚、サメ、装飾、品質プリセット。
Network / StoreLeaderboardClient.cs、AdMob、IAP、StoreReview、NativeShare。ランキング、広告、購入、レビュー、共有。
EditorOceanTimeOfDayCycleEditor.csOceanTimeOfDayControllerEditor.csJellyfishCompanionSetup.cs、iOS PostProcess群。調整・生成・ビルド後処理。

ログ一覧

ここではシステムのデバッグ出力ではなく、ユーザー操作・利用状況として記録される Unity Analytics のイベントと、 PlayFabへ送信する Statistic / ランキング値をまとめます。Debug.Log は実装診断用のため、この一覧の中心からは外します。

Unity Analytics: button_tapped

イベントパラメータ画面・ボタンの記録例
button_tappedscreenbuttonすべてのボタン操作を共通形式で送信。UGS初期化前は送信しない。
Titlescreen=TitleStartStart_NormalStart_TimeAttackStart_CenterHitClockModeSettingsRankingStoreCloset
Gamescreen=GameStartPauseResumeRetryStartOverTitleShareReviveAdLight_Custom など。
Settings / Pausescreen=Settings または GameBgmSelectVibrationSelectContactLight_Real / Light_Custom。スライダーの15分刻み変更自体はボタンイベントに含めない。
ClockModescreen=ClockModeTab_ClockPlay_PomodoroPause_TimerReset_TimerCloseExit
Closet / Store / Ranking画面名 + 商品/操作名Equip_outfit_*Exchange_outfit_*Store_outfit_*Tab_InGameTab_RealMoneyRestoreSelectTypeSelectChoice

iOSではATTの許可状態を確認してからデータ収集を開始します。ATT拒否時はAnalytics収集を開始せず、初期化完了前のボタン操作もキューには入れません。

PlayFab: Statistic / ランキング

Statistic名記録タイミング集計
BubblePop_HighScoreNormal Endlessの新しいベストスコア確定時Maxヘディング回数
BubblePop_DistanceNormal Endlessの距離ベスト更新時Max距離(m × 10)
BubblePop_TotalScoreゲームオーバー時。セッション未送信分のみSum全モード累計ヘディング回数
BubblePop_TotalDistanceゲームオーバー時。セッション未送信分のみSum全モード累計距離(m × 10)
BubblePop_60secDistanceTime Attackの距離ベスト更新時Max60秒間の距離(m × 10)
BubblePop_CenterHitScoreCenter Hitのスコアベスト更新時MaxCenter Hitスコア
BubblePop_CenterHitAvePercentCenter Hitの平均命中率ベスト更新時Max平均命中率(0〜10000。87.65% → 8765)

PlayFab送信の扱い

  • ゲームオーバー時にモード別のStatisticを更新。
  • 複数Statisticは1回の UpdatePlayerStatistics にまとめて送信。
  • 未ログイン時は送信待ちキューへ保持し、ログイン後にまとめて送信。
  • ランキング画面は GetLeaderboardAroundPlayer で自分周辺を取得。

フォールバック

PlayFab未ログイン、開発者モード、SDK未定義時は、同じStatistic名に対応する PlayerPrefs のローカルベストを表示します。オンライン値とローカル値を混同しないよう、ランキング画面ではローカルフォールバックとして扱います。

Ver1.4 リリース確認観点

海の光

  • Titleで現実時刻を選ぶと、端末時刻と季節に応じた見た目になる。
  • カスタム時刻を4:30 / 10:30 / 16:45 / 17:30 / 21:00 / 24:00で動かし、海と太陽が連続変化する。
  • ゲーム中ポーズでもスライダーが timeScale=0 のまま即時反映される。
  • Normal/TimeAttack/CenterHitの保存スロットが混ざらない。
  • 1.3の旧5タブ設定が対応するカスタム時刻へ1回だけ移行される。

クラゲ救助

  • クラリィが届く落下を横取りせず、確実に届かない画面内の落下だけを救う。
  • ワープの伸縮・粒子・浮上・真上へのバウンス・上方退場が一連で見える。
  • 救助が通常のスコア/SE/触覚/難易度更新を通り、吹き出しが約2秒表示される。
  • 1プレイ2回で止まり、退場後20秒は補充されない。
  • 落下寸前でも、一度引き受けた救助が途中キャンセルされない。

クラリィの髪

  • Normal / TimeAttack / CenterHitで自動追加され、TitleのSpringBoneと二重起動しない。
  • 走り出し・停止・左右旋回で、毛束が控えめに遅れて戻る。
  • 120fpsでも物理更新は固定60Hzで、フレームレートによる揺れ方の差が大きくならない。
  • 復活などの位置復元で履歴がリセットされ、髪が大きく飛ばない。
  • 全12衣装で胴体・顔への目立つ貫通がないか目視確認する。

Appendix / 関連解説書

同じ Docs ディレクトリにある実装解説を、仕様書の補足として参照できます。