Tương tác với Object đa nền tảng trong Unity
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
Tiếp đến là thêm component Physics 2D Raycast cho MainCamera.
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.
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 và 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:
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.