Tuyệt vời! Bạn đang muốn biến đổi cử chỉ chạm trên màn hình thành chuyển động tương đối cho tàu vũ trụ trong Unity. Đây là một kỹ thuật phổ biến trong phát triển game di động.
Để làm điều này trong C# và Unity, bạn cần theo dõi sự thay đổi vị trí của ngón tay chạm (touch) và áp dụng sự thay đổi đó vào vị trí của tàu vũ trụ.
Dưới đây là cách thực hiện chi tiết:
1. Thiết lập Biến và Component Cần Thiết
Bạn sẽ cần một script C# (ví dụ: TouchMovement.cs) gắn vào GameObject tàu vũ trụ của bạn.
using UnityEngine;
using UnityEngine.InputSystem.EnhancedTouch; // Quan trọng: Dùng EnhancedTouch
public class TouchMovement : MonoBehaviour
{
private Vector2 startTouchPosition; // Vị trí chạm ban đầu
private Vector3 initialShipPosition; // Vị trí tàu vũ trụ ban đầu khi bắt đầu chạm
private bool isTouching = false; // Theo dõi trạng thái chạm
[Header("Cài đặt")]
[Tooltip("Hệ số để điều chỉnh tốc độ/độ nhạy của chuyển động")]
public float sensitivity = 0.01f;
// Các giới hạn di chuyển (tùy chọn)
public float movementLimitX = 5f;
public float movementLimitY = 3f;
// ... (Thêm các biến khác nếu cần)
}
2. Xử lý Sự kiện Chạm (Touch Input)
Bạn nên sử dụng hệ thống Input System mới của Unity (đặc biệt là EnhancedTouch cho di động) để xử lý chạm một cách hiệu quả.
Bật EnhancedTouch
Trước tiên, hãy đảm bảo bạn đã bật EnhancedTouch Support trong Project Settings > Player > Other Settings hoặc bằng code.
private void OnEnable()
{
// Bật EnhancedTouch
EnhancedTouchSupport.Enable();
UnityEngine.InputSystem.EnhancedTouch.Touch.onFingerDown += OnFingerDown;
UnityEngine.InputSystem.EnhancedTouch.Touch.onFingerMove += OnFingerMove;
UnityEngine.InputSystem.EnhancedTouch.Touch.onFingerUp += OnFingerUp;
}
private void OnDisable()
{
// Tắt và hủy đăng ký
UnityEngine.InputSystem.EnhancedTouch.Touch.onFingerDown -= OnFingerDown;
UnityEngine.InputSystem.EnhancedTouch.Touch.onFingerMove -= OnFingerMove;
UnityEngine.InputSystem.EnhancedTouch.Touch.onFingerUp -= OnFingerUp;
EnhancedTouchSupport.Disable();
}
3. Hàm Xử lý Từng Pha Chạm
A. Bắt đầu Chạm (OnFingerDown)
Khi người chơi chạm vào màn hình lần đầu, bạn cần ghi lại vị trí chạm ban đầu và vị trí hiện tại của tàu vũ trụ.
private void OnFingerDown(Finger finger)
{
// Chỉ xử lý ngón chạm đầu tiên (single touch)
if (finger.index == 0)
{
startTouchPosition = finger.screenPosition;
initialShipPosition = transform.localPosition; // Tốt nhất nên dùng localPosition
isTouching = true;
}
}
B. Di chuyển Ngón Tay (OnFingerMove)
Đây là phần cốt lõi. Trong khi ngón tay di chuyển, bạn tính toán độ lệch (delta) từ vị trí chạm ban đầu và áp dụng độ lệch đó (sau khi nhân với sensitivity) vào vị trí ban đầu của tàu vũ trụ.
private void OnFingerMove(Finger finger)
{
if (isTouching && finger.index == 0)
{
// 1. Tính độ lệch của ngón tay (từ điểm chạm ban đầu)
Vector2 currentTouchPosition = finger.screenPosition;
Vector2 touchDelta = currentTouchPosition - startTouchPosition;
// 2. Chuyển đổi độ lệch màn hình thành độ lệch thế giới game
// Sử dụng sensitivity để điều chỉnh
Vector3 worldDelta = new Vector3(
touchDelta.x * sensitivity,
touchDelta.y * sensitivity,
0 // Giữ trục Z không đổi
);
// 3. Tính toán vị trí mới của tàu
Vector3 newPosition = initialShipPosition + worldDelta;
// 4. (Tùy chọn) Giới hạn chuyển động quanh vị trí ban đầu
newPosition.x = Mathf.Clamp(newPosition.x, initialShipPosition.x - movementLimitX, initialShipPosition.x + movementLimitX);
newPosition.y = Mathf.Clamp(newPosition.y, initialShipPosition.y - movementLimitY, initialShipPosition.y + movementLimitY);
// 5. Áp dụng vị trí mới
transform.localPosition = newPosition;
}
}
C. Ngón Tay Nhấc Lên (OnFingerUp)
Khi người chơi nhấc ngón tay, bạn kết thúc chế độ điều khiển bằng chạm.
private void OnFingerUp(Finger finger)
{
if (finger.index == 0)
{
isTouching = false;
// Tùy chọn: Có thể reset tàu về vị trí initialShipPosition hoặc giữ nguyên
// Ví dụ: transform.localPosition = initialShipPosition;
}
}
4. Giải thích Kỹ thuật
| Khái niệm | Chi tiết | Mục đích |
|---|---|---|
| Chuyển động Tương đối | Tính toán sự thay đổi vị trí (touchDelta) của ngón tay so với điểm chạm ban đầu (startTouchPosition). | Đảm bảo tàu di chuyển quanh vị trí ban đầu của nó thay vì nhảy đến vị trí ngón tay. |
| Vị trí Ban đầu của Tàu | Ghi lại initialShipPosition khi bắt đầu chạm. | Thiết lập điểm neo (anchor point) cho chuyển động tương đối. |
| sensitivity | Hệ số nhân nhỏ (ví dụ: 0.01). | Chuyển đổi đơn vị pixel lớn của màn hình thành đơn vị thế giới game nhỏ hơn, điều chỉnh độ nhạy. |
| localPosition | Sử dụng transform.localPosition. | Đảm bảo tàu di chuyển tương đối với Parent của nó (nếu có), giúp việc đặt giới hạn và quản lý chuyển động dễ dàng hơn. |
Bằng cách này, tàu vũ trụ của bạn sẽ bắt chước chuyển động của ngón tay theo một tỉ lệ nhất định, xoay quanh điểm nó đã đứng khi người chơi bắt đầu chạm.
No comments:
Post a Comment