Xem lại: Bài 7: Text, Particle System và chuyển đổi màn chơi Note: thời gian qua mình khá bận và không thu xếp được để viết bài Vừa rồi có một bạn hỏi cách làm sao để truyền một giá trị từ một script này sang script khác. Hôm nay mình sẽ trả lời chi tiết câu hỏi này trong phần hướng dẫn sử dụng Sound và Design Pattern trong game. Link dự án mẫu: https://www.dropbox.com/s/0m84bjfv74yl82b/RunningMan.zip link dự phòng tại đây III. Tạo các đối tượng cơ bản 1. Game Object 2. Sprite 3. Animation 4. Prefab 5. Script và điều khiển máy trạng thái 6. Thành phần vật lý và xử lý va chạm 7. Sử dụng text 8. Sử dụng Particle System 9. Chuyển đổi màn chơi 10. Sound Đầu tiên, ta sẽ import một tập tin mp3 vào dự án để làm nhạc nền, bằng cách click chuột phải vào thư mục Sounds, chọn Import New Assets, sau đó tìm đến tập tin MP3 của mình. Để sử dụng và quản lý sound, ta sẽ quản lý thông qua một đối tượng trong game. Tiến hành tạo mới một Empty game object, đặt tên là SoundManager, sau đó thêm Audio Source component cho đối tượng này. Ở cửa sổ Inspector, ta nhấn nút được bao tròn ô vuông màu đỏ, để chọn nhạc (Nhớ là phải import nhạc vào sẵn), chọn Start on awake để tự động chơi nhạc mỗi khi đối tượng bắt đầu khởi tạo, chọn loop nếu cho phép nhạc lặp đi lặp lại. Như vậy là ta đã có được nhạc nền cho game, nhấn thử nút Play để xem kết quả. Tiếp theo ta sẽ import thêm một bài khác nữa, thao tác tương tự, để điều khiển bắt đầu nhạc, tạm dừng ta sẽ tạo một script cho đối tượng SoundManager, đặt tên là SoundManagerBehaviour Ta sẽ viết Script như sau: Như vậy, khi game chạy, mỗi lần nhấn nút P là nhạc tắt, nhấn nút S là nhạc chơi lại. Ngoài ra các bạn có thể tìm hiểu thêm, để sử dụng linh hoạt hơn trong game tại https://docs.unity3d.com/Documentation/Manual/Sound.html. 11. Design Pattern trong game. Design Pattern hay mẫu thiết kế, là cách xây dựng một lớp dựa trên một thiết kế nhất định nào đó. Ở bài này mình sẽ giới thiệu đến các bạn một Pattern được sử dụng nhiều trong game đó là Singleton. Vậy khi nào thì sử dụng Singleton ? - Singleton sử dụng khi trong chương trình chỉ tồn tại duy nhất một instance (thể hiện or đối tượng) của một lớp nào đó. Ví dụ: Ta có lớp SoundManager để quản lý tất cả sound cho game, thì suốt chương trình chỉ cần duy nhất 1 thể hiện của lớp SoundManager để quản lý âm thanh trong game. Như vậy ta sẽ cài đặt lớp SoundManager theo mẫu Singleton. Về cơ bản mẫu Singleton được thiết kế như sau: Hàm dựng (constructor) để là private, để đảm bảo không tạo được đối tượng từ bên ngoài lớp, chỉ cho phép tạo đối tượng từ hàm GetInstance thôi. Câu lệnh instance = this; để đảm bảo biến instance được trỏ đến đối tượng duy nhất vừa mới tạo ra. Chúng ta có thể xem lại cách thiết kế của lớp SoundManagerBehaviour để thấy chi tiết. Để sử dụng ta sử dụng như sau: Như vậy ở bất cứ đâu trong dự án, muốn điều khiển Sound, bật tắt bài nào đó ta chỉ việc gọi SoundManagerBehaviour.GetInstances().Method() là được. *** Cách truyền một giá trị từ script này sang script khác. Nhu cầu truyền một giá trị từ script này sang script khác rất thường xuyên. Ở Unity một script được coi là một component của một GameObject, vì vậy để làm việc này ta chỉ cần xác định được đối tượng GameObject chứa script cần truyền giá trị, sau đó từ đối tượng này ta sẽ truy xuất giá trị cần thiết thông qua component script. Ví dụ: ở Script SoundManagerBehaviour ta muốn truy xuất đến các giá trị ở Script MainCharacterBehaviour ta làm như sau: Đầu tiên ta sẽ đặt cho đối tượng MainCharacter tag là: Player (Xem lại phần 2 để biết cách đặt tag). Ở script SoundManagerBehaviour ta khai báo một đối tượng là mainCharacter kiểu GameObject. Ở hàm Start của SoundManagerBehaviour ta thực hiện như sau: Chú ý lênh mainCharacter = GameObject.FindGameObjectWithTag("Player"); cần phải đặt ở hàm Start (hàm này chỉ gọi một lần khi khởi tạo xong đối tượng), nếu lệnh này đặt ở Update/FixedUpdate/Render... thì sẽ làm chậm chương trình và không tối ưu. Vì quá trình tìm kiếm một đối tượng dựa vào tag hay vào một tiêu chí nào đó sẽ mất rất nhiều thời gian. Sau khi tìm thấy đối tượng chúng ta có thể truy xuất, thay đổi các thành phần public của script đó bằng cách: if (mainCharacter != null) { MainCharacterBehaviour script = mainCharacter.GetComponent<MainCharacterBehaviour>(); script.speed = new Vector3(1, 0, 0); // access and change speed value of main character } Hoặc bạn có thể cài đặt đối tượng MainCharacter theo Singleton như hướng dẫn ở trên, vì thông thường trong một game thì chỉ có 1 MainCharacter. Xong phần này về cơ bản bạn đã nắm được hầu hết các đối tượng cơ bản và cách xử lý các đối tượng cơ bản trong unity để bắt đầu hành trình trên con đường lập trình game rồi đấy. Chúc các bạn thành công !