[{"data":1,"prerenderedAt":1043},["ShallowReactive",2],{"tutorial-2020-04-world-bending-effect":3},{"tutorial":4,"series":1025,"author":1033},{"id":5,"title":6,"author":7,"body":8,"category":1015,"cover":1016,"date":1019,"description":1020,"extension":1021,"meta":1022,"navigation":366,"path":1023,"seo":1024,"series":1025,"stem":1026,"tags":1027,"youtube":1030,"youtubeRange":1025,"__hash__":1031,"slug":1032},"posts\u002Fposts\u002F2020\u002F04\u002Fworld-bending-effect.md","World Bending Effect","nir",{"type":9,"value":10,"toc":1005},"minimark",[11,20,23,39,44,51,73,77,91,94,98,102,109,115,141,190,196,201,204,208,215,224,228,231,234,241,249,252,256,267,270,274,280,284,287,291,297,301,307,311,320,755,761,769,772,776,779,788,793,802,960,963,965,969,972,977,986,990,996,1001],[12,13,14,15,19],"p",{},"In this article, we will recreate the ",[16,17,18],"em",{},"Animal Crossing","’s World Bending effect in Unity. Trust me, you will be surprised how simple it is! But we’re not stopping there, we will also explore how we can take it to the next level...",[21,22],"hr",{},[12,24,25,26,30,31,34,35,38],{},"The ",[27,28,29],"strong",{},"World Bending"," effect brings in the horizon and the skyline, allowing both the ground and sky to be visible at the same time.",[32,33],"br",{},"\nThis is done by what Nintendo calls the ",[16,36,37],{},"“Rolling Log”"," effect, in which the terrain seems to bend and roll beneath the players while they wander around.",[40,41,43],"h2",{"id":42},"origin","Origin",[12,45,46,47,50],{},"The effect has an interesting origin, as the producer of ",[16,48,49],{},"Animal Crossing: Wild World"," once described:",[52,53,54,57],"blockquote",{},[12,55,56],{},"For the Nintendo DS, it made more sense to use this effect in order to show the sky in the upper screen, in oppose to a scrolling camera.",[12,58,59],{},[60,61,62,63],"small",{},"— Katsuya Eguchi, ",[64,65,66],"cite",{},[67,68,72],"a",{"href":69,"rel":70},"https:\u002F\u002Fwww.ign.com\u002Farticles\u002F2005\u002F05\u002F20\u002Fe3-2005-animal-crossing-ds-interview",[71],"nofollow","IGN (2005)",[40,74,76],{"id":75},"scene-building","Scene Building",[12,78,79,80,83,84,86,87,90],{},"After creating a new ",[16,81,82],{},"Universal Render Pipline"," project, I went ahead and created a fun scene we can work with. It has a boat for the player to control.",[32,85],{},"\nOne thing to note regarding the scene, the effect requires meshes with a ",[27,88,89],{},"sufficient amount of polygon count",". If your mesh poly count is too low – it will harm the desired look.",[12,92,93],{},"If you need more inspiration for your scenes, Animal Crossing is not the only game using this effect. It was also featured in games like DeathSpank, Subway Surfers, and more...",[95,96],"article-affiliate",{"asset":97},"173251",[40,99,101],{"id":100},"shader-graph","Shader Graph",[12,103,104,105,108],{},"I created a Lit Shader Graph named ",[106,107,29],"code",{},":",[110,111,114],"article-image",{"src":112,"alt":113},"\u002Fposts\u002F2020\u002F04-24\u002Fshader-graph-world-bending-1.png","World bending effect in Unity – shader graph","\nInitial World Bending shader graph.\n",[12,116,117,118,121,122,125,126,129,130,132,133,136,137,140],{},"It has two properties: a ",[106,119,120],{},"Texture"," and a ",[106,123,124],{},"Vector1",". The ",[27,127,128],{},"Amount"," ",[106,131,124],{}," property expects tiny numbers, so I set it to a slider between ",[106,134,135],{},".005"," and ",[106,138,139],{},".1",".",[142,143,144,152,155,162,179],"ul",{},[145,146,147,148,151],"li",{},"To kick things off, we calculate the distance from the vertex to the camera. We only care about the distance of the ",[106,149,150],{},"Z","-axis, so we split it.",[145,153,154],{},"To achieve the curved look, we multiply the Amount by an exponent of the distance.",[145,156,157,158,161],{},"We can now add our shifted ",[106,159,160],{},"Y"," position to the vertex world position.",[145,163,164,165,168,169,172,173,176,177,140],{},"Since the ",[16,166,167],{},"Vertex Shader"," expects an ",[16,170,171],{},"Object Space"," position, we convert the position from ",[16,174,175],{},"World Space"," into ",[16,178,171],{},[145,180,181,182,185,186,189],{},"Now all that remains to do is to connect the new position into the ",[106,183,184],{},"Vertex Position"," of the ",[16,187,188],{},"Master"," node.",[12,191,192,193,195],{},"The fundamental shader graph is now ready.",[32,194],{},"\nLet’s see our shader in action...",[197,198,200],"article-giphy",{"gif":199},"f9BElsQMM1i2J3vPuS","\nThe World Bending shader in action.\n",[12,202,203],{},"An advantage of the World Bending effect is that it allows us to present only a fraction of the world at any given moment. At the same time, we aren’t actually limited to the surface area of a cylinder or a sphere – so we can create infinite large worlds.",[40,205,207],{"id":206},"rendering-effects","Rendering Effects",[12,209,210,211,214],{},"I added a moderate amount of fog by going to Window > Rendering > Lighting Settings. In this window, I ticked ",[27,212,213],{},"Fog"," and set the appropriate distances for my scene.",[12,216,217,218,136,221,140],{},"I also added post-processing effects. Just a subtle touch of ",[27,219,220],{},"vignette",[27,222,223],{},"depth-of-field",[40,225,227],{"id":226},"zooming-behavior","Zooming Behavior",[12,229,230],{},"In Animal Crossing, Whenever a dialogue kicks in, the camera changes two parameters. The first one is obviously the distance, the other one is the angle.",[12,232,233],{},"I added Cinemachine to the project and created two cameras. The Main camera angle is set to 50 and has a distance of 14. On the other hand, the Zoom camera angle is set to 30 and has a distance of 10.",[12,235,236,237,240],{},"I created a ",[106,238,239],{},"CamZone"," script that expects a Cinemachine virtual camera:",[142,242,243,246],{},[145,244,245],{},"When it starts, it disables the camera",[145,247,248],{},"It will only activate and deactivate the virtual camera based on a player entering and exiting the trigger.",[12,250,251],{},"On my bridge object, I created a trigger collider, added the script to it, and passed in the Zoom virtual camera.",[197,253,255],{"gif":254},"VFH4vchBabwIFQDqdJ","\nCamera zones triggering zoom.\n",[12,257,258,259,261,262,266],{},"Now when the boat passes under the bridge, we have a nice zooming behavior.",[32,260],{},"\nIf you want to learn more about ",[67,263,265],{"href":264},"\u002Ftutorials\u002F2020\u002F03\u002F25d-game-in-unity-part-5","Cineamchine and Camera Zones",", check out my article about it.",[268,269],"article-assets",{},[40,271,273],{"id":272},"culling","Culling",[12,275,276,277,279],{},"You may have noticed as the world rolls, background objects in the distance abruptly disappear instead of rolling all the way down.",[32,278],{},"\nThis is an issue caused by the camera’s frustum culling.",[197,281,283],{"gif":282},"ZA5uUBoAB83EW9EBf4","\nCamera’s frustom culling influence.\n",[12,285,286],{},"The camera’s frustum is the area of the scene that is visible to the player. The Unity renderer ignores the objects outside of the frustum. In the illustration, we see that the trees inside the frustum are highlighted and rendered.",[197,288,290],{"gif":289},"Y48V7smBWP57MUi9Fp","\nDifference between CPU and GPU objects’ representation.\n",[12,292,293,294,296],{},"Our shader runs on the GPU and modifies the position of the objects before rendering them.",[32,295],{},"\nThe CPU is not aware of the modifications made on the GPU. We can see this conflict if we select an object and move it – notice how the orange selection outline is not synchronized with the rendered object.",[197,298,300],{"gif":299},"U7mziBBlEdvoOBarb6","\nCamera’s frustom culling influence mapped to a bent world.\n",[12,302,303,304,306],{},"As our shader curves the world, it inserts more objects into the field of view. As a result, Unity renderer’s culling step, which runs on the CPU, ignores objects that are inside the field of view, but outside the frustum.",[32,305],{},"\nThe illustration presents the same trees, both with and without the shader. It highlights the trees that are inside the frustum and rendered. The blue trees are modified by the shader – notice that some blue trees are inside the frustum but aren’t highlighted and rendered.",[197,308,310],{"gif":309},"JR0WjfokbWSGn7zTGB","\nFixed camera’s frustom culling and how it mapps to a bent world.\n",[12,312,313,314,316,317,319],{},"Our simple solution is to render with the normal frustum, but when Unity culls are objects, we use a modified frustum.",[32,315],{},"\nWe will create a custom orthographic frustum with a larger field of view.",[32,318],{},"\nNotice that the blue trees are always highlighted when inside the frustum, therefore they are always rendered when we see them.",[321,322,328],"pre",{"className":323,"code":324,"filename":325,"language":326,"meta":327,"style":327},"language-csharp shiki shiki-themes github-light","using UnityEngine;\nusing UnityEngine.Rendering;\n\npublic class BendingManager : MonoBehaviour\n{\n  #region MonoBehaviour\n\n  private void OnEnable ()\n  {\n    if ( !Application.isPlaying )\n      return;\n\n    RenderPipelineManager.beginCameraRendering += OnBeginCameraRendering;\n    RenderPipelineManager.endCameraRendering += OnEndCameraRendering;\n  }\n\n  private void OnDisable ()\n  {\n    RenderPipelineManager.beginCameraRendering -= OnBeginCameraRendering;\n    RenderPipelineManager.endCameraRendering -= OnEndCameraRendering;\n  }\n\n  #endregion\n\n\n  #region Methods\n\n  private static void OnBeginCameraRendering (ScriptableRenderContext ctx,\n                                              Camera cam)\n  {\n    cam.cullingMatrix = Matrix4x4.Ortho(-99, 99, -99, 99, 0.001f, 99) *\n                        cam.worldToCameraMatrix;\n  }\n\n  private static void OnEndCameraRendering (ScriptableRenderContext ctx,\n                                            Camera cam)\n  {\n    cam.ResetCullingMatrix();\n  }\n\n  #endregion\n}\n","BendingManager.cs","csharp","",[106,329,330,347,361,368,386,392,405,410,425,431,446,454,459,471,482,488,493,505,510,520,529,534,539,547,552,557,567,572,597,609,614,669,675,680,685,705,715,720,732,737,742,749],{"__ignoreMap":327},[331,332,335,339,343],"span",{"class":333,"line":334},"line",1,[331,336,338],{"class":337},"sD7c4","using",[331,340,342],{"class":341},"s7eDp"," UnityEngine",[331,344,346],{"class":345},"sgsFI",";\n",[331,348,350,352,354,356,359],{"class":333,"line":349},2,[331,351,338],{"class":337},[331,353,342],{"class":341},[331,355,140],{"class":345},[331,357,358],{"class":341},"Rendering",[331,360,346],{"class":345},[331,362,364],{"class":333,"line":363},3,[331,365,367],{"emptyLinePlaceholder":366},true,"\n",[331,369,371,374,377,380,383],{"class":333,"line":370},4,[331,372,373],{"class":337},"public",[331,375,376],{"class":337}," class",[331,378,379],{"class":341}," BendingManager",[331,381,382],{"class":345}," : ",[331,384,385],{"class":341},"MonoBehaviour\n",[331,387,389],{"class":333,"line":388},5,[331,390,391],{"class":345},"{\n",[331,393,395,398,401],{"class":333,"line":394},6,[331,396,397],{"class":345},"  #",[331,399,400],{"class":337},"region",[331,402,404],{"class":403},"sYBdl"," MonoBehaviour\n",[331,406,408],{"class":333,"line":407},7,[331,409,367],{"emptyLinePlaceholder":366},[331,411,413,416,419,422],{"class":333,"line":412},8,[331,414,415],{"class":337},"  private",[331,417,418],{"class":337}," void",[331,420,421],{"class":341}," OnEnable",[331,423,424],{"class":345}," ()\n",[331,426,428],{"class":333,"line":427},9,[331,429,430],{"class":345},"  {\n",[331,432,434,437,440,443],{"class":333,"line":433},10,[331,435,436],{"class":337},"    if",[331,438,439],{"class":345}," ( ",[331,441,442],{"class":337},"!",[331,444,445],{"class":345},"Application.isPlaying )\n",[331,447,449,452],{"class":333,"line":448},11,[331,450,451],{"class":337},"      return",[331,453,346],{"class":345},[331,455,457],{"class":333,"line":456},12,[331,458,367],{"emptyLinePlaceholder":366},[331,460,462,465,468],{"class":333,"line":461},13,[331,463,464],{"class":345},"    RenderPipelineManager.beginCameraRendering ",[331,466,467],{"class":337},"+=",[331,469,470],{"class":345}," OnBeginCameraRendering;\n",[331,472,474,477,479],{"class":333,"line":473},14,[331,475,476],{"class":345},"    RenderPipelineManager.endCameraRendering ",[331,478,467],{"class":337},[331,480,481],{"class":345}," OnEndCameraRendering;\n",[331,483,485],{"class":333,"line":484},15,[331,486,487],{"class":345},"  }\n",[331,489,491],{"class":333,"line":490},16,[331,492,367],{"emptyLinePlaceholder":366},[331,494,496,498,500,503],{"class":333,"line":495},17,[331,497,415],{"class":337},[331,499,418],{"class":337},[331,501,502],{"class":341}," OnDisable",[331,504,424],{"class":345},[331,506,508],{"class":333,"line":507},18,[331,509,430],{"class":345},[331,511,513,515,518],{"class":333,"line":512},19,[331,514,464],{"class":345},[331,516,517],{"class":337},"-=",[331,519,470],{"class":345},[331,521,523,525,527],{"class":333,"line":522},20,[331,524,476],{"class":345},[331,526,517],{"class":337},[331,528,481],{"class":345},[331,530,532],{"class":333,"line":531},21,[331,533,487],{"class":345},[331,535,537],{"class":333,"line":536},22,[331,538,367],{"emptyLinePlaceholder":366},[331,540,542,544],{"class":333,"line":541},23,[331,543,397],{"class":345},[331,545,546],{"class":337},"endregion\n",[331,548,550],{"class":333,"line":549},24,[331,551,367],{"emptyLinePlaceholder":366},[331,553,555],{"class":333,"line":554},25,[331,556,367],{"emptyLinePlaceholder":366},[331,558,560,562,564],{"class":333,"line":559},26,[331,561,397],{"class":345},[331,563,400],{"class":337},[331,565,566],{"class":403}," Methods\n",[331,568,570],{"class":333,"line":569},27,[331,571,367],{"emptyLinePlaceholder":366},[331,573,575,577,580,582,585,588,591,594],{"class":333,"line":574},28,[331,576,415],{"class":337},[331,578,579],{"class":337}," static",[331,581,418],{"class":337},[331,583,584],{"class":341}," OnBeginCameraRendering",[331,586,587],{"class":345}," (",[331,589,590],{"class":341},"ScriptableRenderContext",[331,592,593],{"class":341}," ctx",[331,595,596],{"class":345},",\n",[331,598,600,603,606],{"class":333,"line":599},29,[331,601,602],{"class":341},"                                              Camera",[331,604,605],{"class":341}," cam",[331,607,608],{"class":345},")\n",[331,610,612],{"class":333,"line":611},30,[331,613,430],{"class":345},[331,615,617,620,623,626,629,632,635,639,642,644,646,648,650,652,654,656,659,661,663,666],{"class":333,"line":616},31,[331,618,619],{"class":345},"    cam.cullingMatrix ",[331,621,622],{"class":337},"=",[331,624,625],{"class":345}," Matrix4x4.",[331,627,628],{"class":341},"Ortho",[331,630,631],{"class":345},"(",[331,633,634],{"class":337},"-",[331,636,638],{"class":637},"sYu0t","99",[331,640,641],{"class":345},", ",[331,643,638],{"class":637},[331,645,641],{"class":345},[331,647,634],{"class":337},[331,649,638],{"class":637},[331,651,641],{"class":345},[331,653,638],{"class":637},[331,655,641],{"class":345},[331,657,658],{"class":637},"0.001f",[331,660,641],{"class":345},[331,662,638],{"class":637},[331,664,665],{"class":345},") ",[331,667,668],{"class":337},"*\n",[331,670,672],{"class":333,"line":671},32,[331,673,674],{"class":345},"                        cam.worldToCameraMatrix;\n",[331,676,678],{"class":333,"line":677},33,[331,679,487],{"class":345},[331,681,683],{"class":333,"line":682},34,[331,684,367],{"emptyLinePlaceholder":366},[331,686,688,690,692,694,697,699,701,703],{"class":333,"line":687},35,[331,689,415],{"class":337},[331,691,579],{"class":337},[331,693,418],{"class":337},[331,695,696],{"class":341}," OnEndCameraRendering",[331,698,587],{"class":345},[331,700,590],{"class":341},[331,702,593],{"class":341},[331,704,596],{"class":345},[331,706,708,711,713],{"class":333,"line":707},36,[331,709,710],{"class":341},"                                            Camera",[331,712,605],{"class":341},[331,714,608],{"class":345},[331,716,718],{"class":333,"line":717},37,[331,719,430],{"class":345},[331,721,723,726,729],{"class":333,"line":722},38,[331,724,725],{"class":345},"    cam.",[331,727,728],{"class":341},"ResetCullingMatrix",[331,730,731],{"class":345},"();\n",[331,733,735],{"class":333,"line":734},39,[331,736,487],{"class":345},[331,738,740],{"class":333,"line":739},40,[331,741,367],{"emptyLinePlaceholder":366},[331,743,745,747],{"class":333,"line":744},41,[331,746,397],{"class":345},[331,748,546],{"class":337},[331,750,752],{"class":333,"line":751},42,[331,753,754],{"class":345},"}\n",[12,756,236,757,760],{},[106,758,759],{},"BendingManager"," script:",[142,762,763,766],{},[145,764,765],{},"When it loads, I register for camera rendering events from the rendering pipeline manager.",[145,767,768],{},"When the camera renders, we provide it with our modified frustum based on its location.",[12,770,771],{},"Gone are the culling issues!",[40,773,775],{"id":774},"editor-mode","Editor Mode",[12,777,778],{},"By now, we have achieved the desired look & feel. But modifying the scene is, to say the least, not a pleasant experience.",[12,780,781,782,140,785,787],{},"In the shader graph, I added a global multi compile boolean keyword and named its reference ",[106,783,784],{},"ENABLE_BENDING",[32,786],{},"\nI modified the shader, so the effect only takes place when the keyword is enabled.",[110,789,792],{"src":790,"alt":791},"\u002Fposts\u002F2020\u002F04-24\u002Fshader-graph-world-bending-2.png","World bending effect in Unity – activation shader graph","\nWorld Bending shader graph with a keyword toggle.\n",[12,794,795,796,798,799,801],{},"I added an attribute and some more lines in top of the ",[106,797,759],{}," script.",[32,800],{},"\nWhen it awakes, I enable and disable the keyword depending on whether we are in play mode or not.",[321,803,805],{"className":323,"code":804,"filename":325,"language":326,"meta":327,"style":327},"[ExecuteAlways]\npublic class BendingManager : MonoBehaviour\n{\n  #region Constants\n  \n  private const string BENDING_FEATURE = \"ENABLE_BENDING\";\n  \n  #endregion\n\n\n  #region MonoBehaviour\n\n  private void Awake ()\n  {\n    if ( Application.isPlaying )\n      Shader.EnableKeyword(BENDING_FEATURE);\n    else\n      Shader.DisableKeyword(BENDING_FEATURE);\n  }\n\n  \u002F\u002F ...\n",[106,806,807,818,830,834,843,848,869,873,879,883,887,895,899,910,914,921,932,937,946,950,954],{"__ignoreMap":327},[331,808,809,812,815],{"class":333,"line":334},[331,810,811],{"class":345},"[",[331,813,814],{"class":341},"ExecuteAlways",[331,816,817],{"class":345},"]\n",[331,819,820,822,824,826,828],{"class":333,"line":349},[331,821,373],{"class":337},[331,823,376],{"class":337},[331,825,379],{"class":341},[331,827,382],{"class":345},[331,829,385],{"class":341},[331,831,832],{"class":333,"line":363},[331,833,391],{"class":345},[331,835,836,838,840],{"class":333,"line":370},[331,837,397],{"class":345},[331,839,400],{"class":337},[331,841,842],{"class":403}," Constants\n",[331,844,845],{"class":333,"line":388},[331,846,847],{"class":345},"  \n",[331,849,850,852,855,858,861,864,867],{"class":333,"line":394},[331,851,415],{"class":337},[331,853,854],{"class":337}," const",[331,856,857],{"class":337}," string",[331,859,860],{"class":341}," BENDING_FEATURE",[331,862,863],{"class":337}," =",[331,865,866],{"class":403}," \"ENABLE_BENDING\"",[331,868,346],{"class":345},[331,870,871],{"class":333,"line":407},[331,872,847],{"class":345},[331,874,875,877],{"class":333,"line":412},[331,876,397],{"class":345},[331,878,546],{"class":337},[331,880,881],{"class":333,"line":427},[331,882,367],{"emptyLinePlaceholder":366},[331,884,885],{"class":333,"line":433},[331,886,367],{"emptyLinePlaceholder":366},[331,888,889,891,893],{"class":333,"line":448},[331,890,397],{"class":345},[331,892,400],{"class":337},[331,894,404],{"class":403},[331,896,897],{"class":333,"line":456},[331,898,367],{"emptyLinePlaceholder":366},[331,900,901,903,905,908],{"class":333,"line":461},[331,902,415],{"class":337},[331,904,418],{"class":337},[331,906,907],{"class":341}," Awake",[331,909,424],{"class":345},[331,911,912],{"class":333,"line":473},[331,913,430],{"class":345},[331,915,916,918],{"class":333,"line":484},[331,917,436],{"class":337},[331,919,920],{"class":345}," ( Application.isPlaying )\n",[331,922,923,926,929],{"class":333,"line":490},[331,924,925],{"class":345},"      Shader.",[331,927,928],{"class":341},"EnableKeyword",[331,930,931],{"class":345},"(BENDING_FEATURE);\n",[331,933,934],{"class":333,"line":495},[331,935,936],{"class":337},"    else\n",[331,938,939,941,944],{"class":333,"line":507},[331,940,925],{"class":345},[331,942,943],{"class":341},"DisableKeyword",[331,945,931],{"class":345},[331,947,948],{"class":333,"line":512},[331,949,487],{"class":345},[331,951,952],{"class":333,"line":522},[331,953,367],{"emptyLinePlaceholder":366},[331,955,956],{"class":333,"line":531},[331,957,959],{"class":958},"sAwPA","  \u002F\u002F ...\n",[12,961,962],{},"Now when the editor is not playing, the scene is presented normally.",[95,964],{"asset":97},[40,966,968],{"id":967},"level-up","Level Up",[12,970,971],{},"I modified the shader by adding a horizontal curve in addition to the depth curve. This will result in an effect that resembles a sphere as opposed to a log.",[110,973,976],{"src":974,"alt":975},"\u002Fposts\u002F2020\u002F04-24\u002Fshader-graph-world-bending-3.png","World bending effect in Unity – planet shader graph","\nWorld Bending shader graph with planets.\n",[12,978,979,980,982,983,985],{},"Now when we move, you can see how the world bends in both axes. It seems as we are on the edge of a planet.",[32,981],{},"\nSpeaking of a planet... This effect has 3 parameters that we can play with to achieve a different look & feel: curvature amount, camera rotation, and camera position.",[32,984],{},"\nLet’s look at what happens when we change the camera rotation to 90 degrees and move it further away.",[197,987,989],{"gif":988},"XcLbnIDGvhWaiDHhyK","\nPlanet version of the World Bending shader in action.\n",[12,991,992,993,995],{},"We now have a planet we can sail on!",[32,994],{},"\nAltering the curvature amount will change the planet’s size.",[997,998],"article-download",{"href":999,"title":1000},"https:\u002F\u002Fgithub.com\u002Fnotslot\u002Ftutorial-world-bending","Download Unity Project",[1002,1003,1004],"style",{},"html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}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 pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}",{"title":327,"searchDepth":363,"depth":363,"links":1006},[1007,1008,1009,1010,1011,1012,1013,1014],{"id":42,"depth":349,"text":43},{"id":75,"depth":349,"text":76},{"id":100,"depth":349,"text":101},{"id":206,"depth":349,"text":207},{"id":226,"depth":349,"text":227},{"id":272,"depth":349,"text":273},{"id":774,"depth":349,"text":775},{"id":967,"depth":349,"text":968},"tutorial",{"480w":1017,"960w":1018},"\u002Fposts\u002F2020\u002F04-24\u002Fworld-bending-effect-480w.jpg","\u002Fposts\u002F2020\u002F04-24\u002Fworld-bending-effect-960w.jpg","2020-04-24","Recreating Animal Crossing’s world bending effect and planets in Unity with Shader Graph.","md",{},"\u002Fposts\u002F2020\u002F04\u002Fworld-bending-effect",{"title":6,"description":1020},null,"posts\u002F2020\u002F04\u002Fworld-bending-effect",[1028,106,1029],"unity","shader","SOK3Ias5Nk0","rEPWfKh5F2hha0SLAoxCLILUvyPoXbZeaHBvmNHHafE","world-bending-effect",{"id":1034,"authorPage":366,"extension":1035,"meta":1036,"name":1037,"social":1038,"stem":1041,"__hash__":1042},"team\u002Fteam\u002Fnir.yaml","yaml",{},"Nir Lahad",{"twitter":1039,"linkedin":1040},"Nirlah","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fnir-lahad-b994675b","team\u002Fnir","XR6GHUplaX0xSjFx9OIVhSL2dd4CVyDFtBi3TRUSr5c",1790297819562]