Sau những nội dung về thiết kế, tài liệu sẽ trình bày về việc lập trình trên Unity khi giới thiệu vềngôn ngữ lập trình cùng các lớp, hàm trong thư viện dựng sẵn của Unity thôngqua các ví
GIỚI THIỆU
Máy bay tiêu diệt máy bay quân địch bằng cách bắn đạn né máy bay địch để giành chiến thắng.
TỔNG QUAN VỀ GAME
Thể loại game
Yếu tố
Game mang tính giải trí, giúp tăng khả năng phản xạ thông qua việc di chuyển qua các chướng ngại vật trong các màn chơi. Đối tượng nhắm tới là những người chơi trẻ thuộc độ tuổi 6-20.
So với những game thông thường, hệ thống có thêm máy báy địch bắn đạn, và thay đổi cấp độ khó, có các loại chướng ngại vật tránh gây nhàm chán.
Hệ thống máy bay, đạn địch trong game đa dạng theo loại, mức độ; tạo hứng thú, cuốn hút cho người chơi mà không cảm thấy nhàm chán Có tích điểm thưởng sau khi hoàn thành mỗi màn chơi.
Phong cách, yếu tố phiêu lưu kết hợp với áp lực cao, lối chơi thử thách là những điểm khác biệt, tạo nên sự nổi bật hơn so với một số game cùng thể loại trên thị trường.
Nội dung
Người chơi phải tập trung tìm hiểu vào kỹ năng thiết kế, tư duy nhằm giành được chiến thắng.
Game đem đến cảm xúc thích thú cho người chơi khi giành chiến thắng, cũng như cảm giác khi chơi thua.
Cốt truyện của game hay sẽ khiến người chơi luôn trong tâm thế muốn khám phá.Áp lực cao, lối chơi thử thách kiểm tra sự chú ý của người chơi thật chi tiết.Các mục tiêu trải nghiệm sẽ đem lại cho người chơi: rèn luyện khả năng quan sát và phản xạ nhanh chóng cho người chơi, giúp tăng cường thị lực, cải thiện tầm nhìn của người chơi
Các trải nghiệm được lồng vào màn chơi như thế nào: người chơi được cung cấp một số mạng hồi sinh để chơi, quân địch sẽ tăng dần theo thời gian chơi.
Chủ đề
Phong cách
Phong cách không gian vũ trụ, hiệu ứng đồ họa 2D
Loại người chơi game được ngắm đến
Những người chơi được ngắm đến là những người trên 6 tuổi Có hứng thú với cảm giác được nhập vai vào một thế giới không gian vũ trụ cùng với những chiếc máy bay đa dạng để trải nghiệm những cảm xúc lạ khó có thể xuất hiện ngoài đời thực.
Game flow
Tại menu người chơi sẽ chọn các mục tương ứng:
●Play game: Vào các màn chơi
●Time: Thời gian chơi game
●Lives: Số lượt chơi game
●Score: Điểm khi chơi game
Tại menu màn chơi: người chơi chọn màn chơi để vào game, chỉ chọn được những màn chơi đã mở khóa
Trong game người chơi sử dụng các phím:
●Phím mũi tên sang trái sang phải lên xuống để di chuyển nhân vật.
●Nhấn chuột để chọn màn,vào game
Look & feel
Bối cảnh trong game tại đây máy bay phải chiến đấu với quân địch, tìm được cách di chuyển hợp lý để giết quân địch. Âm thanh là tiếng bắn đạn, tiếng máy bay di chuyển, tiếng khi bị kẻ địch giết, tiếng giết chết kẻ địch.
Các khía cạnh tác động vào người chơi
Khi chơi game, người chơi sẽ được tác động bởi rất nhiều khía cạnh khác nhau Như hình ảnh trong game, âm thanh phát ra trong game Cách điều khiển máy bay,máy bay địch,đạn mà máy bay địch bắn ra
Người chơi phải suy nghĩ chiến lược hợp lý để bắn được máy bay địch ăn điểm.
Người chơi được hòa nhập vào cốt truyện trong game, khiến người chơi có cảm giác như một phi cơ chiến đấu thực thụ Tinh thần anh dũng chiến đấu sẽ được đẩy lên cao nhất.
Mục tiêu trải nghiệm
Giúp người chơi nhập vai vào khung cảnh trong game, tạo ra những cảm xúc mà không bao giờ có ngoài đời thực Mang lại những phút giây thư giãn, giải trí sau những giờ học tập và làm việc căng thẳng Rèn luyện khả năng quan sát và phản xạ nhanh chóng cho người chơi, giúp tăng cường thị lực, cải thiện tầm nhìn của người chơi.Người chơi được lái máy bay, người chơi được cung cấp một lượng mạng để chơi, quân địch sẽ tăng dần theo thời gian chơi
GAMEPLAY & MECHANICS
Game Player
Đặc trưng của dòng game theo màn mà chúng em đã xây dựng tại 1 thời điểm chỉ có một người chơi, trò chơi sẽ có 1 màn hình chơi, ở trong màn chơi người chơi sẽ được cung cấp 1 lượng mạng hồi sinh nhất định, người chơi sẽ bắn để loại bỏ quân địch,né đạn của máy bay địch bắn ra trên đường bay và cố gắng hạ càng nhiều nhiều thì điểm càng cao, khi người chơi bị trúng đạn quá nhiều dẫn đến hết mạng hồi sinh thì người chơi sẽ chết và màn hình GameOver sẽ xuất hiên thông báo cho người chơi về tổng số điểm nhận được, người chơi cũng có thể xem điểm cao ở ngay trên màn hình chính.
Màn hình sẽ di chuyển và quân địch cũng từ đó mà xuất hiện, càng về sau quân địch càng đông và khó chết vì vậy người chơi phải khéo léo di chuyển để tránh né đạn của địch giết càng nhiều địch thì càng có nhiều cơ hội ăn vàng để nâng cao điểm số.
Level design
Game sẽ có nhiều cấp độ, sau mỗi màn thắng hay sau một thời gian nhất định tỷ lệ quân địch càng nhiều.
Game mode
Trò chơi có thiết kế chỉ có chế độ chơi đơn Trong chế độ chơi đơn, người chơi có 3 cấp độ,độ khó phụ thuộc vào cấp độ, số lượng kẻ thù và lượng mạng hồi sinh nhất định bị mất khi trúng đạn của kẻ thù sẽ khác nhau Khi trò chơi ở cấp độ cao hơn, số lượng kẻ thù sẽ tăng lên Bảng dưới đây cung cấp thông tin về số lượng sức mạnh và kẻ thù trong mỗi cấp độ.
Player(chỉ số giữ nguyên): Khi va chạm với chướng ngại vật sẽ bị -1Lives, khi bị trúng đạn của máy bay địch thì player sẽ bị -3 Lives.
Game Control
Trò chơi sẽ sử dụng chuột và bàn phím để điều khiển
Winning and Losing
Mục tiêu của game là tiêu diệt quân địch tránh đạn trước khi người chơi bị chết.Người chơi chỉ có một số mạng sống nhất địch nếu hết mạng sẽ GameOver.
STORY, SETTING & CHARACTER
Story
Thời gian gần đây trái đất đang bị xâm chiếm bởi những vật thể lạ và quái vật Chúng tấn công không ngừng nghỉ vào trái đất Người chơi phải ngồi lên chiếc máy bay để để để bay lên bầu trời chiến đấu với chúng giải cứu loài người.
Mở đầu game, người chơi đang ở trên chiếc máy bay và bay ra ngoài vũ trụ Sau mỗi một màn chơi, người chơi phải tiêu diệt hết quái vật và vật thể lạ.Đến màn tiếp theo độ khó lại cao hơn một chút, quân địch ngày càng đông người chơi phải cực kì khéo léo và nhanh nhạy để tránh những màn tấn công của quân địch và qua màn.
Narrative: lời thuật
Người giải cứu trái đất (tự sự): tôi sinh ra đã gánh trách nhiệm giải cứu thế giới, giải cứu nhân loại khỏi sự hủy diệt Mặt khác, nếu như tôi không thể chiến thắng thì thế giới này sẽ hoàn toàn bị tiêu diệt Vì vậy tôi sẽ cố gắng hết sức để bắt đầu cuộc hành trình này a, Đầu game
Người giải cứu trái đất: Ta sẽ trừng phạt ngươi nếu ngươi dám động đến trái đất thân yêu của ta.
Vật thể lạ và người ngoài hành tinh: hahaha nếu ngươi đầu hàng ta sẽ tha cho ngươi, còn nếu không ngươi sẽ nhận được hậu quả khó lường. b, Cuối game
- Chiến thắng: Ngươi giỏi lắm người giải cứu, hôm nay coi như ta thua.
Ngươi hãy đợi đấy, một ngày nào đó ta sẽ quay lại!
- Thua: Ta đã thông báo trước kết quả rồi còn cố chấp, kết cục của ngươi chỉ đến thế thôi hahaha.
Thế giới trong game
Ngoài hành tinh lũ vật thể lạ đang hoành hành vì vật người chơi phải tiêu diệt được chúng để có thể cứu thế giới.
Characters
- Máy bay chiến đấu với máy bay địch bằng đạn, tăng level.
-Mạng hồi sinh của máy bay bị giảm nếu bị kẻ địch tấn công, sẽ bị chết khi giảm về 0.
-Máy bay bắn hạ kẻ địch để tích lũy điểm để qua màn.
MÀN CHƠI
Giới thiệu các màn chơi
Đặc trưng của dòng game 2D theo màn mà em đã xây dựng tại 1 thời điểm chỉ có một người chơi, trò chơi sẽ có 3 màn hình chơi chính (Màn hình bất đầu chơi,Màn hình chính, Màn hình kết thúc chơi).
Chi tiết các màn chơi
Sẽ bao gồm các phím điều hướng(Chơi), xung quanh sẽ là background vũ trụ tạo hứng thú cho người chơi.Khi người chơi nhấn vào Chơi, màn hình sẽ chuyển sang phần chơi b Màn 2
Người chơi sẽ có 1 máy bay và nhấn di chuyển để điều khiển đường đạn bắn các máy bay của địch và né đạn mà địch bắn ra Trên góc màn hình sẽ có điểm cộng,thời gian chơi và mạng hồi sinh.Ở trong màn chơi người chơi sẽ được cung cấp 1 lượng mạng hồi sinh người chơi sẽ bắn để loại bỏ quân địch,né đạn trên đường bay và cố gắng hạ càng nhiều thì điểm càng cao, sẽ có 1 lượng mạng, khi người chơi bị trúng đạn quá nhiều dẫn đến hết mạng hồi sinh thì người chơi sẽ chết và màn hình GameOver sẽ xuất hiện thông báo cho người chơi về tổng số điểm nhận được.
Màn hình sẽ di chuyển và quân địch cũng từ đó mà xuất hiện, càng về sau quân địch càng đông và khó chết vì vậy người chơi phải khéo léo di chuyển để tránh né đạn của địch giết càng nhiều địch thì càng có nhiều cơ hội ăn vàng để nâng cao điểm số c Màn 3
Màn hình sẽ hiện ra lives,score,time chơi và thông báo Game Over
GIAO DIỆN
Mô tả về hệ thống thị giác
Có HUD, trên HUD sẽ chứa thông tin về mạng hồi sinh của người chơi, , điểm số,thời gian.
Menu: Gồm có phần bắt đầu game.
Hệ thống điều khiển
Người chơi sử dụng 4 phím trên, dưới, trái, phải để di chuyển, sử dụng chuột chọn máy máy và click vào chơi
Audio, music, sound effect
● Âm thanh máy bay (Khi bắn trúng, khi bị va chạm)
● Âm thanh khi chiến thắng
● Hiệu ứng âm thanh khi chọn menu, chọn màn
MỘT SỐ HÌNH ẢNH VÀ CODE TRONG GAME
Code trong game
7.1 BulletsControll using UnityEngine; using System Collections; public class BulletsControll : MonoBehaviour { float speed;
// Use this for initialization void Start () { speed = 8f ;
// Update is called once per frame void Update () {
Vector2 position = transform position ; position = new Vector2 ( position x, position y + speed *
Time.deltaTime); transform.position = position;
Vector2 max = Camera main ViewportToWorldPoint (new Vector2 ( , 1 1)); if ( transform position y > max.y ) {
} void OnTriggerEnter2D(Collider2D _collider) { if ( _collider.tag == "EnemyShipTag" ) {
7.2 Destroyer using UnityEngine; using System Collections; public class Destoryer : MonoBehaviour { void DestoryGameObject() {
7.3 Enemybullet using UnityEngine; using System Collections; public class EnemyBullets : MonoBehaviour { float speed;
// initialize variables or game state before the game starts void Awake() { speed = 5f ; isReady = false;
// Use this for initialization void Start () {}
// Update is called once per frame void Update () { if ( isReady ) {
Vector2 position = transform position ; position += bulletDirection * speed * Time deltaTime ; transform.position = position;
Vector2 min = Camera main ViewportToWorldPoint (new Vector2 ( , 0 0));
Vector2 max = Camera main ViewportToWorldPoint (new Vector2 ( , 1 1)); if ( transform.position.x > max.x || transform position y > max y
|| transform position x < min x || transform position y < min.y ) {
} public void setBulletsDirection( Vector2 dir ) { bulletDirection = dir normalized ; isReady = true;
} void OnTriggerEnter2D(Collider2D _collider) { if ( _collider.tag == "PlayerShipTag" ) {
7.4 EnemyController using UnityEngine; using System Collections; public class EnemyController : MonoBehaviour { float speed; public int score; public int life; public GameObject exposion;
GameObject scoreTextUI; private Animator anim;
// Use this for initialization void Start () { speed = 2f ; scoreTextUI = GameObject FindGameObjectWithTag("ScoreUITag"); anim = GetComponent ();
// Update is called once per frame void Update () {
Vector2 position = transform position ; position = new Vector2 ( position x, position y - speed * Time.deltaTime); transform.position = position;
Vector2 min = Camera main ViewportToWorldPoint(new Vector2(0, 0)); if ( transform.position.y < min.y ) {
} void OnTriggerEnter2D(Collider2D _collider) { if ( _collider.tag == "PlayerBulletTag" ) { life ; if ( life == ) { 0
Destroy (gameObject); scoreTextUI.GetComponent ().Score += score ; GameObject expo = ( GameObject )Instantiate (exposion); expo transform position = transform position ;
} public void animationChooser(string method) { switch(method) { case "shooting": anim.SetBool ("shooting", true); break; case "unshooting": anim.SetBool ("shooting", false); break; default: break;
7 5 EnemyGun using UnityEngine; using System Collections; public class EnemyGun : MonoBehaviour { public GameObject enemyBullets; public GameObject enemyObject;
// Use this for initialization void Start () {
// Update is called once per frame void Update () {
GameObject playerAirplane = GameObject Find ("AirCraft"); if (playerAirplane != null ) { enemyObject.GetComponent ().animationChooser ("shooting");
GameObject bullets = ( GameObject )Instantiate (enemyBullets);
GameObject bullets2 = ( GameObject )Instantiate (enemyBullets);
GameObject bullets3 = ( GameObject )Instantiate (enemyBullets); bullets.transform position = transform position ; bullets2.transform position = transform position ; bullets3.transform position = transform position ;
Vector2 direction = playerAirplane transform position - bullets transform position ; bullets.GetComponent () setBulletsDirection (direction); bullets2.GetComponent () setBulletsDirection ( new Vector2(direction x + 2, direction y)); bullets3.GetComponent () setBulletsDirection ( new Vector2(direction x - 2, direction y));
7.6 EnemySpawner using UnityEngine; using System Collections; public class EnemySpawner : MonoBehaviour { public GameObject enemy; float maxSpawnRateInSecond = 5f ;
// Use this for initialization void Start () {
// Update is called once per frame void Update () {
Vector2 min = Camera main ViewportToWorldPoint (new Vector2 ( , 0 0));
Vector2 max = Camera main ViewportToWorldPoint (new Vector2 ( , 1 1));
GameObject enemy01 = ( GameObject )Instantiate (enemy); enemy01.transform position = new Vector2 ( Random Range(min x, max x), max.y);
} void NextSpawnSheduler() { float spawnInNSec; if ( maxSpawnRateInSecond > 1f ) { spawnInNSec = Random.Range ( 1f , maxSpawnRateInSecond );
} void IncreseSpawnRate() { if ( maxSpawnRateInSecond > 1f ) { maxSpawnRateInSecond ;
InvokeRepeating("IncreseSpawnRate", 0f , 30f); } public void StopEnemySpawn() {
7.7 GameScore using UnityEngine; using System Collections; using UnityEngine.UI; public class GameScore : MonoBehaviour {
Text scoreText; int userScore; public int Score { get { return this userScore;
// Use this for initialization void Start () {
// Get Text UI Component of this gameobject scoreText = GetComponent ();
} public void UpdateScoreTextUI() { string scoreString = string Format ("{0:000000}", userScore); scoreText.text = scoreString;
// Update is called once per frame void Update () {
7.8 Planet using UnityEngine; using System Collections; public class Planet : MonoBehaviour { public float speed; public bool isMoving;
Vector2 max; void Awake() { isMoving = false ; min = Camera main ViewportToWorldPoint (new Vector2 ( , 0 0)); max = Camera main ViewportToWorldPoint (new Vector2 ( , 1 1)); max y = max y +
GetComponent().sprite bounds extents y; min y = min y -
GetComponent().sprite bounds extents y;
// Use this for initialization void Start () {
// Update is called once per frame void Update () { if (!isMoving) return;
Vector2 position = transform position ; position = new Vector2 ( position x, position y + speed * Time.deltaTime); transform.position = position; if ( transform position y < min.y ) { isMoving = false ;
} public void ResetPosition() { transform position = new Vector2 (Random.Range ( min.x , max.x), max.y); }
7.9 PlanetGenerator using UnityEngine; using System Collections; using System Collections Generic ; public class PlanetGenerator : MonoBehaviour { public GameObject[] planets ;
Queue avaliablePlanets = new Queue GameObject < >();
// Use this for initialization void Start () { avaliablePlanets Enqueue ( planets [0]); avaliablePlanets Enqueue ( planets [1]); avaliablePlanets Enqueue ( planets [2]);
// Update is called once per frame void Update () {
EnqueuePlanets (); if (avaliablePlanets Count == ) 0 return;
GameObject aplanet = avaliablePlanets Dequeue(); aplanet.GetComponent ().isMoving = true ;
//int i = 0; foreach(GameObject a_planet in planets ) { if ( (a_planet transform position y < 0) && !
( a_planet GetComponent().isMoving) ) { a_planet.GetComponent () ResetPosition (); avaliablePlanets Enqueue ( a_planet );
//print ("The" + (i++) + "Planets pos: " + a_planet.transform.position.x+", "+a_planet.transform.position.y);
7.10 StarGenerator using UnityEngine; using System Collections; public class StarGenerator : MonoBehaviour { public GameObject starBg; // Star prefab public int MaxStars;
Color[] starColors = { new Color ( 0.5f, 0.5f , 1f ), new Color ( 0, 1f , 1f ), new Color ( 1f, 1f , 0), new Color ( 1f, 0, 0)
// Use this for initialization void Start () {
Vector2 min = Camera main ViewportToWorldPoint (new Vector2 ( , 0 0)); Vector2 max = Camera main ViewportToWorldPoint (new Vector2 ( , 1 1)); for ( int = i 0; i MaxStars; ++ ) { < i
GameObject star = ( GameObject )Instantiate (starBg); star.GetComponent ().color = starColors
[ Random Range (0, 3)]; star transform position = new Vector2(Random.Range(min x, max x), Random Range ( min y, max y)); star.GetComponent().speed = -( 1f * Random value + 0.5f); star transform parent = transform;
// Update is called once per frame void Update () {
7.11 Stars using UnityEngine; using System Collections; public class Stars : MonoBehaviour { public float speed;
// Use this for initialization void Start () {
// Update is called once per frame void Update () {
Vector2 position = transform position ; position = new Vector2 ( position x, position y + speed *
Time.deltaTime); transform.position = position;
Vector2 min = Camera main ViewportToWorldPoint (new Vector2(0, 0)); Vector2 max = Camera main ViewportToWorldPoint (new Vector2(1, 1)); if ( transform.position.y < min.y ) { transform position = new Vector2 (Random.Range ( min.x , max.x), max.y);
7.12 TimeCounter using UnityEngine; using System Collections; using UnityEngine.UI; public class TimeCounter : MonoBehaviour {
Text timeUI; // Time Counter UI float startTime; float elapsedTime; bool startCounter; float minutes; float seconds;
// Use this for initialization void Start () { startCounter = false; timeUI = GetComponent ();
} public void startTimeCounter() { startTime = Time.time ; startCounter = true ;
} public void stopTimeCounter() { startCounter = false;
// Update is called once per frame void Update () { if (startCounter) { elapsedTime = Time time - startTime ; minutes = elapsedTime / 60; seconds = elapsedTime % 60; timeUI text = string Format ("{0:00}:{1:00}", minutes , seconds );
7.13 UserControll using UnityEngine; using System Collections; using UnityEngine.UI; public class UserControll : MonoBehaviour { public GameObject gameManager; public float speed; public GameObject bullets; public GameObject bulletPosition1; public GameObject bulletPosition2; public GameObject exposion; private const float firstX = 0.01f; private const float firstY = -2.53f; private Animator anim; float firerate = 0.25f ; private float nextFire = 0.15f; public Text lives; const int MaxLive = 3; int NowLive; public void Init() {
NowLive = MaxLive; lives text = NowLive ToString(); gameObject transform position = new Vector2 ( firstX , firstY ); gameObject.SetActive(true);
// Use this for initialization void Start () { anim = GetComponent ();
// Update is called once per frame void Update () { if ( Input GetKey ( KeyCode.C ) && Time.time > nextFire ) { animationChooser ("shooting"); gameObject.GetComponent ().Play ();
GameObject bullets01 = ( GameObject )Instantiate (bullets); bullets01 transform position = bulletPosition1 transform position ;
GameObject bullets02 = ( GameObject )Instantiate (bullets); bullets02 transform position = bulletPosition2 transform position ; nextFire = Time.time + firerate ;
} else if ( Input GetKeyDown(KeyCode Alpha1 ) ) { speed = 2f ;
} else if ( Input GetKeyDown(KeyCode Alpha2 ) ) { speed = 4f ;
} else if ( Input GetKeyDown(KeyCode Alpha3 ) ) { speed = 6f ;
} else if ( Input GetKeyDown(KeyCode Alpha4 ) ) { speed = 8f ;
} float x = Input GetAxisRaw ("Horizontal"); float y = Input GetAxisRaw ("Vertical");
Vector2 direction = new Vector2 (x , ) y normalized ;
Vector2 min = Camera main ViewportToWorldPoint(new Vector2(0, 0)); Vector2 max = Camera main ViewportToWorldPoint(new Vector2(1, 1)); max x = max x - 0.15f; min x = min x + 0.2f; max y = max y - 0.15f; min y = min y + 0.2f;
Vector2 pos = transform position; pos += dir * speed * Time.deltaTime; pos x = Mathf Clamp ( pos x, min x, max x); pos y = Mathf Clamp ( pos y, min y, max y); transform.position = pos ;
} void OnTriggerEnter2D(Collider2D _collider) { if ( _collider.tag == "EnemyShipTag" || _collider.tag ==
NowLive ; lives text = NowLive ToString ();
GameObject expo = ( GameObject )Instantiate (exposion); expo transform position = transform position ; if ( NowLive == ) { 0 gameManager.GetComponent ().SetGameState (GameManager GameStates GameOver ); gameObject.SetActive (false);
//Destroy (gameObject); gameObject.SetActive (false);
// return first place gameObject transform position = new Vector2 ( firstX , firstY ); gameObject.SetActive (true);
} public void animationChooser(string action) { switch(action) { case "shooting": anim.SetBool ("Shooting", true); break; case "unshooting": anim.SetBool ("Shooting", false); break;