Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

Moon_B 게임개발 공부 업적

[Unity] 스카이박스, Rigidbody ForceMode, Raycast, Input System 공부하기 본문

Unity

[Unity] 스카이박스, Rigidbody ForceMode, Raycast, Input System 공부하기

Moon_B 2025. 3. 12. 15:33

Unity 개발에서 핵심적으로 사용되는 스카이박스, Rigidbody ForceMode, Raycast, Input System 등에 대한 기술적인 내용을 정리해 보았습니다.


1. 스카이박스(Skybox)

1.1 개념

스카이박스(Skybox)는 게임 세계의 배경을 표현하는 환경 매핑 기술입니다. 주로 하늘, 구름, 산 등의 자연 배경을 표현하는 데 사용됩니다.

1.2 종류

  • 큐브 맵(Cube Map): 6개의 텍스처로 구성된 정육면체 배경
  • 구체형 스카이박스(Sphere Map): 단일 텍스처를 구체 형태로 매핑하여 표현
  • Procedural Skybox: Unity의 기본적인 하늘 표현 방식으로, 동적인 날씨와 시간 변화 적용 가능

1.3 Unity 적용 방법

RenderSettings.skybox = mySkyboxMaterial;
  • mySkyboxMaterial에 원하는 스카이박스 머티리얼을 지정하여 적용

1.4 성능 고려사항

  • 고해상도 텍스처는 GPU 사용량을 증가시킬 수 있음
  • 동적 변경 시 프레임 속도 저하 가능
  • 절차적 스카이박스(Procedural Skybox)는 CPU와 GPU 사용량에 영향

2. Rigidbody - ForceMode

2.1 개념

Rigidbody를 사용하여 오브젝트에 힘을 가할 때 ForceMode를 지정하여 적용 방식을 설정할 수 있습니다.

2.2 ForceMode 종류

ForceMode 설명

Force 지속적인 힘 적용 (질량 고려)
Acceleration 가속도를 적용 (질량 무관)
Impulse 순간적인 힘 적용
VelocityChange 현재 속도를 즉각 변경

2.3 추가 고려 사항

  • ForceMode.Force와 ForceMode.Acceleration은 FixedUpdate()에서 호출하는 것이 권장됨
  • ForceMode.Impulse와 ForceMode.VelocityChange는 Update()에서도 사용 가능

2.4 적용 방법

Rigidbody.AddForce(Vector3 force, ForceMode.Impulse);
  • force: 적용할 힘 벡터
  • ForceMode.Impulse: 순간적인 힘 적용

3. Raycast (광선 투사)

3.1 개념

Raycast는 보이지 않는 광선을 발사하여 충돌하는 객체를 감지하는 기능입니다.

3.2 Ray 생성 방법

Ray ray = new Ray(transform.position, transform.forward);
  • transform.position: 광선의 시작점
  • transform.forward: 광선의 방향

3.3 RaycastHit 정보

속성 설명

point 충돌한 위치
distance 원점에서 충돌 지점까지 거리
transform 충돌한 객체의 Transform
collider 충돌한 객체의 Collider

3.4 Raycast 최적화 방법

  • LayerMask를 사용하여 불필요한 충돌 감지를 방지
  • Physics.RaycastNonAlloc()을 사용하여 GC(가비지 컬렉션) 발생 최소화
  • Physics.SphereCast() 또는 Physics.BoxCast()를 활용하여 더 넓은 범위 감지 가능

3.5 적용 방법

RaycastHit hit;
if (Physics.Raycast(ray, out hit, maxDistance, LayerMask.GetMask("Enemy")))
{
    Debug.Log("충돌한 객체: " + hit.transform.name);
}

4. Input System의 SendMessage vs InvokeEvent

4.1 개념

Unity에서 입력 시스템을 활용할 때 두 가지 이벤트 호출 방식이 존재합니다.

4.2 방식 비교

방식 설명

SendMessage “On+ActionName” 형식의 함수를 찾아 호출 (비효율적)
Invoke Event Inspector에서 이벤트를 등록하여 실행
Invoke C# Events C# 코드에서 이벤트를 등록 및 실행 (권장)

4.3 성능 고려

  • SendMessage()는 런타임 중 문자열을 검색하여 실행하므로 성능 저하 발생 가능
  • C# Events를 사용하면 컴파일 타임에 함수가 연결되어 성능 최적화 가능

4.4 예제 코드

public void OnMove()
{
    Debug.Log("Move 실행됨");
}

5. 추가적으로 알고 있으면 좋은 기능

5.1 Object Pooling (오브젝트 풀링)

오브젝트를 재사용하여 성능을 최적화하는 기법입니다. 주로 총알, 적 캐릭터 등의 반복 생성이 많은 경우에 사용됩니다.

public class ObjectPool : MonoBehaviour {
    public GameObject prefab;
    private Queue<GameObject> pool = new Queue<GameObject>();

    public GameObject GetObject() {
        if (pool.Count > 0) {
            GameObject obj = pool.Dequeue();
            obj.SetActive(true);
            return obj;
        }
        return Instantiate(prefab);
    }

    public void ReturnObject(GameObject obj) {
        obj.SetActive(false);
        pool.Enqueue(obj);
    }
}

5.2 Coroutine (코루틴)

일정 시간 동안 실행되는 함수를 만들 수 있습니다.

IEnumerator ExampleCoroutine() {
    yield return new WaitForSeconds(2);
    Debug.Log("2초 후 실행됨");
}

5.3 Shader Graph 활용

비주얼 프로그래밍 방식으로 셰이더를 제작할 수 있으며, 그래픽 최적화 및 커스텀 효과를 만들 때 유용합니다.

5.4 DOTS (Data-Oriented Technology Stack)

DOTS는 Unity의 고성능 엔진 개발 방식으로, ECS(Entity Component System), Job System, Burst Compiler를 활용하여 성능을 극대화할 수 있습니다.

5.5 Addressables System

큰 프로젝트에서 리소스를 효율적으로 관리할 수 있도록 도와주는 Unity 시스템으로, 동적 로딩 및 메모리 최적화를 제공함.


결론

Unity의 핵심 개념인 스카이박스, Rigidbody ForceMode, Raycast, Input System뿐만 아니라, 추가적으로 개발 시 유용한 오브젝트 풀링, 코루틴, 셰이더 그래프, DOTS, Addressables System 등을 정리하였습니다. 이를 활용하여 보다 최적화된 Unity 프로젝트를 개발하시기 바랍니다.