반응형

 

※ 해당 포스팅은 유니티 물리, 힌지 조인트를 사용하는것이 아닌 단순히 진자 운동을 보이게 하기위한 포스팅이다.

 

삼각함수를 이용하여 진자운동을 구현해볼것이다.

최종 목표는 진자운동을 구현하여 좌우로 흔들리는 철퇴 장애물을 만드는것.

 

구현하기에 앞서 삼각함수 그래프를 먼저 살펴본다.

파란선이 sin 그래프, 빨간선이 cos 그래프이다. (그림이 조악한건 이해바람..)

위 두 그래프는 1과 -1을 반복하기 떄문에 우리는 이 특성을 이용하여 진자 운동을 구현할 것이다.

진자 운동 코드를 만들기 전에 삼각함수 그래프를 이용한 움직임이 어떤지 확인해보기 위해 위, 아래로 먼저 표현을 해보자.

 

 

 

사용 예시

이번 예시에서는 Vector3.Lerp()의 마지막 인자 t의 값을 Mathf.Sin()으로 구해서 구체의 Position값을 변경하는 형태이다.

참고로 Vector3.Lerp()t인자 값은 0~1로 넣어줘야하는데 Mathf.Sin()의 값은 -1~1이다. 그렇기 때문에 약간의 추가 작업이 필요하다. t인자 값을 구하기 위한 코드는 다음과 같다.

float lerpTime += Time.deltaTime;
(Mathf.Sin(lerpTime) + 1) * 0.5f; //Lerp()의 t인자 값

그럼 본격적으로 철퇴 장애물을 만들어보자.

 

 

 

유니티 게임오브젝트 세팅

1. 빈 게임오브젝트를 만들어준다.

  ※ 이 게임오브젝트가 최상위 부모 오브젝트이다.

2. 빈 게임오브젝트의 자식으로 체인 오브젝트를 만들어준 뒤 체인 오브젝트의 위쪽을 부모 오브젝트의 중심에 맞춰준다.

3. 체인 오브젝트의 자식으로 철퇴 오브젝트를 만들어준다.

 

이것으로 게임오브젝트 세팅이 완료되었다. 설명이 따로 필요없을정도로 간단하다.

이제 최상위 부모 오브젝트를 좌우로 회전시켜주기만 하면 진자운동을 하는 철퇴 장애물을 만들 수 있는것이다!

회전 시켜줄 게임 오브젝트에 연결해줄 코드를 살펴보자

 

 

 

코드

using UnityEngine;

public class Pendulum : MonoBehaviour
{
    public float angle = 0;
    
    private float lerpTime = 0;
    private float speed = 2f;
    
    private void Update()
    {
        lerpTime += Time.deltaTime * speed;
        transform.rotation = CalculateMovementOfPendulum();
    }
	
    Quaternion CalculateMovementOfPendulum()
    {
        return Quaternion.Lerp(Quaternion.Euler(Vector3.forward * angle), 
        	Quaternion.Euler(Vector3.back * angle), GetLerpTParam());
    }
	
    float GetLerpTParam()
    {
        return (Mathf.Sin(lerpTime) + 1) * 0.5f;
    }
}

  ※ angle값은 public으로 선언했으므로, 인스펙터 창에서 입맛대로 바꿔주면 된다.

  ※ 예시에서는 Mathf.Sin()을 사용했지만, Mathf.Cos()도 사용 가능하다. 포스팅 상단의 그림에서 봤듯이 Lerp()의 t인자값을 0.5(Sin)부터 시작할 것이냐 1(Cos)부터 시작할 것이냐의 차이다.

 

 

 

결과

 

반응형

+ Recent posts