1 第一小节流程梳理
进入游戏-->
弹出几个文本框介绍背景-->
接取任务收集资源->
打怪获得源能结晶-->
场景里获得一些金属碎片-->
用源能和金属修复合成台-->
完成第一个任务-->
接第二个任务,打带精英怪的一波(小怪1换颜色,放大,调数值)-->
获得进阶源能的材料-->
材料够了可升级源能结晶-->
(可选)合成装备-->
任务三找到解密点并击败Boss-->
回地图解密-->
遇到Boss-->打过获得高级源能材料,第一小节流程结束,没打过回去补做装备
2 分析任务具体需求
1.做用户界面,文本框模板,对话完调用接任务函数
2.当前追踪的任务提示UI
3.修复合成台扣材料,然后解锁,能够自由开关面板,这时更新存储文件,标记任务1完成,并标记怪物的生成模式为可生成精英怪,解锁地图内的新区域以开启解密。
4.接任务二,目标:制作某某装备,但是某个关键材料精英怪掉落,合成装备完成任务,不计入关键任务
5.未完待续
3 具体实现
3.1 创建TextBox用户界面并写好点击逻辑
OnClickTalkBox具体逻辑是最后一段话看完就接任务1,没有就继续对话:
3.2 创建一个Save类记录游戏流程
UCLASS()
class ARPG_CPLUS_API UGameFlowControlSaveData : public USaveGame
{
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere,BlueprintReadWrite,Category="GameFlowControl")
TArray<bool> GameFlowKeyPoints{false};
UFUNCTION(BlueprintCallable)
TArray<bool> GetGameFlowKeyPoints();
UFUNCTION(BlueprintCallable)
void SetGameFlowKeyPoints(TArray<bool> InGameFlowKeyPoints);
};
在GameInstance中管理:
//Manage GameFlow
bool UMyGameInstance::SaveGameFlow()const
{
UGameFlowControlSaveData* Save= Cast<UGameFlowControlSaveData>(UGameplayStatics::CreateSaveGameObject(UGameFlowControlSaveData::StaticClass()));
if (Save)
{
Save->SetGameFlowKeyPoints(GameFlowKeyPointsInGameInstance);
if (UGameplayStatics::SaveGameToSlot(Save, FString("GameFlowControlSaveData"), 0))
{
UE_LOG(LogTemp, Warning, TEXT("UGameFlowControlSaveData::-->Save Success"));
return true;
}
UE_LOG(LogTemp, Warning, TEXT("UGameFlowControlSaveData::-->Save Failed"));
}
return false;
}
bool UMyGameInstance::LoadGameFlow()
{
bool bIsExistSaveData=UGameplayStatics::DoesSaveGameExist(FString("GameFlowControlSaveData"),0);
if(bIsExistSaveData)
{
UGameFlowControlSaveData* Save=Cast<UGameFlowControlSaveData>(UGameplayStatics::LoadGameFromSlot(FString("GameFlowControlSaveData"), 0));
GameFlowKeyPointsInGameInstance=Save->GetGameFlowKeyPoints();
UE_LOG(LogTemp,Warning,TEXT("UGameFlowControlSaveData-->Loaded Success"));
return true;
}
SaveGameFlow();
UE_LOG(LogTemp,Warning,TEXT("UGameFlowControlSaveData-->Loaded Fail"));
return false;
}
3.3 若KeyPoint1为false并且为首次进入游戏,则执行对话接任务
在进入关卡时判断,若为第一次就把输入模式设为UIOnly
if(MyGameInstance->bIsFirstInGameInGameInstance)
{
UE_LOG(LogTemp,Warning,TEXT("MyGameInstance->bIsFirstInGameInGameInstance is true"));
MyGameInstance->bIsFirstInGameInGameInstance=false;
if(MyGameInstance->GameFlowKeyPointsInGameInstance.Num()==0)
{
MyGameInstance->GameFlowKeyPointsInGameInstance.Add(false);
MyGameInstance->SaveGameFlow();
}
MyGameInstance->GameFlowKeyPointsInGameInstance[0]=false;//保证第一次进入时都是false
AMyPlayer* MyPlayerRef=Cast<AMyPlayer>(GetPawn());
if(MyPlayerRef)
{
MyPlayerRef->OnFirstInGame();
}
bShowMouseCursor=false;
const FInputModeUIOnly Input{FInputModeUIOnly()};
SetInputMode(Input);
}
3.4 当前任务提示
设置一个面板复制之前任务栏测试的板块,重写一个更新函数,传入参数为当前锁定的任务id