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.

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

No comments

Leave your comment

In reply to Some User