유니티

공격을 받았을 때 Material 바꾸기 (Flash effect)

nock_ji 2022. 5. 24. 14:48

모두 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");
        }
    }