Как я могу помешать моим предметам проходить сквозь стены, когда я поднимаю их и опускаю вниз? - PullRequest
0 голосов
/ 28 января 2019

Когда я поднимаю объект, я могу проскользнуть сквозь карту, чтобы он выпал из мира.Это происходит, когда я поднимаю его и бросаю предмет на полпути.Результат, который я получаю, - это не то, чего я ожидал, что я могу сделать, чтобы это исправить.Также да, коллайдеры и жесткие тела настроены правильно.

public GameObject PressEtoInteractText;

public bool pickup, inrange;

public Collider Playercol;

public Vector3 guide;

private GameObject temp;

private Rigidbody rb;

void Update()
{
    if (Input.GetKeyDown(KeyCode.E) && inrange == true)
    {
        PressEtoInteractText.SetActive(false);
        pickup = true;
    }

    if (Input.GetMouseButtonDown(0) && pickup == true)
    {
        pickup = false;
        Playercol.isTrigger = true;
    }
    UpdatePickUpFollow();
}

void OnTriggerEnter(Collider other)
{
    if (other.gameObject.tag == "Interact")
    {
        PressEtoInteractText.SetActive(true);
        temp = other.gameObject;
        inrange = true;
    }

    if (other.gameObject.tag == "Interact" && temp.transform.position == guide)
    {
        return;
    }
}

void OnTriggerExit(Collider other)
{
    if (other.gameObject.name != "Interact")
    {
        PressEtoInteractText.SetActive(false);
        inrange = false;
    }
}

public void PickUp()
{
    rb = temp.GetComponent<Rigidbody>();
    rb.MovePosition(transform.position += guide);
    Playercol.isTrigger = false;
}

public void UpdatePickUpFollow()
{
    if (pickup == true)
    {
        PickUp();
    }
}

1 Ответ

0 голосов
/ 28 января 2019

Если вы деактивируете коллайдер объектов с помощью 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...