인프런 강의 - 케이디 생존게임

케이디 강의13 - (나뭇가지 파괴, 효과음, 이펙트, 오브젝트 변형)

WMG1 2022. 11. 15. 00:05
반응형

 

 

 

public class Twig : MonoBehaviour
{

    [SerializeField]
    private int hp; // 나뭇가치 체력

    [SerializeField] //이펙트 파괴시간
    private float destroyTime;



    [SerializeField]
    private GameObject go_little_Twig; // 작은 나뭇가지 조각들

    [SerializeField]
    private GameObject go_hit_effect_prefab; //나뭇가지 타격 이펙트

    //##회전값 변수##
    private Vector3 originRot; //나무 칠때마다 기울이게 원래 로테이션 저장
    private Vector3 wantedRot; // 회전 희망방향
    private Vector3 currentRot; //현재 방향

    //##필요한 사운드 이름##
    [SerializeField]
    private string hit_Sound; //나무 타격음
    [SerializeField]
    private string broken_Sound; //나무 파괴음


    void Start()
    {
        originRot = transform.rotation.eulerAngles; //로테이션 값 vector3 그대로 선언했으므로 오일러로 변환시켜야함
        currentRot = originRot; // 원래 방향값 설정
    }



    public void Damage(Transform _playerTf) //나무 타격 ((플레이어의 위치정보 받아옴
    {
        hp--;

        Hit();

        StartCoroutine(HitSwayCoroutine(_playerTf));

        if(hp <= 0)
        {
            Destruction(); // 파괴함수
        }
    }

    private void Hit() //Rock 스크립트와 동일
    {
        SoundManager.instance.PlaySE(hit_Sound);

        GameObject clone = Instantiate(go_hit_effect_prefab, gameObject.GetComponent<BoxCollider>().bounds.center + Vector3.up * 0.5f,
            Quaternion.identity); 

        Destroy(clone, destroyTime);
    }

    IEnumerator HitSwayCoroutine(Transform _target) //맞은 방향으로 휘게하는 코루틴
    {
        Vector3 direction = (_target.position - transform.position).normalized;
        //나뭇가지와 플레이어가 서로 바라보는 방향 // normalized 나온 값의 합이 1이되도록 재조정해줌
        //플레이어 포지션 (x,y,z)에서 나뭇가지 포지션(x,y,z)를 빼면 방향값이 나옴

        Vector3 rotationDir = Quaternion.LookRotation(direction).eulerAngles;
        //방향에 대한 각도=> direction에서 나온 방향으로 바라보게 만듬 해당 값을 xyz값으로 반환

        CheckDirection(rotationDir); //각도 확인=>나온 각도
        
        
        
        while(!CheckThreshold())
        {
            currentRot = Vector3.Lerp(currentRot, wantedRot, 0.25f);
            //현재 회전값에 Lerp해줌 (현재 각도, 희망각도, 힘 값)
            transform.rotation = Quaternion.Euler(currentRot);
            //나온 값 적용
            // currentRot는 벡터값이지만  transform.rotation 오일러 값이므로 Quaternion.Euler를 추가하여 자동으로 대입할 수 있도록 변환
            yield return null;
        }

        wantedRot = originRot;

        while (!CheckThreshold())
        {
            currentRot = Vector3.Lerp(currentRot, wantedRot, 0.15f); //원래 위치로 돌아가는 반복문
            //현재 회전값에 Lerp해줌 (현재 각도, 희망각도, 힘 값)
            transform.rotation = Quaternion.Euler(currentRot);
            //나온 값 적용
            // currentRot는 벡터값이지만  transform.rotation 오일러 값이므로 Quaternion.Euler를 추가하여 자동으로 대입할 수 있도록 변환
            yield return null;
        }

    }



    private bool CheckThreshold() //임계점(목표근사치) 체크-> currentRot = Vector3.Lerp(currentRot, wantedRot, 0.25f);의
    {
        if (Mathf.Abs(wantedRot.x - currentRot.x) <= 0.5f && Mathf.Abs(wantedRot.z - currentRot.z) <= 0.5f)
            //Mathf.Abs를 추가하여 값을 항상 양수로 설정하여 오류 해결
            return true; //임계점도달
        return false; // 임계점 아님
    }

    //##얻은 방향,각도에 따른 나무 휘어짐 구현함수##
    private void CheckDirection(Vector3 _rotationDir) 
    {
        Debug.Log(_rotationDir);

        if(_rotationDir.y > 180) //타격 각도 180 이상인경우
        {
            if (_rotationDir.y > 300)
                wantedRot = new Vector3(-50f, 0f, -50f);
            else if (_rotationDir.y > 240)
                wantedRot = new Vector3(0f, 0f, -50f);
            else
                wantedRot = new Vector3(50f, 0f, -50f);
        }
        else if (_rotationDir.y <= 180) //타격 각도 조건
        {
            if (_rotationDir.y < 60)
                wantedRot = new Vector3(-50f, 0f, 50f);
            else if (_rotationDir.y > 120)
                wantedRot = new Vector3(0f, 0f, 50f);
            else
                wantedRot = new Vector3(50f, 0f, 50f);
        }
    }

    private void Destruction()
    {
        SoundManager.instance.PlaySE(broken_Sound);

        GameObject clone1 = Instantiate(go_little_Twig, gameObject.GetComponent<BoxCollider>().bounds.center + (Vector3.up * 0.5f),
    Quaternion.identity);

        GameObject clone2 = Instantiate(go_little_Twig, gameObject.GetComponent<BoxCollider>().bounds.center - (Vector3.up * 0.5f),
Quaternion.identity);

        Destroy(clone1, destroyTime);

        Destroy(clone2, destroyTime);

        Destroy(gameObject);
    }    
}

 

이전시간에 배웠던 사운드 매니저를 통한 효과음 추가와 파괴된 오브젝트 생성, 파티클 추가로

부서지는 나뭇가지를 구현하였다.

 

 

 

 

그리고 곡괭이 스크립트의 연계를 통해 플레이어 방향을 구하고

나뭇가지의 위치값과 합쳐 방향 ->각도를 구하고

 

입력값에 따라 나뭇가지가 천천히 휘어지게 Lerp를 사용하여 함수를 짠 뒤

 

각도에따라 휘어지는 함수를 실행하도록하였다.

 

반응형