Как создать систему, которая позволяет объекту взять или подобрать другой объект в Unity?

Как можно реализовать систему поднятия и укладки предметов с помощью кнопки E, чтобы поднятый предмет всегда оставался в руке игрока и не перемещался при изменении ракурса камеры? Также, как можно ограничить возможность укладывать предмет только на объекты с тегом "Placement"?
  • 27 января 2024 г. 12:48
Ответы на вопрос 2
Чтобы создать систему, которая позволяет персонажу в игре на Unity подбирать и укладывать объекты, вы можете следовать следующим шагам:

1. Определите, какие объекты можно поднимать, добавив к ним тег, например "Pickup", и создайте для них коллайдер.

2. Создайте точку удержания объектов (так называемую "руку"), которая будет дочерним объектом игрока и позиционирована там, где вы хотите, чтобы поднимаемые предметы находились во время удержания.

3. Напишите скрипт для подбора и укладки объектов. Вам понадобится определить, когда игрок находится достаточно близко к объекту, чтобы поднять его, и следить за нажатием клавиши E.

Примерный скрипт на C# для игрока (PlayerController.cs):

```csharp
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    public Transform holdPoint; // Точка, куда будет перемещаться поднятый предмет
    public float pickUpRange = 2f; // Дальность, с которой можно подбирать предметы
    private GameObject heldObj; // Текущий поднятый объект

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.E))
        {
            if (heldObj == null)
            {
                // Попытаемся поднять объект
                PickupObject();
            }
            else
            {
                // Попытаемся уложить поднятый объект
                PlaceObject();
            }
        }
    }

    void PickupObject()
    {
        // Проверяем наличие объектов, которые можно поднять, в пределах дистанции
        Collider[] pickableObjects = Physics.OverlapSphere(transform.position, pickUpRange, LayerMask.GetMask("Pickup"));
        if (pickableObjects.Length > 0)
        {
            GameObject closestObj = null;
            float minDistance = float.MaxValue;
            
            // Найдите ближайший объект
            foreach (var obj in pickableObjects)
            {
                float distance = (obj.gameObject.transform.position - transform.position).sqrMagnitude;
                if (distance < minDistance)
                {
                    closestObj = obj.gameObject;
                    minDistance = distance;
                }
            }

            if (closestObj != null)
            {
                heldObj = closestObj;
                heldObj.transform.SetParent(holdPoint);
                heldObj.transform.localPosition = Vector3.zero;
                heldObj.GetComponent<Rigidbody>().isKinematic = true; // Отключаем физику, чтобы объект не падал
            }
        }
    }

    void PlaceObject()
    {
        Ray ray = new Ray(transform.position, transform.forward);
        RaycastHit hit;

        if (Physics.Raycast(ray, out hit, pickUpRange))
        {
            if (hit.collider.gameObject.CompareTag("Placement"))
            {
                heldObj.transform.SetParent(null); // Убираем родительскую зависимость
                heldObj.transform.position = hit.point; // Помещаем объект на место
                heldObj.GetComponent<Rigidbody>().isKinematic = false; // Возвращаем физику
                heldObj = null; // Очищаем ссылку на удерживаемый объект
            }
        }
    }
}
```

Не забудьте присвоить вашей "руке" (holdPoint) соответствующий Transform компонент в Unity Editor и настроить LayerMask для слоя "Pickup", чтобы включить только объекты с тегом "Pickup".

Чтобы предотвратить перемещение объекта при изменении ракурса камеры, вы можете использовать `localPosition` для установки позиции объекта относительно руки. Также убедитесь, что у поднятого объекта отключена физика (`isKinematic = true`), чтобы он не реагировал на внешние силы.

Для объектов, на которые можно укладывать предметы, добавьте им
Зависит от того как работает твоя камера/рука/персонаж. Можешь сделать предмет дочерним к камере/руке и все.
Похожие вопросы