🚀 実装例:フォーム
機能を組み合わせることで、実機テスト中にスクリーンショット付きのバグレポートを送信するような、高度なデバッグ機能を実装できます。
🛠️ 実装のポイント
このサンプルでは、以下のテクニックを組み合わせています:
- コンテキスト駆動 (
LogiViewContext): 入力値の保持とクリア - プレビュー機能 (
LogiPreview): 撮影したスクリーンショットの即時表示 - 非同期処理: 通信中の二重送信防止とトースト通知
- ライフサイクル管理:
IDisposableによるテクスチャメモリの適切な解放
📄 フィードバックフォームのサンプルコード (Simplified)
public sealed class FeedbackForm : ILogiCommandGroup, IDisposable
{
public string GroupName => "Feedback";
public int Priority => 9999;
public enum ReportType { Bug, Feedback }
ReportType _reportType;
string _userMessage;
Sprite _captureSprite;
bool _isSending;
// --- UI Definition ---
[LogiInput("Report Type <color=red>*</color>")]
ReportType ReportTypeInput(ReportType type, LogiViewContext context)
{
if (context == LogiViewContext.ValueChanged) _reportType = type;
return _reportType;
}
[LogiTextArea("Message <color=red>*</color>")]
string MessageInput(string msg, LogiViewContext context)
{
if (context == LogiViewContext.ValueChanged) _userMessage = msg;
return _userMessage;
}
[LogiButton(title:"Screenshot", buttonName:"Capture")]
void StartCapture()
{
// スクリーンショット撮影ロジック (Coroutine等) を実行し
// _captureSprite に結果を格納する
}
[LogiPreview("Preview")]
Sprite ScreenshotPreview() => _captureSprite;
[LogiButton("Send Feedback", "Send")]
async void Send()
{
// 1. 二重送信防止とバリデーション
if (_isSending) return;
if (string.IsNullOrEmpty(_userMessage))
{
Logi.OpenToast("Message is required.", LogifyToastType.Error);
return;
}
try
{
_isSending = true;
Logi.OpenToast("Submitting feedback...", LogifyToastType.Information);
// 2. 非同期送信処理の実行
// スクリーンショット(byte[])やログ(LogEntries)をコンテキストに含めて送信
var result = await _dispatcher.SendFeedbackAsync(new FeedbackContext(
message: _userMessage,
isBug: _reportType == ReportType.Bug,
screenshot: _captureSprite?.texture?.EncodeToJPG(75)
));
// 3. 結果に応じたフィードバック
if (result.IsSuccess)
{
Logi.OpenToast("Submission completed successfully!", LogifyToastType.Information);
ClearForm(); // 成功時のみフォームをリセット
}
else
{
// サーバー側や通信エラーによる失敗
Logi.OpenToast($"Submission failed: {result.ErrorMessage}", LogifyToastType.Error);
Debug.LogError($"[Logify] Feedback failed: {result.ErrorMessage}");
}
}
catch (Exception e)
{
// 予期せぬ例外(ネットワーク遮断など)の捕捉
Logi.OpenToast("An unexpected error occurred.", LogifyToastType.Error);
Debug.LogException(e);
}
finally
{
_isSending = false;
}
}
void ClearForm()
{
_userMessage = string.Empty;
ReleaseSprite(); // テクスチャの破棄
}
public void Dispose() => ReleaseSprite();
void ReleaseSprite() { /* Object.Destroy 等の処理 */ }
}