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