@Dcat_me
обесняйте по-проще пойжалуйста.

Что делать эсли при повороте на наклонной поверхности персонаж подлетает?

Когда резко поворачиваю на наклонной поверхности. Персонаж подлетает на секунду.
Скорее всего, из-за того, что вектор velocity не успевает изменится.
Я попробовал обновлять вектор при повороте, но на низком fps. Работает через рас.
Вот код(С моим способом обнуления вектора):
{
    //Walk
    public float Speed = 7;
    public Vector2 movement;
    //Flip
    public bool Right = true;

    //Jump, Dash
    public bool onGround;

    //Jump
    public float JumpForce = 60;
    public float JumpControlTime = 0.3f;

    private bool JumpControl;
    private float JumpTime = 0f;
    //SecondJump
    public float DoubleJumpForce = 15;
    public int JumpCount = 2;

    private int MomentJumpCount = 0;

    //Dash
    public int DashImpulse = 5000;

    //functions
    private Rigidbody2D rb;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    void FixedUpdate()
    {
        Jump();
    }
    void Update()
    {
        Walk();
        SecondJump();
        Dash();
    }

    void Walk()
    {
        movement.x = Input.GetAxis("Horizontal");
        rb.velocity = new Vector2(movement.x * Speed, rb.velocity.y);

        if (movement.x < 0 && Right == true)
        {
            Flip();
            Debug.Log("в лево");
        }
        else if (movement.x > 0 && Right == false)
        {
            Flip();
            Debug.Log("в право");
        }
    }
    public void Flip()
    {
        if ((onGround) && !JumpControl)
        {
            rb.velocity = new Vector2(rb.velocity.x, 0);
        }

        Vector3 scale = transform.localScale;
        scale.x *= -1;
        transform.localScale = scale;
        Right = !Right;
    }

    void Jump()
    {
        if (Input.GetKey(KeyCode.Space))
        {
            if (onGround)
            {
                if (!JumpControl)
                {
                    rb.velocity = new Vector2(rb.velocity.x, 0);
                    //Debug.Log("Обновление вектора => Прыжок");
                }
                JumpControl = true;
            }
        }
        else
        {
            JumpControl = false;
        }
        if (JumpControl)
        {
            if ((JumpTime += Time.fixedDeltaTime) < JumpControlTime)
            {
                rb.AddForce(Vector2.up * JumpForce / (JumpTime * 10));
            }
        }
        else
        {
            JumpTime = 0;
        }

        if (onGround)
        {
            MomentJumpCount = 0;
        }
    }
    void SecondJump()
    {
 
        if (Input.GetKeyDown(KeyCode.Space) && !onGround && !JumpControl && (++MomentJumpCount < JumpCount))
        {
            rb.velocity = new Vector2(0, DoubleJumpForce);
            //Debug.Log(MomentJumpCount + "-Доп.прыжок");
        }
    }

    void Dash()
    {
        if (Input.GetKeyDown(KeyCode.LeftShift))
        {
            rb.velocity = new Vector2(rb.velocity.x, 0);
            if (!Right)
            {
                rb.AddForce(Vector2.left * DashImpulse);
            }
            else
            {
                rb.AddForce(Vector2.right * DashImpulse);
            }
            //Debug.Log("Рывок!");
        }
    }
}
  • Вопрос задан
  • 82 просмотра
Решения вопроса 1
@5465
Проблема может быть связана с тем, что вектор velocity персонажа не успевает измениться в момент поворота на наклонной поверхности, что приводит к тому, что персонаж подлетает на секунду.

Вам может помочь следующий подход: при повороте на наклонной поверхности, вместо того, чтобы обнулять вектор velocity, попробуйте изменить его направление в соответствии с углом наклона поверхности. Для этого вам нужно получить нормаль к поверхности в точке, где находится персонаж, и использовать ее направление для изменения вектора velocity.

Вы можете использовать функцию Physics2D.Raycast для получения нормали к поверхности в точке, где находится персонаж. Затем вы можете использовать функцию Vector2.Reflect, чтобы изменить направление вектора velocity в соответствии с нормалью.

Пример кода для изменения направления вектора velocity при повороте на наклонной поверхности:

void Flip()
{
    if ((onGround) && !JumpControl)
    {
        Vector2 normal = GetSurfaceNormal();
        rb.velocity = Vector2.Reflect(rb.velocity, normal);
    }

    Vector3 scale = transform.localScale;
    scale.x *= -1;
    transform.localScale = scale;
    Right = !Right;
}

Vector2 GetSurfaceNormal()
{
    RaycastHit2D hit = Physics2D.Raycast(transform.position, -Vector2.up);
    return hit.normal;
}


В этом примере функция GetSurfaceNormal использует Raycast для получения нормали к поверхности в точке, где находится персонаж. Затем функция Flip использует Vector2.Reflect для изменения направления вектора velocity в соответствии с нормалью.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Dcat_me Автор вопроса
обесняйте по-проще пойжалуйста.
Вот вариант с обнулением.
Но когда FPS маленький, проверка не успевает проходить на земле и не работает.
void FixedUpdate()
    {
        BugFix();
    }
    void Update()
    {
        Walk();
        BugFixFPS();
    }

    void BugFixFPS()
    {
        if ((onGround) && !JumpControl)
        {
            CleanVectorY = true;
        }
        else
        {
            CleanVectorY = false;
        }
    }

    void BugFix()
    {
        if ((onGround) && !JumpControl)
        {
            CleanVectorY = true;
        }
        else
        {
            CleanVectorY = false;
        }
    }


    void Walk()
    {
        movement.x = Input.GetAxis("Horizontal");
        rb.velocity = new Vector2(movement.x * Speed, rb.velocity.y);

        if (movement.x < 0 && Right == true)
        {
            Flip();
            Debug.Log("в лево");
        }
        else if (movement.x > 0 && Right == false)
        {
            Flip();
            Debug.Log("в право");
        }
    }
    public void Flip()
    {
        if (CleanVectorY)
        {
            rb.velocity = new Vector2(rb.velocity.x, 0);
            Debug.Log("Очистить вектор");
        }

        Vector3 scale = transform.localScale;
        scale.x *= -1;
        transform.localScale = scale;
        Right = !Right;
    }
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы