Danh hiệu: Administration
Nhóm: Gia nhập: 20-08-2014(UTC) Bài viết: 60
Cảm ơn: 2 lần Được cảm ơn: 2 lần trong 2 bài viết
|
bài viết trích dẫn của bạn đậu tài trên diễn đàn của unity việt. ===================================================================
Raycast trong Unity, nói nôm na là bắn một tia từ một ví trí A(x1, y1, z1), theo một vector hướng (x2, y2, z2), trong một khoảng cách nhất định sẽ bắn trúng một Collider tại một điểm giao nhau là hit(x3, y3, z3)
Raycast có rất nhiều ứng dụng, ví dụ như tìm đích của viên đạn, xác định vật thể sắp va chạm khi rơi, …Nhưng đó là trong môi trường game, còn ở bài giới thiệu này, tôi sẽ giới thiệu cách dùng Raycast để chọn đối tượng trong game bằng cách nhấp chuột (hay chạm vào màn hình chạm) khi chơi game.
Game ví dụ sẽ là một bảng ô có màu vàng, khi ta nhấn chuột (hay chạm màn hình) vào ô nào thì ô đó sẽ chuyển sang màu đỏ, xem hình dưới đây
Mô hình sử dụng raycast trong trường hợp này được mô tả như sơ đồ sau:
Theo đó, khi bạn nhấn vào màn hình, 1 tia sẽ bắn theo hướng Camera từ vị trí camera (nếu game 2D thì vị trí bắn sẽ là từ mặt phẳng camera). Tia này gặp collider của ô vuông và báo một sự kiện lệnh.
Tuy nhiên vấn đề là vị trí của chuột (hay chạm) trên màn hình sẽ khác hệ tọa độ với game, do đó cần có hàm chuyển, bạn hãy yên tâm, Unity hỗ trợ rất mạnh việc này, chỉ cần 1 hàm là đủ
Đầu tiên, trong scene mới của Unity, bạn tạo ra các đối tượng như hình sau:
Bảng ô sẽ có 4 hàng, mỗi hàng gồm 4 Quad (tạo bằng Hierarchy, Create > Quad)
Sau đó, bạn đặt tag “cell” cho 16 Quad này.
Muốn đặt tag thì ta chọn object, rồi nhấn vào mục Tag, tại list tag sổ xuống, nếu chưa có tag ta cần thì chọn Add Tag:
Đặt tên mới cho tag mới:
Sau đó chọn 16 Quad ban đầu, chọn tag “cell” cho nó.
Tạo một script mới, đặt tên là “RaycastHitMouse”, kéo vào Main Camera
Ta viết code cho script này như sau:
Mã:
using UnityEngine;
using System.Collections;
public class raycastHitMouse : MonoBehaviour {
public GameObject[] cell;
// Use this for initialization
void Start () {
resetColor();
}
// Update is called once per frame
void Update () {
if(Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, 100))
{
if(hit.collider.gameObject.tag == "cell")
{
resetColor();
hit.collider.gameObject.renderer.material.color = Color.red;
}
}
}
}
private void resetColor()
{
for(int i = 0; i < 16; i++)
{
cell[i].renderer.material.color = Color.yellow;
}
}
}
Giải thích:
Biến toàn cục cell là một mảng GameObject, đặt public, cho phép bạn kéo trỏ 16 Quad ban đầu vào biến này:
Hàm resetColor() dùng để đặt màu vàng cho 16 ô Quad
Trong Update():
if(Input.GetMouseButtonDown(0)) để kiểm tra nếu người dùng nhấn chuột trái
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition): hàm chuyển đổi Camera.main.ScreenPointToRay(Vector3 pos) sẽ nhận vào vị trí Chuột theo hệ tọa độ của màn hình và chuyển thành một tia (ray) theo hệ tọa độ world trong game
if (Physics.Raycast(ray, out hit, 100)): kiểm tra nếu trong khoảng cách 100 trong hệ tọa độ world trong game tính từ vị trí (hoặc mặt phẳng) camera, mà tia raycast đụng trúng Collider hay không
các thuộc tính của Raycast vui lòng xem link tham khảo.
if(hit.collider.gameObject.tag == “cell”): kiểm tra nếu trong Collider đụng trúng có tag là “cell” hay không
hit.collider.gameObject.renderer.material.color = Color.red: đổi màu cho object chứa Collider bị đụng trúng
Rồi, bây giờ bạn nhấn Play và xem thử ô chọn có đổi màu hay không, chúc thành công và hẹn gặp lại!
Link tham khảo:
Video: http://unity3d.com/learn...inner/physics/raycasting
Mô tả script: http://docs.unity3d.com/...nce/Physics.Raycast.html
|