Devil Toast/Cat Like Coding

21.03.24 - CLC: Orbit Camera

nd-F 2021. 3. 25. 01:00

변명을 하자면 어제 저녁에는 게임 약속이 있었고

오늘은 외출을 하고 오느라 바빴고

내일도 갑자기 약속이 생겨서 나가야 한다.

 

그래도 일단 어제 끝마친 건 처리해야될 것 같아서.

 

이 글은 Cat Like Coding의 Unity Turotial을 연습했음을 밝힘.

catlikecoding.com/unity/tutorials/movement/orbit-camera/

 

Orbit Camera

A Unity Movement tutorial about controlling a sphere via an orbit camera.

catlikecoding.com

 


이번에는 Orbit Camera, 즉 플레이어의 움직임과 위치에 따라 움직이는 카메라를 만들었다.

사실 마우스를 이용해 카메라를 조작하기도 하는데, 뭔가 좀 이상하기는 하다. 어색하다고 해야 할까.

 

그냥 코드를 따라해 연습했다는 것에 의의를 두자.

 

1, Require Component 선언

SerializeField 선언처럼 코드 상에 적으면 inspector에 적용이 된다.

 

[RequireComponent(typeof(Camera))]

이렇게 하면, 이 스크립트를 포함한 컴포넌트에 (Camera가 없는 경우) Camera가 자동으로 추가된다.

 

docs.unity3d.com/ScriptReference/RequireComponent.html

 

Unity - Scripting API: RequireComponent

When you add a script which uses RequireComponent to a GameObject, the required component will automatically be added to the GameObject. This is useful to avoid setup errors. For example a script might require that a Rigidbody is always added to the same G

docs.unity3d.com

 

2, Serialize Field의 default 할당

이번에는 Serialize Field에서 transform을 받았다. (이전에 했었을 수도. 기억이 안나는데)

기존에 우리가 float나 int, 또는 Rnage( ) 옵션을 추가한 경우 디폴트 값을 적어주었는데, transform역시 마찬가지로 존재한다. 바로 defualt.

 

[SerializeField]
Transform focus = default;

이렇게 해주면 된다.

 

2-1, if문에서의 defualt 취급

이렇게 하는 또 다른 이유는, 이 Transform 요소에 값을 할당하지 않았을 수도 있기 때문이다. 가령 여기서는 Player의 값이 들어가는데, 만약 Player가 별도로 할당되지 않았다면 그냥 카메라는 고정된 World Space를 바라보도록 원할수도 있다.

 

아무튼 그래서 만약 inspector에서 별도의 Object(의 transform값)를 할당하지 않으면 default이 되는데, 이 focus를 if문으로 하게 되면, 마치 false처럼 분기한다.

 

3, Serialize Field의 Min 설정

이건 간단하다. 기존에 Range( ) 설정이 두 사이의 값에서 조정할 수 있게 했다면

이건 그 값의 최소값만 설정해주는 것.

 

[SerializeField, Min(0f)]
float alignDelay = 5f;

 

이렇게 하면 inspector에서는

... 쓰임세 자체는 평범히다.

 

4, Vector3의 단위 벡터 멤버

Vector3의 staticc 멤버에는 forward, right같은 것들이 있는데 그냥... 단위 벡터로써 자주 사용한다. 그냥 크기가 1인 무언가의 벡터 성분을 쓰려 하거나, x, y, z로 분리해서 값을 조정할 때 조금 더 직관적이다.

 

5, Vector3. Lerp

원형은 public static Vector3 Lerp(Vector3 a, Vector3 b, float t)

 

한글로는 '선형 보간'이라고 하는데, a와 b라는 3차원 공간 사이의 한 위치를 리턴하게 된다. 어디를 리턴하느냐, a지점을 0, b지점을 1이라고 하고 0에서 1사이의 값을 지니는 t로 지정하는 식이다.

 

docs.unity3d.com/ScriptReference/Vector3.Lerp.html

 

Unity - Scripting API: Vector3.Lerp

Interpolates between the points a and b by the interpolant t. The parameter t is clamped to the range [0, 1]. This is most commonly used to find a point some fraction of the way along a line between two endpoints (e.g. to move an object gradually between t

docs.unity3d.com

 

5-1, Mathf. Clamp

그냥, Clamp는 언제나 좋은 것 같다. (물론 효율 의미에서는 잘 모르겠지만...)

 

public static float Clamp (float value, float min, float max)

value 값을 min과 max 사이로 들어가도록 강제해서 리턴하는 메소드이다. 저번에 언급했던 것 같지만 한번 더 적었다.

 

6, Time. unscaled Delta Time

지금까지 우리는 Time. deltaTime을 자주 사용해왔다. 하지만 Time의 멤버에는 다른 것들도 존재하는데 대표적으로 unscaled Time 그리고 unscaled Delta Time이 있다.

 

unscaled Delta Time이 가동 중 play mode 설정 변경으로 인한 '정지', '슬로우 모션'등에 영향을 받지 않기에 사용한다는 것 까지는 알겠는데,

unscaled Time과 unscaled Delta Time 사이의 차이점은 잘 모르겠다.

 

사실 이건 공부를 더 해야겠다.

 

7, rotation Speed의 설정값은?

보통 move Speed 값은 자주 설정해봤을 것이다. rotation Speed 역시 Serialize Field의 Range( ) 옵션으로 설정하는데, 그 범위를 0에서 360으로 잡는다.

 

그냥... 괜찮은 것 같다. 예제에서는 90을 사용한다.

 

8, on Validate

그냥 임의로 만든 메소드인 줄 알았는데 있는 녀석이다. 말 그대로 해당 스크립트가 validate 되면 실행되는 메소드이다. (다만 명시적으로 호출하기도 한다)

 

여기서 validate된다는 건, 그 스크립트가 직접 동작하거나(Awake( )로 시작하는 일련의 과정) 그 클래스의 인스턴스의 생성 및 호출이 작동하는 경우를 이야기한다.

 

9, y성분 지우고 normalize

저번에도 이야기했지만, 이 예제 목록은 Vector3에서 필요없는 값(항상 0f를 지니는 성분)이 존재할 경우 Vector2로 값을 관리한다고 했다.

 

가끔은 Vector3의 값을 받아오되, 이를 사용하는 파트는 Vector2일 수 있다. 그렇다면 간단하게 Vector3의 y(예를 들자면) 성분을 제거하고 normalize할 수 있다.

 

그냥 그런걸 자주 하더라.

10, ray cast -> box cast

저번에 점프 기능을 포함해, raycast를 참 좋아하는 것 같다. 이번에는 카메라가 그라운드를 뚫고 플레이어를 비추는지 확인하기 위해 사용하고 있다.

 

다만 이 ray는 카메라의 중심에서 쏘기 때문에 카메라 박스 가의 부분이 벽이나 땅에 의해 가려지는 것을 막아주지는 못한다. (물론 카메라를 케릭터에 매우 가깝게 가도록 distance를 고정시킬 수도 있겠지만, 듣기만 해도 별로다)

 

사실 box casting을 위한 메소드가 이미 존재한다. 이번 튜토리얼 막바지에 있는데 사용법 자체는 raycast와 유사하니 한번 사용해보기 바란다.

 

개인적으로는 다음에 한 번 한글 설명들을 좀 모아두든 해야겠다. 티스토리에는 능력자가 많다.

 

docs.unity3d.com/ScriptReference/Physics.BoxCast.html

 

Unity - Scripting API: Physics.BoxCast

Success! Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable. Close

docs.unity3d.com

 

10-1, 기능에 따른 메소드의 업데이트

Cat Like Coding 대부분에서 보이는 특징인데, 한 번 만든 메소드가 기능에 따라서 계속 수정이 된다. 사실 프로그램을 짜기 시작할 때 이게 어떻게 될지 윤곽은 잡힌다고 해도 결국 무언가에 의해 바뀔수도 있지 않은가.

 

센스적인 부분이기는 하지만, 일단 한 가지만 이야기하자면 메소드의 인자가 추가되거나 리턴형이 바뀔 때 다음과 같은 작업들이 동반됩니다.

 

- 사용된 값들을 바뀐 메소드 역할에 맞게 조정하기

- (혹은) 새로운 지역 및 멤버 변수 추가

- if문 수정하기 (대부분은 else if 류가 추가된다)

 

그냥 앞으로 계속 따라하면서 익혀나갈 생각이다.


언급했듯이 내일은 약속이 있어서 힘들겠지만, 아무튼 속도를 좀 잡아두기는 해야겠다.

그래도 투비 쪽 작업은 해놨으니까, 아주 망하지는 않았겠지.