모두 Enemy script
바꾸고 싶은 색의 material를 만들고 assign 한다
public Material matWhite;
Damage 데미지를 받을 때 코루틴 함수로 0.2초 뒤에 Material를 교체하는 로직
SkinnedMeshRenderer와 GetComponentsInChildren
-> 스크립트가 있는 오브젝트 자식의 모든 MeshRederer를 가져온다
Material의 리스트 backup를 만들어서 기존 material을 저장하고, 다른 white material를 불러와 바꾼다
smr[i].material은 현재 material을 갖고 있는 리스트이다 !
0.2초 후에 기존 matrial로 돌아오도록 smr[i].material = backup[i]로 선언한다
SkinnedMeshRenderer[] smr;
Material[] backup;
void Start()
{
SkinnedMeshRenderer[] smr = GetComponentsInChildren<SkinnedMeshRenderer>(); //모든 meshrederer를 가져옴
Material[] backup = new Material[smr.Length];
for (int i = 0; i < smr.Length; i++)
{
backup[i] = smr[i].material; //기존 material을 저장
smr[i].material = matWhite; //다른 white material로 바꾸기
}
}
//공격받을 때 흰색으로 material 변경
public Material matWhite;
IEnumerator FlashBody()
{
//0.2초 후에
yield return new WaitForSeconds(0.2f);
//기존 material로 롤백
for (int i = 0; i < smr.Length; i++)
{
smr[i].material = backup[i];
}
}
Damage를 입는 스크립트에 StopCoroutine, StartCoroutine을 적어준다
죽은 후에도 총을 맞으면 충돌하여 반응을 하므로 충돌체를 false로 비활성화 한다
internal void TakeDamage(int damage)
{
if (state == State.Death)
{
return;
}
StopCoroutine("FlashBody");
StartCoroutine("FlashBody");
//damage만큼 체력을 감소시키고 싶다
enemyHP.HP -= damage;
//NavMeshAgent를 멈추고싶다
agent.isStopped = true;
//만약 체력이 0 이하라면
if(enemyHP.HP <= 0)
{
//죽음 상태
state = State.Death;
anim.SetTrigger("Death");
//충돌체를 off하고싶다
GetComponent<Collider>().enabled = false;
}
else
{
//리액션상태
state = State.React;
anim.SetTrigger("React");
}
}
'유니티' 카테고리의 다른 글
player 순찰 & 추적 / waypoint / NavMeshAgent (0) | 2022.06.06 |
---|---|
애니메이션의 특정 부분에 다른 이벤트가 함께 나타나는 기능 / Animation Event / Hit (0) | 2022.06.05 |
싱글톤 Singleton (C#) (0) | 2022.05.15 |
FBSGunTarget 1인칭 시점 object grab (0) | 2022.05.12 |
프로퍼티(Property) get; set; (0) | 2022.05.12 |