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ả

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
C# Extension trong Unity: Delay Action Coroutine
Việc chờ một khoảng thời gian rồi gọi một (hoặc nhiều) hàm trong một project thì cách đơn giản nhất là sử dụng Coroutine. Cách thông thường nhất là...
Save/Load dữ liệu trong Unity
Save/Load dữ liệu có lẽ là điều quá quen thuộc với những người đã từng chơi game. Bài viết này mình sẽ hướng dẫn các bạn cách dựng một...
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...