Как исправить коллизию объектов в 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");
}
}