Để tạo chuyển động cho đối tượng game trong Unity sao cho khi bạn di chuyển đầu ngón tay trên màn hình thì đối tượng game cũng di chuyển tương tự, bạn có thể sử dụng input từ cảm ứng (touch input) để cập nhật vị trí của đối tượng game theo hướng di chuyển của ngón tay.
### Các bước chính để thực hiện:
1. **Nhận diện vị trí ngón tay trên màn hình**: Sử dụng `Input.GetTouch()` để lấy vị trí ngón tay.
2. **Chuyển đổi vị trí màn hình sang không gian thế giới (world space)**: Dùng `Camera.main.ScreenToWorldPoint()` để chuyển vị trí từ không gian màn hình sang không gian thế giới.
3. **Cập nhật vị trí đối tượng**: Sau khi có vị trí, bạn có thể di chuyển đối tượng theo hướng ngón tay.
### Ví dụ mã nguồn C# trong Unity:
```csharp
using UnityEngine;
public class TouchMovement : MonoBehaviour
{
// Tốc độ di chuyển của đối tượng
public float moveSpeed = 5f;
// Vị trí đầu ngón tay (Touch)
private Vector3 touchPosition;
void Update()
{
// Kiểm tra nếu có ít nhất một ngón tay trên màn hình
if (Input.touchCount > 0)
{
// Lấy thông tin ngón tay đầu tiên
Touch touch = Input.GetTouch(0);
// Chuyển đổi vị trí màn hình thành vị trí thế giới
touchPosition = Camera.main.ScreenToWorldPoint(touch.position);
// Đảm bảo đối tượng chỉ di chuyển trên mặt phẳng 2D (giữ giá trị z không đổi)
touchPosition.z = 0;
// Di chuyển đối tượng theo ngón tay
transform.position = Vector3.Lerp(transform.position, touchPosition, moveSpeed * Time.deltaTime);
}
}
}
```
### Giải thích:
* **Input.touchCount > 0**: Kiểm tra xem có ngón tay nào đang chạm vào màn hình không.
* **Touch touch = Input.GetTouch(0)**: Lấy thông tin của ngón tay đầu tiên.
* **Camera.main.ScreenToWorldPoint(touch.position)**: Chuyển đổi vị trí của ngón tay từ không gian màn hình (screen space) sang không gian thế giới (world space).
* **transform.position = Vector3.Lerp(...)**: Di chuyển đối tượng về vị trí ngón tay theo một cách mượt mà (Lerp giúp di chuyển từ vị trí cũ tới vị trí mới một cách dần dần, tránh nhảy).
### Lưu ý:
* Nếu bạn muốn đối tượng di chuyển theo hình tròn (như trong yêu cầu của bạn), bạn có thể tính toán vị trí của ngón tay sao cho nó di chuyển theo hình tròn. Bạn sẽ cần một số toán học để đảm bảo quỹ đạo di chuyển của ngón tay (và do đó là đối tượng game) là hình tròn.
Ví dụ, để di chuyển theo hình tròn, bạn có thể tính toán vị trí ngón tay theo một phương trình hình tròn trong không gian 2D.
### Di chuyển đối tượng theo đường tròn:
Giả sử bạn muốn đối tượng di chuyển theo một quỹ đạo hình tròn với bán kính cố định khi ngón tay bạn di chuyển:
```csharp
using UnityEngine;
public class CircularMovement : MonoBehaviour
{
public float radius = 5f; // Bán kính của đường tròn
public float moveSpeed = 2f; // Tốc độ di chuyển
private Vector3 centerPosition; // Vị trí trung tâm của đường tròn
private float angle = 0f; // Góc hiện tại trên đường tròn
void Start()
{
centerPosition = transform.position; // Thiết lập vị trí ban đầu của đối tượng là trung tâm của vòng tròn
}
void Update()
{
// Kiểm tra nếu có ít nhất một ngón tay trên màn hình
if (Input.touchCount > 0)
{
// Lấy thông tin ngón tay đầu tiên
Touch touch = Input.GetTouch(0);
// Chuyển đổi vị trí màn hình thành vị trí thế giới
Vector3 touchPosition = Camera.main.ScreenToWorldPoint(touch.position);
touchPosition.z = 0;
// Tính toán góc di chuyển trên đường tròn
angle += moveSpeed * Time.deltaTime;
// Tính toán vị trí mới trên đường tròn
float x = centerPosition.x + radius * Mathf.Cos(angle);
float y = centerPosition.y + radius * Mathf.Sin(angle);
// Cập nhật vị trí đối tượng theo quỹ đạo hình tròn
transform.position = new Vector3(x, y, 0);
}
}
}
```
### Giải thích:
* **radius**: Bán kính của đường tròn mà bạn muốn đối tượng di chuyển theo.
* **angle**: Góc của đối tượng trên đường tròn, được cập nhật theo thời gian.
* **Mathf.Cos(angle)** và **Mathf.Sin(angle)**: Các hàm này tính toán vị trí của đối tượng trên đường tròn bằng cách sử dụng các giá trị góc.
Bạn có thể tùy chỉnh `moveSpeed` và `radius` để có được hiệu ứng mong muốn.
Hy vọng mã trên giúp bạn thực hiện được chuyển động cho đối tượng game trong Unity!
No comments:
Post a Comment