using UnityEngine;
public class EnemyController : MonoBehaviour
{
private Animator animator;
[SerializeField] private int monsterHP;
private float hitTimer = 0f; // 피격 타이머
private float hitDelay = 0.1f; // 피격 딜레이
private void Start()
{
animator = GetComponent<Animator>();
}
private void Update() //state 0 = Idle, 1 = GetHit
{
// 피격 후 hitDelay 동안은 idle 상태로 전환하지 않음
if (hitTimer > 0)
{
hitTimer -= Time.deltaTime; // 타이머 감소
}
else
{
// 평상시에는 idle 애니메이션 재생
animator.SetInteger("state", 0);
}
}
private void OnCollisionEnter2D(Collision2D collision)
{
// 총알의 태그가 "Bullet"인 경우만 처리
if (collision.gameObject.CompareTag("Bullet"))
{
this.monsterHP -= 1;
// 피격 애니메이션 재생
animator.SetInteger("state", 1);
hitTimer = hitDelay; // 피격 애니메이션 타이머 설정
if (this.monsterHP == 0)
{
Destroy(this.gameObject);
}
// 총알 파괴
Destroy(collision.gameObject);
}
}
}
using UnityEngine;
using System.Collections;
public class EnemyController : MonoBehaviour
{
private Animator animator;
[SerializeField] private int monsterHP;
private float hitDelay = 0.1f;
private void Start()
{
animator = GetComponent<Animator>();
}
private IEnumerator HitAnimationCoroutine() //state 0 = Idle, 1 = GetHit
{
// 피격 애니메이션 재생
animator.SetInteger("state", 1);
// hitDelay만큼 대기
yield return new WaitForSeconds(hitDelay);
// 평상시에는 idle 애니메이션 재생
animator.SetInteger("state", 0);
}
private void OnCollisionEnter2D(Collision2D collision)
{
// 총알의 태그가 "Bullet"인 경우만 처리
if (collision.gameObject.CompareTag("Bullet"))
{
monsterHP -= 1;
// 피격 애니메이션 코루틴 시작
StartCoroutine(HitAnimationCoroutine());
if (monsterHP == 0)
{
Destroy(this.gameObject);
}
// 총알 파괴
Destroy(collision.gameObject);
}
}
}
1. 피격시 애니메이션 설정
2. update -> coroutine 코드 전환
'KDT > 2D 콘텐츠 제작' 카테고리의 다른 글
[SpaceShooter2D] Bullet Prefab 오브젝트 풀링 구현 (0) | 2023.08.28 |
---|---|
[SpaceShooter2D] 총알 발사 구현과 삭제 및 정규화 (0) | 2023.08.16 |
[SpaceShooter2D] 캐릭터 방향에 따른 애니메이션 상태 변환 (0) | 2023.08.16 |
[SpaceShooter2D] 캐릭터 이동과 벽에 닿았을 때 이동 제한 (0) | 2023.08.16 |