Unity 3D

UNITY 3D การพัฒนาเกม God Simulation Game บน Unity ตอนที่ 4

บทเรียนตอนที่ 4 การสร้างระบบ คะแนน God Simulator และเงื่อนไขในการจัดการอุปสรรคโดยใช้ Power Element ของเราในเกมด้วย Unity

ต่อเนื่องจากบทเรียนที่แล้ว:

จากตอนที่ 3 เราจะได้ระบบสุ่มการเกิดของเจ้าอุปสรรคที่ชื่อ Golem มาแล้ว 4 จุดรอบนี้เราจะออกแบบ MainSystem เป็นตัวจัดการเงื่อนไขของ คะแนน และปีที่เราจะดูแลดาวเคราะห์ดวงนี้

เงื่อนไขที่ตั้งไว้:

  1. Golem สีแดงต้องใช้ Power of Cloud คือสายฝนในการจัดการมัน
  2. Golem สีน้ำเงินต้องใช้ Power of Sun คือแสงอาทิตย์ในการจัดการมัน
  3. Golem แต่ละตัวถ้าเอา Power ที่ตรงกับรูปแบบของมันเช่น cloud ไปใส่ Golem น้ำเงินจะเป็นการเพิ่มพลัง และทำให้อายุไขของดวงดาวลดลง
  4. คะแนนอยู่ที่ระยะเวลาของอายุดวงดาวหากจัดการ Golem ตัวไหนได้จะได้ระยะเวลาของดวงดาวเพิ่มขึ้น

ให้เราสร้าง Empty Game Object ขึ้นมาตั้งไฟล์ว่า MainSystem.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class MainSystem : MonoBehaviour {

	float timeRemaining = 100;
	float timeExtension = 3f;
	float timeDeduction = 2f;
	float totalTimeElapsed = 0;
	float score=0f;
  public string countValue = "";
  public string countScore = "";
	public bool isGameOver = false;
	// Use this for initialization
	void Start () {
		Time.timeScale = 1;
	}

	// Update is called once per frame
	void Update () {
		if(isGameOver)
			return;      //move out of the function

		totalTimeElapsed += Time.deltaTime;
		score = totalTimeElapsed*50;
		timeRemaining -= Time.deltaTime;
		countValue = ((int)timeRemaining).ToString();
    countScore = ((int)score).ToString();
		if(timeRemaining <= 0){
			isGameOver = true;
		}
	}

	public void SaveThePlanet()
	{
		timeRemaining += timeExtension;
	}

	public void AttackofMonster()
	{
		timeRemaining -= timeDeduction;
	}
}

ถ้าจัดการ golem ได้จะมีการเรียกเมธอดชื่อนี้:

public void SaveThePlanet()
	{
		timeRemaining += timeExtension;
	}

หากพลาดจะเกิดเหตุการณ์นี้:

public void AttackofMonster()
	{
		timeRemaining -= timeDeduction;
	}

หลังจากนั้นให้ออกแบบ UI โดยเพิ่ม Text ขึ้นมา 2 ตัวตั้งชื่อว่า counterText และ scoreText

สร้างไฟล์ CounterText.cs เป็น Component หนึ่งใน UI Text ชื่อ CounterText

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class CounterText : MonoBehaviour {
	public Text counterText;
	public MainSystem system;
	// Use this for initialization
	void Start () {
		if(system ==null){
			GameObject _system = GameObject.FindGameObjectWithTag("MainSystem") as GameObject;
			system = _system.GetComponent<MainSystem>();
		}
		counterText = GetComponent<Text>();
	}

	// Update is called once per frame
	void Update () {
		counterText.text = "Years: "+system.countValue;
	}
}

สร้างไฟล์ scoreText.cs เป็น Component หนึ่งใน UI Text ชื่อ scoreText

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class scoreText : MonoBehaviour {
	public Text _scoreText;
	public MainSystem system;
	// Use this for initialization
	void Start () {
		if(system ==null){
			GameObject _system = GameObject.FindGameObjectWithTag("MainSystem") as GameObject;
			system = _system.GetComponent<MainSystem>();
		}
		_scoreText = GetComponent<Text>();
	}

	// Update is called once per frame
	void Update () {
		_scoreText.text = "Score: "+system.countScore;
	}
}

สร้างไฟล์ redEnemy.cs และ blueEnemy.cs แนบไว้ใน Golem ทั้งสีแดง และน้ำเงิน

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class redEnemy : MonoBehaviour {
	public MainSystem system;
	public CameraShake camera;
	public int _hp=10;
	// Use this for initialization
	void Start () {
		if(system ==null){
			GameObject _system = GameObject.FindGameObjectWithTag("MainSystem") as GameObject;
			system = _system.GetComponent<MainSystem>();
		}
		if(camera ==null){
			GameObject _camera = GameObject.FindGameObjectWithTag("MainCamera") as GameObject;
			camera = _camera.GetComponent<CameraShake>();
		}
	}
	void OnTriggerStay(Collider other)
	{
		if(other.gameObject.name == "PowerCloud")
		{
				//Bad Thing to Do
				system.SaveThePlanet();
				_hp = _hp-1;
				if(_hp <= 0){
						gameObject.SetActive(false);
				}

		}else if(other.gameObject.name == "PowerSun"){
				//Good Thing to do
				_hp = _hp+1;
				camera.Shaking = true;
				system.AttackofMonster();
		}
	}
}

และ

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class blueEnemy : MonoBehaviour {
	public MainSystem system;
	public CameraShake camera;
	public int _hp=10;
	// Use this for initialization
	void Start () {
		if(system ==null){
			GameObject _system = GameObject.FindGameObjectWithTag("MainSystem") as GameObject;
			system = _system.GetComponent<MainSystem>();
		}
		if(camera ==null){
			GameObject _camera = GameObject.FindGameObjectWithTag("MainCamera") as GameObject;
			camera = _camera.GetComponent<CameraShake>();
		}
	}
	void OnTriggerStay(Collider other)
	{
		if(other.gameObject.name == "PowerSun")
		{
				//Bad Thing to Do
				system.SaveThePlanet();
				_hp = _hp-1;
				if(_hp <= 0){
						gameObject.SetActive(false);
				}

		}else if(other.gameObject.name == "PowerCloud"){
				//Good Thing to do
				_hp = _hp+1;
				camera.Shaking = true;
				system.AttackofMonster();
		}
	}
}

เป็นการกำหนดว่าเมื่อเราเลื่อน PowerElement ไปถูก Enemy ที่กำหนดไว้ได้ถูกต้องจะทำการซ่อน golem ตัวนั้นๆ ไป

gameObject.SetActive(false);

ต่อมาทำการเพิ่ม Shaking กล้องเมื่อเคลื่อน Power Element ผิด ให้สร้างไฟล์ CameraShake.cs ขึ้นมา

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraShake : MonoBehaviour {
	 public bool Shaking;
	 private float ShakeDecay;
	 private float ShakeIntensity;
	 private Vector3 OriginalPos;
	 private Quaternion OriginalRot;
	// Use this for initialization
	void Start () {
		Shaking = false;
	}

	// Update is called once per frame
	void Update () {
		if(ShakeIntensity > 0)
     {
         transform.position = OriginalPos + Random.insideUnitSphere * ShakeIntensity;
         transform.rotation = new Quaternion(
	    OriginalRot.x + Random.Range(-ShakeIntensity, ShakeIntensity)*.2f,
            OriginalRot.y + Random.Range(-ShakeIntensity, ShakeIntensity)*.2f,
            OriginalRot.z + Random.Range(-ShakeIntensity, ShakeIntensity)*.2f,
            OriginalRot.w + Random.Range(-ShakeIntensity, ShakeIntensity)*.2f);
        ShakeIntensity -= ShakeDecay;
     }
     else if (Shaking)
     {
        Shaking = false;
     }
  }
}

ทำการทดสอบเกม และทดลองเล่นดู:

จบบทเรียน การพัฒนาเกม God Simulation แล้ว

คุณสามารถดาวน์โหลดไฟล์ Complete Project ได้ที่: http://bit.ly/2pMYuTN

Asst. Prof. Banyapon Poolsawas

อาจารย์ประจำสาขาวิชาการออกแบบเชิงโต้ตอบ และการพัฒนาเกม วิทยาลัยครีเอทีฟดีไซน์ & เอ็นเตอร์เทนเมนต์เทคโนโลยี มหาวิทยาลัยธุรกิจบัณฑิตย์ ผู้ก่อตั้ง บริษัท Daydev Co., Ltd, (เดย์เดฟ จำกัด)

Related Articles

Back to top button

Adblock Detected

เราตรวจพบว่าคุณใช้ Adblock บนบราวเซอร์ของคุณ,กรุณาปิดระบบ Adblock ก่อนเข้าอ่าน Content ของเรานะครับ, ถือว่าช่วยเหลือกัน