본문 바로가기
TIL

12.15 (TIL-Unity3D)

by 오랑이귀엽다 2023. 12. 15.

2D와 3D의 차이

  1. 차원:
    • 2D(2차원): 가로와 세로로만 이루어진 공간으로, X와 Y 축으로만 물체를 배치. 예를 들면, 슈팅 게임, 플랫폼 게임, 보드 게임 등이 있다.
    • 3D(3차원): 가로, 세로, 높이로 이루어진 공간으로, X, Y, Z 축을 사용하여 물체를 배치하고, 입체적인 모습을 표현한다. 이런 방식은 FPS 게임, 어드벤처 게임, 레이싱 게임 등에서 주로 사용
  2. 시각적인 표현:
    • 2D: 주로 픽셀 아트, 스프라이트 시트를 사용하여 물체들을 평면적으로 표현. 이러한 스타일은 효율적인 게임 제작에 좋고, 보다 간단한 그래픽 요소들을 다룬다.
    • 3D: 모든 물체는 깊이와 입체감을 가지며, 다양한 시각적 효과와 현실감 있는 그래픽을 표현. 광원, 그림자, 입체적인 모습 등이 가능하며, 보다 현실적인 게임 환경을 만들 수 있다.
  3. 개발 방식:
    • 2D: 주로 스프라이트, 타일맵, 2D 애니메이션 등을 사용하여 간단한 게임을 제작.
    • 3D: 모델링, 텍스처링, 애니메이션, 쉐이더 등의 복잡한 기술과 작업이 필요. 따라서 보다 복잡하고 현실적인 세계를 만들 수 있다.

플레이어 만들기 - 핵심내용

1. Light 컴포넌트

  1. 라이트 소스: 게임 또는 3D 랜더링에 광원을 추가하는 데 사용. 이것은 특정 위치 또는 방향에서 발생하는 빛을 나타냄
  2. 유형: 라이트는 여러 유형이 있다.
    • 점 광원(Point Light): 특정 지점에서 모든 방향으로 빛을 발산하는 라이트
    • 방향성 라이트(Directional Light): 특정 방향에서 모든 객체를 비추는 라이트. 이 라이트는 거리에 관계없이 동일한 강도로 모든 객체를 비춘다.
    • 스포트라이트(Spot Light): 특정 방향으로 원뿔형의 빛을 발산하는 라이트.
    • 영역 라이트(Area Light): 특정 영역에서 발생하고 그 주변에 빛을 발산하는 라이트(예: 실내 조명).
  3. 속성: 각 라이트에는 여러 속성이 있다. 이러한 속성에는 위치, 방향, 강도(intensity), 색상(color), 범위(range), 각도(angle) 등이 포함된다.
  4. 그림자: 라이트는 그림자를 생성할 수 있다. 라이트와 객체 사이의 관계에 따라 그림자는 라이트가 부딪히는 객체 뒤에 생성된다.
  5. 성능: 라이트는 렌더링 성능에 큰 영향을 미침. 많은 라이트를 사용하면 특히 동적 그림자가 포함된 경우 렌더링 성능에 부정적인 영향을 미칠 수 있다. 따라서 최적화는 중요한 고려사항이다.
  6. 빛 반사 및 산란: 라이트는 표면에 부딪히고 반사되거나 다른 방향으로 산란되어 재질과 표면의 실제성을 나타낸다. 이러한 효과는 물리 기반 렌더링(PBR)에서 중요한 요소이다.

2. 스카이박스

게임 세계의 배경을 둘러싸는 환경 매핑 기술. 큐브 맵(Cube Map)과 구체형 스카이박스(Sphere Map) 등이 있다.

  • 스카이박스는 6개의 텍스처로 구성된 큐브 맵 또는 하나의 구체로 텍스처가 매핑된 구체형 스카이박스로 구성
  • Unity에서는 씬의 배경으로 사용되며, 게임 환경을 확장시키는데 활용
  • 주로 하늘, 구름, 산 등의 자연적인 배경을 표현하는 데 사용
  • 미리 만들어진 스카이박스를 사용하거나 직접 만들어서 Unity에서 적용할 수 있다.
  • 게임 중에 스카이박스를 동적으로 변경하여 낮과 밤 등의 시간대나 특정 이벤트에 맞게 배경을 변화시킬 수 있다.
  • 성능에 영향을 미치므로 최적화에 주의해야 한다.

3. Rigidbody - ForceMode

Rigidbody 컴포넌트를 사용하여 게임 오브젝트에 물리적인 힘을 가할 때, 이 **ForceMode**를 사용하여 다양한 힘 적용 방식을 설정할 수 있다.

  1. Force: 힘을 지속적으로 적용
    • Rigidbody.AddForce(Vector3 force, ForceMode.Force);
  2. Acceleration: 가속도를 적용. 이전 힘의 누적에 따라서 점진적으로 더 빠르게 움직이게 된다.
    • Rigidbody.AddForce(Vector3 force, ForceMode.Acceleration);
  3. Impulse: 순간적인 힘을 적용. 짧은 시간에 갑작스러운 움직임이 발생.
    • Rigidbody.AddForce(Vector3 force, ForceMode.Impulse);
  4. VelocityChange: 변화하는 속도를 적용. 물체의 현재 속도를 변경하면서 움직인다.
    • Rigidbody.AddForce(Vector3 force, ForceMode.VelocityChange);

이러한 **ForceMode**를 적절히 활용하여 게임 오브젝트에 원하는 물리적인 움직임과 효과를 부여할 수 있다.

 

 

플레이어 데미지 처리 - 핵심내용

1. Invoke

  • Invoke(string methodName, float time): 지정된 시간(time) 후에 지정된 메서드(methodName)를 실행
  • methodName: 실행할 메서드의 이름을 문자열로 지정
  • time: 메서드를 실행할 시간을 초 단위로 지정

간단 예시

더보기

using UnityEngine;

public class ExampleScript : MonoBehaviour
{
    private void Start()
    {
        Invoke("DelayedMethod", 2.0f);
    }

    private void DelayedMethod()
    {
        Debug.Log("This method is called after 2 seconds.");
    }
}

 

2. Invoke Repeating

InvokeRepeating(string methodName, float time, float repeatRate):

지정된 시간(time) 후에 지정된 메서드(methodName)를 주기적으로 반복해서 실행.

methodName: 실행할 메서드의 이름을 문자열로 지정

time: 메서드를 처음 실행할 때까지의 시간을 초 단위로 지정

repeatRate: 메서드를 반복해서 실행할 주기를 초 단위로 지정

 

간단예시

더보기

csharpCopy code
using UnityEngine;

public class ExampleScript : MonoBehaviour
{
    private void Start()
    {
        InvokeRepeating("RepeatingMethod", 2.0f, 3.0f);
    }

    private void RepeatingMethod()
    {
        Debug.Log("This method is called every 3 seconds after 2 seconds delay.");
    }
}

 

3. TryGetComponent

TryGetComponent는 Unity에서 사용하는 메서드로, 게임 오브젝트의 컴포넌트를 가져오는 기능을 제공

이 메서드를 사용하면 특정 컴포넌트가 게임 오브젝트에 연결되어 있는지 확인하고,

연결되어 있다면 해당 컴포넌트를 가져올 수 있다.

 

TryGetComponent 매서드의 형식

더보기

public bool TryGetComponent<T>(out T component) where T : Component;

 

  • T: 가져오려는 컴포넌트의 타입. **MonoBehaviour**를 상속한 컴포넌트는 모두 사용 가능
  • component: 컴포넌트를 가져올 때 사용되는 out 매개변수

 

간단예시

더보기

using UnityEngine;

public class ExampleScript : MonoBehaviour
{
    private void Start()
    {
        // 게임 오브젝트에 Rigidbody 컴포넌트가 있는지 확인하고 가져옴
        Rigidbody rb;
        if (TryGetComponent<Rigidbody>(out rb))
        {
            // Rigidbody 컴포넌트가 있다면 해당 컴포넌트로 원하는 동작을 수행
            rb.AddForce(Vector3.up * 100f);
        }
        else
        {
            // Rigidbody 컴포넌트가 없다면 다른 처리를 수행
            Debug.Log("Rigidbody component not found.");
        }
    }
}

TryGetComponent는 컴포넌트가 없어도 예외를 발생시키지 않고,

컴포넌트가 있으면 해당 컴포넌트를 가져와서 사용할 수 있다.

이를 통해 더 안전하게 컴포넌트를 가져오고 사용할 수 있다.

'TIL' 카테고리의 다른 글

12.19 (TIL-Unity3D)  (0) 2023.12.19
12.18 (TIL-코딩문제)  (1) 2023.12.18
12.14 (TIL - Unity)  (0) 2023.12.14
12.13 (TIL - Unity)  (0) 2023.12.13
12.12 (TIL-Unity)  (0) 2023.12.12