Задать вопрос
@Pythonchik3

Почему не работает AddForce?

Есть вот такой код:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{
    public float speed = 4.5f;
    public float Climbspeed = 1.0f;
    public float jumpForce = 8.0f;

    private CapsuleCollider2D _box;
    private Rigidbody2D _body;
    private Animator _anim;

    private bool grounded = false;
    private bool jump = false;
    private bool stairs = false;
    private float Crouch;

    private string[] TagNames = { "floor", "Stairs", "Untagged" };
    private const int TGLen = 3;
    private int AllTags;
    private Dictionary<string, int> Bricks = new Dictionary<string, int>(TGLen);

    void Start()
    {
        _body = GetComponent<Rigidbody2D>();
        _anim = GetComponent<Animator>();
        _box = GetComponent<CapsuleCollider2D>();

        for (int i = 0; i < TGLen; i++)
        {
            Bricks.Add(TagNames[i], 0);
        }
    }

    void Update()
    {
        float deltaX = Input.GetAxis("Horizontal") * speed;
        float deltaY = Input.GetAxis("Vertical") * Climbspeed;
        float Crouch = Input.GetAxis("Fire1");

        AllTags = GetTagSum();
        grounded = Bricks["floor"] > 0;
        stairs = Bricks["Stairs"] > 0;
        if (grounded && Input.GetKeyDown(KeyCode.Space) && Crouch == 0)
        {
            _body.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);
            jump = true;
            Debug.Log('!');
        }
        if (grounded)
        {
            jump = false;
        }
        if (AllTags == 0) { jump = true; }
        if (jump) { Crouch = 0; }
        if (stairs && !jump &&false)
        {
            Crouch = 0;
            _body.gravityScale = 0;
        }
        else
        {
            deltaY = 0;
            _body.gravityScale = 3;
        }
        if (!jump)
        {
            Vector2 movement = new Vector2(deltaX * (1 - Crouch), deltaY);
            _body.velocity = movement;
        }
        else
        {
            Vector2 movement = new Vector2(deltaX * (1 - Crouch), _body.velocity.y);
            _body.velocity = movement;
        }


        {
            _anim.SetBool("Go", deltaX != 0 && grounded);
            _anim.SetBool("Jump", jump);
            _anim.SetBool("Crouch", Crouch == 1);
            _anim.SetBool("Climb", stairs);
            _anim.SetBool("ClimbGo", deltaY != 0);
        }

        if (!Mathf.Approximately(deltaX, 0) && !stairs)
        {
            transform.localScale = new Vector3(Mathf.Sign(deltaX), 1, 1);
        }
    }

    int GetTagSum()
    {
        int sum = 0;
        for(int i = 0; i < TGLen; i++)
        {
            sum += Bricks[TagNames[i]];
        }
        return sum;
    }

    void OnTriggerEnter2D(Collider2D other)
    {
        Bricks[other.gameObject.tag]++;
    }

    void OnTriggerExit2D(Collider2D other)
    {
        Bricks[other.gameObject.tag]--;
    }
}

Почему то AddForce срабатывает через раз. В консоль выводится !, т.е. нажатие произошло, была приложена сила, но персонаж почему-то не прыгает. Где у меня ощибка? Спасибо.
  • Вопрос задан
  • 691 просмотр
Подписаться 1 Сложный Комментировать
Решения вопроса 1
Работать с физикой в update - плохая идея. Попробуй через fixedupdate, это как минимум решат проблему различных лагов будущем, а возможно и конкретно твою.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы