すべてをまとめる - チャレンジ - (Unity モジュール)
Last updated on February 4, 2026
注釈:本資料はAI技術を用いて翻訳されています。
チャレンジを表示するための UI の接続
-
ChallengeEntry_Starterクラスを開き、以前作成したラッパーを参照するために以下の変数を宣言します。private ChallengeEssentialsWrapper_Starter challengeWrapper; -
次に、事前定義された
OnEnable()関数に以下のコードを追加して、メニューエントリがインスタンス化されたときにラッパー参照を割り当てます。private void OnEnable()
{
challengeWrapper ??= TutorialModuleManager.Instance.GetModuleClass<ChallengeEssentialsWrapper_Starter>();
} -
チャレンジゴール情報を表示してメニューエントリをセットアップするために、以下の関数を作成します。
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);
} -
次に、作成したラッパーから関数を呼び出してチャレンジゴールの報酬を受け取るために、以下の関数を作成します。
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");
}
});
} -
ChallengeMenu_Starterクラスを開き、以前作成したラッパーを参照するために以下の変数を宣言します。private ChallengeEssentialsWrapper_Starter challengeWrapper; -
次に、事前定義された
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();
}
} -
次に、
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);
});
}
リソース
-
このチュートリアルセクションで使用されているファイルは、Unity Byte Wars GitHub リポジトリで入手できます。