-
케이디 강의13 - (나뭇가지 파괴, 효과음, 이펙트, 오브젝트 변형)인프런 강의 - 케이디 생존게임 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를 사용하여 함수를 짠 뒤
각도에따라 휘어지는 함수를 실행하도록하였다.
반응형'인프런 강의 - 케이디 생존게임' 카테고리의 다른 글
케이디 강의15 - (나무 파괴, 효과음, 이펙트, 오브젝트 변형) (0) 2022.11.16 케이디 강의14 - (풀 파괴, 효과음, 이펙트, 오브젝트 변형) (1) 2022.11.15 케이디 강의12 - (사운드 매니저 생성, 싱글톤) (0) 2022.11.14 케이디 강의11 - (바위-공격을 통한 이펙트와 파괴 구현) (0) 2022.11.14 케이디 강의10 - (근접 무기 구현) (0) 2022.11.13