logo
Khóa học lập trình game server - smartfox - game đa người chơi Học lập trinh game online 3dvietpro Sửa chữa và thiết kế website .net
Welcome Guest! To enable all features please Đăng nhập or Đăng ký.

Thông báo

Icon
Error

Tùy chọn
Xem
Xem bài viết cuối Go to first unread
JungJinHyuk  
#1 Đã gửi : 29/09/2014 lúc 12:46:02(UTC)
JungJinHyuk

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.
===================================================================
UserPostedImage
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
UserPostedImage
Mô hình sử dụng raycast trong trường hợp này được mô tả như sơ đồ sau:
UserPostedImage
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:
UserPostedImage
Bảng ô sẽ có 4 hàng, mỗi hàng gồm 4 Quad (tạo bằng Hierarchy, Create > Quad)
UserPostedImage
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:
UserPostedImage
Đặt tên mới cho tag mới:
UserPostedImage
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:
UserPostedImage
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
Bạn bình luận ngay tại đây
G4VietVLTK  
#2 Đã gửi : 16/10/2014 lúc 11:16:26(UTC)
G4VietVLTK

Danh hiệu: Newbie

Nhóm:
Gia nhập: 15-10-2014(UTC)
Bài viết: 2

thanks you!
Ai đang xem chủ đề này?
Guest
Di chuyển  
Bạn không thể tạo chủ đề mới trong diễn đàn này.
Bạn không thể trả lời chủ đề trong diễn đàn này.
Bạn không thể xóa bài của bạn trong diễn đàn này.
Bạn không thể sửa bài của bạn trong diễn đàn này.
Bạn không thể tạo bình chọn trong diễn đàn này.
Bạn không thể bỏ phiếu bình chọn trong diễn đàn này.

Powered by YAF 2.1.0 | YAF © 2003-2024, Yet Another Forum.NET
Thời gian xử lý trang này hết 0.097 giây.