저번에는 기초 이동을 만들었으니
이번에는 기초 공격을 만들어보자.
요구사항은 다음과 같다
1. 방향키를 통해서 공격을 할 수 있다.
2. 수직의 우선순위가 수평보다 높다
3. 공격시 움직이는 방향에 상관없이 머리가 공격방향으로 고정 된다
4. 투사체는 벽 장애물에 부딪히거나 사정거리에 도달하면 사라진다
(추가)
5. 투사체는 최대사정거리 근처에서 바닥을 향해 떨어진다
6. 투사체는 좌우 번갈아 가면서 소환된다.
이동과 비슷하게 구현했다.
※ 발사체 생성은 Animation Event를 통해서 원하는 타이밍에 생성하자!
Vector2 attackVel = Vector2.zero;
attackVel.x = Input.GetAxis("AttackHorizontal");
attackVel.y = Input.GetAxis("AttackVertical");
if (Input.GetKey(KeyCode.LeftArrow) && Input.GetKey(KeyCode.RightArrow))
attackVel.x *= -1;
if (Input.GetKey(KeyCode.UpArrow) && Input.GetKey(KeyCode.DownArrow))
attackVel.y *= -1;
UpdateAttack(attackVel);
이 항목은 저번에 했던방법과 비슷하게 진행하였다.
public void UpdateAttack(Vector2 attackVel)
{
if (attackVel != Vector2.zero)
{
HeadDirState = ECreatureHeadDirState.None;
AnimatorHead.enabled = true;
HeadState = ECreatureHeadState.Attack;
if (attackVel.y != 0 && (Input.GetKey(KeyCode.UpArrow) || Input.GetKey(KeyCode.DownArrow)))
{
HeadDirState = attackVel.y > 0 ? ECreatureHeadDirState.Up : ECreatureHeadDirState.Down;
}
else if (attackVel.x != 0)
{
HeadDirState = attackVel.x > 0 ? ECreatureHeadDirState.Right : ECreatureHeadDirState.Left;
}
}
else
{
AnimatorHead.enabled = false;
HeadState = ECreatureHeadState.Idle;
}
}
이부분은 저번에 머리 방향의 상태를 가지는
EPlayerHeadDirState의 값이 변경될 때 호출되는 UpdateFacing()을 통해서 간단히 구현했다
public void UpdateFacing()
{
if (HeadState == ECreatureHeadState.Attack)
{
AnimatorHead.enabled = true;
UpdateHeadAnimation();
}
else
{
AnimatorHead.enabled = false;
UpdateHeadSprite();
}
}
private IEnumerator CoRserveDestroy(float lifetime)
{
yield return new WaitForSeconds(lifetime * 0.8f);
if (Mathf.Abs(Rigidbody.velocity.x) > Mathf.Abs(Rigidbody.velocity.y))
Rigidbody.velocity += new Vector2(0, -2.0f);
yield return new WaitForSeconds(lifetime * 0.2f);
Destroy(gameObject);
}