0

Simple Game Running 2D with Unity

Unity Game Engine

ខ្ញំុសូមណែនំាអ្នកទាំងអស់គ្នា នៅការបង្កើត Game 2D តាមរយះការប្រើប្រាស់ Unity Game Engine ។ យើងពិតជាដឹងហើយថា Unitiy Game Engine បានផ្គត់ផ្គង់អោយយើងអាចសរសេរបាននៅ ភាសាកំុព្យូទ័រចំនួនបី: C#, JavaScript, និង Boo ។ ចំពោះប្រធានបទដែលខ្ញំុលើកយកមកសរសេរនាថ្ងៃនេះ គឺចង់និយាយការបង្កើតហ្គេមបែបធូឌីដែលខ្ញំុអោយឈ្មោះថា រ៉ាននីង ធូឌី (Running 2D)។

១.ចំនុចផ្ដើម

  • ដំឡើងកម្មវិធី Unity ក្នុងកំុព្យូទ័ររបស់លោកអ្នក:

https://unity3d.com/get-unity/download

២. ដំណើរការ

យើងត្រូវការរៀបចំផូដឺ ក្នុងអាសិះសំរាប់ហ្គេមរបស់យើង។ ហើយសំរាប់ការណែនាំរបស់ខ្ញំុយើងគួរតែរៀបចំជាលក្ខណះដូចខាងក្រោយ:

Image01.PNG

មុនដំបូងយើងត្រូវចែករូបភាពជាចំនែកតូចៗ ដែលក្នុងនោះជ្រើរើសបើករូបភាពចុច :

Slice: សំរាប់ការកាត់ដោយស្វ័យប្រវិត្ដ Self Cut: ការកាត់ដោយខ្លួនឯងហើយយើងអាចប្រើប្រាស់ Trim ដើម្បីចំនួញ ក្នុងការតំរិមកែមរបស់រូបភាពដែលយើងត្រូវកាត់ ។

Image02.PNG

បន្ទាប់ពីកាត់រូបភាពរួចរាល់ហើយយើងត្រូវចំផ្ដើមបង្កើតចលនាសំរាប់រូបភាព ទាំងនោះ ។ដោយការចុចទៅលេងរូបភាបកាត់ទាំងនោះ ហើយ ទាញវាមកដល់ក្នុងលេយឺ (Layout scene) ។ពេលនោះ Unityនឹងបង្កើតអោយយើងនៅ ចលនាននៃរូបភាពដោយស្វ័យប្រវិត្ដ។ Image03.PNG

យើងអាចចុចButtonដើម្បីដំណើរការសាកល្បងអោយបានដឹងថាចលនក្នុងហ្គេមបែបណា ។ទោះបីជាយើងអាចលុបរឺបន្ថែមរូបភាពរឺ កែប្រែល្បឿនរបស់រូបភាពបានពីព្រោះ Unityបានផ្ដល់អោយយើងនៅដំនើរណាដល់ងាយស្រួលក្នុងការកែប្រែតាមចិត្ដរបស់យើងចង់ ។ ពេលនេះយើងទទួលបាននៅ ចលនារបស់រូបភាពទាំងការរត់ លោតនិងចលនាពេលរូបភាពត្រូវអស់ជីវិតរួចរាល់ហើយ (យើងសូមរំលងនៅការពណ័នាលំអិត នែការធ្វើចលាន លោត រឺចលានពេលត្រូវអស់ជីវិត) ។ បន្ដទៅ ទៀតនេះយើងត្រូវបង្កើត សិុន (Scene) សំរាប់ហ្គេមរបស់យើងដោយចុចទៅ File >> New Scene ហើយធ្វើការរក្សាវាទុកទៅ ក្នុងហ្វូដឺសិុន (Folder Scene) ។ តែមានរូបដូចខាងក្រោយនេះជាឧទារហ៍ស្រាប់: Image04.PNG បន្ដមកយើងចាំផ្ដើមបង្កើត ភ្លឺផែម (Prefabs) http://docs.unity3d.com/Manual/Prefabs.html សំរាប់រូបភាពរបស់ហ្គេមយើង(យើងសូមលើកការពន្យល់អោយកាន់តែច្បាស់អំពី ភ្លឺផែម Prefabs ក្នុងបទសំនេររបស់យើងនៅក្រោយ) ។ដូចនេះយើងនឹងទទួលបាន Prefabs សំរាប់រូបភាពហ្គេមរបស់យើងដូចខាងក្រោម Image05.PNG យើងចាំផ្ដើមបង្ដើត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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí