Simple Game Running 2D with Unity
Bài đăng này đã không được cập nhật trong 4 năm
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 សំរាប់រូបភាពហ្គេមរបស់យើងដូចខាងក្រោម
បន្ដមកយើងចាំផ្ដើមបង្កើត ភ្លឺផែម (Prefabs) http://docs.unity3d.com/Manual/Prefabs.html សំរាប់រូបភាពរបស់ហ្គេមយើង(យើងសូមលើកការពន្យល់អោយកាន់តែច្បាស់អំពី ភ្លឺផែម Prefabs ក្នុងបទសំនេររបស់យើងនៅក្រោយ) ។ដូចនេះយើងនឹងទទួលបាន Prefabs សំរាប់រូបភាពហ្គេមរបស់យើងដូចខាងក្រោម
 យើងចាំផ្ដើមបង្ដើតScript សំរាប់រូបភាពហ្គេមរបស់យើងដោយយើងចូលក្នុងហ្វូដឺ Script បង្កើតScript ដូចខាងក្រោមនេះ
Scripts/PlayerScripts/JumpPlayer.cs
យើងចាំផ្ដើមបង្ដើត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 មួយដើម្បីគ្រប់គ្រងរឺកែប្រែអ្វីមួយក្នុងហ្គេម តួយ៉ាងដូចជាឈាម ពិន្ទុ បំរែបំរួលរបស់តួអង្គជាដើម ។
យើងសង្ឃឹមថា អត្ថបទដែលបានលើកយកមកនេះអាចជួយពន្យល់បន្ថែមអោយយើងយល់បន្ថែមនៅរបៀបដល់សាមញ្ញាក្នុងការបង្កើតហ្គេមទោះបី ការពន្យល់ខាងលើនៅមានចំនុចខ្វះខាតរឺ រំលងយ៉ាងណាក៏ដោយ ហើយយើងនឹងលើកយកការសរសេរពន្យល់បន្ដនៅ អត្ថបទបន្ដពីនេះ។
All rights reserved
 
  
 