Как исправить коллизию объектов в unity

У персонажа в руках если какой либо предмет, но если подходить к стене или другому объекту на карте то предмет в руках будет проходит сквозь него. Я столкнулся с этой проблемой, и единственным решением, которое я нашел, было использование второй камеры, для отображения предмета в руках. Насколько я понимаю, это решение не самое лучшее, может быть, есть другие способы? Я использую cinemachine для создания вида от первого лица. При подъеме объекта он прикрепляется к главной камере в определенной точке, которую я задаю в Scriptableobject.

Вот мои скрипты, которые я использую для подбора предмета. "ItemDataHolder" находится на выбранном объекте. "ItemHandler" находится на главной камере.

public class ItemDataHolder : MonoBehaviour
{
    [SerializeField] private Items _itemData;

    public Items ItemData => _itemData;
}


[CreateAssetMenu(fileName = "NewItem", menuName = "Items/ItemData")]
public class Items : ScriptableObject
{
    [field: SerializeField] public Vector3 RotationItem { get; private set; }
    [field: SerializeField] public Vector3 PositionItem { get; private set; }
}

public class ItemHandler : MonoBehaviour
{
    private Ray _ray;
    private RaycastHit _hit;

    private Transform _currentItemHandTransform;
    private Rigidbody _currentItemHandRigidbody;

    [SerializeField] private float _rayDistance;
    [SerializeField] public Transform _itemHoldingPoint; 
    [SerializeField] private LayerMask _layerMask;

    private void Update()
    {
        if (Input.GetButton("Fire1"))
            RayCast();

        if (Input.GetButton("Fire2"))
            DropItem();
    }

    private void PickUpItem()
    {
        Transform itemTransform = _hit.transform;
        ItemDataHolder itemDataHolder = itemTransform.GetComponent<ItemDataHolder>();

        _currentItemHandTransform = itemTransform.transform;
        _currentItemHandRigidbody = itemTransform.GetComponent<Rigidbody>();

        _currentItemHandRigidbody.isKinematic = true;

        itemTransform.position = _itemHoldingPoint.position + _itemHoldingPoint.
            TransformDirection(itemDataHolder.ItemData.PositionItem);
        itemTransform.rotation = _itemHoldingPoint.rotation * Quaternion.Euler(itemDataHolder.ItemData.RotationItem);

        itemTransform.SetParent(_itemHoldingPoint.transform);
    }

    private void DropItem()
    {
        _currentItemHandRigidbody.isKinematic = false;
        _currentItemHandTransform.SetParent(null);
    }

    private void RayCast() 
    {
        Camera camera = Camera.main;
        Vector3 screenCenter = new Vector3(Screen.width / 2, Screen.height / 2, 0);

        _ray = camera.ScreenPointToRay(screenCenter);

        if (Physics.Raycast(_ray, out _hit, _rayDistance) && (_layerMask & (1 << _hit.collider.gameObject.layer)) != 0) 
        {
            PickUpItem();
        }  
        else
            Debug.Log("No object hit");
    }
}

Ответы (0 шт):