[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"me":3,"catalog:en:game-dev\u002Fgp-character-controller-movement":4,"config":233},null,{"field_key":5,"field_name":6,"seniority":7,"topic_key":8,"topic_name":9,"spec_key":7,"spec_name":7,"locale":10,"cell_total":11,"field_total":12,"seniorities":13,"topics":17,"specs":130,"samples":147},"game-dev","Game Development","","gp-character-controller-movement","Gp Character Controller Movement","en",75,2850,[14,15,16],"junior","mid","senior",[18,21,24,27,30,33,36,39,42,45,48,51,54,57,60,63,66,69,70,73,76,79,82,85,88,91,94,97,100,103,106,109,112,115,118,121,124,127],{"key":19,"name":20,"count":11},"game-ai-pathfinding","Game Ai Pathfinding",{"key":22,"name":23,"count":11},"game-input-audio","Game Input Audio",{"key":25,"name":26,"count":11},"game-loop-fundamentals","Game Loop Fundamentals",{"key":28,"name":29,"count":11},"game-networking-multiplayer","Game Networking Multiplayer",{"key":31,"name":32,"count":11},"game-performance-optimization","Game Performance Optimization",{"key":34,"name":35,"count":11},"game-physics-collision","Game Physics Collision",{"key":37,"name":38,"count":11},"game-rendering-pipeline","Game Rendering Pipeline",{"key":40,"name":41,"count":11},"game-state-management","Game State Management",{"key":43,"name":44,"count":11},"gfx-forward-deferred-architectures","Gfx Forward Deferred Architectures",{"key":46,"name":47,"count":11},"gfx-gpu-pipeline-stages","Gfx Gpu Pipeline Stages",{"key":49,"name":50,"count":11},"gfx-post-processing-aa-hdr","Gfx Post Processing Aa Hdr",{"key":52,"name":53,"count":11},"gfx-shading-lighting-pbr","Gfx Shading Lighting Pbr",{"key":55,"name":56,"count":11},"gfx-shadows-depth-precision","Gfx Shadows Depth Precision",{"key":58,"name":59,"count":11},"gfx-textures-sampling-compression","Gfx Textures Sampling Compression",{"key":61,"name":62,"count":11},"gp-ability-cooldown-damage","Gp Ability Cooldown Damage",{"key":64,"name":65,"count":11},"gp-animation-state-locomotion","Gp Animation State Locomotion",{"key":67,"name":68,"count":11},"gp-camera-follow-targeting","Gp Camera Follow Targeting",{"key":8,"name":9,"count":11},{"key":71,"name":72,"count":11},"gp-frame-windows-game-feel","Gp Frame Windows Game Feel",{"key":74,"name":75,"count":11},"gp-interaction-detection-triggers","Gp Interaction Detection Triggers",{"key":77,"name":78,"count":11},"nc-rollback-determinism","Nc Rollback Determinism",{"key":80,"name":81,"count":11},"nc-security-protocol","Nc Security Protocol",{"key":83,"name":84,"count":11},"nc-serialization-bandwidth","Nc Serialization Bandwidth",{"key":86,"name":87,"count":11},"nc-time-sync-tick","Nc Time Sync Tick",{"key":89,"name":90,"count":11},"nc-topology-nat-relay","Nc Topology Nat Relay",{"key":92,"name":93,"count":11},"nc-transport-reliability","Nc Transport Reliability",{"key":95,"name":96,"count":11},"ue-actor-component-lifecycle","Ue Actor Component Lifecycle",{"key":98,"name":99,"count":11},"ue-blueprint-cpp-interop","Ue Blueprint Cpp Interop",{"key":101,"name":102,"count":11},"ue-containers-strings-memory","Ue Containers Strings Memory",{"key":104,"name":105,"count":11},"ue-gameplay-framework-classes","Ue Gameplay Framework Classes",{"key":107,"name":108,"count":11},"ue-modules-build-packaging","Ue Modules Build Packaging",{"key":110,"name":111,"count":11},"ue-uobject-reflection-gc","Ue Uobject Reflection Gc",{"key":113,"name":114,"count":11},"un-csharp-memory-gc-performance","Un Csharp Memory Gc Performance",{"key":116,"name":117,"count":11},"un-gameobject-component-transform","Un Gameobject Component Transform",{"key":119,"name":120,"count":11},"un-jobs-burst-dots-basics","Un Jobs Burst Dots Basics",{"key":122,"name":123,"count":11},"un-monobehaviour-lifecycle-execution-order","Un Monobehaviour Lifecycle Execution Order",{"key":125,"name":126,"count":11},"un-prefabs-instantiate-pooling-addressables","Un Prefabs Instantiate Pooling Addressables",{"key":128,"name":129,"count":11},"un-scriptableobject-serialization","Un Scriptableobject Serialization",[131,135,138,141,144],{"key":132,"name":133,"count":134},"gameplay","Gameplay",450,{"key":136,"name":137,"count":134},"graphics-rendering","Graphics \u002F Rendering",{"key":139,"name":140,"count":134},"multiplayer-netcode","Multiplayer \u002F Netcode",{"key":142,"name":143,"count":134},"unity-csharp","Unity (C#)",{"key":145,"name":146,"count":134},"unreal-cpp","Unreal (C++)",[148,166,180,193,207,220],{"id":149,"topic":9,"difficulty":150,"body":151,"options":152,"correct_key":160,"explanation":165},"01a034ec-0cb6-735c-b162-a2ca04d9f9e7",1,"A character controller commonly checks whether it is standing on ground by casting a short probe (a ray or small sweep) straight down from its base each step. What does the resulting hit's surface normal let the controller compute?",[153,156,159,162],{"key":154,"text":155},"a","The friction coefficient of the surface",{"key":157,"text":158},"b","The distance to the next obstacle",{"key":160,"text":161},"c","The slope angle of the surface",{"key":163,"text":164},"d","The mass of the surface object","The hit normal is compared against the world-up vector (the angle whose cosine is their dot product) to get the surface slope angle, which then feeds walkable\u002Fnon-walkable and sliding decisions. (a) needs a separate material lookup, not geometry. (b) is a distance, not something a normal encodes. (d) needs a physical mass property a normal doesn't carry.",{"id":167,"topic":9,"difficulty":168,"body":169,"options":170,"correct_key":157,"explanation":179},"01a034ec-0ccb-7cf6-9534-b70d7e0b65fa",3,"A controller's ground check uses a straight-down ray of a fixed short length from the character's feet. While the character walks down a steep ramp at speed, testers report brief, repeated 'airborne' flickers even though the character never actually leaves the ramp. What is the most likely cause?",[171,173,175,177],{"key":154,"text":172},"Gaps between the ramp's collision triangles",{"key":157,"text":174},"The ray falling short of the downhill slope surface",{"key":160,"text":176},"The ray being cast upward instead of downward",{"key":163,"text":178},"The forward speed exceeding the physics step's limit","On a downward slope, the surface drops away faster than it does on flat ground for the same forward travel, so a ray sized for flat-ground clearance can end each step above the ramp surface, missing the hit and briefly reporting airborne. (a) is a content bug unrelated to slope motion. (c) describes a broken query, not a flicker pattern tied to slope. (d) isn't how this kind of miss happens; it's a geometric clearance issue, not a step-size cap.",{"id":181,"topic":9,"difficulty":150,"body":182,"options":183,"correct_key":154,"explanation":192},"01a034ec-0ced-742a-bb44-37b673961c7f","Compared to a single straight-down ray, what practical advantage does using a small sphere or capsule sweep for ground detection give a character controller?",[184,186,188,190],{"key":154,"text":185},"It samples a small area instead of a point",{"key":157,"text":187},"It removes the need for a surface normal",{"key":160,"text":189},"It guarantees ground contact on every slope",{"key":163,"text":191},"It computes horizontal speed automatically","A sweep has width, so it checks an area rather than a single infinitely thin line; this makes it more forgiving of small ledges, seams, or the character standing near an edge, where a single ray could slip through a gap. (b) is false, the sweep still returns a normal. (c) overstates it: slope limits and other conditions can still break contact. (d) is unrelated to ground detection.",{"id":194,"topic":9,"difficulty":195,"body":196,"options":197,"correct_key":163,"explanation":206},"01a034ec-0cfc-7376-9639-3a17ffc7eb90",2,"A controller stores a boolean 'grounded' state each step based on that step's ground check. Why is it common to also keep the last measured ground normal for the single step in which grounded becomes false, rather than discarding it immediately?",[198,200,202,204],{"key":154,"text":199},"The normal is needed for the character's shadow",{"key":157,"text":201},"The physics engine requires it for the next collision",{"key":160,"text":203},"It lets the controller skip the next ground check",{"key":163,"text":205},"Same-step movement code may still need that normal","Some controller logic, such as clamping movement to a slope's plane or deciding whether the character should slide, runs using the ground normal from the same step; keeping the last value avoids that logic seeing a sudden null right when the state flips. (a) is unrelated, shadows use their own geometry pass. (b) isn't a physics engine requirement, it's controller-side bookkeeping. (c) is false, the next step still needs its own fresh check.",{"id":208,"topic":9,"difficulty":150,"body":209,"options":210,"correct_key":157,"explanation":219},"01a034ec-0d00-726f-b95f-0186952a6ee2","A platformer controller implements 'coyote time': for a short grace window after the character walks off a ledge with no jump input, a jump press still counts as a valid ground jump. What problem does this solve?",[211,213,215,217],{"key":154,"text":212},"Accidental falls off ledges",{"key":157,"text":214},"A slightly late jump input",{"key":160,"text":216},"Low maximum jump height near ledges",{"key":163,"text":218},"The need for a ground check while airborne","Players perceive 'I was still on the ledge' slightly later than the exact frame contact is lost, so a strict same-frame-only rule feels unresponsive; a brief grace window absorbs that perception gap. (a) is false, the character still falls, jumping is just still allowed briefly. (c) is unrelated, the grace window doesn't change jump height. (d) is false, ground checks keep running normally.",{"id":221,"topic":9,"difficulty":195,"body":222,"options":223,"correct_key":154,"explanation":232},"01a034ec-0d0f-7db2-b3b1-be9096de04c4","Two common ways to give variable jump height (a quick tap jumps low, a held press jumps high) are: (1) cutting the upward velocity when the jump button is released, and (2) applying stronger gravity while ascending if the button is not held. What is the main mechanical difference between them?",[224,226,228,230],{"key":154,"text":225},"(1) acts once; (2) acts continuously",{"key":157,"text":227},"(1) only functions without gravity present",{"key":160,"text":229},"(2) requires removing the jump button entirely",{"key":163,"text":231},"(1) only applies to the character's first jump","Velocity-cut is a one-time edit applied at the moment of release; gravity-scaling instead keeps modifying the acceleration applied every step while ascending and the button is up, producing a smoother, more continuously adjustable arc. (b) is false, both work under normal gravity. (c) is false, gravity-scaling still reads button state. (d) is an arbitrary restriction with no mechanical basis.",{"fields":234,"seniorities":446,"interview_shapes":447,"locales":452,"oauth":454,"question_count":457,"coach_enabled":458,"jd_match_enabled":458},[235,260,280,296,320,333,352,371,393,412,427,437],{"key":236,"name_tr":237,"name_en":237,"sort":150,"specializations":238},"backend","Backend",[239,242,245,248,251,254,257],{"key":240,"name":241,"field":236},"general","Genel",{"key":243,"name":244,"field":236},"go","Go",{"key":246,"name":247,"field":236},"python","Python",{"key":249,"name":250,"field":236},"java","Java",{"key":252,"name":253,"field":236},"csharp","C#\u002F.NET",{"key":255,"name":256,"field":236},"nodejs","Node.js",{"key":258,"name":259,"field":236},"php","PHP",{"key":261,"name_tr":262,"name_en":262,"sort":195,"specializations":263},"frontend","Frontend",[264,265,268,271,274,277],{"key":240,"name":241,"field":261},{"key":266,"name":267,"field":261},"javascript","JavaScript",{"key":269,"name":270,"field":261},"typescript","TypeScript",{"key":272,"name":273,"field":261},"react","React",{"key":275,"name":276,"field":261},"vue","Vue",{"key":278,"name":279,"field":261},"angular","Angular",{"key":281,"name_tr":282,"name_en":282,"sort":168,"specializations":283},"fullstack","Fullstack",[284,285,286,287,288,289,290,291,292,293,294,295],{"key":240,"name":241,"field":281},{"key":243,"name":244,"field":236},{"key":246,"name":247,"field":236},{"key":249,"name":250,"field":236},{"key":252,"name":253,"field":236},{"key":255,"name":256,"field":236},{"key":258,"name":259,"field":236},{"key":266,"name":267,"field":261},{"key":269,"name":270,"field":261},{"key":272,"name":273,"field":261},{"key":275,"name":276,"field":261},{"key":278,"name":279,"field":261},{"key":297,"name_tr":298,"name_en":298,"sort":299,"specializations":300},"devops-cloud","DevOps \u002F Cloud",4,[301,302,305,308,311,314,317],{"key":240,"name":241,"field":297},{"key":303,"name":304,"field":297},"aws","AWS",{"key":306,"name":307,"field":297},"gcp","GCP",{"key":309,"name":310,"field":297},"azure","Azure",{"key":312,"name":313,"field":297},"kubernetes","Kubernetes",{"key":315,"name":316,"field":297},"terraform","Terraform",{"key":318,"name":319,"field":297},"linux","Linux",{"key":321,"name_tr":322,"name_en":322,"sort":323,"specializations":324},"ai-engineer","AI Engineer",5,[325,326,327,330],{"key":240,"name":241,"field":321},{"key":246,"name":247,"field":321},{"key":328,"name":329,"field":321},"llm-rag","LLM\u002FRAG",{"key":331,"name":332,"field":321},"mlops","MLOps",{"key":334,"name_tr":335,"name_en":336,"sort":337,"specializations":338},"database","Veritabanı","Database",6,[339,340,343,346,349],{"key":240,"name":241,"field":334},{"key":341,"name":342,"field":334},"postgresql","PostgreSQL",{"key":344,"name":345,"field":334},"mysql","MySQL",{"key":347,"name":348,"field":334},"mongodb","MongoDB",{"key":350,"name":351,"field":334},"redis","Redis",{"key":353,"name_tr":354,"name_en":355,"sort":356,"specializations":357},"mobile","Mobil","Mobile",7,[358,359,362,365,368],{"key":240,"name":241,"field":353},{"key":360,"name":361,"field":353},"ios-swift","iOS (Swift)",{"key":363,"name":364,"field":353},"android-kotlin","Android (Kotlin)",{"key":366,"name":367,"field":353},"flutter","Flutter",{"key":369,"name":370,"field":353},"react-native","React Native",{"key":372,"name_tr":373,"name_en":374,"sort":375,"specializations":376},"security","Güvenlik","Security",8,[377,378,381,384,387,390],{"key":240,"name":241,"field":372},{"key":379,"name":380,"field":372},"appsec","AppSec",{"key":382,"name":383,"field":372},"offensive-pentest","Offensive \u002F Pentest",{"key":385,"name":386,"field":372},"cloud-security","Cloud Security",{"key":388,"name":389,"field":372},"devsecops","DevSecOps",{"key":391,"name":392,"field":372},"blue-team-incident","Blue Team \u002F Incident",{"key":394,"name_tr":395,"name_en":396,"sort":397,"specializations":398},"qa-test-automation","QA \u002F Test Otomasyonu","QA \u002F Test Automation",9,[399,400,403,406,409],{"key":240,"name":241,"field":394},{"key":401,"name":402,"field":394},"test-automation","Test Automation",{"key":404,"name":405,"field":394},"sdet","SDET",{"key":407,"name":408,"field":394},"performance-testing","Performance Testing",{"key":410,"name":411,"field":394},"mobile-qa","Mobile QA",{"key":413,"name_tr":414,"name_en":414,"sort":415,"specializations":416},"data-engineer","Data Engineer",10,[417,418,421,424],{"key":240,"name":241,"field":413},{"key":419,"name":420,"field":413},"pipelines-etl","Pipelines \u002F ETL",{"key":422,"name":423,"field":413},"streaming","Streaming",{"key":425,"name":426,"field":413},"warehousing","Warehousing",{"key":5,"name_tr":428,"name_en":6,"sort":429,"specializations":430},"Oyun Geliştirme",11,[431,432,433,434,435,436],{"key":240,"name":241,"field":5},{"key":142,"name":143,"field":5},{"key":145,"name":146,"field":5},{"key":132,"name":133,"field":5},{"key":136,"name":137,"field":5},{"key":139,"name":140,"field":5},{"key":438,"name_tr":439,"name_en":439,"sort":440,"specializations":441},"ml-engineer","ML Engineer",12,[442,443],{"key":240,"name":241,"field":438},{"key":444,"name":445,"field":438},"classical-ml","Classical ML",[14,15,16],{"junior":448,"mid":450,"senior":451},{"questions":449,"median_sec":3},20,{"questions":449,"median_sec":3},{"questions":449,"median_sec":3},[453,10],"tr",[455,456],"google","github",27600,true]