본문 바로가기

유니티 게임 개발하기/2D 게임 개발일지

유니티 - 탄막 슈팅 게임을 만들자(1), Sin(),Cos()과 Mathf 의 사용

안녕하세요, 윈디입니다!

오늘은 처음으로 보스가 탄막을 뿜어내도록 만들었습니다.

지난번의 보스 패턴 구현에서 연장선상이 되겠네요.


 

이러한 탄막을 구하기 위해, 구현해야 하는 두 가지의 파트를 먼저 살펴보겠습니다.

첫번째는, 탄막을 '쏘는' 보스에서 구현해야 할 부분.


두번째는, 탄 자체가 움직이거나, 혹은 시야 범위에서 사라진 탄이 삭제되기 위해 필요한

'탄' 내부에서 구현해야 하는 부분이 있겠습니다.


탄을 쏘는 보스의 부분부터 살펴보도록 하지요.

탄을 원하는 방식대로 쏘도록 코루틴을 만들어서, 

원하는 타이밍에 실행해줄 수 있도록 하면 되니까요.

저는 시작하는 시점에 저런 탄을 생성할 수 있도록,

 SpellStart()  코루틴을 만들었습니다.


IEnumerator SpellStart() 

float angle = 360 / oneShoting; 

// 저는 총알을 쏘는 갯수를 변수로 지정해서,

예를들어 몇 개의 총탄을 쏘고 싶다, 라고 하면  그것의 개수를 이용해 360도의 각도 안에서 균일하게 배치될 수 있도록 하였습니다.

이렇게 해 두면 앞으로 같은 함수를 써도 갯수나 속도등을 조절할수 있으니 재활용성이 높아지겠죠?


do{ 

for(int i =0;i<oneShoting;i++) 
{ Debug.Log(i); 
GameObject obj; 
obj=(GameObject)Instantiate(bullet,boss.transform.position,Quaternion.identity); 

//보스의 위치에 bullet을 생성합니다.
obj.GetComponent<Rigidbody2D>().AddForce( new Vector2(speed*Mathf.Cos(Mathf.PI*2*i/oneShoting),speed*Mathf.Sin(Mathf.PI*i*2/oneShoting)));


obj.transform.Rotate(new Vector3(0f,0f,360*i/oneShoting -90)); 


//지정해둔 각도의 방향으로 모든 총탄을 날리고, 날아가는 방향으로 방향회전을 해줍니다.

yield return new WaitForSeconds(1f); 
}while(true); 



주의깊게 부신분들은 눈치채셨겠지만, Cos(Mathf.PI*2*i/oneShoting) 부분에서, 360도를 float 형태가 아닌  Math.PI 형태로 집어넣었습니다.


Mathf.PI*2 = 360도이니까, 이 각도에서 총알 한개씩의 각도를 계산하는 겁니다.


처음에는 그냥 숫자를 넣었는데, 잘 안 들어가더라고요. Rotate 에서는 float 로 각도가 들어갑니다만, Cos, Sin 에서는 제대로 들어가지 않고 엉뚱한 방향으로 튀기에, mathf에 있는 Pi 값을 이용하였습니다.

유니티의 오류인지, 원래 이 사용법만 되는건지는 모르겠습니다만,

뭐 이것도 나름대로 알아보기 쉽고, 편하군요,



이걸로 총알에 RigidBody2D만 추가해 주면, addforce()함수에 의해서 총알이 자연스럽게

날아가게 되겠습니다. 강체 옵션을 조절해 주시면 아마 마찰력 조정으로 중간에 멈추게 할 수도 있을 것이지만, 이럴 경우 점점 총알이 쌓이게 되면, 프레임드랍이 무지막지 심해지니까 꼭 조심해서 다루도록 해 주세요. (제 경우 1800개가 한계였습니다.)


그럼 다음에는 총알 내부에 써야할 것들을 다뤄보도록 하겠습니다. 모두 좋은 하루 보내세요!