Hệ thống tương tác đa dụng (Nhấn E)

Tags:
Interaction
Gameplay
Player
Architecture
Interface
UI

C# Code

using UnityEngine;
using TMPro;

// 1. Interface cho tất cả các đối tượng có thể tương tác
public interface IInteractable
{
    // Hành động sẽ xảy ra khi người chơi tương tác
    void Interact();
    // Văn bản sẽ hiển thị khi người chơi nhìn vào đối tượng
    string GetInteractionPrompt();
}

// 2. Script chính gắn vào người chơi
public class InteractionSystem : MonoBehaviour
{
    public Camera playerCamera;
    public float interactionDistance = 3f;
    public TextMeshProUGUI interactionPromptUI;

    void Update()
    {
        // Tạo một ray từ camera hướng về phía trước
        Ray ray = new Ray(playerCamera.transform.position, playerCamera.transform.forward);
        RaycastHit hit;

        // Kiểm tra xem ray có chạm vào vật thể nào trong tầm tương tác không
        if (Physics.Raycast(ray, out hit, interactionDistance))
        {
            // Lấy component IInteractable từ vật thể chạm phải
            IInteractable interactable = hit.collider.GetComponent<IInteractable>();

            // Nếu có, hiển thị prompt và lắng nghe input
            if (interactable != null)
            {
                interactionPromptUI.text = interactable.GetInteractionPrompt();
                interactionPromptUI.gameObject.SetActive(true);

                if (Input.GetKeyDown(KeyCode.E))
                {
                    interactable.Interact();
                }
                return;
            }
        }

        // Nếu không có vật thể nào trong tầm, ẩn prompt
        interactionPromptUI.gameObject.SetActive(false);
    }
}

// 3. Ví dụ: một công tắc có thể tương tác
public class SwitchInteract : MonoBehaviour, IInteractable
{
    private bool isOn = false;
    public Light connectedLight; // Kéo một đối tượng Light vào đây

    public string GetInteractionPrompt()
    {
        return isOn ? "Press E to Turn Off" : "Press E to Turn On";
    }

    public void Interact()
    {
        isOn = !isOn;
        if (connectedLight != null) {
            connectedLight.enabled = isOn;
        }
        Debug.Log(isOn ? "Switch turned ON" : "Switch turned OFF");
    }
}

Một hệ thống linh hoạt cho phép người chơi tương tác với nhiều loại đối tượng (cửa, vật phẩm, NPC, công tắc) chỉ bằng một nút bấm (E) khi ở trong tầm, kèm hiển thị gợi ý trên màn hình.

Bình luận (0)

Bạn cần đăng nhập để có thể bình luận.

Chưa có bình luận nào. Hãy là người đầu tiên!

Bài viết liên quan

Một hệ thống cho phép người chơi tương tác với nhiều loại đối tượng (cửa, NPC, vật phẩm) chỉ bằng một nút bấm khi ở trong tầm.

Gameplay
Interaction
Player
Architecture
Interface

Một hệ thống đơn giản để hiển thị các đoạn hội thoại có nhiều câu và lựa chọn cho người chơi, sử dụng ScriptableObject.

UI
Gameplay
Interaction
ScriptableObject

Một hệ thống kho đồ cơ bản sử dụng ScriptableObject cho dữ liệu vật phẩm và quản lý các ô chứa trong UI.

UI
Gameplay
Inventory
ScriptableObject
Architecture

Quản lý thanh thể lực cho các hành động như chạy nước rút. Thể lực sẽ giảm khi chạy và tự động hồi lại khi đứng yên.

Gameplay
Player
Stamina
UI

Cho phép người chơi đẩy các vật thể có Rigidbody khi di chuyển vào chúng. Lực đẩy có thể điều chỉnh được.

Physics
Interaction
Player
Gameplay

AI sẽ phát hiện người chơi trong một phạm vi nhất định và bắt đầu di chuyển về phía họ. Khi người chơi ra khỏi phạm vi, AI sẽ dừng lại.

AI
Movement
Gameplay
Player

Tạo một viên đạn (projectile) tại một điểm và bắn nó đi theo một hướng xác định. Thường dùng cho nhân vật hoặc kẻ địch.

Gameplay
Player
Spawning
Physics

Cho phép nhân vật thực hiện một cú lướt nhanh theo hướng di chuyển hiện tại. Có cooldown để tránh lạm dụng.

Player
Movement
Gameplay
Coroutine

Sử dụng Input System mới của Unity để di chuyển nhân vật 2D hoặc 3D một cách hiệu quả và linh hoạt.

2D
3D
Input
Gameplay
Player

Ví dụ cách sử dụng các tham số Trigger, Bool và Float (cho Blend Tree) để điều khiển các trạng thái animation của nhân vật.

Animation
Animator
Player
Gameplay