Question by
LenexTLI · Nov 19, 2021 at 09:18 PM ·
2d-platformerprogrammingmelee attack
Trying to add Directional Attacking
So I'm trying to add directional attacking to my game (basically how Hollow Knight or Cuphead have it) which means that (On PS4 Controller) if the Left Joystick is going down, then the character will attack downwards, and the same for each direction (up, down, left, right). But I have no idea on how to implement this. I have the script for attacking, but it doesn't rotate with the player and only stays on the right side, and I got no clue on how I can make it so it moves depending on where the character is looking.
This is the Combat Script:
private void Update()
{
if (timeBetweenAttack <= 0)
{
if (Input.GetButtonDown("Fire1"))
{
Collider2D[] enemiesToDamage = Physics2D.OverlapCircleAll(attackPos.position, attackRange, whatIsEnemies);
for (int i = 0; i < enemiesToDamage.Length; i++)
{
enemiesToDamage[i].GetComponent<Enemy>().TakeDamage(damage);
}
}
timeBetweenAttack = startTimeBetweenAttack;
}
else
{
timeBetweenAttack -= Time.deltaTime;
}
}
private void OnDrawGizmosSelected()
{
Gizmos.color = Color.white;
Gizmos.DrawWireSphere(attackPos.position, attackRange);
}
}
And this is the Player Movement Script:
public Rigidbody2D rb;
public float moveSpeed;
private SpriteRenderer sr;
public Animator animator;
public float jumpForce;
private float moveInputx;
private float lookInput;
private bool isGrounded;
public Transform feetPos;
public float checkRadius;
public LayerMask whatIsGround;
public float jumpStartTime;
private float jumpTime;
private bool isJumping;
bool isDashing;
bool canDash = true;
float direction = 1;
float normalGravity;
IEnumerator dashCoroutine;
void Start()
{
rb = GetComponent<Rigidbody2D>();
sr = GetComponent<SpriteRenderer>();
normalGravity = rb.gravityScale;
}
void Update()
{
FaceMoveDirection();
Jump();
moveInputx = Input.GetAxisRaw("Horizontal");
animator.SetFloat("Speed", Mathf.Abs(moveInputx));
if (moveInputx != 0)
{
direction = moveInputx;
}
if (Input.GetButtonDown("Dash") && canDash == true)
{
if (dashCoroutine != null)
{
StopCoroutine(dashCoroutine);
}
dashCoroutine = Dash(.1f, 2);
StartCoroutine(dashCoroutine);
}
if (lookInput != 0)
{
direction = lookInput;
}
}
void FixedUpdate()
{
rb.velocity = new Vector2(moveInputx * moveSpeed, rb.velocity.y);
if (isDashing)
{
rb.AddForce(new Vector2(direction * 450,0), ForceMode2D.Impulse);
}
}
void Jump()
{
isGrounded = Physics2D.OverlapCircle(feetPos.position, checkRadius, whatIsGround);
if (isGrounded == true && Input.GetButtonDown("Jump"))
{
isJumping = true;
jumpTime = jumpStartTime;
rb.velocity = Vector2.up * jumpForce;
}
if (Input.GetButton("Jump") && isJumping == true)
{
if (jumpTime > 0)
{
rb.velocity = Vector2.up * jumpForce;
jumpTime -= Time.deltaTime;
}
else
{
isJumping = false;
}
}
if (Input.GetButtonUp("Jump"))
{
isJumping = false;
}
}
void FaceMoveDirection()
{
if (moveInputx > 0)
{
sr.flipX = false;
}
else if (moveInputx < 0)
{
sr.flipX = true;
}
}
void OnDrawGizmos()
{
Gizmos.DrawWireSphere(feetPos.position, checkRadius);
}
IEnumerator Dash(float dashDuration, float dashCooldown)
{
Vector2 originalVelocity = rb.velocity;
isDashing = true;
canDash = false;
rb.gravityScale = 0;
rb.velocity = Vector2.zero;
yield return new WaitForSeconds(dashDuration);
isDashing = false;
rb.gravityScale = normalGravity;
rb.velocity = originalVelocity;
yield return new WaitForSeconds(dashCooldown);
canDash = true;
}
}
Comment