void GiveDamage()
{
Collider2D[] hitColliders = Physics2D.OverlapCircleAll(transform.position, attackRange, targetLayer);
if (hitColliders.Length > 0)
{
foreach (Collider2D hitCollider in hitColliders)
{
GameObject colider = hitCollider.gameObject;
if (colider.TryGetComponent<EnemyController>(out EnemyController enemy))
{
Debug.Log("Найден");
if ((enemy.transform.position.x < transform.position.x && direction == -1) || (enemy.transform.position.x > transform.position.x && direction == 1))
{
enemy.ReceiveDamage(damage);
}
}
}
}
}
using UnityEngine;
public class Hitbox : MonoBehaviour
{
[SerializeField] Transform playerPos;
public PlayerController player;
private void OnTriggerEnter2D(Collider2D other)
{
if (other.TryGetComponent<EnemyController>(out EnemyController enemy))
{
Debug.Log("Найден");
enemy.ReceiveDamage(player.damage);
}
else
{
Debug.LogWarning("Enemy не найден на объекте " + other.name);
}
}
public void SetInverse(bool value)
{
Vector3 currentPosition = playerPos.transform.position;
if (value) currentPosition.x -= 2;
else currentPosition.x += 2;
transform.position = currentPosition;
}
}
using UnityEngine;
public class Hitbox : MonoBehaviour
{
[SerializeField] Transform playerPos;
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.tag == "Enemy") Destroy(collision.gameObject);
}
public void SetInverse(bool value)
{
Vector3 currentPosition = playerPos.transform.position;
if (value) currentPosition.x -= 2;
else currentPosition.x += 2;
transform.position = currentPosition;
}
}
using UnityEngine;
public class PlayerController : MonoBehaviour
{
[Header("Параметры игрока")]
[SerializeField] private float playerSpeed = 5.0f;
//------------------------------------------------------
[Header("Ввод")]
[SerializeField] private InputManager inputManager;
public Vector2 inputVector;
//------------------------------------------------------
[Header("Физика")]
public Vector2 velocity;
private Rigidbody2D rb;
//------------------------------------------------------
[Header("Атака")]
[SerializeField] private Hitbox playerHitbox;
[SerializeField] private BoxCollider2D hitbox;
private bool isAttack;
//------------------------------------------------------
[Header("Анимации")]
[SerializeField] private SpriteRenderer spriteRenderer;
[SerializeField] private Animator animator;
void Start()
{
rb = GetComponent<Rigidbody2D>();
animator = GetComponent<Animator>();
hitbox = transform.Find("HitboxPlayer").GetComponent<BoxCollider2D>();
inputVector = new Vector2(0, 0);
}
public void SetFlipX(int direction)
{
spriteRenderer.flipX = direction < 0;
playerHitbox.SetInverse(direction < 0);
}
void Update()
{
inputVector = new Vector2(inputManager.horizontalInput, inputManager.verticalInput);
float horizontalInput = inputVector.x;
if (horizontalInput > 0) SetFlipX(1);
else if (horizontalInput < 0) SetFlipX(-1);
animator.SetFloat("Speed", GetSpeed());
if (inputManager.inputAttack)
{
Attack();
}
if(!isAttack) Move();
}
void Move()
{
velocity = new Vector2(inputVector.x * playerSpeed, inputVector.y);
rb.velocity = velocity;
}
public float GetSpeed()
{
return velocity.sqrMagnitude;
}
public void Attack()
{
animator.SetTrigger("Attack");
Invoke("ActivateHitbox", 0.27f);
Invoke("DeactivateHitbox", 0.54f);
}
void ActivateHitbox()
{
hitbox.gameObject.SetActive(true);
isAttack = true;
}
void DeactivateHitbox()
{
hitbox.gameObject.SetActive(false);
isAttack = false;
}
}
using UnityEngine;
public class Hitbox : MonoBehaviour
{
[SerializeField] Transform playerPos;
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.tag == "Enemy") Destroy(collision.gameObject);
}
public void SetInverse(bool value)
{
Vector3 currentPosition = playerPos.transform.position;
if (value) currentPosition.x -= 2;
else currentPosition.x += 2;
transform.position = currentPosition;
}
}
using UnityEngine;
public class PlayerController : MonoBehaviour
{
[Header("Параметры игрока")]
[SerializeField] private float playerSpeed = 5.0f;
//------------------------------------------------------
[Header("Ввод")]
[SerializeField] private InputManager inputManager;
[SerializeField] public Vector2 inputVector;
//------------------------------------------------------
[Header("Физика")]
public Vector2 velocity;
private Rigidbody2D rb;
//------------------------------------------------------
[Header("Атака")]
[SerializeField] private Hitbox playerHitbox;
[SerializeField] private BoxCollider2D hitbox;
//------------------------------------------------------
[Header("Анимации")]
[SerializeField] private SpriteRenderer spriteRenderer;
[SerializeField] private Animator animator;
void Start()
{
rb = GetComponent<Rigidbody2D>();
animator = GetComponent<Animator>();
hitbox = transform.Find("HitboxPlayer").GetComponent<BoxCollider2D>();
inputVector = new Vector2(0, 0);
}
public void SetFlipX(int direction)
{
spriteRenderer.flipX = direction < 0;
playerHitbox.SetInverse(direction < 0);
}
void Update()
{
inputVector = new Vector2(inputManager.horizontalInput, inputManager.verticalInput);
float horizontalInput = inputVector.x;
if (inputManager.isAttack)
{
Attack();
}
if (horizontalInput > 0) SetFlipX(1);
else if (horizontalInput < 0) SetFlipX(-1);
animator.SetFloat("Speed", GetSpeed());
Move();
}
void Move()
{
velocity = new Vector2(inputVector.x * playerSpeed, inputVector.y);
rb.velocity = velocity;
}
public float GetSpeed()
{
return velocity.sqrMagnitude;
}
public void Attack()
{
animator.SetTrigger("Attack");
Invoke("ActivateHitbox", 0.2f); // Activate hitbox after 0.2 seconds.
Invoke("DeactivateHitbox", 0.8f); // Deactivate hitbox after 0.4 seconds.
}
void ActivateHitbox()
{
hitbox.gameObject.SetActive(true);
}
void DeactivateHitbox()
{
hitbox.gameObject.SetActive(false);
}
}
Я пробовал просто через AddForce, так как в простом сайд-скролинг проекте не вижу смысла заморачиваться с прыжком(на начальном этапе как минимум)