개발 노트

[유니티 윷놀이] 윷 던지기 본문

유니티

[유니티 윷놀이] 윷 던지기

알 수 없는 사용자 2024. 2. 23. 11:22

[오브젝트와 속성]

 

일단 처음으로 윷놀이 만들기에 있어서 윷을 구현했다.

 

 

이러한 모양으로 원형 모양의 오브젝트와 사각 모양의 오브젝트를 합쳐 비슷하게 만들었다.

 

그 이후 중요한건 이 윷이라는 오브젝트에 Rigidbody와 Collider적용이다 Rigidbody는 현실같은 중력의 영향을 받게하는 속성으로써 윷을 던질때 필요한 부분이다. 

 

그리고 Collider는 충돌처리에 대한 속성으로 충돌을 감지하기에 필요하다.

 

그래서 이 두속성을 이용한다

 

이렇게 Rigidbody와 Collider를 적용한다.(Add component에서 찾아서 적용하면 됨)

 

여기서 Mesh Collider는 오브젝트의 충돌처리 면적을 세밀하게 검사하여 오브젝트 모양 만큼의 정밀한 범위를 만들어 낸다. (Mesh Collider는 정밀하게 연산하기 때문에 연산할 범위가 클 수록 용량이 많이 커질 수 있다.)

 


[중력]

 

그 다음 중요한 것은 윷이 현실 감 있게 떨어지는 느낌을 주기 위한 작업인데, 중력 값을 조절해야한다.

 

 

이를 위해 Constant Force라는 속성을 사용했는데 이것은 Rigidbody에 추가적인 중력의 힘을 부가하는 것이다.

그래서 y 값의 -50값을 더해 적당한 거리만큼 위로 뜨고 내려오게끔 값을 설정했다.

 

 

또한 상단 Edit창의 Project Settings를 들어가면 뜨는 창으로 보이는 Physics의 Gravity 정보를 보면 0 , - 50 , 0으로 설정했다. 여기서 Gravity는 중력 가속도로써 y값은 -50으로 설정하여 물체가 공중에 있을대 내려오는 가속도가 더 빨라지게하였다.

 

 


[스크립트 구현]

 

이제 c# 스크립트를 통해서 오브젝트의 움직임을 구현하는 것이다.

 

Assets에 오른클을 하여 Create에서 C# Script를 찾아 스크립트를 생성하여 작업한다.

 


[회전]

 

여기서 알아야 하는것은 Start 함수와 Update함수가 미리 설정되어있다.

 

Start 함수는 유니티를 실행시킬때 한번 실행되고, Update함수는 유니티에서 적용하는 프레임단위로 실시간으로 계속 실행시킨다 그래서 Update함수에 계속해서 작동시켜야할 로직들을 넣어두면 될 것 같다.

 

이제 회전을 구현할 것이다.

 

 

이렇게 yutrotate라는 함수를 만들어서 구현을 했는데, 여기 보면

 

float rotationAmount = rotationSpeeds[i] * Time.deltaTime;

이부분에서 눈여겨 볼점은 Time.deltaTime이다 이 변수는 유니티에서 제공하는 변수로 유니티에 있는 시간의 흐름을 적용 받는다는 것이다. 

 

그리고 다음으로 넘어가서

yutObjects[i].transform.Rotate(Vector3.up * rotationAmount);
yutObjects[i].transform.Rotate(Vector3.forward * rotationAmount);

이 코드가 회전을 시키는 부분이다. yutobjects는 

이러한 게임오브젝트 클래스를 통해 만들어서

이렇게 yut(clone)처럼 오브젝트가 들어가 있어야 작동할 수 있다.

 

다시 돌아가서 yutobjects[i].transform.Rotate에서 tranform은 Inspector창에 있는 속성에 접근하여 유니티에서 기본으로 제공하는 Rotate라는 함수를 이용하는 것인데,  Rotate(Vector3.up * rotationAmount); 여기서 Vector3.up은 3d물체의 값을 up시키는 것으로 up은 y값을 반영시킨다.

 

그래서 y값에 회전을 주는 것이다.

또한 forward는  z 값에 회전을 주는 것이다.

 

이러면 어설프지만 윷이 돌아간다는 회전을 구현하게 된다.

 

 

추가적으로 

윷은 공중에서 회전하기 때문에 

yutRigidbodies[i].AddForce(Vector3.up * 120f, ForceMode.Impulse);

이러한 코드를 사용하는데 AddForce는 중력의 힘을 적용받아 작동 하는 함수로서 Vector3.up * 120f만큼 올라가는데

ForceMode.Impulse 이런 포스모드에서 impulse를 적용한다.(impulse는 정지되어있는물체를 순간적으로 힘을 붙여주는 모드) 

 

그렇게해서 순간적인 힘으로 공중에 떠서 회전하는 윷 던지는 모습이 구현이 된다.


[윷 앞면,뒷면]

 

이제 윷을 던지고 난이후 중요한 것은 앞면 인지 뒷면인지 확인해야 하는 것이다.

 

이처럼 rotation 값에 x 값이 어떤지의 따라 판단을 시켰는데 각자 어떻게 구현하는지에 따라 달라질 수 있다.

앞면이 나오는 각도는 180< 앞면 <360 이거나 -180< 앞면 < 0 이기 때문에 이러한 값이 나오면 앞면 1의 값을 아니면 0의 값을 반환하게 된다.


[윷 백도]

 

윷놀이를 하게 되면 도개걸윷모 그 다음 백도가 존재한다. 유니티 상에서 구현하기 위해  3개의 기본 윷과 백도가 있는 1개의 윷을 구현하고. 그 이후 백도가 있는 윷만 앞면일때 백도가 되게끔 설정해야한다.

 

이렇게 윷마다 앞면 뒷면인지 확인해서 카운트를 주고 기본 윷이 뒷면이 3개이고 백도있는 윷이 앞면일때 -1값을 반환하여 백도로 처리되게 설정을 한다.


[윷 값 계산]

 

윷 오브젝트들을 개별적으로 나타나게 하여 윷마다 앞뒷면의 값을 계산하게 한다.

 

그 다음 Sum이라는 함수로 개별적인 윷의 값을 모아 해당 되는 부분에 로그와 텍스트를 출력시킨다.

 


[윷 바닥에 닿고 윷의 값 판단]

 

yutRotate함수에서

  if (isGrounded[i] && yutRigidbodies[i].velocity.magnitude < 0.01f || timeCount == 5)
  {
      if (isRotating[i])
      {
          isRotating[i] = false;
          yutResults[i] = JudgeYutResult(yutRigidbodies[i]);
      }

이러한 조건으로 지면에 닿았고 velocity.magnitude < 0.01f 이 코드는 그 물체에 속도를 감지하는 것인데 속도의 움직임이 0.01f보다 아래로 내려갔을때 조건문을 활성화 시키는 것이다. 또한 timecount ==5는 5초가 되면 실행시킨다는 코드이다.

 


 

'유니티' 카테고리의 다른 글

[유니티 윷놀이] 윷 놀이 말 설정  (0) 2024.02.23
[유니티 윷놀이] 턴제  (0) 2024.02.23
[유니티 윷놀이] 윷놀이 판 배열 설정  (0) 2024.02.23
유니티 프로젝트 구성  (0) 2024.02.23
유니티 설치  (0) 2024.02.23