상품 설명
■ 「出して、待って、帰ってくる」は、書いてみると意外と厄介
遠征・派遣・採集・探索。キャラクターを預けて実時間を待ち、帰ってきたら報酬を受け取る——遊ぶ側には単純に見えるこの仕組みは、作り始めると次々に引っかかります。
アプリを閉じている間の時間は、どう扱う?
「3 人必要なのに 2 人」を、どう画面に出す?
大成功の判定は、出発時? それとも帰還時?
同時に出せる枠、時短、自動再出発……どこに持たせる?
セーブに何を残せば、次の起動で正しく続く?
このアセットは、その全部——**オフライン経過・条件判定・成果の段階・報酬の抽選・枠と時短・セーブ**——を丸ごと引き受けます。
■ できること
●アプリを閉じていても進む
終了時刻を実世界の時刻(UTC)で持ちます。閉じていた時間は「引き算の結果」として自動的に反映されるので、**オフライン専用の処理を 1 行も書きません。**
●Update もコルーチンも回しません
進捗は「今の時刻」から毎回計算します。100 件走っていても負荷は同じです。タイマーを持ったオブジェクトを並べる必要もありません。
●足りない条件は「データ」で返る
「3 人必要なのに 2 人」「運搬役があと 1 人」が、**要求値と現在値の組**で返ります。文章ではないので、表示の文面も多言語化も購入者の自由です。条件は 5 種類——人数・上限人数・合計レベル・ひとりあたりの下限・**タグ(艦種/職業/属性)の人数**。
●成果の段階(大成功)
条件を満たすほど良い段階になり、報酬と経験値に倍率が掛かります。段階はいくつでも作れます。**段階は出発の瞬間に確定します**——帰還を待つ間にレベルを上げても結果は変わらないので、「出す前に編成を考える」というゲーム性が守られます。
●報酬の配り方は 3 通り
個別抽選(それぞれ確率つき)・**重み付きで 1 つだけ**・全部確定。抽選まではアセットが行い、実際にインベントリへ入れるのは購入者のコードです(所持上限もスタックも通知演出も、購入者のルールのまま)。
●メンバーの寄与
「輸送装備を積むほど多く持ち帰る」が、キャラクター側の値 1 つで書けます。パーティー全員ぶんを合計して報酬倍率に乗ります。
●放置ゲームの定番、ひと通り
・枠を増やす(施設拡張・課金)
・途中で呼び戻す(報酬なしでメンバーだけ返る)
・時短(アイテム・広告視聴・課金)
・精算したら自動で出発し直す
・溜まった帰還をまとめて精算
・「留守中の成果」画面のサンプル
●時計を差し替えられます
端末の時計・サーバー時刻・テスト用の固定時刻。差し替えは 1 行です。おかげで**「8 時間後」を実際に待たずにテストできます**し、端末の時計を進める不正が気になる場合はサーバー時刻を返す実装に変えるだけです。
●セーブは文字列 1 本
JsonUtility で 1 行。PlayerPrefs・JSON ファイル・既存のセーブデータのどれにでも差し込めます。保存されるのは「どの遠征に・誰が・いつまで」と確定済みの段階だけで、軽量かつ人間が読める形です。
■ 導入は 3 ステップ
【1】キャラクターをつなぐ
public class MyCharacter : MonoBehaviour, IExpeditionMember
{
public string MemberId => id; // セーブに残る識別子
public int Level => level;
public IReadOnlyList<string> Tags => tags; // "駆逐艦" "運搬" "偵察" など何でも
public bool IsAvailable => !isInjured; // 出撃中・入渠中なら false
public float RewardBonus => cargoBonus; // 0.2 なら取得量 +20%
}
【2】遠征を作る
Project → Create → UnitForge → Expeditions → Expedition から作り、所要時間・条件・報酬・成果段階をインスペクターで設定します(コードだけで組むこともできます)。
【3】送り出して、帰りを受け取る
var service = new ExpeditionService(new PlayerPrefsExpeditionStore(), myRewardHandler);
service.RegisterBoard(board);
service.Start(patrol, party); // 出発
foreach (var r in service.PollCompletions()) // 起動時に 1 回呼ぶだけ
ShowReturnedBadge(r);
var result = service.Claim(record); // 精算(報酬と経験値はここで配られる)
これだけです。毎フレームの更新も、アプリ復帰時の特別処理も要りません。
■ 今あるゲームに、そのまま入ります
**キャラクターの形を知りません。** インターフェースを 1 つ実装するだけで、既存のキャラクタークラスがそのまま「遠征に出せる存在」になります。書き換えたくない場合は薄いアダプタで十分です(サンプル同梱)。
**UI を持ちません。** 遠征一覧の見た目も、タイマーの書式も、帰還通知の出し方もゲームの個性です。本アセットは残り時間・進み具合・条件の判定結果を返すところまでを担当し、描画例はデモとサンプルに丸ごと入っています。
**通信もしません。** 単体でオフラインゲームにそのまま使えます。サーバー時刻を使いたい場合の差し込み口だけ用意してあります。
■ まず動かしてみてください(実演シーン同梱)
メニューを 1 クリックすればシーンが構築され、再生するだけで **14 場面が字幕付きで自動再生**されます(操作不要・無限ループ、1 周およそ 2 分 50 秒)。
出発/条件の判定結果/タグ条件/合計レベル/成果の段階/報酬の抽選/メンバーの寄与/経験値/枠の拡張/早期帰還/時短/自動再出発/**閉じている間の時間経過**/セーブと復元——を順に見られます。
実演では時計を 420 倍速に差し替えているため、30 分の遠征が約 4 秒で帰ってきます。これは特別なデバッグ機能ではなく、**時計を差し替えられるという設計そのものの実演**です。
デモには画像・音声・フォントを 1 つも含みません(図形はコード生成、文字は OS のフォント参照)。
■ 収録内容
・Runtime(本体)… 遠征定義と一覧・5 種類の条件と判定レポート・成果の段階・報酬テーブル 3 方式・進行管理(出発/進捗/帰還/精算/枠/時短/自動再出発)・保存先 3 種・残り時間の表記
・Samples … 最小構成のコード例 4 本(メンバー実装/報酬の受け取り/遠征一覧 UI/留守中の成果画面)
・Demo … 実演シーン一式(メニューから自動生成。削除しても本体に影響しません)
・動作確認メニュー … 151 項目の自己診断をその場で実行できます(時計を差し替えるので待ち時間ゼロ)
・README(日本語/英語)
・フルソース付属。改変して組み込めます
■ よくある質問
Q. オンライン専用ですか?
A. いいえ。通信を一切行わないため、オフラインゲームにもそのまま使えます。
Q. 端末の時計を進める不正は防げますか?
A. そのままでは防げません。対策が必要な場合、時計のインターフェースにサーバー時刻を返す実装を差し込んでください(差し替えは 1 行です)。
Q. 帰還したときにスマホの通知を出せますか?
A. 通知そのものは各プラットフォームの機能なので含まれません。「いつ帰るか」の時刻は取り出せるので、通知の予約に渡せます。
Q. 報酬はインベントリに入りますか?
A. 何をいくつ渡すかまでを決め、実際に加算するのは購入者のコードです(メソッド 1 つ)。所持上限やスタックの扱いを購入者のルールのままにするための設計です。
Q. 遠征中に戦闘やイベントを起こせますか?
A. 本アセットの範囲外です。帰還の通知を受け取ってから、ご自身の処理を挟んでください。
Q. UI は付いていますか?
A. 付いていません。残り時間・進み具合・条件の判定結果を返すところまでです(デモとサンプルに実装例が入っています)。
■ ライセンス
購入者ご自身の商用・非商用プロジェクトでご利用いただけます。アセット単体での再配布・販売はご遠慮ください。
모든 리뷰
더보기리뷰 등록
리뷰를 작성하려면 로그인이 필요합니다.
로그인하고 리뷰 쓰기