유니티/AA(3D 쿼터뷰 액션 게임)

AA(22) - 캐릭터 피격 구현

무직백수취업준비생 2021. 9. 27. 01:41
728x90
반응형
    void OnTriggerEnter(Collider other)
    {
        if(other.tag == "Item")
        {
            Item item = other.GetComponent<Item>();
            switch (item.type)
            {
                case Item.Type.Ammo:
                    ammo += item.value;
                    if (ammo > maxAmmo)
                        ammo = maxAmmo; //최대치 초과시 수치는 최대값과 동일
                    break;
                case Item.Type.Coin:
                    coin += item.value;
                    if (coin > maxCoin)
                        coin = maxCoin;
                    break;
                case Item.Type.Heart:
                    health += item.value;
                    if (health > maxHealth)
                        health = maxHealth;
                    break;
                case Item.Type.Grenade:
                    grenades[hasGrenades].SetActive(true);
                    hasGrenades += item.value;
                    if (hasGrenades > maxHasGrenade)
                        hasGrenades = maxHasGrenade;
                    break;
            }
            Destroy(other.gameObject); //접촉한 소모아이템 파괴
        }
        else if (other.tag == "EnemyBullet") //플레이어 피격 구현
        {
            if(!isDamage)
            {
                Bullet enemyBullet = other.GetComponent<Bullet>();
                health -= enemyBullet.damage;
                StartCoroutine(OnDamage());
            }

        }
    }
    IEnumerator OnDamage()
    {
        isDamage = true;
        foreach(MeshRenderer mesh in meshs)
        {
            mesh.material.color = Color.yellow; //모든 재질의 색상 변경
        }
        yield return new WaitForSeconds(1f); //WaitForSeconds()로 무적 타임 조정
        isDamage = false;
        foreach (MeshRenderer mesh in meshs)
        {
            mesh.material.color = Color.white; //모든 재질의 색상 변경
        }
    }

캐릭터 피격을 위한 스크립트를 작성합니다.

 

    void OnTriggerEnter(Collider other)
    {
        if(other.tag == "Item")
        {
            Item item = other.GetComponent<Item>();
            switch (item.type)
            {
                case Item.Type.Ammo:
                    ammo += item.value;
                    if (ammo > maxAmmo)
                        ammo = maxAmmo; //최대치 초과시 수치는 최대값과 동일
                    break;
                case Item.Type.Coin:
                    coin += item.value;
                    if (coin > maxCoin)
                        coin = maxCoin;
                    break;
                case Item.Type.Heart:
                    health += item.value;
                    if (health > maxHealth)
                        health = maxHealth;
                    break;
                case Item.Type.Grenade:
                    grenades[hasGrenades].SetActive(true);
                    hasGrenades += item.value;
                    if (hasGrenades > maxHasGrenade)
                        hasGrenades = maxHasGrenade;
                    break;
            }
            Destroy(other.gameObject); //접촉한 소모아이템 파괴
        }
        else if (other.tag == "EnemyBullet") //플레이어 피격 구현
        {
            if(!isDamage)
            {
                Bullet enemyBullet = other.GetComponent<Bullet>();
                health -= enemyBullet.damage;
                StartCoroutine(OnDamage());
            }

        }
    }
    IEnumerator OnDamage()
    {
        isDamage = true;
        foreach(SkinnedMeshRenderer mesh in meshs)
        {
            mesh.material.color = Color.yellow; //모든 재질의 색상 변경
        }
        yield return new WaitForSeconds(1f); //WaitForSeconds()로 무적 타임 조정
        isDamage = false;
        foreach (SkinnedMeshRenderer mesh in meshs)
        {
            mesh.material.color = Color.white; //모든 재질의 색상 변경
        }
    }

 

 

피격 테스트를 위한 오브젝트를 생성합니다.

 

태그와 레이어를 EnemyBullet으로 설정하고 박스 콜라이더를 트리거로 설정한 뒤

 

Bullet 스크립트를 드래그&드롭한 뒤 데미지를 설정해줍니다.

 

이후 오브젝트를 캐릭터에 닿게 옮겨보면 스크립트에 작성된 대로

 

플레이어의 체력이 깎이며 스킨매쉬랜더러가 노란색으로 변경되는 것을 확인할 수 있습니다.

728x90
반응형