Simple Game Running 2D with Unity
Bài đăng này đã không được cập nhật trong 3 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 សំរាប់រូបភាពហ្គេមរបស់យើងដូចខាងក្រោម យើងចាំផ្ដើមបង្ដើត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