Nhặt và Ném đồ vật (Rigidbody)

Tags:
Physics
Rigidbody
Interaction
Player

C# Code

using UnityEngine;

public class PickupAndThrow : MonoBehaviour
{
    public Transform holdPoint; // Điểm giữ vật thể trước mặt camera/player
    public float throwForce = 20f;
    private GameObject heldObject;
    private Rigidbody heldObjectRb;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.E))
        {
            if (heldObject == null)
            {
                // Thử nhặt vật thể
                RaycastHit hit;
                if (Physics.Raycast(transform.position, transform.forward, out hit, 5f))
                {
                    if (hit.collider.GetComponent<Rigidbody>()) // Kiểm tra có Rigidbody không
                    {
                        PickupObject(hit.collider.gameObject);
                    }
                }
            }
            else
            {
                // Thả vật thể
                DropObject();
            }
        }

        if (heldObject != null && Input.GetMouseButtonDown(0)) // Nút chuột trái để ném
        {
            ThrowObject();
        }
    }

    void PickupObject(GameObject obj)
    {
        heldObject = obj;
        heldObjectRb = obj.GetComponent<Rigidbody>();
        heldObjectRb.useGravity = false;
        heldObjectRb.drag = 10;
        heldObjectRb.constraints = RigidbodyConstraints.FreezeRotation;
        heldObject.transform.parent = holdPoint;
        heldObject.transform.position = holdPoint.position;
    }

    void DropObject()
    {
        heldObjectRb.useGravity = true;
        heldObjectRb.drag = 1;
        heldObjectRb.constraints = RigidbodyConstraints.None;
        heldObject.transform.parent = null;
        heldObject = null;
    }

    void ThrowObject()
    {
        Rigidbody rbToThrow = heldObjectRb;
        DropObject(); // Thả ra trước khi ném
        rbToThrow.AddForce(transform.forward * throwForce, ForceMode.Impulse);
    }
}

Cho phép người chơi nhặt các vật thể có Rigidbody, giữ chúng trước mặt và ném đi bằng một lực.

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

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

Phát ra các âm thanh bước chân khác nhau tùy thuộc vào loại bề mặt vật liệu (qua Tag) mà người chơi đang đi trên đó, ví dụ: cỏ, gỗ, đá.

Audio
Physics
Player
Effects

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

Giúp nhân vật đứng vững trên các nền tảng di chuyển (moving platforms) bằng cách tạm thời đặt nhân vật làm con của nền tảng đó.

Movement
Player
Physics
Platformer

Giữ một đối tượng trong một vùng hình chữ nhật xác định bằng cách sử dụng hàm Mathf.Clamp() để giới hạn giá trị tọa độ x và y.

Movement
Physics
Player
Boundaries

Sử dụng Tilemap Collider 2D và Composite Collider 2D để tạo ra một vùng đi lại duy nhất cho nhân vật, ngăn họ đi xuyên tường hoặc ra khỏi bản đồ.

2D
Movement
Player
Physics
Tilemap

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.

Interaction
Gameplay
Player
Architecture
Interface
UI

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

AI sẽ bắn đạn về phía người chơi khi họ ở trong tầm tấn công và có một khoảng thời gian chờ (cooldown) giữa mỗi lần bắn.

AI
Gameplay
Spawning
Physics

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