Tương tác với Object đa nền tảng trong Unity

26 Tháng Sáu, 2024

Với phần lớn game trên smartphone, việc tương tác với object trong game đa phần là dùng ngón tay. Vấn đề đặt ra ở đây là việc phát triển game dù cho các platform nào đều phải thực hiện trên PC với bàn phím và chuột. Vậy để làm sao để tiết kiệm thời gian cho các dev không phải code riêng cho mỗi nền tảng tách biệt? EventSystem là để giải quyết vấn đề này.

Cụ thể trong bài viết này, mình sẽ hướng dẫn các bạn thực hiện các thao tác tương tác cơ bản (chạm, kéo, thả) với Object mà không phải code riêng cho các nền tảng khác nhau. Công cụ mình sẽ dùng chủ yếu là các interface của EventSystem.

Setup các Object

Do có sự khác biệt giữa Object trên Canvas và Gameobject trong Scene nên mình sẽ hướng dẫn tách biệt trong phần này.

Với Gameobject trong Scene

Đầu tiên, mình sẽ tạo ra một gameobject 2D như dưới đây:

Thêm component BoxCollider2D cho gameobject mình vừa tạo
Thêm component BoxCollider2D cho gameobject mình vừa tạo

Thêm component BoxCollider2D cho gameobject mình vừa tạo

component BoxCollider2D
component BoxCollider2D

Tiếp đến là thêm component Physics 2D Raycast cho MainCamera.

Thêm component Physics 2D Raycast
Thêm component Physics 2D Raycast

Với Object trong Canvas

Với object trên Canvs thì đơn giản hơn. Bạn chỉ cần tạo Canvas từ UI là được. Ở đây mình sẽ tạo mẫu một object từ Image của UI.

Object trong Canvas
Object trong Canvas

Scripts

Sau khi setup xong xuôi với cả hai trường hợp của object. Phần việc quan trọng nhất vẫn là viết script. Về script, thì cả hai trường hợp hoàn toàn giống nhau.

Bước đầu tiên, mình sẽ tạo script ControlObject.cs và kế thừa thêm các interface của EventSystem.

using UnityEngine;
using UnityEngine.EventSystems;
public class ControlObject : MonoBehaviour, IPointerDownHandler, IDragHandler
{
    public void OnDrag(PointerEventData eventData)
    {
    }
    public void OnPointerDown(PointerEventData eventData)
    {
    }
}

Ở đây, mình chỉ dùng hai interface của EventSystems đó là IPointerDownHandler IDragHandler. Với công dụng:

  • IPointerDownHandler là khi bạn giữ chuột trái trên PC hoặc ngón tay chạm vào object trên smartphone.
  • IDragHandler là khi bạn bắt đầu di chuột trên PC hoặc di chuyển ngón tay trên smartphone.

Để biết thêm nhiều interface của EventSystems các bạn truy cập vào đường link nhé.

Tiếp theo, mình sẽ code để di chuyển object bằng con trỏ chuột hoặc ngón tay trên smartphone:

using UnityEngine;
using UnityEngine.EventSystems;
public class ControlObject : MonoBehaviour, IPointerDownHandler, IDragHandler
{
    public bool isOnCanvas;
    private Vector3 offset;
    public void OnDrag(PointerEventData eventData)
    {
        Vector3 pointerPosition = GetPointerPosition();
        transform.position = pointerPosition - offset;
    }
    public void OnPointerDown(PointerEventData eventData)
    {
        Vector3 pointerPosition = GetPointerPosition();
        offset = pointerPosition - transform.position;
    }
    private Vector3 GetPointerPosition()
    {
        Vector3 pointerPosition = Vector3.zero;
        if (isOnCanvas)
        {
// Object trên Canvas dùng toạ độ trên screen
            pointerPosition = Input.mousePosition;
        }
        else
        {
// Object trong Scene dùng toạ độ World
            pointerPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        }
        pointerPosition.z = 0;
        return pointerPosition;
    }
}

Vậy là đã viết xong script, giờ mình sẽ thêm script vào hai object mình vừa setup. Đối với object trên Canvas sẽ tick vào IsOnCanvas:

Object trên Canvas
Object trên Canvas

Cuối cùng, là test xem mọi thứ đã OK chưa. Ở đây cái khiên sẽ là object trong scene còn cái kiếm sẽ là object trên Canvas.

Kiểm tra lại thành quả
Kiểm tra lại thành quả

0 0 đánh giá
Đánh giá bài viết
Theo dõi
Thông báo của
guest
0 Góp ý
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất
Phản hồi nội tuyến
Xem tất cả bình luận
Tin tức liên quan
Command Pattern và ứng dụng trong Unity – Phần 1
Trong lập trình game, việc tương tác, điều khiển của người chơi với game là rất quan trọng. Do vậy, command pattern được sử dụng rộng rãi và phổ...
Các hàm cơ bản của Monobehaviour Unity: Awake, OnEnable, Start
Monobehaviour là một lớp “nền” cho các script được gắn vào game object trong Unity. Một lớp Mono có sẵn rất nhiều hàm để thực thi các chức năng...
Singleton trong Unity
Nếu phải chỉ ra một design pattern nào không thể thiếu trong một project thì đó chắc chắn là Singleton. Đơn giản, tính ứng dụng cao là các ưu...
0
Rất thích suy nghĩ của bạn, hãy bình luận.x