Simple Game Running 2D with Unity
Unity Game Engine ខ្ញំុសូមណែនំាអ្នកទាំងអស់គ្នា នៅការបង្កើត Game 2D តាមរយះការប្រើប្រាស់ Unity Game Engine ។ យើងពិតជាដឹងហើយថា Unitiy Game Engine បានផ្គត់ផ្គង់អោយយើងអាចសរសេរបាននៅ ភាសាកំុព្យូទ័រចំនួនបី: C#, JavaScript, និង Boo ។ ចំពោះប្រធានបទដែលខ្ញំុលើកយកមកសរសេរនាថ្ងៃនេះ គឺចង់និយាយការបង្កើតហ្គេមបែប ...
Unity Game Engine
ខ្ញំុសូមណែនំាអ្នកទាំងអស់គ្នា នៅការបង្កើត Game 2D តាមរយះការប្រើប្រាស់ Unity Game Engine ។ យើងពិតជាដឹងហើយថា Unitiy Game Engine បានផ្គត់ផ្គង់អោយយើងអាចសរសេរបាននៅ ភាសាកំុព្យូទ័រចំនួនបី: C#, JavaScript, និង Boo ។ ចំពោះប្រធានបទដែលខ្ញំុលើកយកមកសរសេរនាថ្ងៃនេះ គឺចង់និយាយការបង្កើតហ្គេមបែបធូឌីដែលខ្ញំុអោយឈ្មោះថា រ៉ាននីង ធូឌី (Running 2D)។
១.ចំនុចផ្ដើម
- ដំឡើងកម្មវិធី Unity ក្នុងកំុព្យូទ័ររបស់លោកអ្នក:
https://unity3d.com/get-unity/download
- ប្រើប្រាស់ NGUI plugin:
- https://www.assetstore.unity3d.com/en/#!/content/2413
២. ដំណើរការ
យើងត្រូវការរៀបចំផូដឺ ក្នុងអាសិះសំរាប់ហ្គេមរបស់យើង។ ហើយសំរាប់ការណែនាំរបស់ខ្ញំុយើងគួរតែរៀបចំជាលក្ខណះដូចខាងក្រោយ:
មុនដំបូងយើងត្រូវចែករូបភាពជាចំនែកតូចៗ ដែលក្នុងនោះជ្រើរើសបើករូបភាពចុច :
Slice: សំរាប់ការកាត់ដោយស្វ័យប្រវិត្ដ Self Cut: ការកាត់ដោយខ្លួនឯងហើយយើងអាចប្រើប្រាស់ Trim ដើម្បីចំនួញ ក្នុងការតំរិមកែមរបស់រូបភាពដែលយើងត្រូវកាត់ ។
បន្ទាប់ពីកាត់រូបភាពរួចរាល់ហើយយើងត្រូវចំផ្ដើមបង្កើតចលនាសំរាប់រូបភាព ទាំងនោះ ។ដោយការចុចទៅលេងរូបភាបកាត់ទាំងនោះ ហើយ ទាញវាមកដល់ក្នុងលេយឺ (Layout scene) ។ពេលនោះ Unityនឹងបង្កើតអោយយើងនៅ ចលនាននៃរូបភាពដោយស្វ័យប្រវិត្ដ។
យើងអាចចុចButtonដើម្បីដំណើរការសាកល្បងអោយបានដឹងថាចលនក្នុងហ្គេមបែបណា ។ទោះបីជាយើងអាចលុបរឺបន្ថែមរូបភាពរឺ កែប្រែល្បឿនរបស់រូបភាពបានពីព្រោះ Unityបានផ្ដល់អោយយើងនៅដំនើរណាដល់ងាយស្រួលក្នុងការកែប្រែតាមចិត្ដរបស់យើងចង់ ។ ពេលនេះយើងទទួលបាននៅ ចលនារបស់រូបភាពទាំងការរត់ លោតនិងចលនាពេលរូបភាពត្រូវអស់ជីវិតរួចរាល់ហើយ (យើងសូមរំលងនៅការពណ័នាលំអិត នែការធ្វើចលាន លោត រឺចលានពេលត្រូវអស់ជីវិត) ។ បន្ដទៅ ទៀតនេះយើងត្រូវបង្កើត សិុន (Scene) សំរាប់ហ្គេមរបស់យើងដោយចុចទៅ File >> New Scene ហើយធ្វើការរក្សាវាទុកទៅ ក្នុងហ្វូដឺសិុន (Folder Scene) ។ តែមានរូបដូចខាងក្រោយនេះជាឧទារហ៍ស្រាប់: បន្ដមកយើងចាំផ្ដើមបង្កើត ភ្លឺផែម (Prefabs) http://docs.unity3d.com/Manual/Prefabs.html សំរាប់រូបភាពរបស់ហ្គេមយើង(យើងសូមលើកការពន្យល់អោយកាន់តែច្បាស់អំពី ភ្លឺផែម Prefabs ក្នុងបទសំនេររបស់យើងនៅក្រោយ) ។ដូចនេះយើងនឹងទទួលបាន Prefabs សំរាប់រូបភាពហ្គេមរបស់យើងដូចខាងក្រោម យើងចាំផ្ដើមបង្ដើតScript សំរាប់រូបភាពហ្គេមរបស់យើងដោយយើងចូលក្នុងហ្វូដឺ Script បង្កើតScript ដូចខាងក្រោមនេះ Scripts/PlayerScripts/JumpPlayer.cs
using UnityEngine; using System.Collections; public class JumpPlayer : MonoBehaviour { public static bool jump; public static int stateJump = 0; // Reference Jump 2 times public static bool stayInAir; public AudioClip jumpAudio; void FixedUpdate () { if (stateJump <= 2) { getJump(); } } private void getJump() { var forceX = 0f; var forceY = 0f; // One Touch player is jumper if (jump) { forceY = GameManager.HeightPlayerJump; forceX = GameManager.SpeedPlayerRun; jump = false; gameObject.rigidbody2D.AddForce (Vector3.up * forceY); stayInAir = true; AudioSource.PlayClipAtPoint(jumpAudio, transform.position); } } }
កូដខាងលើនេះអនុញ្ញាតអោយរូបភាពរបស់យើងអាចលោតចំនួន២ដង ជាប់គ្នា ។ ហើយដើម្បីអោយរូបភាពរបស់យើងអាចរត់បាននោះយើងត្រូវបង្កើតScipt មួយទៀត Scripts/PlayerScripts/MovePlayer.cs
using UnityEngine; using System.Collections; public class MovePlayer : MonoBehaviour { // Update is called once per frame void Update() { gameObject.transform.Translate (GameManager.SpeedPlayerRun, 0, 0); } }
ពេលនេះយើងទទួលបាននៅ Script រត់និងលោតហើយក៏ប៉ុន្ដែយើងត្រូវការអោយដឹងពី ការបាត់បង់ជីវិតរបស់រូបភាពហ្គេមរបស់យើង ដូចនេះយើងត្រូវបង្កើតនៅ Script មួយទៀតដាក់ឈ្មោះថា HealthPlayer ។ Scripts/PlayerScripts/HealthPlayer.cs
using UnityEngine; using System.Collections; public class HealthPlayer : MonoBehaviour { private GameObject health; public GameObject one; // Use this for initialization void Start () { health = GameObject.FindGameObjectWithTag ("Health"); } // Update is called once per frame void Update () { loseHeart (); } private void loseHeart() { if (health) { if (health.transform.childCount > 0) { if (GameManager.HealthPlayer < health.transform.childCount) { Vector3 currPos = gameObject.transform.position; currPos.x += 1f; Destroy (health.transform.GetChild(0).gameObject); GameObject clone = Instantiate(one, currPos, Quaternion.identity) as GameObject; clone.transform.Translate(0, 0.85f, 0); Destroy(clone, 2f); if (GameManager.HealthPlayer == 0) { //GameManager.isPlaying = false; Destroy(health); } } } } } }
នាពេលនេះយើងកូដសំរាប់ដឹងថា រូបភាពរបស់យើងអាចចេះដើរអាចដឹងថាលោតអាចដឹងថាបាត់បង់ជីវិតហើយប៉ុន្ដែវានៅមិនទាន់គ្រាន់ទេ ពីព្រោះយើងត្រូវការបង្ដើតសតិញាអោយរូបភាពរបស់យើងដឹងថារាសិ្ថតនៅលើដី រឺនៅលើលំហ រឺមួយប៉ះទៅនឹងអ្វីមួយ ។ ដើម្បីអោយវាដឹងរឺយល់់សតិញាណដូចមនុស្សយើងត្រូវការ ។ដូចនេះ Unity បានផ្ដល់អោយយើងនៅលក្ខណះពិសេសអោយរូបភាពរបស់ហើយដោយការប្រើប្រាស់ Rigibody2D (អាចអោយរូបភាពដឹងពីទំនាញដី អរូបីមិនពិតដែលបង្កើតឡើងដោយUnity), Trigger2D (អាចអោយរូបភាពដឹងពីការប៉ះ គ្នាទៅដឹងរបស់អ្វីមួយប៉ុន្ដែការប៉ះនោះអាចរំលងទៅបានដោយគ្មានការរាំង), Collider2D (អាចអោយរូបភាពដឹងពីការប៉ះ គ្នាទៅដឹងរបស់អ្វីមួយប៉ុន្ដែមិនអាចរំលងទៅបាន)... យើងសូមលើកយកសង្ខេប។ បន្ដទៅទៀតយើងបង្កើត Scripts/PlayerScripts/ColliderPlayer.cs using UnityEngine; using System.Collections;
public class ColliderPlayer : MonoBehaviour { void OnCollisionEnter2D(Collision2D target) { if (target.gameObject.transform.tag == "Land") { gameObject.rigidbody2D.drag = 3.5f; SlidePlayer.slidePlayer = false; JumpPlayer.stateJump = 0; JumpPlayer.stayInAir = false; } else if (target.gameObject.transform.tag == "Monster") { target.gameObject.collider2D.isTrigger = true; } } }
Scripts/PlayerScripts/TriggerPlayer.cs
public class TriggerPlayer : MonoBehaviour { public static bool triggerDied = false; // player is died by monster private int corn = 0; public AudioClip goldMusic; void OnTriggerEnter2D(Collider2D target) { if (target.gameObject.tag == "Monster") { GameManager.HealthPlayer = GameManager.HealthPlayer - 1; if (GameManager.HealthPlayer == 0) { triggerDied = true; } else { triggerDied = false; } } else if (target.gameObject.tag == "Gold") { Destroy(target.gameObject); GameManager.scoreGame += 10; GameManager.gold ++; corn = GameManager.gold * 10; GameManager.scoreLabel.text = "" + corn; AudioSource.PlayClipAtPoint(goldMusic,target.gameObject.transform.position); } } void OnTriggerExit2D(Collider2D target) { if (target.gameObject.tag == "Monster") { target.gameObject.collider2D.isTrigger = false; } } }
ពេលនេះ យើងទទួលបាននៅរូបភាពហ្គេមរបស់យើងអាចចេះដឹងដើរដឹង ថាធ្លាក់ពេលលោត ដឹងថាបុករបស់ខាងមុខពេលវាប៉ះ ក៏ប៉ុន្ដែអ្វីដែលយើងនៅមិនទាន់មានគឺការបែកចែក នេះផ្លាស់របស់ចលនាមួយទៅ ចលនាមួយទៀត (យើងមានចលនាលោត រត់ នឹងបាត់បង់ជីវិត) ដូចគ្នាយើងត្រូវតែគ្រប់គ្រងចលនាទាំងនោះដើម្បីអោយ រូបភាពដឹងថាពេលណាវា ត្រូវជ្រើរើសចលនាណាមួយមកបង្ហាញ។ ដូច្នេាះយើងបង្កើតScript មួយទៀត: Scripts/PlayerScripts/AnimationPlayer.cs
using UnityEngine; using System.Collections; public class AnimationPlayer : MonoBehaviour { private Animator animator; void Start() { animator = GetComponent<Animator> (); } // Update is called once per frame void Update () { getStayOnAirAnimation (); getDiedByMonsterAnimation (); } private void getStayOnAirAnimation() { if (JumpPlayer.stayInAir) { animator.SetInteger("AnimeState", 1); GameManager.shadowPlayer.enableEmission = true; } else { GameManager.shadowPlayer.enableEmission = false; animator.SetInteger("AnimeState", 0); } } private void getDiedByMonsterAnimation () { if (TriggerPlayer.triggerDied) { animator.SetInteger("AnimeState", 2); gameObject.collider2D.isTrigger = true; } } }
៣.សេចក្ដីសង្ខេប
ជាការពិតណាស់ការលើកឡើងមកបកស្រាយនឹឹងពន្យល់ខាងលើនេះគឺជាជំហានដំបូងនេះការសរសេរតែប៉ុណ្ណោះ ហើយ រូបភាពរួមទាំងកូដដែលយើងបានសរសេរបង្ហាញនោះវាគ្រាន់តែអាចធ្វើចលលាទៅមុខ ដឹងពីការប៉ះអ្វីមួយ រឺមួយ យល់ពីទំនាញដី យើងនៅបន្ដការសរសេរគ្រប់គ្រងហ្គេមរបស់ហើយទៀត។ ពីព្រោះថាហ្គេមនិមួយៗ ត្រូវការ Gamemanager មួយដើម្បីគ្រប់គ្រងរឺកែប្រែអ្វីមួយក្នុងហ្គេម តួយ៉ាងដូចជាឈាម ពិន្ទុ បំរែបំរួលរបស់តួអង្គជាដើម ។
យើងសង្ឃឹមថា អត្ថបទដែលបានលើកយកមកនេះអាចជួយពន្យល់បន្ថែមអោយយើងយល់បន្ថែមនៅរបៀបដល់សាមញ្ញាក្នុងការបង្កើតហ្គេមទោះបី ការពន្យល់ខាងលើនៅមានចំនុចខ្វះខាតរឺ រំលងយ៉ាងណាក៏ដោយ ហើយយើងនឹងលើកយកការសរសេរពន្យល់បន្ដនៅ អត្ថបទបន្ដពីនេះ។