ኣብዚ ጽሑፍ፡ ንነፍሲ ወከፍ ስጉምቲ ምውቃርን ምምሕያሽን መቆጻጸሪታት ብዕምቆት ብምምርማር፡ ኣብ ዩኒቲ ን2D ፕላትፎርመር ዝኸውን ናይ ገጸ ባህርያት ተቖጻጻሪ ምምዕባል ቀጺልና ኣለና። ኣብ ዝሓለፈ ጽሑፍ “ ”፡ ከመይ ጌርካ መሰረት ናይቲ ገጸ ባህሪ ትፈጥር፡ ኣካላዊ ባህርያቱን መሰረታዊ ምንቅስቓሱን ሓዊስካ ብዝርዝር ተዛሪብና ኔርና። ሕጂ፡ ናብ ዝያዳ ምዕቡል መዳያት፡ ከም ኣተሓሕዛ እታዎታትን ዳይናሚክ ካሜራ ምክትታልን ክንሰግር ግዜኡ እዩ። ከመይ ጌርና 2D Character Controller ኣብ ሓድነት ንፈጥር፡ 1ይ ክፋል ኣብዚ ጽሑፍ፡ ኣብ ምድላው ሓድሽ ስርዓተ ምእታው ዩኒቲ፡ ነቲ ገጸ ባህሪ ንምቁጽጻር ንጡፍ ተግባራት ምፍጣር፡ ምዝላል ምኽኣልን ንትእዛዛት ተጻወትቲ ግቡእ ምላሽ ምርግጋጽን ዕምቆት ክንርኢ ኢና። ኩሉ እቲ ኣብዚ ጽሑፍ ተገሊጹ ዘሎ ለውጥታት ባዕልኻ ከተተግብሮ እንተደሊኻ፡ ነቲ መሰረት ናይዚ ጽሑፍ ዝሓዘ “ ” ዝብል ጨንፈር መኽዘን ከተውርድ ትኽእል ኢኻ። ከም ኣማራጺ ድማ፡ ነቲ “ ” ዝብል ጨንፈር ምስቲ ናይ መወዳእታ ውጽኢት ከተውርድዎ ትኽእሉ ኢኹም። ኣካል ገጸ ባህርያት Character Controller ምድላው ስርዓተ ምእታው ቅድሚ ንባህርያትና ንምቁጽጻር ኮድ ምጽሓፍ ምጅማርና፡ ኣብቲ ፕሮጀክት ዘሎ ስርዓተ ምእታው ክንውቅሮ ኣለና። ንናይ ፕላትፎርመርና፡ ቅድሚ ገለ ዓመታት ዝተኣታተወ ሓድሽ ናይ ዩኒቲ ኢንፑት ሲስተም መሪጽና ኣለና፡ እዚ ድማ ካብቲ ባህላዊ ስርዓት ብዘለዎ ብልጫታት ኣገዳሲ ኮይኑ ይቕጽል ኣሎ። ስርዓት እታው ዝያዳ ሞዱላርን ተዓጻጻፍን ኣገባብ ኣተሓሕዛ እታዎታት የቕርብ፣ እዚ ድማ ንዝተፈላለዩ መሳርሒታት ብቐሊሉ ቁጽጽር ከቕውሙን ብዘይ ተወሳኺ ናይ ኣተገባብራ ልዕሊ ዋጋ ዝያዳ ዝተሓላለኹ ናይ ምእታው ስናርዮታት ክድግፉን የኽእሎም። መጀመርታ Input System package ንጽዓኖ። ካብቲ ቀንዲ ዝርዝር መስኮት → ኣመሓዳሪ ዕሹግ ብምምራጽ ኣመሓዳሪ ፓኬጅ ክፈቶ። ኣብቲ Unity Registry ዝብል ክፍሊ "Input System" ዝብል ፓኬጅ ረኺብና "Install" ዝብል ጠውቕ። ቀጺልና ብመንገዲ Edit → Project Settings ዝብል ዝርዝር ናብቲ ናይ ፕሮጀክት ቅጥዕታት ንኺድ። ነቲ Player ዝብል ትብ ምረጽ፡ ነቲ Active Input Handling ዝብል ክፍሊ ረኺብካ፡ ናብ "Input System Package (New) ኣቐምጦ። ነዞም ስጉምትታት ምስ ወዳእካ፡ ዩኒቲ ዳግማይ ክትጅምር ክሕብረካ እዩ። ዳግማይ ምስ ተጀመረ ኩሉ ንካፕቴንና መቆጻጸሪታት ንምውቃር ድሉው ክኸውን እዩ። ምፍጣር ናይ ምእታው ተግባራት ኣብቲ ኣቃፊራ፡ ብመንገዲ እቲ ቀንዲ ዝርዝር ፍጠር። ነቲ ፋይል "Controls" ኢልካ ስመዮ። ናይ ቅጥዕታት ፡ ንብረት → ምፍጣር → ተግባራት ምእታው፡ ተግባራት ምእታው ዩኒቲ ኢንፑት ሲስተም ሓያልን ተዓጻጻፍን ናይ ምእታው ምሕደራ መሳርሒ ኮይኑ፡ ዲቨሎፐራት ንገጸ ባህርያትን ናይ ጸወታ ባእታታትን መቆጻጸሪታት ክውቅሩ ዘኽእሎም እዩ። ዝተፈላለዩ ናይ ምእታው መሳርሒታት ይድግፍ። እቶም እትፈጥሮም Input Actions ማእከላይ ምሕደራ እታዎት ይህቡ፣ ንኣወዳድባ የቃልሉን ነቲ መተሓላለፊ ዝያዳ ንጹር ይገብሮን። ንኣርትዖት ንምኽፋት ነቲ ፋይል ድርብ ጠውቕ፣ "Character" ዝብል ስም ዘለዎ ንመቆጻጸሪ ፊደላት ወስኸሉ። Controls Action Map ካርታ ተግባር ኣብ ሓድነት ኣብቲ ጸወታ ፍሉይ ዕማማት ንምፍጻም ምስ ዝተፈላለዩ ተቖጻጸርትን መፍትሕን ክተሓሓዝ ዝኽእል እኩብ ተግባራት እዩ። ንመቆጻጸሪታት ንምውዳብ ውጽኢታዊ መንገዲ ኮይኑ፡ ዲቨሎፐራት ኮድ ዳግማይ ከይጸሓፉ እታዎታት ክምድቡን ከስተኻኽሉን የኽእሎም። ንዝያዳ ዝርዝር ሓበሬታ፡ ኣብ ወግዓዊ ተወከስ ። ሰነድ ስርዓተ ምእታው እቲ ቀዳማይ ተግባር "ምንቅስቓስ" ክበሃል እዩ። እዚ ተግባር እዚ ኣንፈት ምንቅስቓስ ናይቲ ገጸ ባህሪ ክገልጽ እዩ። ንኣርባዕተ ኣንፈት ምንቅስቓስ ንምኽኣል ናብ "ዋጋ" ድማ ናብ "ቬክተር2" ኣቐምጦ። ንዓይነት ተግባር ንዓይነት ቁጽጽር Add Up/Down/Right/Left Composite ብምምራጽን ነቶም ፍሉጣት ናይ WASD መፍትሕታት ናብ በብኣንፈቶም ብምምዳብን ነዚ ተግባር መእሰሪታት ምምዳብ። ብምጥዋቕ ቅጥዕታትካ ምዕቃብ ኣይትረስዕ። እዚ ኣወዳድባ እዚ ን"Move" ዝብል ተግባር ዝኸውን መእሰሪታት ዳግማይ ክትምድብ ከም እትኽእል የረጋግጽ፣ ንኣብነት ናብ መፍትሕ ፍላጻታት ወይ ውን ዋላ ናብ ጆይስቲክ ጌምፓድ። ንብረት ምዕቃብ ቀጺልና ሓድሽ ተግባር ወስኸሉ — "ዘለል"። ከም "መጠወቒ" ጌርካ ምሓዝ፣ ግን ሓድሽ — "Press" ወስኸሉ፣ ከምኡውን ናብ "Press And Release" ኣቐምጦ፣ ምኽንያቱ ንኽልቲኡ ምጽቃጥን ምፍታሕን መጠወቒ ክንሕዝ ስለዘድልየና። ዓይነት ተግባር Interaction Trigger Behavior እዚ ድማ ነቲ ናይ ገጸ ባህርያት ምቁጽጻር ስልቲ ይውድኦ። እቲ ዝቕጽል ስጉምቲ ነዞም ተግባራት ንምሕላው ሓደ ክፍሊ ምጽሓፍ እዩ። ነቲ ገጸ ባህሪ ንጸጋምን ንየማንን ምንቅስቓስ ንመቆጻጸሪ ገጸ ባህርያት ዝፈጠርናዮ Input Actions ምስቲ ክፍሊ ከነተሓሕዞ ግዜኡ በጺሑ ኣሎ፣ እዚ ድማ እቲ ገጸ ባህሪ ብመሰረት ትእዛዛት ምቁጽጻርና ብንጥፈት ኣብ ልዕሊ እቲ ትርኢት ንኽንቀሳቐስ የኽእሎ። CharacterBody ነዚ ንምግባር ድማ ንመቆጻጸሪ ምንቅስቓስ ሓላፍነት ዝስከም ስክሪፕት ፈጢርና ንንጹርነት ኢልና ክንሰምዮ ኢና። ኣብዚ ስክሪፕት መጀመርታ ገለ መሰረታዊ ዓውድታት ክንገልጽ ኢና። ነቲ ዝበሃል ክፍሊ መወከሲ ክንውስኸሉ ኢና ፡ እዚ ድማ ብቐጥታ ብስክሪፕት ክቆጻጸር እዩ። CharacterController CharacterBody _characterBody ብተወሳኺ ንፍጥነት ምንቅስቓስ ናይቲ ገጸ ባህሪ ( )ን ቁመት ዝላ ( )ን መለክዒታት ከነቐምጥ ኢና። ብተወሳኺ ዕላማ ናይቲ ዝብል ዓውዲ ክንገልጽ ኢና። _speed _jumpHeight _stopJumpFactor ኣብ ብዙሓት 2D ፕላትፎርመርስ ቁመት ዝላ ክቆጻጸር ከም ዝኽእል ኣስተብሂልኩም ትኾኑ። እቲ ናይ ዘላሊ መጠወቒ ብዝነውሐ መጠን ብዝተሓዝ መጠን እቲ ገጸ ባህሪ ዝለዓለ ይዘልል። ብመሰረቱ ኣብ መጀመርታ እቲ ዝላ ናይ መጀመርታ ንላዕሊ ዝወስድ ፍጥነት ይትግበር፣ እዚ ፍጥነት ድማ እቲ መጠወቒ ምስ ዝፍታሕ ይንኪ። ነቲ ናይ ምዝላል መጠወቒ ምስ ፈታሕካ እቲ ንላዕሊ ዝወስድ ፍጥነት ክንደይ ከም ዝንኪ ይውስን። _stopJumpFactor ኣብነት ናይቲ ክንጽሕፎ ዝግበኣና ኮድ እንሆ፤ // CharacterController.cs public class CharacterController : MonoBehaviour { [SerializeField] private CharacterBody _characterBody; [Min(0)] [SerializeField] private float _speed = 5; [Min(0)] [SerializeField] private float _jumpHeight = 2.5f; [Min(1)] [SerializeField] private float _stopJumpFactor = 2.5f; } ቀጺልና ነቲ ገጸ ባህሪ ንጸጋምን የማንን ናይ ምንቅስቓስ ክእለት ክንተግብር ኢና። እቲ ገጸ ባህሪ ነቲ ናይ ምንቅስቓስ መጠወቒ ክትሕዞ ከለኻ፡ ዕንቅፋታት ብዘየገድስ፡ ነቲ ዝተወሰነ ፍጥነት ምንቅስቓስ ክሕሉ ኣለዎ። ነዚ ንምዕዋት፡ ኣብቲ ስክሪፕት ሓደ ተለዋዋጢ ክንውስኽ ኢና፡ ነቲ ሕጂ ዘሎ ፍጥነት ምንቅስቓስ ኣብ ልዕሊ እቲ ገጽ (ወይ ድማ እቲ ገጸ ባህሪ ኣብ ኣየር ክህሉ ከሎ ብቐሊሉ ብኣግማድ) ክንዕቅቦ ኢና፤ // CharacterController.cs private float _locomotionVelocity; ኣብቲ ክፍሊ ነዚ ፍጥነት ንምቕማጥ ዝሕግዝ ሜላ ከነተኣታቱ ኢና፤ CharacterBody // CharacterBody.cs public void SetLocomotionVelocity(float locomotionVelocity) { Velocity = new Vector2(locomotionVelocity, _velocity.y); } ጸወታና ቁልቁል ዝኣፉ ገጽ ስለዘይብሉ እዚ ኣገባብ እዚ ኣዝዩ ቀሊል እዩ። ኣብ ዝያዳ ዝተሓላለኸ ተርእዮታት፡ ንኹነታት ኣካላትን ቁልቁለት ገጽን ምሕሳብ ምተገደድና። ንሕጂ ግን ነቲ ቀጥታዊ ባእታ ናይቲ ፍጥነት ጥራይ ኢና ንዕቅቦ፡ ነቲ ልኡል ኮርዲኔት ጥራይ እናቐየርና። x ቀጺልና ነዚ ዋጋ ኣብ method ኣብ ነፍሲ ወከፍ ፍሬም ክንሰርዖ ኢና፤ Update // CharacterController.cs private void Update() { _characterBody.SetLocomotionVelocity(_locomotionVelocity); } ካብ Input Action ዝመጽእ ምልክታት ንምሕላው ዝሕግዝ ሜላ ክንገልጽ ኢና፤ Move // CharacterController.cs public void OnMove(InputAction.CallbackContext context) { var value = context.ReadValue<Vector2>(); _locomotionVelocity = value.x * _speed; } እቲ ዝብል ተግባር ከም ስለዝግለጽ፡ እቲ ዓውደ-ጽሑፍ ከከም ኣየኖት መፍትሕታት ከምዝተጸቕጡ ወይ ከምዝተለቐቑ ናይ ቬክተር ዋጋ ክህብ እዩ። ንኣብነት፡ መፍትሕ ምጽቃጥ፡ እቲ ሜላ ነቲ ቬክተር (1, 0) ክቕበል እዩ። ንኽልቲኦም ን ን ብሓንሳብ ምጽቃጥ (1, 1) ይኸውን። ኩሎም መፍትሕታት ምፍታሕ ብዋጋ (0, 0) ክጅምር እዩ። Move Vector2 D OnMove D W OnMove ንመፍትሕ ፡ እቲ ቬክተር (-1, 0) ክኸውን እዩ። ኣብ ኣገባብ ነቲ ልኡል ባእታ ናይቲ ዝተቐበለ ቬክተር ወሲድና በቲ ዝተወሰነ ፍጥነት ምንቅስቓስ ንባዝሖ። A OnMove _speed ነቲ ገጸ ባህሪ ክዘልል ምምሃር መጀመርታ ነቲ ዝበሃል ክፍሊ ምዝላል ንምሕላው ክንምህሮ ኣለና። ነዚ ንምግባር ድማ ነቲ ዝላ ሓላፍነት ዝስከም ሜላ ክንውስኽ ኢና፤ CharacterBody // CharacterBody.cs public void Jump(float jumpSpeed) { Velocity = new Vector2(_velocity.x, jumpSpeed); State = CharacterState.Airborne; } ኣብ ጉዳይና እዚ ኣገባብ ቀጥታዊ እዩ: ነቲ ቀጥታዊ ፍጥነት የቐምጦ እሞ ብኡንብኡ ንኹነታት ናይቲ ገጸ ባህሪ ናብ ይቕይሮ። Airborne ቀጺልና፡ እቲ ገጸ ባህሪ ክዘልል ዘለዎ ፍጥነት ክንውስን ኣለና። ድሮ ቁመት ዝላ ገሊጽናዮ ኣለና፡ ስሕበት ድማ ብቐጻሊ ኣብ ኣካላት ከም ዝሰርሕ ንፈልጥ ኢና። ካብዚ ብምብጋስ እቲ ናይ መጀመርታ ፍጥነት ዝላ ነዚ ቀመር ተጠቒምካ ክሕሰብ ይከኣል፤ ኣብዚ ቁመት ዝላ ኮይኑ ድማ ምቅልጣፍ ስሕበት እዩ። ኣብቲ ዝበሃል ክፍሊ ዝርከብ ናይ ስሕበት መባዛሒ እውን ክንሕተተሉ ኢና። ንመጀመርታ ፍጥነት ዝላ ንምግላጽ ሓድሽ ሜዳ ክንውስኽን ከምዚ ዝስዕብ ክንሕስቦን ኢና፤ h ፡ g CharacterBody // CharacterController.cs private float _jumpSpeed; private void Awake() { _jumpSpeed = Mathf.Sqrt(2 * Physics2D.gravity.magnitude * _characterBody.GravityFactor * _jumpHeight); } እቲ ገጸ ባህሪ ኣብዚ እዋን እዚ ይዘልል ድዩ ኣይዘልልን ንምክትታል ካልእ ዓውዲ ከድልየና እዩ፣ ስለዚ ኣብቲ ዝግባእ ግዜ ፍጥነት ዝላ ክንድርቶ ንኽእል። ብተወሳኺ እቲ ተጻዋታይ ክሳብ ዝዓልብ ነቲ ናይ ምዝላል መጠወቒ እንተሓዚሉ ነዛ ባንዴራ ባዕልና ዳግማይ ክንሰርሓ ይግባእ ። እዚ ኣብቲ ዝብል ኣገባብ ክግበር እዩ፤ Update // CharacterController.cs private bool _isJumping; private void Update() { if (_characterBody.State == CharacterState.Grounded) { _isJumping = false; } //... } ሕጂ፡ ነቲ ተግባር ንምሕላው ዝሕግዝ ሜላ ንጽሓፍ፤ Jump // CharacterController.cs public void OnJump(InputAction.CallbackContext context) { if (context.started) { Jump(); } else if (context.canceled) { StopJumping(); } } እቲ ዝብል ተግባር መጠወቒ ስለዝኾነ፡ እቲ መጠወቒ ምጽቃጥ ጀሚሩ ( ) ወይ ተዛዚሙ ( ) ካብቲ ዓውዲ ክንውስን ንኽእል። ካብዚ ብምብጋስ ወይ ነቲ ዝላ ነበግሶ ወይ ድማ ነቋርጾ። Jump context.started context.canceled ነቲ ዝላ ንምፍጻም ዝሕግዝ ሜላ ኣብዚ ኣሎ፤ // CharacterController.cs private void Jump() { if (_characterBody.State == CharacterState.Grounded) { _isJumping = true; _characterBody.Jump(_jumpSpeed); } } ቅድሚ ምዝላልና፡ እቲ ገጸ ባህሪ ኣብ መሬት እንተሃልዩ ንምርግጋጽ። ከምኡ እንተኾይኑ ድማ ዝብል ባንዴራ ኣቐሚጥና ነቲ ኣካል ብ_ ከም ዝዘልል ንገብሮ። _isJumping _jumpSpeed ሕጂ፡ ነቲ ደው ምባል ዝዘልል ባህሪ ነተግብሮ፤ // CharacterController.cs private void StopJumping() { var velocity = _characterBody.Velocity; if (_isJumping && velocity.y > 0) { _isJumping = false; _characterBody.Velocity = new Vector2( velocity.x, velocity.y / _stopJumpFactor); } } ነቲ ዝላ ደው ንብሎ ዝብል ባንዴራ ንጡፍ ምስ ዝኸውን ጥራይ እዩ። ካልእ ኣገዳሲ ኩነታት ድማ እቲ ገጸ ባህሪ ንላዕሊ ዝኸይድ ክኸውን ኣለዎ። እዚ ድማ ንታሕቲ እናተጓዓዝካ እቲ ናይ ዝላ መጠወቒ እንተተለቒቑ ፍጥነት ውድቀት ከይድርት ይከላኸል። ኩሎም ኩነታት እንተተማሊኦም፡ ነቲ ባንዴራ ዳግማይ ንሰርዖን ነቲ ቀጥታዊ ፍጥነት ብ ረቛሒ ንጉድሎን። _isJumping _isJumping _stopJumpFactor ምድላው ናይቲ ገጸ ባህሪ ሕጂ ኩሎም ኣካላት ድሉዋት ምስ ዝኾኑ ን ዝበሃሉ ኣካላት ኣብቲ ኣብቲ scene ዘሎ object ንውስኾ። ነቲ ን3D ፊደላት ንምቁጽጻር ዝተዳለወ ስታንዳርድ ኣሃዱ ኣሃዱ ዘይኮነስ ነቲ ዝፈጠርናዮ component ምምራጽካ ኣረጋግጽ። PlayerInput CharacterController Captain CharacterController ን ፡ ነቲ ዝጸንሐ ክፍሊ ካብቲ ፊደል ምደቦ። ን ፡ ነቲ ኣቐዲሙ ዝተፈጥረ ኣብቲ ዝብል ዓውዲ ኣቐምጦ። CharacterController CharacterBody PlayerInput Controls Actions ቀጺልና ነቲ PlayerInput ዝበሃል ክፍሊ ካብ CharacterController ዝምጥን ሜላታት ንኽጽውዕ ንውቅሮ። ኣብቲ ኣርታዒ ንዘሎ ክፍልታት ፍጻመታትን ገጸ ባህርያትን ኣስፍሕ፣ ነቶም ተዛመድቲ ሜላታት ድማ ምስ ተግባራት ምንቅስቓስን ምዝላልን ኣተሓሕዞም። ሕጂ፡ ኩሉ ነቲ ጸወታ ንምክያድን ኩሎም እቶም ዝተዋቕሩ ኣካላት ብኸመይ ብሓባር ከም ዝሰርሑ ንምፍታንን ድሉው ኮይኑ ኣሎ። ምንቅስቓስ ካሜራ ሕጂ፡ ካሜራ ነቲ ገጸ ባህሪ ኣብ ዝኸድዎ ቦታ ክትስዕቦ ክንገብሮ ኣለና። ሓድነት ንኣመራርሓ ካሜራ ሓያል መሳርሒ ይህብ — ። ሲነማሽን ሲነማሽን ኣብ ዩኒቲ ንምቁጽጻር ካሜራ ዝኸውን ሰውራዊ መፍትሒ ኮይኑ፡ ንደቨሎፐራት ምስ ድሌታት ጸወታ ዝሰማማዕ ዳይናሚክ፡ ጽቡቕ ዝተቓነየ ስርዓታት ካሜራ ንምፍጣር ሰፊሕ ዓቕሚ የቕርብ። እዚ መሳርሒ እዚ፡ ከም ምክትታል ገጸ ባህርያት፡ ኣውቶማቲክ ምትዕርራይ ፎኮስን ካልእ ብዙሕን ዝኣመሰሉ ዝተሓላለኹ ሜላታት ካሜራ ንምትግባር ቀሊል ይገብሮ፡ ኣብ ነፍሲ ወከፍ ትርኢት ህይወትን ሃብትን ይውስኽ። መጀመርታ ኣብቲ scene ዘሎ object ንረክብ እሞ component ንውስኸሉ። Main Camera CinemachineBrain ቀጺልና ኣብቲ ትርኢት ዝበሃል ሓድሽ ነገር ንፍጠር። እዚኣ ልክዕ ከም ፕሮፌሽናል ካሜራማን ንካፕቴን እትስዕብ ካሜራ ክትከውን እያ። ኣብኡ ዝብል ክፍሊ ወስኸሉ። ነቲ ዓውዲ ናብ ካፕቴን ኣቐምጦ፣ for the field ምረጽ፣ ነቲ ዝብል መለክዒ ድማ ናብ 4 ኣቐምጦ። CaptainCamera CinemachineVirtualCamera Follow ዝብል Framing Transposer Body Lens Ortho Size ብተወሳኺ፡ ናይ ካሜራ ኦፍሴት ብተዛማዲ ምስቲ ገጸ ባህሪ ንምግላጽ ካልእ ክፍሊ ከድልየና እዩ — ። ዋጋ ናብ 1.5 ዋጋ ድማ ናብ -15 ኣቐምጦ። CinemachineCameraOffset Y Z ሕጂ፡ ካሜራ ከመይ ጌራ ንባህርያትና ከም እትኽተል ንፈትን። ምሉእ ብምሉእ ጽቡቕ ውጽኢት ዝረኸበ ይመስለኒ። ካሜራ ሓሓሊፋ ቁሩብ ከም እትሽርሽር ኣስተብሂለ። ነዚ ንምእራም ድማ ነቲ Blend Update Method ዝብል ዓውዲ ናይቲ Main Camera object ናብ FixedUpdate ኣቐሚጠዮ። ምምሕያሽ ዝላታት እስከ ነቲ ዝተመሓየሸ መካኒክስ ንፈትኖ። ክትጎዪን ብቐጻሊ ክትዘልልን ፈትን። ምኩራት ተጻወትቲ፡ እቲ ዝላታት ኩሉ ግዜ ከምዘይምዝገብ ከስተብህሉ ይኽእሉ። ኣብ መብዛሕትኡ ጸወታታት እዚ ጉዳይ ኣይኮነን። ንመጠወቒ ዝላ ዳግማይ ንምጽቃጥ ልክዕ ናይ ምዕላብ ግዜ ምግማት ኣጸጋሚ ኮይኑ ተረኺቡ። ተጻወትቲ ቅድሚ ምዕላቦም ቁሩብ ዝላ ክጸቕጡ ብምፍቃድን እቲ ገጸ ባህሪ ምስ ዓለቡ ብቕጽበት ክዘልል ብምግባርን ነቲ ጸወታ ዝያዳ ይቕረ ዝብሎ ክንገብሮ ኣለና። እዚ ባህሪ እዚ ምስቲ ተጻወትቲ ዝለመድዎ ይሰማማዕ። ነዚ ንምትግባር ድማ ሓድሽ ተለዋዋጢ ከነተኣታቱ ኢና፡ እዚ ድማ ነቲ ዕድል እንተተፈጢሩ ገና ዝላ ክጅምር ዝኽእል መስኮት ግዜ ዝውክል እዩ። _jumpActionTime // CharacterController.cs [Min(0)] [SerializeField] private float _jumpActionTime = 0.1f; ዝብል ዓውዲ ወሲኸ ኣለኹ፣ እዚ ድማ መወዳእታ ናይቲ ናይ ምዝላል ተግባር መስኮት ዝሕብር እዩ። ብኻልእ ኣዘራርባ ክሳብ ዝበጽሕ እቲ ገጸ ባህሪ ዕድል እንተተፈጢሩ ክዘልል እዩ። ከምኡ ውን action handler update ንገብሮ። _jumpActionEndTime _jumpActionEndTime Jump // CharacterController.cs private float _jumpActionEndTime; public void OnJump(InputAction.CallbackContext context) { if (context.started) { if (_characterBody.State == CharacterState.Grounded) { Jump(); } else { _jumpActionEndTime = Time.unscaledTime + _jumpActionTime; } } else if (context.canceled) { StopJumping(); } } እቲ ናይ ዘላሊ መጠወቒ ምስ ዝጽቀጥ፡ እቲ ገጸ ባህሪ ኣብ መሬት እንተሃልዩ፡ ብኡንብኡ ይዘልሉ። እንተዘይኮይኑ፡ እቲ ዝላ ገና ክፍጸም ዝኽእል ናይ ግዜ መስኮት ንዕቅቦ። ካብቲ ሜላ ባዕሉ ነቲ state check ነወግዶ። Jump Grounded // CharacterController.cs private void Jump() { _isJumping = true; _characterBody.Jump(_jumpSpeed); } ነቲ ደው ምባል ዝዘልል ኣገባብ እውን ክንመዓራረዮ ኢና። እቲ መጠወቒ ቅድሚ ምዕላብ እንተተለቒቑ፡ ዝኾነ ዝላ ክኽሰት የብሉን፡ ስለዚ ዳግማይ ንሰርዖ። _jumpActionEndTime // CharacterController.cs private void StopJumping() { _jumpActionEndTime = 0; //... } መዓስ እቲ ገጸ ባህሪ ከም ዝዓለበ ፈቲሽና ዝላ ከነበግስ ይግባእ? እቲ ኩነታት ኣብ ይስርሕ፣ መስርሕ ተግባር ድማ ድሒሩ ይፍጸም። ይኹን ብዘየገድስ፡ ኣብ መንጎ ምዕላብን ምዝላልን ናይ ሓደ ፍሬም ምድንጓይ ከጋጥም ይኽእል እዩ፡ እዚ ድማ ርኡይ እዩ። CharacterBody FixedUpdate Update FixedUpdate ንመዓልቦ ብቕጽበት መልሲ ንምሃብ ኣብ event ክንውስኽ ኢና። እቲ ቀዳማይ ስነ-ሞጎት እቲ ዝሓለፈ ኩነታት ክኸውን እዩ፣ እቲ ካልኣይ ድማ እቲ ናይ ሕጂ ኩነታት ክኸውን እዩ። CharacterBody StateChanged // CharacterBody.cs public event Action<CharacterState, CharacterState> StateChanged; ነቲ ናይ ግዝኣት ለውጢ ክስተት ንምብጋስ ነቲ ናይ ግዝኣት ምሕደራ ከነስተኻኽሎ ኢና እሞ ዳግማይ ክንጽሕፎ ኢና። FixedUpdate // CharacterBody.cs [field: SerializeField] private CharacterState _state; public CharacterState State { get => _state; private set { if (_state != value) { var previousState = _state; _state = value; StateChanged?.Invoke(previousState, value); } } } ብተወሳኺ ኣብ ከመይ ከም ዝሕዞ ኣጽሪየዮ ኣለኹ። FixedUpdate surfaceHit // CharacterBody.cs private void FixedUpdate() { //... if (_velocity.y <= 0 && slideResults.surfaceHit) { var surfaceHit = slideResults.surfaceHit; Velocity = ClipVector(_velocity, surfaceHit.normal); if (surfaceHit.normal.y >= _minGroundVertical) { State = CharacterState.Grounded; return; } } State = CharacterState.Airborne; } ኣብ ፡ ኣብቲ ክስተት ሳብስክራይብ ክንገብር ኢና፡ ሓደ ሃንድለር ድማ ክንውስኽ ኢና። CharacterController StateChanged // CharacterController.cs private void OnEnable() { _characterBody.StateChanged += OnStateChanged; } private void OnDisable() { _characterBody.StateChanged -= OnStateChanged; } private void OnStateChanged(CharacterState previousState, CharacterState state) { if (state == CharacterState.Grounded) { OnGrounded(); } } ነቲ state check ካብ ኣውጺእና ናብ ከነሰጋግሮ ኢና። Grounded Update OnGrounded // CharacterController.cs private void Update() { _characterBody.SetLocomotionVelocity(_locomotionVelocity); } private void OnGrounded() { _isJumping = false; } ሕጂ፡ ዝላ ክጅምር ኣለዎ ድዩ ኣይግባእን ንምርግጋጽ፡ ነቲ ኮድ ወስኸሉ። // CharacterController.cs private void OnGrounded() { _isJumping = false; if (_jumpActionEndTime > Time.unscaledTime) { _jumpActionEndTime = 0; Jump(); } } ካብቲ ሕጂ ዘሎ ሰዓት ዝዓቢ እንተኾይኑ፡ እቲ ናይ ምዝላል መጠወቒ ኣብ ቀረባ እዋን ተጸቒጡ ማለት እዩ፡ ስለዚ ዳግማይ ንሰርዖ እሞ ነቲ ዝላ ንፍጽሞ። _jumpActionEndTime _jumpActionEndTime ሕጂ፡ ምስቲ ገጸ ባህሪ ብቐጻሊ ክትዘልል ፈትን። እቲ ናይ ዘላሊ መጠወቒ ዝያዳ ምላሽ ዝህብ ኮይኑ ከም ዝስምዓካ ከተስተብህል ኢኻ፡ ምቁጽጻር ድማ ነቲ ገጸ ባህሪ ዝያዳ ስሉጥ ከም ዝኸውን። ይኹን እምበር፡ ኣብ ዝተወሰኑ ኩነታት፡ ከም ኣብዚ ኣብ ታሕቲ ዘሎ ስእሊ ዝርአ ኩርናዕ፡ እቲ state ቁሩብ ምድንጓይ ከም ዘጋጥሞ ተዓዚበ፡ እዚ ድማ ነቲ ናይ ዘላሊ ሰንሰለት የቋርጾ። Grounded ነዚ ንምፍታሕ ኣብቲ component ዘሎ field ኣብ ክንዲ 0.01 ናብ 0.05 ኣቐሚጠዮ። እዚ ዋጋ እዚ እቲ ኣካል ናብ ኩነታት ንኽኣቱ ናብ ሓደ ገጽ ዝወሓደ ርሕቀት ይውክል። CharacterBody Surface Anchor Grounded ክሊፍ ጃምፒንግ ካብ ቀጥታዊ ቦታታት እናጎየኻ ክትዘልል ምፍታን ኩሉ ግዜ ከም ዘይሰርሕ ኣስተብሂልካ ትኸውን። እቲ ናይ ዘላሊ መጠወቒ ሓደ ሓደ ግዜ መልሲ ዘይህብ ኮይኑ ክስምዓካ ይኽእል። እዚ ሓደ ካብቲ ን2D ፕላትፎርመር ዝኸውን ምምዕባል ዝረአ ረቂቕ ነገራት እዩ። ተጻወትቲ ዋላ ቁሩብ ደንጉዮም ነቲ ናይ ምዝላል መጠወቒ ክጽቕጡ ከለዉ ናይ ምዝላል ክእለት የድልዮም። እዚ ኣምር እዚ ፍሉይ ክመስል ይኽእል እዩ፡ መብዛሕትኦም ፕላትፎርመርስ ብኸመይ ከም ዝሰርሑ ግን እዩ። ውጽኢቱ ድማ ከምቲ ኣብ ታሕቲ ዘሎ ኣኒሜሽን ዝተገልጸ ገጸ ባህሪ ካብ ኣየር ክደፍእ ዝመስል እዩ። Character Controller ነዚ መካኒክ ነተግብሮ። ነቲ ናይ ግዜ መስኮት (ብካልኢታት) ንምዕቃብ ሓድሽ ዓውዲ ከነተኣታቱ ኢና፡ ኣብዚ እዋን እዚ እቲ ገጸ ባህሪ ድሕሪ ምጥፋእ state ገና ክዘልል ይኽእል። Grounded // CharacterController.cs [Min(0)] [SerializeField] private float _rememberGroundTime = 0.1f; ብተወሳኺ ነቲ ናይ ግዜ ማሕተም ንምዕቃብ ካልእ ዓውዲ ክንውስኽ ኢና ድሕሪኡ እቲ state "ተረሲዑ"። Grounded // CharacterController.cs private float _lostGroundTime; እዚ ኩነታት እዚ ነቲ ክስተት ተጠቒምካ ክከታተሎ እዩ። ነዚ ዕላማ እዚ ነቲ handler ከነስተኻኽሎ ኢና። CharacterBody OnStateChanged // CharacterController.cs private void OnStateChanged(CharacterState previousState, CharacterState state) { if (state == CharacterState.Grounded) { OnGrounded(); } else if (previousState == CharacterState.Grounded) { _lostGroundTime = Time.unscaledTime + _rememberGroundTime; } } እቲ ገጸ ባህሪ ብሰንኪ ኮነ ኢልካ ምዝላል ድዩ ወይስ ብኻልእ ምኽንያት state ስኢኑ ምፍላይ ኣገዳሲ እዩ። ድሮ ዝብል ሰንደቕ ዕላማ ኣለና፣ እዚ ድማ ኣብ ነፍሲ ወከፍ ኣብ ዝጽውዓሉ እዋን ተደራራቢ ተግባራት ንምክልኻል ይስረዝ። Grounded _isJumping StopJumping ተደራራቢ ዝላ ምቁራጽ ንኣገባብ ጸወታ ስለዘይጸልዎ ካልእ ባንዴራ ከየተኣታቱ ወሲነ። ክትፍትኑ ናጻ ትኾኑ። ሕጂ እቲ ባንዴራ ዝጽረግ እቲ ገጸ ባህሪ ድሕሪ ዘሊሉ ምስ ዝዓለበ ጥራይ እዩ። ብኡ መሰረት ኮድ ነሐድሶ። _isJumping // CharacterController.cs private void StopJumping() { _jumpActionEndTime = 0; var velocity = _characterBody.Velocity; if (_isJumping && velocity.y > 0) { _characterBody.Velocity = new Vector2( velocity.x, velocity.y / _stopJumpFactor); } } ኣብ መወዳእታ ድማ ነቲ ዝብል ኣገባብ ክንከልሶ ኢና። OnJump // CharacterController.cs public void OnJump(InputAction.CallbackContext context) { if (context.started) { if (_characterBody.State == CharacterState.Grounded || (!_isJumping && _lostGroundTime > Time.unscaledTime)) { Jump(); } else { _jumpActionEndTime = Time.unscaledTime + _jumpActionTime; } } else if (context.canceled) { StopJumping(); } } ሕጂ፡ ካብ ቀጥታዊ ገጽ ምዝላል ድሕሪ ደጊም ንህርመት ጸወታ ኣይዘርግሖን እዩ፡ ዋላ’ኳ ርኡይ ዕሽነት እንተሃለዎ፡ ኣዝዩ ዝያዳ ተፈጥሮኣዊ ኮይኑ ይስምዓካ። እቲ ገጸ ባህሪ ቃል ብቓሉ ካብ ኣየር ክደፍእ ይኽእል እዩ፣ ካብቲ ስነመጎታዊ ዝመስል ንላዕሊ ርሒቑ ክኸይድ ይኽእል። ግን ልክዕ እዚ እዩ ንፕላትፎርመርና ዘድሊ። ገጸ ባህሪ ምግልባጥ እቲ ናይ መወዳእታ ምትንኻፍ ነቲ ገጸ ባህሪ ናብ ኣንፈት ምንቅስቓስ ገጹ ምግባር እዩ። ነዚ ብዝቐለለ መንገዲ ክንተግብሮ ኢና — ናይቲ ገጸ ባህሪ ኣብ መስመር x-axis ስኬል ብምቕያር። ኣሉታዊ ዋጋ ምቕማጥ ንካፕቴንና ብኣንጻሩ ኣንፈት ከም ዝጥምት ክገብሮ እዩ። መጀመርታ ካብ 1 ንኸይፍለ ነቲ ኦሪጅናል ሚዛን ንዕቅቦ። // CharacterController.cs public class CharacterController : MonoBehaviour { //... private Vector3 _originalScale; private void Awake() { //... _originalScale = transform.localScale; } } ሕጂ ንጸጋም ወይ ንየማን ክንከይድ ከለና፡ ኣወንታዊ ወይ ኣሉታዊ ሚዛን ክንጥቀም ኢና። // CharacterController.cs public class CharacterController : MonoBehaviour { public void OnMove(InputAction.CallbackContext context) { //... // Change character's direction. if (value.x != 0) { var scale = _originalScale; scale.x = value.x > 0 ? _originalScale.x : -_originalScale.x; transform.localScale = scale; } } } ውጽኢቱ ንፈትኖ። ምጥቕላል እዚ ጽሑፍ ኣዝዩ ዝርዝር ኮይኑ ተረኺቡ፡ እንተኾነ ግን ንኹሉ ኣገዳሲ መዳያት ምቁጽጻር ገጸ ባህርያት ኣብ 2D ፕላትፎርመር ክንሽፍኖ ክኢልና። ከም መዘኻኸሪ፡ ኣብ “ ” ጨንፈር ናይቲ መኽዘን ናይ መወዳእታ ውጽኢት ክትዕዘብ ትኽእል ኢኻ። Character Controller እዚን እቲ ዝሓለፈ ጽሑፍን ሓጋዚ ኮይኑ እንተረኺብኩም ወይ እንተትረኽብዎ፡ ኣብ GitHub ላይክን ኮኾባትን እንተዝረኽቡ ምተመስገንኩ። ዝኾነ ጉዳይ እንተጋጢሙኩም ወይ ጌጋታት እንተረኺብኩም ክትበጽሑ ድሕር ኣይትበሉ። ስለቲ ትኹረትኩም የቐንየልና!