@Spaici

Как мне сделать реализацию отталкивания персонажа в Unity?

Хочу сделать реализацию отталкивания персонажа, если он меньше размера врага, но он не отталкивается, хотя в логе пишет, что функция PlayerPush() вызывается. Не могу разобраться что нужно делать. Менял Body Type на Dynamic - всё тоже самое.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    [SerializeField] private float _speed;
    [SerializeField] private int _health = 5;

    private GameObject _player;
    private Enemy _enemy;
    private SpriteRenderer _spriteRenderer;
    private Rigidbody2D _rb;
    private Vector2 _moveVector;
    private float _scaleX = 2f;
    private float _scaleY = 2f;
    [SerializeField]private float _size = 2f;

    void Awake()
    {
        _player = gameObject;
        _rb = GetComponent<Rigidbody2D>();
        _spriteRenderer = GetComponent<SpriteRenderer>();
    }
    void FixedUpdate()
    {
        Move();
        if (IsDead())
        {
            Debug.Log("погиб");
            Destroy(_player);
        }
        PlayerPush();
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.gameObject.CompareTag("Enemy"))
        {
            Debug.Log("триггер");
            _enemy = collision.gameObject.GetComponent<Enemy>();
            if (_size >= _enemy.size)
            {
                Destroy(collision.gameObject);
                ScalePlayer();
            }
            else if (_size < _enemy.size)
            {
                PlayerPush();
                _health--;
            }
        }
    }

    void Move()
    {
        _moveVector.x = Input.GetAxis("Horizontal");
        _moveVector.y = Input.GetAxis("Vertical");

        if (_moveVector.x < 0f)
        {
            _spriteRenderer.flipX = true; 
        }
        else if (_moveVector.x > 0f)
        {
            _spriteRenderer.flipX = false;
        }

        _rb.MovePosition(_rb.position + _moveVector * _speed * Time.fixedDeltaTime);
    }

    void ScalePlayer()
    {
        _scaleX += 0.1f;
        _scaleY += 0.1f;
        transform.localScale = new Vector3(_scaleX, _scaleY);
    }

    bool IsDead()
    {
        if (_health <= 0) return true;
        return false;
    }

    void PlayerPush()
    {
        float force = 1000f;
        Vector2 dir = new Vector2(-1, -1);
        _rb.AddForce(dir * force, ForceMode2D.Impulse);
        Debug.Log("Push");
    }
}
  • Вопрос задан
  • 67 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

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