반응형

 

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

 

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

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

 

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

파란선이 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)부터 시작할 것이냐의 차이다.

 

 

 

결과

 

반응형
반응형

※ 해당 에러가나는 유니티 버전은 Hub에서 유니티 설치시, JDK를 같이 설치하는 버전부터이다.


구글 플레이 게임 서비스(이하 GPGS)를 연동하기위해 플러그인을 다운받아 유니티에 임포트를 하고 Resolve를 했는데, 난데없는 에러가 떴다.

 

Gradle failed to fetch dependencies.
ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.

 

'JAVA_HOME'이라는게 설정되지 않았다고한다.

찾아보니 최근 유니티들은 Hub에서 유니티 설치시, SDK, NDK, JDK를 다 설치하다보니 JAVA를 따로 설치할 필요가 없다. 문제는 여기서 발생하는데 GPGS 플러그인 설치 후, Resolve를 할 때 에러가 발생하는것이다.

에러를 추가로 읽어보면,

 

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation.

 

JAVA가 설치된 곳을 JAVA_HOME 변수와 일치시켜달라고 한다. 즉, JAVA_HOME이라는 환경변수를 설정해주면 된다.

그럼 시작해보자!

 

환경변수 설정

1. 내 컴퓨터에서 속성에 들어간다.

2. 고급 시스템설정 - 환경변수 버튼을 눌러준다.

 

3. 시스템 변수 - 새로 만들기 버튼을 눌러 다음과 같이 설정한다.

4. 변수 값에 OpenJDK의 경로를 넘겨준다

  ※ 경로 : 유니티 설치 경로\Editor\Data\PlaybackEngines\AndroidPlayer\OpenJDK

 

 

여기까지 설정을 마쳤다면 이제 재부팅 후 다시 Resolve를 시도해보자!

그러면 Resolve가 진행되며 위와같이 정상적으로 성공 메세지를 받을 수 있다!

 

반응형
반응형

멀티플레이 로비관련 작업을 하던 중, UI요소 사이에 파티클을 넣어보았다.

작업을 어느정도 마친 뒤, 마지막으로 batch 확인을 했는데 파티클을 겨우 10개 사용했는데 다른 UI와 섞여 batch 수치가 SetPassCall과 함께 폭발하고 있었다.

 

 

일단 파티클을 사용한 UI 요소의 구성은 다음과 같다.

Room(Empty object)의 자식으로 파티클, 스프라이트, 텍스트로 들어가있다.

 

 

위의 게임오브젝트가 10개로 불어난다면 다음과 같은 현상이 일어난다.

 

이걸 10개만 불려도 각각 SetPassCall과 Batch가 18로 불어난다.

UGUI 구조상 Canvas안에서는 계층에 따라 레이어 순서가 정해지니, Render queue나 파티클의 Order in layer를 건드려도 아무 개선이 되지 않는다.

 

 

결국 구조를 바꾸는 수 밖에 없었다.

 

위와 같이 파티클들을 전부 빼서 따로 모아두게되면 막무가내로 했던 구성보다 Batch 수치가 6배 차이가 난다.

이걸로 해결! 이면 좋겠지만, UI를 저거 10개만 쓰고 마무리할것도 아니고 다른 UI요소도 고려해야한다.

 

일단 전제 조건은 다른 UI요소들의 이미지들이 같은 아틀라스에 패킹되어있는것으로 한다.

같은 아틀라스에 패킹되어 있는 이미지를 가진 UI요소들은 어디가 어디위에 겹치던 Batch가 1일것이다.

문제는 파티클이다. Paticles 게임오브젝트 위의 계층에 다른 UI요소가 들어가있으면, 즉 파티클을 다른 UI요소들 사이에 샌드위치로 끼워버리는 순간 문제는 발생한다.

 

위와 같은 상황에서 Frame Debugger를 돌려보면 (새로만든 UI요소) - (Paticles) - (Rooms) 순으로 그려지는것이다!!

 

그렇기 때문에 Particles 게임오브젝트의 배치는 계층 위쪽에 배치하려면 Particles 위의 계층에 아무것도 없어야하고, 그렇지 않으면 제일 밑으로 내려야한다!

 

 

필자의 경우엔 Paticles 위쪽 계층에 UI요소가 많이 있어서 최하단으로 배치했다.

 

 

최하단으로 옮기게 되면 Batch 문제에 탈줄은 했지만, UGUI 계층 문제로 파티클이 파란색 박스를 덮게된다.

 

이건 우리가 원하는 바가 아니므로, 장치를 하나더 추가한다.

Canvas에는 Sort Order를 지정할 수 있다. 이것을 사용해서 해결해보자.

 

 

부모 Canvas에는 Sort Order를 1로, Particles에는 Canvas를 추가해서 Sort Order를 0으로 사용해주면 된다. (Sort Order 수치는 부모 Canvas가 Paticles Canvas보다 높으면 아무거나 상관없다.)

 

이렇게 세팅을 해주면 다른 UI요소를 신경 쓸 필요도 없고, 파티클이 파란 박스를 덮지 않고, 처음에 파티클만 빼서 배치했던 경우와 똑같은 수치의 Batch와 SetPassCall을 확인할 수 있다!!

 

추가로 Canvas를 이용해서 SortOrder를 설정 해주게되면 UI 계층 순서는 신경 쓰지 않아도 된다.

 

마지막으로, 이런 세팅은 위와 같은 경우에만 의미가 있는 세팅이기 때문에 UI요소 한두개에 이펙트 터뜨리는거에 위와 같은 세팅을 해버리면.. 배보다 배꼽이 더 커지는 현상이 발생하므로 잘 선택하여 사용하자.

반응형
반응형
  • 기본 슬롯 단축키

(왼쪽부터)

1. Select : S or Ctrl or Ctrl + Drag

2. Move : M

3. Brush : B

4. Fill box : U

5. Picker : I

6. Eraser : D or Shift or Shift + Drag

7. Fill : G

 

  • 기타 단축키

(블럭 선택 후)

1. 시계방향 회전 : ]

2. 반시계 방향 회전 : [

3. 좌우 반전 : Shift + [

4. 상하 반전 : Shift + ]

반응형
반응형

  • 유니티 버전 2019.3.1f1(LTS)
  • 사용 패드 MOGA XP5-X+ (Xbox)
  • 문제가 있으면 기타 주의사항을 봐주세요.

 

 

  • Buttons
GamePad KeyCode
A button JoystickButton0 / Joystick1Button0
B button JoystickButton1 / Joystick1Button1
X button JoystickButton3 / Joystick1Button3
Y button JoystickButton4 / Joystick1Button4
LB button JoystickButton6 / Joystick1Button6
RB button JoystickButton7 / Joystick1Button7
LT button JoystickButton8 / Joystick1Button8
RT button JoystickButton9 / Joystick1Button9
View button JoystickButton10 / Joystick1Button10
Menu button JoystickButton11 / Joystick1Button11
XBox button JoystickButton12 / Joystick1Button12
AGL, AGR buttons -

  • Joystick, D-PAD

 - Precision stick과 D-PAD는 ProjectSettings - InputManager에서 설정을 한뒤 사용한다.

 - 받아와야하는 Axis와 설정은 다음과 같다.

 

 - D-PAD

 

 - Left precision stick

 

 - Right precision stick

 


  • 기타 주의사항

※ Precision stick의 값을 받아왔을 때, 값이 0이 아닌 소수점의 Positive값이 받아와지는 현상이 있었다.

 - InputManager에서 해당 Axis 옵션의 Dead값을 늘려주면 된다. (필자의 패드 기준으로 0.01로 설정해서 해결)

 

 

반응형

+ Recent posts