ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 케이디 강의14 - (풀 파괴, 효과음, 이펙트, 오브젝트 변형)
    인프런 강의 - 케이디 생존게임 2022. 11. 15. 19:58
    반응형

    public class Grass : MonoBehaviour
    {
    
        //풀 체력(보통 1)
        [SerializeField]
        private int hp;
    
        //이펙트 제거시간
        [SerializeField]
        private float destroyTime;
    
        //폭발력 세기
        [SerializeField]
        private float force;
    
    
        // 타격 이펙트
        [SerializeField]
        private GameObject go_hit_effect_prefab;
    
        //##컴포넌트 요청## / *배열로 부르는 이유 여러 자식객체로 이루어진 오브젝트이기 때문
        private Rigidbody[] rigidbodys; //중력 활성화용
        private BoxCollider[] boxColliders; // 박스 콜라이더 활성화용
    
    
    
    
        [SerializeField]
        private string hit_sound;
    
        void Start()
        {
            rigidbodys = this.transform.GetComponentsInChildren<Rigidbody>();
            boxColliders = this.transform.GetComponentsInChildren<BoxCollider>();
        }
    
    
        public void Damage()
        {
            hp--;
    
            Hit();
    
            if (hp <= 0)
            {
                Destruction();
            }
        }
    
        private void Hit() //이펙트,사운드 재생
        {
            SoundManager.instance.PlaySE(hit_sound);
    
            var clone = Instantiate(go_hit_effect_prefab, transform.position + Vector3.up, Quaternion.identity);
            //프리팹 생성, 위치는 약간 위에서 생성, 회전값 기본값으로
    
            Destroy(clone, destroyTime); //생성된 프리팹 삭제
        }
    
    
        private void Destruction() // 리지드바디, 박스콜라이더 활성화
        {
            for (int i = 0; i < rigidbodys.Length; i++) //rigidbodys의 배열 길이만큼 반복
            {
                rigidbodys[i].useGravity = true; // 중력 체크사항을 켜줌
                rigidbodys[i].AddExplosionForce(force, transform.position, 1f);
                //폭발하는 힘 추가(폭발세기, 폭발위치, 폭발반경(이 안에 들어온 객체들이 날아감)
                boxColliders[i].enabled = true; // 콜라이더 컴포넌트를 활성화 상태로 만들어줌
            }
    
            Destroy(this.gameObject, destroyTime); //풀 오브젝트 삭제
        }
    }

    풀 코드

     

     

    지난 강좌와 거의 동일한 내용이였다.

     

    이미 사운드 매니저를 만들어 놓았기때문에 크게 손이 가는 부분은 없었고

     

    데미지 호출 함수는 도끼에서 불러오도록 하였다.

     

    hitInfo.transform.GetComponent<Grass>().Damage();

     

    ㅡㅡ

     

    지난번과 다른점은

     

    grass 오브젝트 자체가 이미 나누어져 있는데

    해당 오브젝트에

    rigidbody와 collider를 부여 후

     

    collider의 경우는 비활성화, 

    rigidbody의 경우는 Use Gravity 항목을 비활성화 하여서 형태를 유지하게 만들었다.

     

    그 후 스크립트에서

     

    rigidbody와 collider를 각각 배열로 불러오고

     

    start 함수에서

     

    GetComponentsInChildren를 이용하여 모든 자식객체의 컴포넌트를 획득하였다.

     

    획득한 배열로

    for문을 돌려 (자식객체의 수는 같으므로 rigidbodys.Length를 사용하였다.)

    useGravity = true == Use Gravity 항목 활성화

    enabled = true == 컴포넌트 활성화

    를 통해서 활성화 시켜주었다.

     

    추가적으로

    AddExplosionForce(force, transform.position, 1f); 를 통해서 풀 오브젝트들이 조금 흩어지게 만들었다.

    반응형
Designed by Tistory.