Phần trước chúng ta đã tạo được một trái banh nằm yên trên một mặt nền màu xanh thẫm (xem bài 1). Phần này sẽ gán tính tương tác vào trái banh làm sao cho trái banh lăn theo các phím mũi tên trên bàn phím.
Các bài
- Phần 1: Dựng hình
- Phần 2: Chuyển động quả banh lăn
- Phần 3: Di chuyển camera theo đối tượng
- Phần 4: Dựng Vách
- Phần 5: Rải các khối quà
- Phần 6: Hiệu ứng va chạm
- Phần 7: Tính điểm va chạm
- Phần 8: Xuất game
Như vậy chúng ta phải gán đồng thời 2 thuộc tinh
- Thuộc tính vật lý:
- TRỌNG LỰC tạo sức nặng quả banh
- VA CHẠM: trái banh "nằm" trên mặt nền, và bị nẩy khi va vào đối tượng khác
- Gán tương tác khi nhấn các phím mũi tên điều khiển trái banh lăn
- Trái banh di chuyển
- Trái banh xoay
Truy cập Physic: Tạo chuyển động banh lăn, đụng vách dội ra, không lọt ra ngoài mảng plane background
- Để đối tượng mang các tính chất vật lý như một vật thể ngoài đời chúng ta phải gán cho nó thành phần Rigidbody (Compopnent > Physics > Rigidbody)
- Để điều khiển đối tượng bằng tương tác, phải gán lệnh (Assets > Create > C# Script)
Bước 1: Gán thuộc tính Rigidbody vào quả banh
Click chọn quả cầu, và chọn Compopnent > Physics > Rigidbody hay chọn trong Add Component trong bảng lệnh inspector
Sau bước này trên bảng Inspector sẽ có thêm mục Rigidbody
Bước 2: Tạo file lệnh C# script
Tạo file Script
- Tạo thư mục Scripts để chứa file Script
- Tạo Script, tên là PlayerController, bằng 1 trong 3 cách sau
- Từ menu Assets: Create > C# Script
- Từ bảng lệnh Project: Create > Script
- Từ bảng lệnh Inspector, click Add Component, chọn Languge: C Sharp
- Một file script được tạo ra trong thư mục ngoài cùng Asset. Kéo file này vào thư mục Scripts vừa tạo ở trên
Lưu ý là trong bảng lệnh Rigidbody, dòng Use Gravity (áp dụng trọng lực) đang được kiểm
Bước 3: Chỉnh sửa nội dung file Script
Có 3 cách để viết các dòng lệnh.
- Click vào Context menu (hình bánh răng) trong bảng lệnh Player Controller trong inspector
- Click chọn file Script trong bảng lệnh Project. Click "Open" trong bảng lệnh Inspector: PlayerController Import Settings
- Dclick file Script trong bảng lệnh Project
Nhập đoạn Scrip sau
Bước 4: Chạy thử
- Bật nút Play
- Nhấn các nút mũi tên để di chuyển quả banh
Nếu banh không chạy và trong inspector của Player (trái banh) không có bảng lệnh Script. Bạn hãy kéo script vào Player
GIẢI THÍCH
Để áp chuyển động vào từng frame của đối tượng game, có 2 lựa chọn: hàm Update và hàm Fixed Update.
- Hàm Update được gọi trước khi render frame, đây là nơi hầu hết các mã lệnh sẽ thực thi
- Hàm Fixed Update được gọi ngay trước khi thực hiện mọi tính toán vật lý, và đây là nơi mà các mã lệnh vật lý thực thi
Chúng ta di chuyển quả banh bằng cách tạo lực vào rigidbody component, vì vậy sẽ chọn hàm Fixed Update cho inputcủa đối tượng quả banh
Tra cứu hàm từ cửa sổ Monodevelop
Trong cửa sổ Monodevelop, có thể tra một hàm nào đó trong Unity API bằng cách
- Quét chuột tên hàm (ví dụ quét chữ input)
- Nhấn ⌘ + ' trên Mac, Ctrl + ' trên PC. Sẽ ra kết quả các hàm input trong thư viện Unity API
Nếu không mở được trang thư viện, hãy tra thủ công bằng cách truy cập https://docs.unity3d.com/ScriptReference/
- Tra từ input: Chọn kết quả input trên cùng vào lớp input
Chọn hàm GetAxis của lớp input → input.GetAxis là hàm tạo chuyển động do bởi các phím mũi tên qua các giá trị tọa độ các trục x là "Horizontal" và trục z là "Vertical".
Khai báo biến moveHorizontal, kiểu float cho giá trị trục x (Horizontal) và biến moveVertical
float moveHorizontal = Input.GetAxis ("Horizontal");
float moveVertical = Input.GetAxis ("Vertical");
- Tra từ Rigidbody
Chọn AddForce để áp lực vào RigidBody qua Vector3(x,y,z). Khai báo biến movement là một giá trị của Vector3
Vector3 movement = new Vector3 (moveHorizontal,0.0f,moveVertical);
rb.AddForce (movement*speed);
Các thư viện tài nguyên
3 thành phần dưới đây là phần có sẵn khi mở một script. Chúng là các thư viện cơ bản cần có cho mọi dòng lệnh
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
Tạo lớp PlayerController cho file PlayerController (lớp cùng tên với tên file.cs)
public class PlayerController : MonoBehaviour {
.......
}
Khi dùng C#, bắt buộc phải khai báo MonoBehaviour
Hàm Start()
Hàm start sẽ tự chạy khi khởi tạo chương trình.
private Rigidbody rb;
void Start () {
rb = GetComponent<Rigidbody>();
}
Khai báo biến rb để liên kết component RigidBody với script
rb = GetComponent<Rigidbody>();
Hàm FixedUpdated
Hàm fixedUpdate sẽ gán các thuộc tính vật lý vào từng frame input của đối tượng
void FixedUpdate() {
float moveHorizontal = Input.GetAxis ("Horizontal");
float moveVertical = Input.GetAxis ("Vertical");
Vector3 movement = new Vector3 (moveHorizontal,0.0f,moveVertical);
rb.AddForce (movement*speed);
}
Vector3 (x,y,z) sẽ nhận moveHorizontal là giá trị x, moveVertical là tọa độ trục z, trục y = 0 (banh lăn trên nền)
Vector3 movement = new Vector3 (moveHorizontal,0.0f,moveVertical);
Điều chỉnh tốc độ chuyển động qua biến speed
Biến speed được khai báo thay cho việc gán con số thẳng vào lệnh để tăng tốc chuyển động.
public float speed;
......
rb.AddForce (movement*speed);
Bạn có thể không xài speed mà gán luôn giá trị là 100 bằng cách viết lại 2 dòng lệnh trên thành
rb.AddForce (movement*100);
Tuy nhiên nhờ vào biến speed, bạn có thể linh hoạt chỉnh thông số trực tiếp trong Inspector
Câu hỏi: hàm nào làm quả banh di chuyển, hàm nào làm banh xoay?
[embed]https://youtu.be/7C7WWxUxPZE[/embed]
Link Video giới thiệu game: https://unity3d.com/learn/tutorials/projects/roll-ball-tutorial/introduction-roll-ball?playlist=17141