[{"data":1,"prerenderedAt":824},["ShallowReactive",2],{"page-Time-1":3,"page-count-Time":50},[4],{"id":5,"title":6,"body":7,"date":801,"description":13,"extension":802,"meta":803,"navigation":338,"path":817,"seo":818,"stem":819,"tags":820,"__hash__":823},"blogs\u002F_legacy\u002F2017\u002F2017-03-25-ue4-time-mange.md","UE4时间相关函数",{"type":8,"value":9,"toc":789},"minimark",[10,14,17,20,25,28,33,36,66,69,72,75,188,191,194,197,205,208,236,239,281,285,288,552,555,562,565,569,572,578,584,587,591,594,600,611,619,623,626,632,639,642,681,689,711,714,736,740,743,749,752,755,758,761,767,773,776,782,785],[11,12,13],"p",{},"在进行游戏构建时，我们通常会用到和时间相关的逻辑，在此稍微做下小结。",[11,15,16],{},"当前UE4版本为4.15。",[11,18,19],{},"基本上游戏引擎都是以Tick为中心运转的，表现在玩家面前就是帧率了，UE4也是如此。",[21,22,24],"h2",{"id":23},"tick","Tick",[11,26,27],{},"tick是引擎的心跳，引擎中很多逻辑就是借助的tick机制自动注册的，例如UMG的动画播放功能就是tick驱动的。",[29,30,32],"h3",{"id":31},"c中使用","C++中使用",[11,34,35],{},"在蓝图中要使用tick的话只要从灰色的tick上拖出调用就可以了，但是在C++中使用的时候需要注意的是，在默认的情况下，tick是关闭的，必须自己开启才行。",[37,38,43],"pre",{"className":39,"code":40,"language":41,"meta":42,"style":42},"language-cpp shiki shiki-themes github-light-high-contrast github-dark monokai","PrimaryActorTick.bCanEverTick = true; \n","cpp","",[44,45,46],"code",{"__ignoreMap":42},[47,48,51,55,59,63],"span",{"class":49,"line":50},"line",1,[47,52,54],{"class":53},"s0idv","PrimaryActorTick.bCanEverTick ",[47,56,58],{"class":57},"sLXdl","=",[47,60,62],{"class":61},"stP0Q"," true",[47,64,65],{"class":53},";\n",[11,67,68],{},"另外由于tick本身是在每帧上调用的，出于效率考虑，要尽量避免往上添加复杂的逻辑，例如寻找1000以内的素数之类的。",[11,70,71],{},"还有一个比较少动到的地方是ShouldTickIfViewportsOnly，这个和编辑器的Tick策略关系比较大，但是在实际游戏中也可以使用。",[11,73,74],{},"主要的差分来自于LevelTick的类型",[37,76,78],{"className":39,"code":77,"language":41,"meta":42,"style":42},"\u002F** Type of tick we wish to perform on the level *\u002F\nenum ELevelTick\n{\n\u002F** Update the level time only. *\u002F\nLEVELTICK_TimeOnly = 0,\n\u002F** Update time and viewports. *\u002F\nLEVELTICK_ViewportsOnly = 1,\n\u002F** Update all. *\u002F\nLEVELTICK_All = 2,\n\u002F** Delta time is zero, we are paused. Components don't tick. *\u002F\nLEVELTICK_PauseTick = 3,\n};\n",[44,79,80,86,97,103,109,125,131,144,150,163,169,182],{"__ignoreMap":42},[47,81,82],{"class":49,"line":50},[47,83,85],{"class":84},"sZdD5","\u002F** Type of tick we wish to perform on the level *\u002F\n",[47,87,89,93],{"class":49,"line":88},2,[47,90,92],{"class":91},"sGZGq","enum",[47,94,96],{"class":95},"sfUV7"," ELevelTick\n",[47,98,100],{"class":49,"line":99},3,[47,101,102],{"class":53},"{\n",[47,104,106],{"class":49,"line":105},4,[47,107,108],{"class":84},"\u002F** Update the level time only. *\u002F\n",[47,110,112,116,119,122],{"class":49,"line":111},5,[47,113,115],{"class":114},"s7EbQ","LEVELTICK_TimeOnly",[47,117,118],{"class":57}," =",[47,120,121],{"class":61}," 0",[47,123,124],{"class":53},",\n",[47,126,128],{"class":49,"line":127},6,[47,129,130],{"class":84},"\u002F** Update time and viewports. *\u002F\n",[47,132,134,137,139,142],{"class":49,"line":133},7,[47,135,136],{"class":114},"LEVELTICK_ViewportsOnly",[47,138,118],{"class":57},[47,140,141],{"class":61}," 1",[47,143,124],{"class":53},[47,145,147],{"class":49,"line":146},8,[47,148,149],{"class":84},"\u002F** Update all. *\u002F\n",[47,151,153,156,158,161],{"class":49,"line":152},9,[47,154,155],{"class":114},"LEVELTICK_All",[47,157,118],{"class":57},[47,159,160],{"class":61}," 2",[47,162,124],{"class":53},[47,164,166],{"class":49,"line":165},10,[47,167,168],{"class":84},"\u002F** Delta time is zero, we are paused. Components don't tick. *\u002F\n",[47,170,172,175,177,180],{"class":49,"line":171},11,[47,173,174],{"class":114},"LEVELTICK_PauseTick",[47,176,118],{"class":57},[47,178,179],{"class":61}," 3",[47,181,124],{"class":53},[47,183,185],{"class":49,"line":184},12,[47,186,187],{"class":53},"};\n",[11,189,190],{},"其中，如果编辑器不是在RealTime模式（Ctrl+R打开）的话，就会是LEVELTICK_TimeOnly ，如果是的话就是LEVELTICK_ViewportsOnly 。一般不是实时模式的话，一些依赖于Tick表现的效果就不会更新，例如旧的粒子特效。",[11,192,193],{},"当LEVELTICK_ViewportsOnly 时，只有与角色有相关性的东西才会Tick。而对于在游戏中需要设定达到这个效果的话，可以设置UWorld的bPlayersOnly，这样的话就会强制将Tick类型变为LEVELTICK_ViewportsOnly 。",[11,195,196],{},"原始的过滤发生在如下的定义：",[37,198,203],{"className":199,"code":201,"language":202},[200],"language-text","void AActor::TickActor( float DeltaSeconds, ELevelTick TickType, FActorTickFunction& ThisTickFunction )\n{\n  \u002F\u002Froot of tick hierarchy\n\n  \u002F\u002F Non-player update.\n  const bool bShouldTick = ((TickType!=LEVELTICK_ViewportsOnly) || ShouldTickIfViewportsOnly());\n  if(bShouldTick)\n  {\n    \u002F\u002F If an Actor has been Destroyed or its level has been unloaded don't execute any queued ticks\n    if (!IsPendingKill() && GetWorld())\n    {\n      Tick(DeltaSeconds);    \u002F\u002F perform any tick functions unique to an actor subclass\n    }\n  }\n}\n","text",[44,204,201],{"__ignoreMap":42},[11,206,207],{},"在C++中使用时，如果遇到Tick函数在编辑模式下不会运行的情况，这时可以尝试对以下函数进行重载：",[37,209,211],{"className":39,"code":210,"language":41,"meta":42,"style":42},"virtual bool ShouldTickIfViewportsOnly() const override;\n",[44,212,213],{"__ignoreMap":42},[47,214,215,218,221,225,228,231,234],{"class":49,"line":50},[47,216,217],{"class":57},"virtual",[47,219,220],{"class":91}," bool",[47,222,224],{"class":223},"scAT4"," ShouldTickIfViewportsOnly",[47,226,227],{"class":53},"() ",[47,229,230],{"class":57},"const",[47,232,233],{"class":57}," override",[47,235,65],{"class":53},[11,237,238],{},"然后直接返回True。",[37,240,242],{"className":39,"code":241,"language":41,"meta":42,"style":42},"bool AMyActor::ShouldTickIfViewportsOnly() const\n{\n return true;\n}\n",[44,243,244,263,267,276],{"__ignoreMap":42},[47,245,246,249,252,255,258,260],{"class":49,"line":50},[47,247,248],{"class":91},"bool",[47,250,251],{"class":95}," AMyActor",[47,253,254],{"class":53},"::",[47,256,257],{"class":223},"ShouldTickIfViewportsOnly",[47,259,227],{"class":53},[47,261,262],{"class":57},"const\n",[47,264,265],{"class":49,"line":88},[47,266,102],{"class":53},[47,268,269,272,274],{"class":49,"line":99},[47,270,271],{"class":57}," return",[47,273,62],{"class":61},[47,275,65],{"class":53},[47,277,278],{"class":49,"line":105},[47,279,280],{"class":53},"}\n",[29,282,284],{"id":283},"tickgroup","TickGroup",[11,286,287],{},"UE4内部对Tick进行了分组管理，TickGroup之间按照先后顺序进行调用，其在引擎内部的定义为：",[37,289,291],{"className":39,"code":290,"language":41,"meta":42,"style":42},"UENUM(BlueprintType)\nenum ETickingGroup\n{\n\u002F** 在物理模拟开始之前的TickGroup *\u002F\nTG_PrePhysics UMETA(DisplayName=\"Pre Physics\"),\n\n\u002F** 用于开始物理模拟的特殊的TickGroup *\u002F\nTG_StartPhysics UMETA(Hidden, DisplayName=\"Start Physics\"),\n\n\u002F** 与物理模拟并行的TickGroup *\u002F\nTG_DuringPhysics UMETA(DisplayName=\"During Physics\"),\n\n\u002F** 用于接受物理模拟的特殊TickGroup *\u002F\nTG_EndPhysics UMETA(Hidden, DisplayName=\"End Physics\"),\n\n\u002F**在物理模拟（包括衣料材质演算）后运行的TickGroup *\u002F\nTG_PostPhysics UMETA(DisplayName=\"Post Physics\"),\n\n\u002F** 所有的更新操作完成后的TickGroup *\u002F\nTG_PostUpdateWork UMETA(DisplayName=\"Post Update Work\"),\n\n\u002F** 包含所有被延迟到最后的TickGroup *\u002F\nTG_LastDemotable UMETA(Hidden, DisplayName = \"Last Demotable\"),\n\n\u002F** 并非TickGroup的伪TickGroup，用于处理新生成的物体 *\u002F\nTG_NewlySpawned UMETA(Hidden, DisplayName=\"Newly Spawned\"),\n\nTG_MAX,\n\n};\n",[44,292,293,301,308,312,317,334,340,345,365,369,374,388,392,398,417,422,428,443,448,454,469,474,480,499,504,510,529,534,542,547],{"__ignoreMap":42},[47,294,295,298],{"class":49,"line":50},[47,296,297],{"class":223},"UENUM",[47,299,300],{"class":53},"(BlueprintType)\n",[47,302,303,305],{"class":49,"line":88},[47,304,92],{"class":91},[47,306,307],{"class":95}," ETickingGroup\n",[47,309,310],{"class":49,"line":99},[47,311,102],{"class":53},[47,313,314],{"class":49,"line":105},[47,315,316],{"class":84},"\u002F** 在物理模拟开始之前的TickGroup *\u002F\n",[47,318,319,322,325,327,331],{"class":49,"line":111},[47,320,321],{"class":53},"TG_PrePhysics UMETA(",[47,323,324],{"class":114},"DisplayName",[47,326,58],{"class":57},[47,328,330],{"class":329},"sZnmU","\"Pre Physics\"",[47,332,333],{"class":53},"),\n",[47,335,336],{"class":49,"line":127},[47,337,339],{"emptyLinePlaceholder":338},true,"\n",[47,341,342],{"class":49,"line":133},[47,343,344],{"class":84},"\u002F** 用于开始物理模拟的特殊的TickGroup *\u002F\n",[47,346,347,350,353,356,358,360,363],{"class":49,"line":146},[47,348,349],{"class":53},"TG_StartPhysics UMETA(",[47,351,352],{"class":114},"Hidden",[47,354,355],{"class":53},", ",[47,357,324],{"class":114},[47,359,58],{"class":57},[47,361,362],{"class":329},"\"Start Physics\"",[47,364,333],{"class":53},[47,366,367],{"class":49,"line":152},[47,368,339],{"emptyLinePlaceholder":338},[47,370,371],{"class":49,"line":165},[47,372,373],{"class":84},"\u002F** 与物理模拟并行的TickGroup *\u002F\n",[47,375,376,379,381,383,386],{"class":49,"line":171},[47,377,378],{"class":53},"TG_DuringPhysics UMETA(",[47,380,324],{"class":114},[47,382,58],{"class":57},[47,384,385],{"class":329},"\"During Physics\"",[47,387,333],{"class":53},[47,389,390],{"class":49,"line":184},[47,391,339],{"emptyLinePlaceholder":338},[47,393,395],{"class":49,"line":394},13,[47,396,397],{"class":84},"\u002F** 用于接受物理模拟的特殊TickGroup *\u002F\n",[47,399,401,404,406,408,410,412,415],{"class":49,"line":400},14,[47,402,403],{"class":53},"TG_EndPhysics UMETA(",[47,405,352],{"class":114},[47,407,355],{"class":53},[47,409,324],{"class":114},[47,411,58],{"class":57},[47,413,414],{"class":329},"\"End Physics\"",[47,416,333],{"class":53},[47,418,420],{"class":49,"line":419},15,[47,421,339],{"emptyLinePlaceholder":338},[47,423,425],{"class":49,"line":424},16,[47,426,427],{"class":84},"\u002F**在物理模拟（包括衣料材质演算）后运行的TickGroup *\u002F\n",[47,429,431,434,436,438,441],{"class":49,"line":430},17,[47,432,433],{"class":53},"TG_PostPhysics UMETA(",[47,435,324],{"class":114},[47,437,58],{"class":57},[47,439,440],{"class":329},"\"Post Physics\"",[47,442,333],{"class":53},[47,444,446],{"class":49,"line":445},18,[47,447,339],{"emptyLinePlaceholder":338},[47,449,451],{"class":49,"line":450},19,[47,452,453],{"class":84},"\u002F** 所有的更新操作完成后的TickGroup *\u002F\n",[47,455,457,460,462,464,467],{"class":49,"line":456},20,[47,458,459],{"class":53},"TG_PostUpdateWork UMETA(",[47,461,324],{"class":114},[47,463,58],{"class":57},[47,465,466],{"class":329},"\"Post Update Work\"",[47,468,333],{"class":53},[47,470,472],{"class":49,"line":471},21,[47,473,339],{"emptyLinePlaceholder":338},[47,475,477],{"class":49,"line":476},22,[47,478,479],{"class":84},"\u002F** 包含所有被延迟到最后的TickGroup *\u002F\n",[47,481,483,486,488,490,492,494,497],{"class":49,"line":482},23,[47,484,485],{"class":53},"TG_LastDemotable UMETA(",[47,487,352],{"class":114},[47,489,355],{"class":53},[47,491,324],{"class":114},[47,493,118],{"class":57},[47,495,496],{"class":329}," \"Last Demotable\"",[47,498,333],{"class":53},[47,500,502],{"class":49,"line":501},24,[47,503,339],{"emptyLinePlaceholder":338},[47,505,507],{"class":49,"line":506},25,[47,508,509],{"class":84},"\u002F** 并非TickGroup的伪TickGroup，用于处理新生成的物体 *\u002F\n",[47,511,513,516,518,520,522,524,527],{"class":49,"line":512},26,[47,514,515],{"class":53},"TG_NewlySpawned UMETA(",[47,517,352],{"class":114},[47,519,355],{"class":53},[47,521,324],{"class":114},[47,523,58],{"class":57},[47,525,526],{"class":329},"\"Newly Spawned\"",[47,528,333],{"class":53},[47,530,532],{"class":49,"line":531},27,[47,533,339],{"emptyLinePlaceholder":338},[47,535,537,540],{"class":49,"line":536},28,[47,538,539],{"class":114},"TG_MAX",[47,541,124],{"class":53},[47,543,545],{"class":49,"line":544},29,[47,546,339],{"emptyLinePlaceholder":338},[47,548,550],{"class":49,"line":549},30,[47,551,187],{"class":53},[11,553,554],{},"在蓝图中有提供修改的接口，默认情况下的TickGroup是PrePhysics。",[11,556,557],{},[558,559],"img",{"alt":560,"src":561},"image","\u002Fwp-content\u002Fuploads\u002F2017\u002F03\u002Fimage_thumb.png",[11,563,564],{},"在C++中可以额外的添加Tick函数，使得对象可以获得额外的其他TickGroup的Tick，但是在设计上意义并不是很大。",[29,566,568],{"id":567},"prerequisite","Prerequisite",[11,570,571],{},"在同一个TickGroup中的Tick似乎是根据优先调度进行的，其顺序近似随机。在特殊的需求下，UE4还提供了前置Tick Actor的设置，它可以保证两个Actor之间的tick按照顺序被调用。",[11,573,574],{},[558,575],{"alt":576,"src":577},"H13GGJPBRDQ5V0","\u002Fwp-content\u002Fuploads\u002F2017\u002F03\u002FH13GGJPBRDQ5V0DB0O4XN.png",[11,579,580],{},[558,581],{"alt":582,"src":583},"QSKL3GNA7SKY","\u002Fwp-content\u002Fuploads\u002F2017\u002F03\u002FQSKL3GNA7SKYM_JGEC_thumb.png",[11,585,586],{},"这个函数只影响当前Actor的tick的执行次序，其子组件的tick并不受影响，如有需要需另行指定。",[21,588,590],{"id":589},"timeline","TimeLine",[11,592,593],{},"时间轴是相当有效的在蓝图中对数值进行时间演变的方式，可以在很多地方被应用。例如打开房门或者是渐变材质的颜色等。",[11,595,596],{},[558,597],{"alt":598,"src":599},"91ZMJYQTWY","\u002Fwp-content\u002Fuploads\u002F2017\u002F03\u002F91PCXG9493HZMJYQTWY_thumb.png",[11,601,602,603,610],{},"功能一目了然，不明了的地方可以参照[",[604,605,609],"a",{"href":606,"rel":607},"https:\u002F\u002Fdocs.unrealengine.com\u002Flatest\u002FCHN\u002FEngine\u002FBlueprints\u002FUserGuide\u002FTimelines\u002Findex.html",[608],"nofollow","官方文档","]。",[11,612,613,614,610],{},"TimeLine也可以在C++中使用，但是实际应用的场景似乎不大，如有遇到可以参考这篇[",[604,615,618],{"href":616,"rel":617},"https:\u002F\u002Fwiki.unrealengine.com\u002FTimeline_in_c%2B%2B",[608],"社区文档",[21,620,622],{"id":621},"timer","Timer",[11,624,625],{},"UE4提供了定时运行的Timer供使用，在游戏逻辑上还是有经常被用到的。",[11,627,628],{},[558,629],{"alt":630,"src":631},"D8TY","\u002Fwp-content\u002Fuploads\u002F2017\u002F03\u002FD8TYNNII5VXAS_F28XHO_thumb.png",[11,633,634,635,610],{},"使用起来需要连接事件或者提供函数名，详细的可以参考[",[604,636,609],{"href":637,"rel":638},"https:\u002F\u002Fdocs.unrealengine.com\u002Flatest\u002FCHN\u002FGameplay\u002FHowTo\u002FUseTimers\u002Findex.html",[608],[11,640,641],{},"在C++中使用Timer也相对简单，使用TimerManager提供的接口函数就可以了。",[37,643,645],{"className":39,"code":644,"language":41,"meta":42,"style":42},"FTimerHandle DummyHandle;\n\nGetWorld()->GetTimerManager()->SetTimer( DummyHandle, StartPulseSurveyIconDelegate, SurveyPulseTimeInterval, false );\n",[44,646,647,652,656],{"__ignoreMap":42},[47,648,649],{"class":49,"line":50},[47,650,651],{"class":53},"FTimerHandle DummyHandle;\n",[47,653,654],{"class":49,"line":88},[47,655,339],{"emptyLinePlaceholder":338},[47,657,658,661,664,667,669,672,675,678],{"class":49,"line":99},[47,659,660],{"class":223},"GetWorld",[47,662,663],{"class":53},"()->",[47,665,666],{"class":223},"GetTimerManager",[47,668,663],{"class":53},[47,670,671],{"class":223},"SetTimer",[47,673,674],{"class":53},"( DummyHandle, StartPulseSurveyIconDelegate, SurveyPulseTimeInterval, ",[47,676,677],{"class":61},"false",[47,679,680],{"class":53}," );\n",[11,682,683,684,688],{},"第二个参数是一个",[604,685,687],{"href":686},"\u002F2015-08-16-ue4-event-dispatcher-and-delegate\u002F","Delegate","，定义如下：",[37,690,692],{"className":39,"code":691,"language":41,"meta":42,"style":42},"DECLARE_DELEGATE(FTimerDelegate);\n\nFTimerDelegate StartPulseSurveyIconDelegate;\n",[44,693,694,702,706],{"__ignoreMap":42},[47,695,696,699],{"class":49,"line":50},[47,697,698],{"class":223},"DECLARE_DELEGATE",[47,700,701],{"class":53},"(FTimerDelegate);\n",[47,703,704],{"class":49,"line":88},[47,705,339],{"emptyLinePlaceholder":338},[47,707,708],{"class":49,"line":99},[47,709,710],{"class":53},"FTimerDelegate StartPulseSurveyIconDelegate;\n",[11,712,713],{},"使用到的第一个参数为FTimerHandle，是用来标识并事后交付给TimerManager用于操作指定Timer的，如果没有这个需求，可以直接定义一个Dummy。",[37,715,717],{"className":39,"code":716,"language":41,"meta":42,"style":42},"GetWorld()->GetTimerManager().UnPauseTimer(SampleTimerHandle);\n",[44,718,719],{"__ignoreMap":42},[47,720,721,723,725,727,730,733],{"class":49,"line":50},[47,722,660],{"class":223},[47,724,663],{"class":53},[47,726,666],{"class":223},[47,728,729],{"class":53},"().",[47,731,732],{"class":223},"UnPauseTimer",[47,734,735],{"class":53},"(SampleTimerHandle);\n",[29,737,739],{"id":738},"delay","Delay",[11,741,742],{},"延迟执行节点，在蓝图中有时会用到的逻辑。Delay相当于一个不重复执行的Timer，因此在C++中要使用这种功能的话，就是用Timer来了。",[11,744,745],{},[558,746],{"alt":747,"src":748},"RPNTM","\u002Fwp-content\u002Fuploads\u002F2017\u002F03\u002FRPNT_K6CC@5L6HMONU7M_thumb.png",[11,750,751],{},"其中上方的那个Delay节点提供的功能是：当还在倒数时被调用到，就会重新开始倒数。",[21,753,754],{"id":754},"速度调节",[11,756,757],{},"UE4有提供调节步进的接口函数，这个功能通常名为slow mode，功能上类似于FPS游戏中经常出现的子弹时间效果。",[11,759,760],{},"这个系列的函数提供两种类型的控制，一种是全局的，一种是针对某个特定物体的。",[11,762,763],{},[558,764],{"alt":765,"src":766},"ZB08UAW","\u002Fwp-content\u002Fuploads\u002F2017\u002F03\u002FZB08UAWFXEIJ5F@GM_thumb.png",[11,768,769],{},[558,770],{"alt":771,"src":772},"DP71R","\u002Fwp-content\u002Fuploads\u002F2017\u002F03\u002FDP7MMNR3LR14QVF81R_thumb.png",[11,774,775],{},"全局的时间调节也可以使用控制台指令打开：",[11,777,778],{},[558,779],{"alt":780,"src":781},"P2YPAQQ7","\u002Fwp-content\u002Fuploads\u002F2017\u002F03\u002FP39OU9IC2Y52GHPAQQ7_thumb.png",[11,783,784],{},"这个功能相对简单，时间设定的细节需要到具体使用的时候调节为上。",[786,787,788],"style",{},"html pre.shiki code .s0idv, html code.shiki .s0idv{--shiki-default:#0E1116;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sLXdl, html code.shiki .sLXdl{--shiki-default:#A0111F;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .stP0Q, html code.shiki .stP0Q{--shiki-default:#023B95;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html pre.shiki code .sZdD5, html code.shiki .sZdD5{--shiki-default:#66707B;--shiki-dark:#6A737D;--shiki-sepia:#88846F}html pre.shiki code .sGZGq, html code.shiki .sGZGq{--shiki-default:#A0111F;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .sfUV7, html code.shiki .sfUV7{--shiki-default:#702C00;--shiki-default-text-decoration:inherit;--shiki-dark:#B392F0;--shiki-dark-text-decoration:inherit;--shiki-sepia:#A6E22E;--shiki-sepia-text-decoration:underline}html pre.shiki code .s7EbQ, html code.shiki .s7EbQ{--shiki-default:#023B95;--shiki-dark:#79B8FF;--shiki-sepia:#F8F8F2}html pre.shiki code .scAT4, html code.shiki .scAT4{--shiki-default:#622CBC;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .sZnmU, html code.shiki .sZnmU{--shiki-default:#032563;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}",{"title":42,"searchDepth":88,"depth":99,"links":790},[791,796,797,800],{"id":23,"depth":88,"text":24,"children":792},[793,794,795],{"id":31,"depth":99,"text":32},{"id":283,"depth":99,"text":284},{"id":567,"depth":99,"text":568},{"id":589,"depth":88,"text":590},{"id":621,"depth":88,"text":622,"children":798},[799],{"id":738,"depth":99,"text":739},{"id":754,"depth":88,"text":754},"2017-03-25","md",{"layout":804,"status":805,"published":338,"author":806,"author_login":808,"author_email":809,"wordpress_id":810,"wordpress_url":811,"date_gmt":812,"excerpt":813},"post","publish",{"display_name":807,"login":808,"email":809,"url":42},"风铃","flinkor","flinkor@foxmail.com",1571,"\u002F\u002F?p=1571","2017-03-25 03:26:22 +0000",{"type":8,"value":814},[815],[11,816,13],{},"\u002F2017-03-25-ue4-time-mange",{"title":6,"description":13},"_legacy\u002F2017\u002F2017-03-25-ue4-time-mange",[821,822],"UE4","Time","8vy4gJatwGajxVpI01uxbY-PZbVt-kezVlysdvuWkgE",1788763180629]