Трясет объект когда оно находится между двумя объектами [дубликат]

181
26 июля 2019, 22:40

На данный вопрос уже ответили:

  • Правильная реализация передвижения персонажа 1 ответ

Для начала шар больше размером и физически не может пролезть через этот проход, но когда шар застревает между двумя объектами, во-первых его начинает трясти туда сюда , во-вторых когда шар выходит на свободное пространство , то самопроизвольно начинает двигаться медленно направо, после того как его потрясло. Как это можно исправить? Я искал ответ в интернете, наверное не смог правильно сформулировать вопрос или что, но не нашел ответа как это исправить.

 void FixedUpdate()
{
    if (allBlock)
    {
        if (Input.GetKey(KeyCode.A))
        {
            transform.position += new Vector3(-0.1f * Time.fixedDeltaTime * speed, 0, 0);
        }
        if (Input.GetKey(KeyCode.D))
        {
            transform.position += new Vector3(0.1f * Time.fixedDeltaTime * speed, 0, 0);
        }
        if (Input.GetKey(KeyCode.W))
        {
            transform.position += new Vector3(0, 0.1f * Time.fixedDeltaTime * speed, 0);
        }
        if (!Input.GetKeyUp(KeyCode.W))
        {
            transform.position += new Vector3(0, -0.1f * Time.fixedDeltaTime * speedY, 0);
        }
    }
    if (!allBlock)
    {
        transform.position += new Vector3(0, 0.5f * Time.fixedDeltaTime * speedY, 0);
    }
}

Я сделал так и все работает . Знаю это все не правильно, жду критики и советов.

public float speedVelocity = 2;
public float speedVelocityDown = 1;
bool allBlock = true;
Rigidbody rb;
void Start()
{
    rb = GetComponent<Rigidbody>();
}

void FixedUpdate()
{
    if (allBlock)
    {
        if (Input.GetKey(KeyCode.A))
        {
            if (Input.GetKey(KeyCode.W))
            {
                rb.velocity = new Vector3(-speedVelocity, speedVelocity, 0);
            }
            else if (!Input.GetKey(KeyCode.W))
            {
                rb.velocity = new Vector3(-speedVelocity, -speedVelocityDown, 0);
            }

            rb.AddForce(Vector3.left * Time.fixedDeltaTime);
        }
        if (Input.GetKey(KeyCode.D))
        {
            if (Input.GetKey(KeyCode.W))
            {
                rb.velocity = new Vector3(speedVelocity, speedVelocity, 0);
            }
            else if (!Input.GetKey(KeyCode.W))
            {
                rb.velocity = new Vector3(speedVelocity, -speedVelocityDown, 0);
            }

            rb.AddForce(Vector3.right * Time.fixedDeltaTime);
        }
        if (Input.GetKey(KeyCode.W))
        {
            if (Input.GetKey(KeyCode.A))
            {
                rb.velocity = new Vector3(-speedVelocity, speedVelocity, 0);
            }
            else if (Input.GetKey(KeyCode.D))
            {
                rb.velocity = new Vector3(speedVelocity, speedVelocity, 0);
            }
            else
                rb.velocity = new Vector3(0, speedVelocity, 0);
            rb.AddForce(Vector3.up * Time.fixedDeltaTime);
        }
        if (!Input.GetKey(KeyCode.W))
        {
            if (Input.GetKey(KeyCode.D))
            {
                rb.velocity = new Vector3(speedVelocity, -speedVelocityDown, 0);
            }
            else if (Input.GetKey(KeyCode.A))
            {
                rb.velocity = new Vector3(-speedVelocity, -speedVelocityDown, 0);
            }
            else
            {
                rb.velocity = new Vector3(0, -speedVelocityDown, 0);
            }
            rb.AddForce(Vector3.down * Time.fixedDeltaTime);
        }
    }
    if (!allBlock)
    {
        rb.velocity = new Vector3(0, speedVelocity, 0);
        rb.AddForce(Vector3.up * Time.fixedDeltaTime);
    }
}
private void OnTriggerStay(Collider other)
{
    if (other.gameObject.name == "Finish")
    {
        allBlock = false;
    }
}

Физика как у шара в реальном мире , которой можно управлять.

Answer 1
  1. Возможно движение шара реализовано неправильно, как сказал dgzargo. Если оно реализовано через изменение позиции в пространстве -- это неправильно. Должно быть реализовано через какой-нить AddForce() или что подобное.
  2. если движение шара реализовано правильно, то скорее всего дело в том, что шар движется слишком быстро. В таком случае нужно изменять настройки ригитбоди на более детальную обработку коллизии коллайдером. Это кажется настраивается в самих настройках обьекта в ригитбоди скрипте. collisionDetectionMode или как-то так.

после твоей обновляхи вопроса видно что что проблема в п.1. Ты занимаешся телепортированием обьекта))

Так же полезно будет почитать: Правильная реализация передвижения персонажа | почему мой персонаж дергается | для чего нужен Time.deltaTime

READ ALSO
Замена числовых значений в datagridview на значения из массива без изменения основных данных

Замена числовых значений в datagridview на значения из массива без изменения основных данных

Имеется datagrigview к которому через datasource привязывается list<> с данными В list<> содержатся ид для подгрузки значений из других массивов Нашел...

169
Как получить Cell из DataGridRow в WPF?

Как получить Cell из DataGridRow в WPF?

Нужно получить значение из первой ячейки из строки DataGrid'а

165
Почему в адресе boolean параметр показывается дважды?

Почему в адресе boolean параметр показывается дважды?

Это перевод вопроса Why does query string parameter get included twice - aspnet boolean

189
Как сгладить UI и остальные объекты в Unity3D?

Как сгладить UI и остальные объекты в Unity3D?

Пытался сглаживать в Quality Anti Aliasing, но не помогает

195