メインコンテンツまでスキップ

すべてをまとめる - チャレンジ - (Unity モジュール)

Last updated on February 4, 2026

注釈:本資料はAI技術を用いて翻訳されています。

チャレンジを表示するための UI の接続

  1. ChallengeEntry_Starter クラスを開き、以前作成したラッパーを参照するために以下の変数を宣言します。

    private ChallengeEssentialsWrapper_Starter challengeWrapper;
  2. 次に、事前定義された OnEnable() 関数に以下のコードを追加して、メニューエントリがインスタンス化されたときにラッパー参照を割り当てます。

    private void OnEnable()
    {
    challengeWrapper ??= TutorialModuleManager.Instance.GetModuleClass<ChallengeEssentialsWrapper_Starter>();
    }
  3. チャレンジゴール情報を表示してメニューエントリをセットアップするために、以下の関数を作成します。

    public void Setup(ChallengeGoalData goal)
    {
    ChallengeGoalMeta meta = goal.Meta;
    GoalProgressionInfo progress = goal.Progress;
    bool isRewardClaimed = (progress.ToClaimRewards?.Length ?? 0) <= 0;
    bool isNotStarted = progress.Status.ToLower() == ChallengeGoalProgressStatus.Not_Started.ToString().ToLower();
    bool isCompleted = progress.Status.ToLower() == ChallengeGoalProgressStatus.Completed.ToString().ToLower();

    // Display basic information.
    goalText.text = meta.Name;
    remainingTimeText.text = goal.EndTimeDuration;
    statusCheckBox.isOn = isCompleted;

    // Display rewards.
    rewardPanel.DestroyAllChildren();
    foreach (ChallengeGoalRewardData reward in goal.Rewards)
    {
    Instantiate(rewardEntryPrefab, rewardPanel).GetComponent<ChallengeGoalRewardEntry>().Setup(reward);
    }

    // Set up claim reward button.
    claimButton.text.text = isRewardClaimed ? ClaimedChallengeRewardLabel : ClaimableChallengeRewardLabel;
    claimButton.button.enabled = !isRewardClaimed;
    claimButton.button.onClick.RemoveAllListeners();
    claimButton.button.onClick.AddListener(() => OnClaimButtonClicked(goal));

    /* Select the progress with the highest progress value, as Byte Wars displays only one.
    * If there is no player progress, set the default goal progress value from the requirement group.
    * Otherwise, use the actual player progress value. */
    int currentProgress = 0, targetProgress = 0;
    if (isNotStarted)
    {
    ChallengePredicate predicate = progress.Goal.RequirementGroups
    .SelectMany(x => x.Predicates)
    .OrderByDescending(x => x.TargetValue)
    .FirstOrDefault();
    targetProgress = (int?)(predicate?.TargetValue) ?? 0;
    }
    else
    {
    ChallengeRequirementProgressionResponse requirement = progress.RequirementProgressions
    .OrderByDescending(x => x.CurrentValue)
    .FirstOrDefault();
    currentProgress = (int?)(requirement?.CurrentValue) ?? 0;
    targetProgress = (int?)(requirement?.TargetValue) ?? 0;
    }
    progressText.text = $"{currentProgress}/{targetProgress}";

    // Display progress if not completed; otherwise, show the claim reward button.
    progressText.gameObject.SetActive(!isCompleted);
    claimButton.gameObject.SetActive(isCompleted);
    }
  4. 次に、作成したラッパーから関数を呼び出してチャレンジゴールの報酬を受け取るために、以下の関数を作成します。

    private void OnClaimButtonClicked(ChallengeGoalData goal)
    {
    // Abort if there are no rewards to claim.
    if (goal.Progress.ToClaimRewards == null)
    {
    MenuManager.Instance.ShowInfo(EmptyClaimableChallengeRewardMessage, "Error");
    return;
    }

    // Collect claimable reward IDs.
    List<string> claimableRewardIDs = goal.Progress.ToClaimRewards.Select(x => x.Id).ToList();

    // Claim rewards.
    claimButton.button.enabled = false;
    claimButton.text.text = ClaimingChallengeRewardLabel;
    challengeWrapper.ClaimChallengeGoalRewards(claimableRewardIDs, (Result result) =>
    {
    claimButton.button.enabled = result.IsError;
    claimButton.text.text = result.IsError ? ClaimableChallengeRewardLabel : ClaimedChallengeRewardLabel;

    if (result.IsError)
    {
    MenuManager.Instance.ShowInfo(result.Error.Message, "Error");
    }
    });
    }
  5. ChallengeMenu_Starter クラスを開き、以前作成したラッパーを参照するために以下の変数を宣言します。

    private ChallengeEssentialsWrapper_Starter challengeWrapper;
  6. 次に、事前定義された OnEnable() 関数のコードを以下のコードに置き換えます。これで、この関数はラッパー参照を割り当て、それを使用してチャレンジゴールリストを取得して表示します。

    private void OnEnable()
    {
    // Set menu title based on the selected challenge period.
    challengeTitleText.text =
    ChallengePeriodMenu.SelectedPeriod == ChallengeRotation.None ?
    AllTimeChallengeTitleLabel :
    string.Format(PeriodicChallengeTitleLabel, ChallengePeriodMenu.SelectedPeriod.ToString());

    // Get and display the challenge goal list.
    challengeWrapper ??= TutorialModuleManager.Instance.GetModuleClass<ChallengeEssentialsWrapper_Starter>();
    if (challengeWrapper)
    {
    GetChallengeGoalList();
    }
    }
  7. 次に、GetChallengeGoalList() 関数を以下のコードに置き換えます。この実装では、作成したラッパーを使用して期間別にチャレンジを取得し、そのチャレンジコードを使用してゴールのリストを取得して表示します。

    private void GetChallengeGoalList()
    {
    widgetSwitcher.SetWidgetState(AccelByteWarsWidgetSwitcher.WidgetState.Loading);

    // Get challenge by period.
    challengeWrapper.GetChallengeByPeriod(
    ChallengePeriodMenu.SelectedPeriod,
    (Result<ChallengeResponseInfo> infoResult) =>
    {
    if (infoResult.IsError)
    {
    widgetSwitcher.ErrorMessage = infoResult.Error.Message;
    widgetSwitcher.SetWidgetState(AccelByteWarsWidgetSwitcher.WidgetState.Error);
    return;
    }

    // Get and display the challenge goal list.
    int rotationIndex = 0; // Zero indicates the current and latest active challenge rotation.
    challengeWrapper.GetChallengeGoalList(
    infoResult.Value,
    (Result<List<ChallengeGoalData>> goalsResult) =>
    {
    if (goalsResult.IsError)
    {
    widgetSwitcher.ErrorMessage = goalsResult.Error.Message;
    widgetSwitcher.SetWidgetState(AccelByteWarsWidgetSwitcher.WidgetState.Error);
    return;
    }

    if (goalsResult.Value.Count <= 0)
    {
    widgetSwitcher.SetWidgetState(AccelByteWarsWidgetSwitcher.WidgetState.Empty);
    return;
    }

    // Display challenge goal entries.
    challengeListPanel.DestroyAllChildren();
    foreach (ChallengeGoalData goal in goalsResult.Value)
    {
    Instantiate(challengeEntryPrefab, challengeListPanel).Setup(goal);
    }
    widgetSwitcher.SetWidgetState(AccelByteWarsWidgetSwitcher.WidgetState.Not_Empty);
    },
    rotationIndex);
    });
    }

リソース