You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Int32变量导致FNAF同人游戏重启崩溃问题求助

Int32变量导致FNAF同人游戏重启崩溃问题求助

大家好,我正在开发一款FNAF同人游戏,已经忙活了几个月,眼看就要进入第三阶段开发了。结果最近在做最后一个角色的AI时卡壳了——一个叫Stage的int32变量每次重启游戏都会导致崩溃,实在头疼。

先把相关代码片段贴出来,方便大家帮我排查:

首先是变量定义:

int32 Stage;

然后是行为树任务里的使用逻辑:

void UBTTask_FoxyCountdown::TimerCompleted(UBehaviorTreeComponent& OwnerComp) const
{
    Foxy->IncreaseStage();
    if (Foxy->GetStage() >= 5)
    {
        FinishLatentTask(OwnerComp, EBTNodeResult::Succeeded);
    }

    FinishLatentTask(OwnerComp, EBTNodeResult::InProgress);
}

PiratesCove中的调用代码:

if (Foxy && Mesh2) 
{ 
   if (Foxy->GetStage() >= 2) 
   // 后续代码原提问未贴全
}

还有Foxy类自身的IncreaseStage方法:

void AFoxy::IncreaseStage()
{   
     Stage++;   
     UE_LOG(LogTemp, Log, TEXT("Increased Foxy's stage to: %d"), Stage);        

     if (Stage < 5)     
     {             
        TeleportTo(Positions[Stage], Rotations[Stage]); 
        // 原代码后续省略
     }
}

我整理的几个可能的崩溃原因和修复思路,你可以试试:

  1. 变量未初始化导致的随机值越界
    你定义的Stage是int32类型,UE里局部成员变量如果没手动初始化,默认会是随机的垃圾值。重启游戏时这个随机值可能直接大于等于5,甚至是负数,之后访问Positions[Stage]或者Rotations[Stage]就会触发数组越界,直接崩溃。

    • 修复:在AFoxy的构造函数或者BeginPlay里给Stage设初始值(比如初始阶段是0就设为0):
      AFoxy::AFoxy()
      {
          Stage = 0; // 或者根据你的游戏逻辑设为1
      }
      
  2. 行为树节点重复调用完成方法的逻辑错误
    看你的TimerCompleted方法,不管Foxy->GetStage() >=5是否成立,最后都会执行FinishLatentTask(OwnerComp, EBTNodeResult::InProgress);。也就是说如果条件满足,会先调用一次Succeeded,再调用一次InProgress,这种重复调用很可能打乱引擎内部的行为树状态,进而引发崩溃。

    • 修复:加上else分支,确保只调用一次FinishLatentTask:
      void UBTTask_FoxyCountdown::TimerCompleted(UBehaviorTreeComponent& OwnerComp) const
      {
          Foxy->IncreaseStage();
          if (Foxy->GetStage() >= 5)
          {
              FinishLatentTask(OwnerComp, EBTNodeResult::Succeeded);
          }
          else
          {
              FinishLatentTask(OwnerComp, EBTNodeResult::InProgress);
          }
      }
      
  3. Positions/Rotations数组的索引越界
    就算Stage初始化为0,当Stage增加到4时,Stage <5成立,会访问Positions[4]和Rotations[4],如果你的数组长度不够(比如只有4个元素,索引0-3),这里照样会越界崩溃。

    • 修复:先检查数组长度,确保索引有效再执行 teleport:
      if (Stage < 5 && Stage >= 0 && Stage < Positions.Num() && Stage < Rotations.Num())     
      {             
         TeleportTo(Positions[Stage], Rotations[Stage]); 
      }
      

另外建议你打开UE的日志和崩溃报告,看一下崩溃时的调用栈,能更精准定位问题——比如数组越界的话,日志里一般会有明确报错。也可以在BeginPlay里加一行日志,输出Stage的初始值,确认是不是未初始化的锅:

void AFoxy::BeginPlay()
{
    Super::BeginPlay();
    UE_LOG(LogTemp, Log, TEXT("Foxy's initial stage: %d"), Stage);
}

备注:内容来源于stack exchange,提问作者Shady Shade

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 12:39:37