STDIO
Tìm kiếm gần đây
    • Nội dung
    • QR Code
    • 0
    • Bình luận
    • Sao chép

    Hiện Thực Game Zero Với Unity - Phần 5 - Âm Thanh Và Effect

    Hướng Dẫn Hiện Thực Game Zero Với Unity. Hướng dẫn các hiệu ứng âm thanh và hiệu ứng của gameplay.

    Rye Nguyen

    11/08/2015
    30/09/2020
    5 phút đọc
    Hiện Thực Game Zero Với Unity - Phần 5 - Âm Thanh Và Effect

    Bài viết nằm trong chuỗi Hướng Dẫn Hiện Thực Game Zero Với Unity, cung cấp kiến thức trong việc xây dựng 1 game trên Unity, đồng thời biết cách tổ chức project hiệu quả trong Unity.

    Bài viết hướng dẫn thêm các hiệu ứng âm thanh và hiệu ứng của gameplay. 

    Các hiệu ứng âm thanh trong Zero

    Trong Zero sử dụng 3 hiệu ứng âm thanh chính:

    • sfx_answer_right.wav: sử dụng khi người chơi vượt qua 1 level.
    • sfx_answer_wrong.wav: sử dụng khi GameOver.
    • sfx_button_press.wav: sử dụng khi người chơi bấm chọn 1 button (trừ 2 button Right và Wrong được xử lý riêng).

    Để thêm 1 file âm thanh vào button, thực hiện thao tác kéo thả trực tiếp hoặc chọn Add Component → Audio → Audio Source, sau đó kéo thả file âm thanh vào thuộc tính Clip của Audio Source.

    2 button Right và Wrong quan trọng nên sẽ ưu tiên hiện thực trước. Về mặt logic, sfx_answer_right và sfx_answer_wrong không gắn vào 2 button tương ứng. Câu trả lời của người chơi ở mỗi level là yếu tố quyết định âm thanh nào sẽ được phát ra. Do đó, đưa phần xử lý 2 âm thanh này vào GameManager.cs như sau:

    Xử lý âm thanh Right (dòng 174-175, GameManager.cs):

    m_audioController.clip = m_sfxAnswerRight;
    m_audioController.Play();

    Xử lý âm thanh Wrong (dòng 253-254, GameManager.cs):

    m_audioController.clip = m_sfxAnswerWrong;
    m_audioController.Play();

    Trước đó, định nghĩa các thuộc tính cần thiết và khởi tạo chúng trước khi sử dụng. Thao tác như sau:

    Khai báo (dòng 33-35, GameManager.cs):

    private AudioClip m_sfxAnswerRight;
    private AudioClip m_sfxAnswerWrong;
    private AudioSource m_audioController;

    Khởi tạo (dòng 52-54, GameManager.cs):

    m_sfxAnswerRight = Resources.Load<AudioClip>("Audios/sfx_answer_right");
    m_sfxAnswerWrong = Resources.Load<AudioClip>("Audios/sfx_answer_wrong");
    m_audioController = GetComponent<AudioSource>();

    Sử dụng Resources.Load để load trực tiếp các file âm thanh trong thư mục tài nguyên. 

    Đối với các button còn lại, việc phát âm thanh có thể xử lý trong code hoặc cách khác tiện dụng hơn là sử dụng event OnClick của button. Thao tác như sau:

    • Thêm component Audio Source và gắn âm thanh sfx_button_press.wav vào thuộc tính Clip của Audio Source.
    • Tạo thêm 1 event OnClick bằng cách click chọn dấu "+" ở Inspector của button.
    • Chọn Audio Source của chính button đó và chọn Audio Source → Play() ở menu bên cạnh.
     Zero Unity

    Thêm effect cho gameplay

    Trong gameplay của Zero, thống nhất tạo ra các hiệu ứng Rotate và Flash cho các suit để tăng tính hấp dẫn cho game. 2 hiệu ứng này đã được hiện thực lại trong script EffectController.cs, có thể tham khảo thêm để hiểu về giải thuật sử dụng trong các hiệu ứng.

    Nguyên mẫu của 2 hàm như sau:

    public void EffectsController.DoRotateEffect(GameObject suit);
    public void EffectsController.DoFlashEffect(GameObject suit);

    Tham số truyền vào là suit cần tạo hiệu ứng. Mỗi khi người chơi vượt qua 1 level, Effect state (trạng thái hiệu ứng) của mỗi suit sẽ được cập nhật lại. Chỉ những suit đang được kích hoạt mới có hiệu ứng.

    Trước hết, các hiệu ứng được định nghĩa trong enum Effect (dòng 29-34, Statics.cs):

    public enum Effect
    {
    	EFFECT_FLASH,
    	EFFECT_ROTATE,
    	EFFECT_NONE
    }

    2 hằng số về tỉ lệ xuất hiện hiệu ứng (dòng 19-20, Statics.cs):

    public static readonly int s_effectFlashRate = 10;
    public static readonly int s_effectRotateRate = 20;

    Mỗi suit sẽ có một biến tương ứng quyết định effect của suit trong một level. Sử dụng mảng 1 chiều để lưu trữ chung trạng thái effect của các suit như sau (dòng 37, 56, GameManager.cs):

    sprivate Effect[] m_suitEffects;
    m_suitEffects = new Effect[Constant.s_numSuit * 2];

    Tại hàm Update, các suit có effect sẽ được cập nhật liên tục từng frame. Do trong Zero chỉ có 2 effect chính là Rotate và Flash nên hiện thực đơn giản như sau (dòng 106-120, GameManager.cs):

    /* Do Effect */
    for (int i = 0; i < Constant.s_numSuit; i++)
    {
    	/* Effect for left side */
    	if (m_suitEffects[i] == Effect.EFFECT_ROTATE)
    		GetComponent<EffectsController>().DoRotateEffect(m_lefts[i]);
    	else if (m_suitEffects[i] == Effect.EFFECT_FLASH)
    		GetComponent<EffectsController>().DoFlashEffect(m_lefts[i]);
    
    	/* Effect for right side */
    	if (m_suitEffects[i + Constant.s_numSuit] == Effect.EFFECT_ROTATE)
    		GetComponent<EffectsController>().DoRotateEffect(m_rights[i]);
    	else if (m_suitEffects[i + Constant.s_numSuit] == Effect.EFFECT_FLASH)
    		GetComponent<EffectsController>().DoFlashEffect(m_rights[i]);
    }

    Tại hàm GenerateNextCalculation, loại bỏ effect của tất cả các suit, sau đó tiến hành random effect cho các suit đang được kích hoạt. Các hiệu ứng chỉ tồn tại trong 1 level duy nhất nên việc cập nhật lại tại GenerateNextCalculation là hợp lý và hiệu quả nhất. Code như sau (dòng 136-165, GameManager.cs):

    /* Reset effect to none */
    for(int i = 0; i < Constant.s_numSuit; i++)
    {
    	m_suitEffects[i] = Effect.EFFECT_NONE;
    	m_suitEffects[i + Constant.s_numSuit] = Effect.EFFECT_NONE;
    
    	m_lefts[i].transform.rotation = Quaternion.identity;
    	m_rights[i].transform.rotation = Quaternion.identity;
    }
    
    /* Get new effect */
    for(int i = 0; i < m_calculation[0]; i++)
    {
    	int randValue = Random.Range(0, 100);
    
    	if (randValue <= Constant.s_effectFlashRate)
    		m_suitEffects[i] = Effect.EFFECT_FLASH;
    	else if (randValue <= Constant.s_effectRotateRate)
    		m_suitEffects[i] = Effect.EFFECT_ROTATE;
    }
    
    for (int i = 0; i < m_calculation[1]; i++)
    {
    	int randValue = Random.Range(0, 100);
    
    	if (randValue <= Constant.s_effectFlashRate)
    		m_suitEffects[i + Constant.s_numSuit] = Effect.EFFECT_FLASH;
    	else if (randValue <= Constant.s_effectRotateRate)
    		m_suitEffects[i + Constant.s_numSuit] = Effect.EFFECT_ROTATE;
    }

    Sau khi hiệu ứng kết thúc, cụ thể là hiệu ứng xoay, suit có thể sẽ không còn góc xoay mặc định ban đầu. Do đó gán lại góc xoay Quaternion.identity cho các suit khi hiệu ứng kết thúc (dòng 142-143).

    Đến đây game đã hoàn thiện, có thể chọn nút Play để xem thành quả đạt được.

     Zero Unity

    Download Project

    STDIO_ZeroUnity-5

    Bài chung series

    Lập Trình Game

    Lập Trình Game

    Kiến thức, kỹ thuật, kinh nghiệm lập trình game.

    Phù hợp cho bạn

    Đề xuất

    Hiện Thực Game Zero Với Unity - Phần 2 - Hiện Thực Gameplay

    Hiện Thực Game Zero Với Unity - Phần 2 - Hiện Thực Gameplay

    Hướng Dẫn Hiện Thực Game Zero Với Unity. Giới thiệu và hướng dẫn xây ...

    Lập Trình GameCùng làm game

    09/08/2015

    Hiện Thực Game Zero Với Unity - Phần 3 - Điểm Số Và Progress Timer

    Hiện Thực Game Zero Với Unity - Phần 3 - Điểm Số Và Progress Timer

    Hướng Dẫn Hiện Thực Game Zero Với Unity. Hướng dẫn cài đặt tính năng ...

    Lập Trình GameCùng làm game

    10/08/2015

    Khám phá thêm

    Hiện Thực Game Zero Với Unity - Phần 4 - Scene Và Popup

    Hiện Thực Game Zero Với Unity - Phần 4 - Scene Và Popup

    Hướng Dẫn Hiện Thực Game Zero Với Unity. Thiết kế hệ thống scene và ...

    Lập Trình GameCùng làm game

    10/08/2015

    Hiện Thực Game Zero Với Unity - Phần 1 - Nhận Sự Kiện Button

    Hiện Thực Game Zero Với Unity - Phần 1 - Nhận Sự Kiện Button

    Hướng Dẫn Hiện Thực Game Zero Với Unity. Thiết lập môi trường phát triển ...

    Lập Trình GameCùng làm game

    09/08/2015

    Hướng Dẫn Viết Game Zero Với Cocos2d-x - Phần 7: Hiện thực GameScene - Button

    Hướng Dẫn Viết Game Zero Với Cocos2d-x - Phần 7: Hiện thực GameScene - Button

    Hướng dẫn gắn thêm các button vào game, và hiện thực hàm resetButton cho ...

    Lập Trình GameCùng làm game

    12/03/2015

    Phát Triển Game Funny Halloween Pumpkins với Cocos2d-x - Phần 1

    Phát Triển Game Funny Halloween Pumpkins với Cocos2d-x - Phần 1

    Hướng dẫn làm game cụ thể bằng Cocos2d-x với code mẫu và game mẫu.

    Lập Trình GameCùng làm game

    27/11/2015

    Hướng Dẫn Viết Game Zero Với Cocos2d-x - Phần 2: Hiện Thực LoadScene

    Hướng Dẫn Viết Game Zero Với Cocos2d-x - Phần 2: Hiện Thực LoadScene

    Hướng dẫn cách để hiện thực một scene trong game, cũng như cách để ...

    Lập Trình GameCùng làm game

    01/03/2015

    Hướng Dẫn Viết Game Zero Với Cocos2d-x - Phần 9: Hiện thực GameScene - Điểm Số

    Hướng Dẫn Viết Game Zero Với Cocos2d-x - Phần 9: Hiện thực GameScene - Điểm Số

    Hướng dẫn cách hiện thực GameScene, cách tính điểm và update điểm số lên ...

    Lập Trình GameCùng làm game

    15/03/2015

    Hiện Thực Menu Select Level với Scroll Rect

    Hiện Thực Menu Select Level với Scroll Rect

    Hiện thực level select với thành phần Scroll Rect trong Unity.

    Lập Trình GameUnity

    08/08/2015

    STDIO
    Trang chính
    Công ty TNHH STDIO

    30, Trịnh Đình Thảo, Hòa Thạnh, Tân Phú, Hồ Chí Minh
    +84 28.36205514 - +84 942.111912
    developer@stdio.vn

    383/1 Quang Trung, Phường 10, Quận Gò Vấp, Hồ Chí Minh
    Số giấy phép ĐKKD: 0311563559 do sở Kế hoạch và Đầu Tư TPHCM cấp ngày 23/02/2012

    ©STDIO, 2013 - 2020