https://www.youtube.com/watch?v=JRaIlTEmvHY&list=PLO-mt5Iu5TeZF8xMHqtT_DhAPKmjF6i3x&index=12&t=46s
1. 피격 리액션
Enemy.cs > OnTriggerEnter2D
몬스터 애니메이터의 피격 상태는 Hit Trigger로 제어되고 있음
피격 부분에 애니메이터의 SetTrigger 함수를 호출하여 상태 변경
private void OnTriggerEnter2D(Collider2D collision)
{
//...
if (health > 0)
{
anim.SetTrigger("Hit");
}
//...
}
코루틴 Coroutine : 생명 주기와 비동기처럼 실행되는 함수
IEnumerator : 코루틴만의 반환형 인터페이스
yield : 코루틴의 반환 키워드
- yield return 을 통해 다양한 쉬는 시간을 지정
private void OnTriggerEnter2D(Collider2D collision)
{
//...
//StartCoroutine("KnockBack");
StartCoroutine(KnockBack());
//...
}
IEnumerator KnockBack()
{
//yield return null; // 1프레임 쉬기
//yield return new WaitForSeconds(2f); // 2초 쉬기
yield return wait;//하나의 물리 프레임을 딜레이 주기
Vector3 playerPos = GameManager.instance.player.transform.position;
Vector3 dirVec = transform.position - playerPos;
rigid.AddForce(dirVec.normalized * 3,ForceMode2D.Impulse);
}
플레이어 기준의 반대 방향 : 현재 위치 -플레이어 위치
리지드바디2D의 AddForce 함수로 힘 가하기
순간적인 힘이므로 ForceMode2D.Impulse 속성 추가
하나의 물리 프레임을 딜레이 하는
WaitForFixedUpdate 변수 선언 및 초기화
public class Enemy : MonoBehaviour
{
//...
WaitForFixedUpdate wait;
void Awake()
{
//...
spriter = GetComponent<SpriteRenderer>();
wait = new WaitForFixedUpdate();
}
FixedUpdate 수정
private void FixedUpdate()
{
//...
if (!isLive || anim.GetCurrentAnimatorStateInfo(0).IsName("Hit"))
return;
//...
}
GetCurrentAnimatorStateInfo : 현재 상태 정보를 가져오는 함수
- 살아있으며 Hit 상태일때 이동로직 비활성화
GetCurrentAnimatorStateInfo(0) : 현재 상태 정보를 가져오는 함수 ,레이어의 인덱스를 매개변수로 사용한다.
IsName : 해당 상태의 이름이 지정된 것과 같은지 확인하는 함수
2. 사망 리액션
여러 로직을 제어하는 isLive 변수를 false로 변경
Collider2D 변수를 생성 및 초기화
public class Enemy : MonoBehaviour
{
//...
Rigidbody2D rigid;
Collider2D coll;
//...
void Awake()
{
rigid = GetComponent<Rigidbody2D>();
coll = GetComponent<Collider2D>();
//...
}
}
컴포넌트의 비활성화는 .enabled = false
리지드바디의 물리적 비활성화는 .simulated = false
SetBool 함수를 통해 죽는 애니메이션 상태로 전환
spriter.sorting
스프라이트 랜더러의 Sorting Order 감소
재활용을 위해 OnEnable 함수에서 되돌리기
애니메이터에서 몬스터 데드 선택
키프레임 선택 후 Ctrl + C 로 복사 Ctrl + v 로 붙여넣기 (Alt + 휠 = 프레임당 간격줄이기)
Add Event 버튼을 통해 애니메이션 이벤트 추가
몬스터 프리펩을 더블클릭하여 들어가기
애니메이션 이벤트 선택 후, 인스펙터에서 연결할 함수 선택
애니메이터 컴포넌트의 컨트롤러를 교체하면서 다른 애니메이션도 작업
3. 처치 데이터 얻기
게임 매니저에 레벨, 킬수, 경험치 변수 선언
각 레벨의 필요경험치를 보관할 배열 변수 선언 및 초기화
public class GameManager : MonoBehaviour
{
public int level;
public int kill;
public int exp;
public int[] nextExp = { 10, 30, 60, 100, 150, 210, 280, 360, 450, 600 };
Header : 인스펙터의 속성들을 이쁘게 구분시켜주는 타이틀
[Header("# Game Control")]
public float gameTime;
public float maxGameTime = 2 * 10f;
[Header("# Player Info")]
public int level;
public int kill;
public int exp;
public int[] nextExp = { 10, 30, 60, 100, 150, 210, 280, 360, 450, 600 };
[Header("# Game Object")]
public Player player;
public PoolManager pool;
경험치 증가 함수 새로 작성
public void GetExp()
{
exp++;
if (exp == nextExp[level])
{
level++;
exp = 0;
}
}
if 조건으로 필요 경험치에 도달하면 레벨 업하도록 작성
몬스터 사망시 킬수 증가와 함께 경험치 함수 호출(Enmey.cs -> 사망)
private void OnTriggerEnter2D(Collider2D collision)
{
if (!collision.CompareTag("Bullet")||isLive)
return;
//...
else
{
isLive = false;
coll.enabled = false;
rigid.simulated = false;
spriter.sortingOrder = 1;
anim.SetBool("Dead",true);
GameManager.instance.kill++;
GameManager.instance.GetExp();
}
}
- 사망 로직이 연달아 실행되는 것을 방지하기 위해 조건(isLive) 추가
깃허브 올리기
Commit : ver 1.9
Description : Add Monster animation
https://github.com/mekain80/CloneCode_Undead_Survivor
'게임개발 > 언데드서바이벌_골드메탈_클론코딩' 카테고리의 다른 글
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 11 (능력 업그레이드💪구현) (0) | 2023.05.10 |
---|---|
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 10 (HUD📐제작하기) (0) | 2023.05.06 |
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 8 (자동🎯원거리 공격 구현) (0) | 2023.04.10 |
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 7 (회전하는🪓근접무기 구현) (0) | 2023.04.10 |
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 6+ (소환 레벨⏳적용하기) (0) | 2023.04.09 |