Если вы деактивируете коллайдер объектов с помощью tempCol.enabled = false;
, он не будет регистрировать никаких столкновений , и вы можете просто толкать или тянуть его сквозь стены весь день.Обязательно удалите это из вашего скрипта.
Кроме того, использование MoveTowards
может вызвать проблемы с обнаружением столкновений.По моему опыту, лучше всего использовать AddForce
или MovePosition
для перемещения компонента Rigidbody вместо непосредственного изменения Transform.Попробуйте Rigidbody.MovePosition(Vector3 position)
.Может быть, это работает лучше для вас.
Вот ссылка на страницу документации.Это в основном ваш точный вариант использования:
Rigidbody.MoveTowards Документы Unity
(Подсказка: обратите внимание, как они используют FixedUpdate
вместо обычного Update
. Вы также должнывсегда делайте это при работе с Rigidbody, потому что он синхронизируется с обновлениями физики.)
// Редактировать: Это небольшая реализация вашего кода более чистым и, надеюсь, правильным способом.Я не проверял это и, вероятно, что-то пропустил.Используйте это в качестве справочного материала для создания собственного рабочего решения.
//set in inspector
public Transform guidePosition;
public GameObject pressEToInteractText;
private bool isObjectInRange;
private GameObject inRangeObject;
private bool isObjectPickedUp;
private Rigidbody pickedUpRigidBody;
/* check if button is pressed.
* If no object is in hand -> pick up;
* if object is in hand -> drop;
*/
private void FixedUpdate()
{
if (Input.GetKeyDown(KeyCode.E) && isObjectInRange && !isObjectPickedUp)
{
PickupObject();
}
if(Input.GetKeyDown(KeyCode.E) && isObjectPickedUp)
{
DropObject();
}
if (isObjectPickedUp)
{
PickedUpObjectFollow();
}
}
//save references
private void PickupObject()
{
pickedUpRigidBody = inRangeObject.GetComponent<Rigidbody>();
isObjectPickedUp = true;
}
//remove saved references
private void DropObject()
{
isObjectPickedUp = false;
pickedUpRigidBody = null;
}
//move position to guidePosition
private void PickedUpObjectFollow()
{
pickedUpRigidBody.MovePosition(guidePosition.position);
}
private void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Interact") && !isObjectPickedUp)
{
pressEToInteractText.SetActive(true);
isObjectInRange = true;
inRangeObject = other.gameObject;
}
}
private void OnTriggerExit(Collider other)
{
if(other.CompareTag("Interact") && other.gameObject == inRangeObject)
{
pressEToInteractText.SetActive(false);
isObjectInRange = false;
inRangeObject = null;
}
}