두서 없이 정리

 

답변은 gpt4.0, 구글링, 노션ai, 기타등등

 

 

UniRx

https://skuld2000.tistory.com/31

요약하면 비동기적 데이터 흐름을 처리하는 프로그래밍 기법인 Reactive programming - 즉 반응형 프로그래밍을 유니티에서 사용할 수 있도록 일본의 개발자가 만든 유니티 전용 반응형 프로그래밍 지원툴이다.

반응형 프로그래밍이란 옵저버 패턴을 사용해서 값의 변화, 이벤트의 발생 등을 감지해서 해당 상황에 값을들 필터링, 버퍼링, 변화, 연산, 가공등을 할 수 있게 해주는 것.

유니티 코루틴에서 Yield와 LINQ를 생각하면 이해가 쉬울듯.

 


LINQ

유니티에서 LINQ(Language Integrated Query)는 데이터 컬렉션에 대해 강력하고 유연한 쿼리 기능을 제공하는 .NET의 프로그래밍 기능입니다. LINQ를 사용하면, 배열, 리스트, 또는 다른 컬렉션 유형의 데이터를 SQL 스타일의 쿼리로 쉽게 조작하고 필터링할 수 있습니다. 유니티에서는 이를 통해 게임 오브젝트, 컴포넌트 목록 등을 효과적으로 다룰 수 있습니다.

LINQ의 장단점은 다음과 같습니다:

장점

  1. 가독성: LINQ 쿼리는 선언적이며, SQL과 유사한 구문을 사용하기 때문에 읽기 쉽고 이해하기 쉽습니다. 이는 코드의 유지보수성을 높여줍니다.
  2. 통합된 쿼리 언어: 다양한 데이터 소스(배열, 리스트, XML, 데이터베이스 등)에 대해 동일한 쿼리 구문을 사용할 수 있습니다. 이는 학습 곡선을 줄여주고, 다양한 데이터 소스를 동일한 방식으로 처리할 수 있게 합니다.
  3. 강력한 필터링, 정렬, 그룹화 기능: LINQ는 복잡한 데이터 조작과 변환을 단순화합니다. 데이터를 필터링, 정렬, 그룹화하는 등의 작업을 간결하고 효율적으로 수행할 수 있습니다.
  4. 컴파일 시간 검사: LINQ는 컴파일 시간에 쿼리를 검사하여, 실행 시간 에러를 줄여줍니다.

단점

  1. 성능 저하 가능성: LINQ 쿼리는 때때로 직접적인 반복문이나 조건문보다 느릴 수 있습니다. 특히 대용량 데이터를 처리할 때 성능 저하가 발생할 수 있습니다.
  2. 디버깅 어려움: LINQ 쿼리는 디버깅이 복잡할 수 있습니다. 특히 복잡한 쿼리의 경우, 어디에서 문제가 발생했는지 파악하기 어려울 수 있습니다.
  3. 학습 곡선: LINQ의 고급 기능은 학습하기가 다소 복잡할 수 있으며, SQL이나 함수형 프로그래밍에 익숙하지 않은 개발자에게는 어려울 수 있습니다.
  4. 오버헤드: 간단한 작업을 위해 LINQ를 사용하는 것은 때때로 오버헤드를 초래할 수 있으며, 이는 특히 게임 개발과 같은 성능이 중요한 환경에서 고려해야 할 사항입니다.

요약하면, LINQ는 유니티 개발에서 데이터를 효율적이고 가독성 높게 처리할 수 있는 강력한 도구입니다. 그러나 성능과 복잡도 측면에서 고려해야 할 부분들이 있으므로, 사용 시 이러한 점들을 염두에 두는 것이 중요합니다.

 


비동기 프로그래밍

비동기 프로그래밍은 프로그램이 일련의 작업을 동시에 또는 병렬로 수행할 수 있도록 하는 프로그래밍 방식입니다. 이 방식의 핵심은 프로그램이 특정 작업을 기다리는 동안 다른 작업을 계속 진행할 수 있다는 점입니다.

비동기 프로그래밍의 주요 특징과 이점은 다음과 같습니다:

  1. 효율성과 반응성 향상: 비동기 프로그래밍을 사용하면 프로그램이 네트워크 요청, 파일 I/O 작업 등과 같은 시간이 오래 걸리는 작업을 기다리는 동안 멈추지 않고 다른 작업을 계속 처리할 수 있습니다. 이로 인해 애플리케이션이 사용자에게 더 반응적으로 느껴질 수 있습니다.
  2. 자원 사용 최적화: 동기식 프로그래밍에서는 작업이 완료될 때까지 기다리면서 CPU 같은 시스템 자원이 유휴 상태에 머물 수 있습니다. 비동기 프로그래밍은 이러한 자원을 보다 효율적으로 활용하여, 여러 작업을 동시에 진행할 수 있게 합니다.
  3. 코드 구조 개선: 비동기 프로그래밍을 적용하면, 코드를 더 명확하고 관리하기 쉬운 형태로 작성할 수 있습니다. 특히, 모던 프로그래밍 언어에서 제공하는 **async**와 await 같은 구문을 사용하면, 비동기 코드를 거의 동기 코드처럼 간결하고 이해하기 쉽게 작성할 수 있습니다.
  4. 확장성 증가: 비동기 프로그래밍은 애플리케이션의 확장성을 향상시킵니다. 많은 요청이나 데이터를 처리해야 하는 서버 애플리케이션에서 비동기 처리는 성능에 큰 영향을 미칩니다.

비동기 프로그래밍은 많은 장점을 가지고 있지만, 오류 처리, 디버깅, 자원 관리 등의 측면에서 복잡성을 추가할 수 있습니다. 따라서 프로그램의 요구 사항과 환경에 맞게 적절한 비동기 전략을 선택하고, 코드를 주의 깊게 관리하는 것이 중요합니다.

유니티에서의 비동기 프로그래밍 사용예

유니티에서 비동기 프로그래밍을 구현하는 주요 방법은 다음과 같습니다:

  1. Coroutines: 코루틴은 유니티에서 가장 일반적으로 사용되는 비동기 프로그래밍 기법 중 하나입니다. **IEnumerator**를 반환하는 함수를 사용하여 구현되며, yield return 문을 통해 실행을 일시 중단하고 유니티의 다음 프레임이나 특정 시간이 지난 후에 계속 실행할 수 있습니다. 코루틴은 비교적 간단한 비동기 작업에 적합하며, 유니티의 게임 루프와 잘 통합됩니다.
  2. Async/Await: C# 5.0 이상에서 사용 가능한 **async**와 await 키워드를 통해 비동기 프로그래밍을 구현할 수 있습니다. 이 방법은 유니티에서 네트워킹, 데이터 로딩, 긴 계산 작업 등을 비동기적으로 처리하는 데 유용합니다. async 함수는 Task 또는 **Task<T>**를 반환하며, await 키워드를 사용하여 비동기적으로 완료될 작업을 기다립니다.
  3. UnityWebRequest: 네트워크 통신과 관련된 비동기 작업을 위해 UnityWebRequest 클래스를 사용할 수 있습니다. 이 클래스는 웹 서버와의 HTTP 통신을 비동기적으로 처리하는 데 사용됩니다. UnityWebRequest는 내부적으로 비동기 작업을 관리하여, 네트워크 응답을 기다리는 동안 게임의 다른 부분이 계속 작동할 수 있게 합니다.
  4. Thread와 ThreadPool: 유니티에서는 C#의 표준 스레딩 기능을 사용하여 별도의 스레드에서 작업을 수행할 수 있습니다. 이 방법은 CPU 집약적 작업이나 긴 계산을 병렬로 수행할 때 유용합니다. 하지만 유니티의 메인 스레드와의 동기화와 스레드 안전성을 고려해야 합니다.
  5. Custom Yield Instructions: 유니티는 코루틴에서 사용할 수 있는 다양한 사용자 정의 대기 명령을 제공합니다. 예를 들어, WaitForSeconds, WaitForEndOfFrame, WaitUntil, WaitWhile 등이 있으며, 이를 통해 보다 세밀한 비동기 제어가 가능합니다.

각각의 방법은 특정 상황과 요구 사항에 따라 선택되어야 하며, 성능과 효율성을 고려하여 적절히 사용되어야 합니다. 예를 들어, 간단한 지연이 필요한 경우에는 코루틴이 적합할 수 있고, 복잡한 데이터 처리나 네트워킹은 async/await 또는 별도의 스레드를 사용할 수 있습니다.

 


반응형 프로그래밍

반응형 프로그래밍(Reactive Programming)은 데이터 흐름과 변화 전파에 중점을 둔 프로그래밍 패러다임입니다. 이 방식은 데이터 스트림과 변화의 전파를 중심으로 하여, 데이터의 변화가 발생할 때마다 이에 자동으로 반응하여 프로그램이 동작하도록 설계됩니다.

반응형 프로그래밍의 주요 특징과 이점은 다음과 같습니다:

  1. 데이터 스트림 중심: 반응형 프로그래밍에서는 모든 것을 스트림(stream)으로 볼 수 있습니다. 사용자 입력, 변수 값의 변화, 프로퍼티, 캐시 데이터 등이 스트림으로 표현되며, 이 스트림은 시간에 따라 다른 값을 방출합니다.
  2. 선언적인 스타일: 반응형 프로그래밍은 선언적 프로그래밍 방식을 사용합니다. 개발자는 '무엇을' 할지를 정의하고, '어떻게' 그 일을 수행할지는 프레임워크나 라이브러리에 맡깁니다. 이는 코드를 보다 직관적이고 간결하게 만들어줍니다.
  3. 데이터 변화에 자동 반응: 데이터 스트림이 변경될 때마다 자동으로 반응하여 새로운 데이터를 처리합니다. 이는 동적인 데이터 흐름을 쉽게 관리할 수 있게 해 주며, 사용자 인터페이스, 네트워크 요청 등 다양한 영역에서 유용하게 사용됩니다.
  4. 비동기 프로그래밍과의 통합: 반응형 프로그래밍은 자연스럽게 비동기 프로그래밍과 연결됩니다. 비동기적인 데이터 스트림을 쉽게 관리하고, 이벤트 기반의 프로그래밍을 강화합니다.
  5. 에러 처리의 용이성: 스트림을 통해 데이터를 처리하는 방식은 에러를 스트림의 일부로 취급하므로, 에러 처리를 보다 일관적이고 중앙집중적으로 관리할 수 있게 해줍니다.

반응형 프로그래밍은 RxJava, RxJS, Rx.NET, UniRx (유니티) 등 다양한 라이브러리와 언어를 통해 구현될 수 있으며, 복잡한 데이터 흐름과 사용자 인터페이스, 네트워킹, 실시간 데이터 처리 등 다양한 영역에서 유용하게 사용됩니다. 이 패러다임은 특히 동적이고 상호작용이 많은 애플리케이션을 개발할 때 그 장점이 잘 드러납니다.

 


함수형 프로그래밍

함수형 프로그래밍(Functional Programming, FP)은 프로그래밍 패러다임 중 하나로, 계산을 수학적 함수의 평가로 취급하고, 상태 변경과 가변 데이터를 피하는 것을 강조합니다. 이 접근 방식은 프로그램의 예측 가능성과 유지 보수성을 높이는 데 도움이 됩니다.

함수형 프로그래밍의 핵심 개념은 다음과 같습니다:

  1. 불변성(Immutability): 데이터는 생성 후 변경되지 않습니다. 변경이 필요한 경우, 기존 데이터를 수정하는 대신 새로운 데이터를 생성합니다.
  2. 순수 함수(Pure Functions): 같은 입력에 대해 항상 같은 출력을 반환하며, 외부 상태에 의존하지 않고 외부 상태를 변경하지 않는 함수입니다.
  3. 함수의 일급 객체(First-Class Functions): 함수를 일반 값처럼 사용할 수 있습니다. 예를 들어, 함수를 변수에 할당하거나, 다른 함수의 인자로 전달하거나, 함수에서 반환할 수 있습니다.
  4. 고차 함수(Higher-Order Functions): 함수를 인자로 받거나 함수를 결과로 반환하는 함수입니다.
  5. 함수 합성(Function Composition): 여러 함수를 조합하여 새로운 함수를 만드는 것입니다.
  6. 레이지 평가(Lazy Evaluation): 필요할 때까지 계산을 미루는 것으로, 성능 최적화에 사용될 수 있습니다.

유니티에서의 함수형 프로그래밍 예시

유니티에서도 함수형 프로그래밍의 원리를 적용할 수 있습니다. 예를 들어, LINQ를 사용하는 것이 하나의 방법입니다. LINQ는 컬렉션에 대한 쿼리를 함수형 스타일로 작성할 수 있게 해줍니다.

csharpCopy code
using System.Linq;
using UnityEngine;

public class FunctionalExample : MonoBehaviour
{
    void Start()
    {
        var numbers = new[] {1, 2, 3, 4, 5};
        var evenNumbers = numbers.Where(n => n % 2 == 0); // 함수형 스타일의 필터링

        foreach (var num in evenNumbers)
        {
            Debug.Log(num);
        }
    }
}

이 코드에서 Where 메서드는 LINQ의 함수형 기능을 활용하여 짝수만 필터링합니다. 이러한 스타일은 선언적이며 부수 효과가 없어, 유지 보수가 용이하고 버그 발생 가능성을 줄여줍니다.

또한, 유니티에서는 람다 표현식이나 익명 함수를 사용하여 이벤트 리스너나 콜백을 작성할 때도 함수형 프로그래밍 개념을 적용할 수 있습니다.

함수형 프로그래밍은 유니티 개발에 있어 강력한 도구이며, 특히 복잡한 데이터 처리, 비동기 프로그래밍, UI 이벤트 처리 등에 유용하게 사용될 수 있습니다.

 


 

DOTS (Data-Oriented Technology Stack)

DOTS는 유니티에서 제공하는 데이터 지향적인 프로그래밍 기술 스택으로, 게임의 성능을 극대화하기 위해 설계되었습니다. 이 기술 스택의 핵심은 게임 개발을 위한 새로운 방식의 접근법을 제공하는 것으로, 이를 통해 개발자들은 더 높은 성능과 다중 스레딩 환경을 쉽게 활용할 수 있게 됩니다.

DOTS의 주요 구성 요소는 다음과 같습니다:

  1. Entity Component System (ECS): ECS는 개체(Entity), 구성 요소(Component), 시스템(System)의 세 가지 주요 요소로 구성됩니다. 각 개체는 하나 이상의 구성 요소를 가질 수 있으며, 각 구성 요소는 데이터를 담고 있습니다. 시스템은 이러한 구성 요소의 데이터를 처리합니다. 이 접근법은 데이터와 로직을 분리하며, 메모리 레이아웃을 최적화하여 성능을 향상시킵니다.
  2. Job System: Job System은 데이터 처리를 병렬 작업으로 분리하여 다중 코어 프로세서의 이점을 최대한 활용할 수 있도록 합니다. 이 시스템을 통해 성능 저하 없이 많은 수의 개체를 동시에 처리할 수 있습니다.
  3. Burst Compiler: Burst Compiler는 고성능 C# 코드를 생성하기 위한 컴파일러입니다. 이는 .NET 코드를 매우 효율적인 네이티브 코드로 변환하여, ECS 및 Job System의 성능을 극대화합니다.

DOTS의 이점은 주로 성능에 있습니다. 데이터 지향적인 설계는 메모리 액세스를 최적화하고, 병렬 처리를 통해 CPU의 여러 코어를 효율적으로 사용할 수 있도록 도와줍니다. 이는 특히 대규모 게임 환경이나 높은 프레임 속도를 요구하는 애플리케이션에 유용합니다.

그러나 DOTS는 전통적인 객체 지향 프로그래밍과는 다른 패러다임을 제공하기 때문에 새로운 학습 곡선이 필요하며, 기존의 유니티 프로젝트를 DOTS로 전환하는 것은 상당한 노력을 요구할 수 있습니다. 따라서 DOTS를 사용하기로 결정하기 전에 프로젝트의 요구 사항과 팀의 전문성을 고려하는 것이 중요합니다.

 


ECS (Entity Component System)

ECS (Entity Component System)

  1. 개념: ECS는 데이터 지향적인 게임 개발 방식으로, 엔티티(Entity), 컴포넌트(Component), 시스템(System)의 세 부분으로 구성됩니다.
    • Entity: 게임 내의 개체나 오브젝트를 나타냅니다. 엔티티 자체는 단순히 ID나 참조로 존재하며, 실제 데이터나 기능은 가지고 있지 않습니다.
    • Component: 엔티티에 부착되어 데이터를 제공하는 구조체입니다. 위치, 속도, 건강 상태 등의 데이터를 담고 있습니다.
    • System: 컴포넌트의 데이터를 기반으로 실제 게임 로직을 처리합니다. 예를 들어, 물리 시스템, 렌더링 시스템, AI 시스템 등이 있습니다.
  2. 목적: ECS는 데이터와 로직을 분리하여 성능을 최적화하고, 유지 보수를 용이하게 합니다. 특히 대규모 게임에서의 성능 개선에 중점을 둡니다.
  3. 유니티와의 관계: 유니티는 DOTS (Data-Oriented Technology Stack)를 통해 ECS 패러다임을 지원하며, 이를 통해 개발자들은 더 높은 성능과 다중 스레딩의 이점을 활용할 수 있습니다.

NTT (Network Transform Toolkit)

  1. 개념: NTT(Network Transform Toolkit)은 유니티에서 네트워크 게임 개발 시, 오브젝트의 위치, 회전, 스케일과 같은 변환 정보를 네트워크를 통해 동기화하는 데 사용되는 도구나 라이브러리를 의미합니다. (참고로, 'NTT'는 공식적인 유니티 용어가 아니며, 네트워크 변환을 처리하는 도구나 툴킷을 일반적으로 지칭합니다.)
  2. 목적: 멀티플레이어 게임에서 각 플레이어의 게임 오브젝트 위치를 실시간으로 동기화하는 것이 주요 목적입니다. 이는 플레이어 간 일관된 게임 경험을 보장하는 데 필수적입니다.
  3. 구현 방식: NTT는 일반적으로 네트워크 상태, 예를 들어, 연결 속도와 지연 시간을 고려하여 효율적인 동기화를 달성합니다. 이는 인터폴레이션(Interpolation)과 엑스트라폴레이션(Extrapolation) 기술을 사용하여 네트워크 지연으로 인한 오브젝트의 움직임 불일치를 최소화합니다.

ECS와 NTT는 각각 게임의 내부 로직 처리와 네트워크를 통한 멀티플레이어 상호작용 처리에 중요한 역할을 합니다. ECS는 게임의 성능 최적화에 중점을 두는 반면, NTT는 네트워크 환경에서의 일관된 게임 경험 제공에 초점을 맞춥니다.

 

 

 


스트럭쳐 클래스 차이, 어느상황에 뭘쓰는게 좋은가?

 

Struct타입은 값타입이고 Class는 참조타입.

따라서 스트럭쳐는 스택영역에 할당되고 클래스는 힙영역에 할당.

내부 변수가 몇개 없고 메모리가 16mb이하라면 스트럭쳐가 유리, 이외에는 클래스가 유리

스트럭쳐는 값타입이라 생성자가 필요없음. 클래스는 생성이 필요.

 

유니티에서 구조체를 쓰면 어떤 장점이 있나요?

구조체는 유니티에서 클래스보다 가볍고 메모리 측면에서 효율적입니다. 또한 구조체를 사용하면 값을 복사하여 사용하기 때문에, 상속과 같은 문제를 회피할 수 있습니다.

 


박싱 / 언박싱

 

박싱은 값형식을 참조형식으로 변환하는것을 말함.

인트형이나 플롯형을 오브젝트타입으로 변환하는거?

아무튼 스택영역에 있던 값타입을 힙영역으로 바꾸면서 메모리손해가 발생한다.

반대로 언박싱은 참조타입이던 객체를 값형식으로 캐스팅하는것.

 

 


 

유니티 라이프 사이클

 

Awake : 객체가 생성될 때 제일처음 한번만 실행 / 보통 초기화 함수

OnEnable : 객체가 활성화 될때마다 실행

Start : 활성화 된 객체의 업데이트가 호출되기 전 한번만 실행 / 보통 초기화 함수

FixedUpdate : 일정프레임마다 호출되는 업데이트 함수

Update : 매프레임 호출되는 업데이트 함수

LateUpdate : 매 업데이트가 호출되고 난 뒤 호출되는 업데이트 함수

OnDisable : 오브젝트가 비활성화 될 때 실행

OnDestroy : 오브젝트가 삭제될 때 실행

 

더 자세한건 공식문서

https://docs.unity3d.com/kr/530/Manual/ExecutionOrder.html

 

이벤트 함수 실행 순서(Execution Order of Event Functions) - Unity 매뉴얼

Unity 이벤트 함수는 사전에 정해진 순서대로 실행됩니다. 실행 순서는 다음과 같습니다.

docs.unity3d.com

 


 

유니티에서 스택영역과 힙영역에 할당되는 객체들

유니티에서 값(Value) 타입으로 선언된 변수들은 스택(Stack) 메모리 영역에 할당됩니다. 반면 참조(Reference) 타입으로 선언된 변수들은 힙(Heap) 메모리 영역에 할당됩니다. 이는 값 타입 변수들이 복사되었을 때 스택에서 복사가 이루어지지만 참조 타입 변수들은 해당 객체의 주소값이 복사됩니다.

유니티에서 스택(Stack) 영역에 할당된 메모리와 힙(Heap) 영역에 할당된 메모리의 차이점은 다음과 같습니다.

  • 스택 영역: 값(Value) 타입으로 선언된 변수들이 스택 메모리 영역에 할당됩니다. 스택은 메모리가 자동으로 관리되며, 변수가 함수나 블록의 범위를 벗어나면 자동으로 제거됩니다. 스택은 작은 메모리 블록을 할당하고 해제하는 데 빠르며, 메모리 블록은 참조되는 순서대로 저장됩니다. 따라서 스택은 데이터를 빠르게 접근할 수 있습니다.
  • 힙 영역: 참조(Reference) 타입으로 선언된 변수들이 힙 메모리 영역에 할당됩니다. 힙은 큰 메모리 블록을 할당하고 해제하는 데 시간이 더 많이 소요됩니다. 또한 메모리 블록은 임의의 순서로 저장됩니다. 따라서 힙은 데이터에 접근하는 데는 스택보다 더 많은 시간이 걸리지만, 메모리의 크기가 동적으로 변경될 수 있습니다. 이는 배열과 같은 구조체를 할당할 때 유용합니다.

 

 


 

유니티에서 가비지컬렉터 동작 방식.

유니티에서 가비지 컬렉터(Garbage Collector)는 할당된 메모리를 정리하는 프로세스입니다. 유니티에서는 참조 카운트(Reference Counting) 방식이 아닌, 마크 앤 스위핑(Mark and Sweep) 방식을 사용합니다.

마크 앤 스위핑 방식은 다음과 같이 동작합니다.

  1. 가비지 컬렉터가 실행될 때마다, 모든 메모리 영역의 객체에 대해 마크(Mark)를 합니다.
  2. 마크된 객체들의 참조를 탐색하면서, 참조되지 않은 객체를 스위핑(Sweep)합니다.
  3. 스위핑된 객체들은 메모리에서 해제됩니다.

이 방식은 참조 카운트 방식보다는 복잡하지만, 더 효율적입니다. 참조 카운트 방식은 객체를 참조하는 모든 객체의 수를 추적해야 하기 때문에, 메모리 관리 오버헤드가 크고, 순환 참조(Circular Reference)와 같은 문제가 발생할 수 있습니다.

즉, 유니티에서는 가비지 컬렉터가 자동으로 메모리를 정리하기 때문에, 개발자들은 메모리 관리에 대한 직접적인 관여가 필요하지 않습니다. 다만, 가비지 컬렉터가 실행될 때마다 일시적으로 프로그램이 멈추는 경우가 있으므로, 이를 최소화하기 위해 메모리 사용을 최적화하는 것이 좋습니다.

 

 

 


 

etc...

 

자료구조에 대해서

 

디자인패턴에 대해서

 

코루틴에 대해서

 

상속과 인터페이스

 

abstract와 virtual

 

 

애니메이션이 자체모션에 따라 트랜스폼이 이동되는 경우

해결방법은 두가지.

첫번째론 애니메이터에 Apply Root Motion을 체크 해제

두번째로는 해당 애니메이션을 찾아서 Root Motion Node를 <None>로 바꿔주면 위에 루트 트랜스폼 포지션항목이 여러가지 나오는데, 거기서 Bake Into Pose를 건드려주면서 이동제어를 할 수 있음.


Has Exit Time

해당 애니메이션의 모션이 종료된 후 이동할 것인지 아니면 즉시 이동할 것인지.

체크가 되어있다면 모션이 끝난후 움직이고 체크해제라면 조건이 충족되는 순간 바로 넘어감.


애니메이션을 사용하는 방법 두가지

  1. 애니메이터 컨트롤러를 이용한 GUI 방식
  2. 스테이트 패턴을 이용한 코드에서의 개별 호출방식

첫 번째 방법 - 애니메이터 컨트롤러 이용

장점은 뭐니뭐니해도 GUI로 되어있어 한눈에 들어온다는것.

숫자가 많지않다면 화살표로 이동경로를 다 알 수 있다는것.

단점은 반대로 한눈에 들어올정도로 적은 개수가 아닐경우 오히려 더 복잡해보이는것.

화살표연결과 파라미터 설정을 하나하나 다 해줘야한다는것.

애니메이션을 섞는 블랜딩이나 블랜드트리는 애니메이터컨트롤러에서밖에 안되는 것 같아서 애니메이터 컨트롤러를 써야만 하는 상황이 있을 수 있어보임.

예를 들어 이동속도에 따른 달리기모션이 걸을때 고정수치 A 달릴때 고정수치 B라면 그냥 걷기, 달리기 두가지 모션만 있으면 되지만 이동속도가 버프/디버프 등의 효과로 인해 다양하고 모션또한 다양하게 주고싶다면 애니메이션 블랜드를 사용해야되기 때문에 컨트롤러를 사용해야함.

두번째의 스테이트패턴을 이용한 호출방식 또한 애니메이션 컨트롤러에서도 유사하게 사용할 수는 있음. 어차피 스테이트패턴자체가 Int로 되어있는거에 String값을 붙이는거기때문에 그냥 해당 패턴을 인트로 받아서 사용하면 됨.

파라미터를 인트(스테이트 변수)로, 값은 이퀄로 해놓으면 스테이트 패턴에 따라 움직임.

다만 이건 만능은 아니고 특정 상황에 따라 하면 좋을듯.

예를 들어 Idle에서는 스킬로 바로 연결되지않고, BattlePaze라는 Bool값을 하나 넣어주던가 Battle Idle상태를 만들어둔뒤 거기에서 여러가지 스킬을 나눠놓고 그 스킬로 이동하는 조건 파라미터를 State 변수로 주는것. 이렇게하면 배틀페이즈가 아니라면 해당 state변수를 초기화해주지않아도 스킬을 마구 사용하지 않음.

두 번째 방법 - 코드에서 State 변수를 이용

일단 애니메이터 컨트롤러에 사용할 애니메이션 클립을 몽땅 넣는다.

그 뒤 코드에서 해당 애니메이션들을 전부 Enum으로 묶어준다.

그리고 해당 Enum의 State 변수를 만들고 이게 애니메이션 상태를 총지휘하는 하나의 길잡이가 되는것.

Animator.Play를 사용하면 뚝뚝 끊기는 문제가 있는데, CrossFade를 사용하면 해결.

State 변수를 프로퍼티로 만들어서 Set하는 부분에 Animator와 동기화를 하면 한층 편해짐.

상태가 바뀔 때 해당 애니메이션을 재생하는 방법으로.

장점이라면 애니메이션이 아무리 많아도 스테이트패턴에서 호출하는 방식이기때문에 덜 헷갈림

컨트롤러에서 애니메이션끼리의 연결을 해주지않아도 되서 편하고 파라미터값도 필요없음 (정확히 말하면 모든 화살표를 연결하고 그값을 Int(state)파라미터 하나로만 사용하는 방식이라 굳이 연결을 안해줘도 되는것

단점이라면 한눈에 보기 어려울거고 어떤 형태에서든 다른 애니메이션으로의 전환이 가능하게 되버림. 예를 들면 점프상태에서 달린다던가 스킬을 쓴다던가. 다만 이건 단점이라고만 하기엔 오히려 의도해서 써먹을만한 상황이 있을지도 모르겠다.

또 상태관리가 어려울 수 있음. 점프같은걸 하면 점프가 끝나고 자동으로 Idle로 돌아가는 그런게 안되서 코드로 끝나면 Idle상태로 바꿔준다던가 하는 작업을 따로 해야함

 


간단하게 휘두르는 무기장착

FBX파일에서 무기를 장착할 부위 - 손이나 팔 등등에 그냥 검이든 지팡이든 뭐든 쥐어주면 알아서 움직임에 따라 휘두르고 이것저것 다함.

이 방법에선 오히려 활같은게 가장 어려운 형태일듯?

 


애니메이션의 범용적 활용

휴머노이드 타입의 애니메이션이라면 모든 휴머노이드 타입의 모델에 대응되기때문에 어디서든 사용이 가능. 다만 모두고려가 안되어있기때문에 머리카락을 뚫는다던지 옷이랑 겹친다던지 하는 문제정도는 있다. 개별 수정이 필요한 부분.

 


Trangition 상태일 때는 애니메이션 전환이 되지 않음

두 클립 사이를 오갈 때 - 그러니까 애니메이터에서 Transitions 상태일때는 다른 화살표로 이동이 불가능하다.

발견한 계기는 Wait과 Move애니메이션을 오가는 사이에 Attack 애니메이션 클립을 실행시켰는데 실행이 안되는 타이밍이 있어서 이것저것 테스트 해보다가 알게됨.

해결방법은 별거없다. 그냥 트랜지션이 끝나고 애니메이션이 호출되게끔 하는수밖에…

Attack이 실행되고 끝나기 전까진 다른 클립으로 이동하지 않는 조건문을 처음에

if (playerAnim.GetCurrentAnimatorStateInfo(0).IsName("Attack"))
{
		return;
}

를 썼었는데 여기서 문제가 트랜지션 상태일 때 Attack 트리거를 발동시켰지만 정작 다음 업데이트문에서 Stateinfo를 체크할땐 아직 Attack클립이 실행되지 않은 상태라서 return이 안되고 그래서 그 아래의 아무입력도 없으면 Idle상태로 돌아가는 코드가 실행되서 아예 Attack이 씹혀버린 문제였음.

그래서 아래처럼 일단 애니메이션이 실행되기전까진 AttackState를 유지하다가 Attack클립의 종료 이벤트 호출에서 다시 SetInteger로 돌아가는걸로 해결했음.

 


 

유니티 프로젝트 필수파일

Assets

Packages

ProjectSettings

이 세 폴더만 있으면 유니티프로젝트로서 유니티허브로 열 수 있음.

피치 못하게 프로젝트 자체를 압축파일 형식으로 저장해야되거나 할 때 쓸만함

 

다르게 말하면 저 세폴더를 제외한 폴더와 파일들은 모두 삭제해도 무방함.

어차피 프로젝트를 열때 다시 생성됨. 다만 시간소요


유니티에서 깃허브 사용하기

  1. 깃허브 레포지토리에 새로운 레포지토리 생성 - 이그노어는 유니티(만약 안했으면 구글검색에서 유니티 이그노어 쳐서 이그노어파일넣기)
  2. 깃허브 데스크탑에서 File - 클론 레포지토리로 온라인과 로컬 동기화
  3. 숨김으로 되있는 .git폴더와 이그노어 파일이 있는곳에 유니티 프로젝트 생성 or 가져오기

3-1 .git 폴더에 Asset을 비롯한 유니티프로젝트 파일들을 통째로 옮겼다면 이그노어 파일은 따로 수정 할 필요 없음. 3-2 만약 .git폴더에 유니티프로젝트를 감싼 폴더를 옮겼다면 이그노어 파일을 열어서 가장 앞에 해당 폴더의 경로를 추가해주어야함

ex) 만약 유니티 프로젝트 네임이 ProjectBase라면 /[Ll]ibrary/ 앞에 해당 이름을 추가해준다

ProjectBase/[Ll]ibrary/

ProjectBase/[Tt]emp/

ProjectBase/[Oo]bj/

ProjectBase/[Bb]uild/

ProjectBase/[Bb]uilds/

ProjectBase/[Ll]ogs/

ProjectBase/[Mm]emoryCaptures/

  1. 작업순서는 브런치 선택 - 작업 - 커밋(커밋내용 필수) - 푸쉬

기타 - 유니티 버전 맞추기, 직렬화 통일하기, 메타파일까지 같이 옮기기(만약 깃이 아닌 다른형태로 옮길경우 익스포트 패키지 형태가 가장 권장됨)

 

 

 


ㅁㄴㅇㄹ

텍스트 컴포넌트의 사이즈, 글꼴, 색상등을 내부에서 실시간으로 바꿀 수 있는 기능

HTML과 비슷하게 특정 태그를 넣어 바꿀 수 있는데 이를 '마크업 포맷' 이라고 함

 

어느정도는 HTML과도 호환이 된다는데 완벽하진 않다고함.

아래가 공식문서에 나와있는 내용

마크업 시스템은 HTML에서 힌트를 얻어 만들어졌으나 보통 HTML과 완벽하게 호환되게 하려는 의도로 만들어지지는 않았습니다. 기본 아이디어는 텍스트의 일부분을 서로 매치되는 태그 쌍 안에 넣어 원하는 시각 효과를 부여할 수 있다는 것입니다.

 

사용예시는 다음과 같다

이런식

일반적인의 경우에 리치텍스트 기능을 안쓴상태로 구현한다고 하면

스킬이 들어가는 부분 / 스킬의 레벨상태 / 스킬의 상세내용

이렇게 3가지 정보를 표시하고 각자 다른 폰트나 색깔을 사용하고 싶을 때 가장 간단한 방법은 단순히 텍스트 오브젝트를 3개 만드는건데 이럴 때 사용하면 텍스트 하나로도 가능하다.

 

대화문 출력중에 강조해야하는 단어 - 예를 들어 특정 아이템이나 퀘스트라면 키워드아이템등을 강조할 때 써도 좋다.

퀘스트 핵심 재료 / 개수 / 타겟몬스터 같은걸 강조하고싶을 때

 

쓰는 방법은 원하는 태그를 코드에서 스트링에 넣어도되고 텍스트 컴포넌트에 바로 넣어도 적용된다.

Text.text = "너에겐 숙련된 모험가의 모습이 보여!" +
"\n당장 부탁이 있는데 마을옆에 슬라임 목장에 가서 <b><color=red>광석</color></b> <b><color=blue>5</color></b>개만 모아다줄래?" + 
"\n<b><color=green>슬라임</color></b>을 잡다보면 나올거야!"

둘다 가능

 

지원태그 목록

 

볼드체
<b>내용</b>

기울림
<i>내용</i>

사이즈변경
<size=크기>내용</size>

정해진 색상변경
<color=색상이름>내용</color>

커스텀 색상변경
<color=#00ffffff>내용</color>


이외에 텍스트 메시에만 적용 가능한 meterial / quad가 있음 이건 공식문서 참고

컬러에 색상이름도 정해져있는거만 되니까 상세목록은 아래에서 찾으면 됨

 

https://docs.unity3d.com/kr/530/Manual/StyledText.html

 

리치 텍스트 - Unity 매뉴얼

UI 요소와 텍스트 메시의 텍스트에는 여러 폰트 스타일 및 크기가 사용될 수 있습니다. 리치 텍스트는 UI 시스템과 레거시 GUI 시스템에서 모두 지원됩니다. Text, GUIStyle, GUIText, TextMesh 클래스에는 U

docs.unity3d.com

 

 

 

 


 

 

 

 

 

참고로 티스토리같은 글쓰기나 다른 블로그 글쓰기 등에도 HTML을 지원하거나 HTML을 기반으로 만들어진게 많아서

여기서도 그냥 위에 <b>내용</b>를 단순하게 복사 붙여넣기 하면 자동으로 내용 이렇게 표시된다.

 

기본모드 말고 HTML 모드로 보면 윗문장을 보면

이런식으로 나오는데 <b> 가 빨갛게 되어있는 부분의 내용은 자동으로 볼드체로 처리가 되어있고

그 전에 내용의 b의 꺽쇠 앞뒤는 꺽쇠대신 &lt &gt 로 되어있는 걸 알 수 있는데 이게 아마 특수문자 출력처리 부분인듯.

 

 

유니티 스트링에서도 줄바꿈문자 라던가 쌍따옴표 자체를 출력하고 싶을 때 \(백스페이드랑 엔터 사이에 있는 키)를 붙여서 사용하는거랑 비슷한 개념.

 

C# 정규식 문서에서 보면 

\n = 줄 바꿈 문자인 \u000A를 찾습니다.

이런식으로 설명이 되어있음.

 

이외에도 정규식언어를 얼마나 알고있느냐에 따라 단순 String만으로 할 수 있는게 매우 달라지는데 이걸 Text컴포넌트의 text에 그대로 사용 할 수 있어서 알아두면 좋음.

https://learn.microsoft.com/ko-kr/dotnet/standard/base-types/regular-expression-language-quick-reference

 

정규식 언어 - 빠른 참조

이 빠른 참조에서는 정규식 패턴을 사용하여 입력 텍스트와 일치시키는 방법을 알아봅니다. 패턴은 하나 이상의 문자 리터럴, 연산자 또는 구문을 포함합니다.

learn.microsoft.com

 

 

예전에 Text.text 에 string을 넣을 때 필드변수등을 참조해서 넣고싶었을 때

Text.text = "현재 레벨은 " + T.level.ToString() + "입니다."

이런식으로 넣었던 적도 있었는데

 

그다음에 포맷을 배워서 바꾼게

Text.text = string.Format("현재 레벨은 {0} 입니다", T.level);

이런 형태였다.

근데 이제는 그냥 $ 하나만 넣어주면 매우 편하게 되서 그렇게만 쓰는듯. 이게 아마 예전부터 되던건 아니고 새로 추가된 기능이라고 들었는데 언젠진 모르겠음

Text.text = $"현재 레벨은 {T.level} 입니다"

 

 

이 기능도 정규식 문서에 나와있음. 자세한 설명에 대체라고 되어있는데 문서 들어가보니까 string.Format이 아니라 Regex.Replace로 중괄호 안에 있는 내용을 바꿔치기 하는 것 같다.

string.Format도 뜯어보면 Replace기능을 사용한건지 까지는 모르겠음.

 

 

 


추가 할 내용이 있으면 아래에

 

 

 

키워드 = 커스텀 에디터, 커스텀 인스펙터, GUILayout, EditorGUILayout

 

기본적으로 GUILayout과 EditorGUILayout의 차이는 후자의 에디터가 붙은 레이아웃은 오로지 유니티 에디터상에서만 볼 수 있다는 점. 따라서 인게임 UI를 GUILayout코드로 설정 할 때는 잘봐야함.

 

기본 GUI그룹과 EditorGUI그룹은 제공하는 래퍼런스가 살짝 차이가 있어서 섞어쓰게 되는 경우도 있음.

 

유니티 공식 레이아웃 메뉴얼

https://docs.unity3d.com/kr/2020.3/Manual/gui-Layout.html

 

IMGUI 레이아웃 모드 - Unity 매뉴얼

IMGUI 시스템을 사용할 때 UI를 정렬하고 구성하는 데 사용할 수 있는 고정 및 자동의 두 가지 모드가 있습니다. 지금까지 이 가이드에 제공된 모든 IMGUI 예제에는 고정 레이아웃이 사용되었습니다

docs.unity3d.com

 

EditorGUILayout 래퍼런스

https://docs.unity3d.com/kr/530/ScriptReference/EditorGUILayout.html

 

UnityEditor.EditorGUILayout - Unity 스크립팅 API

Auto-layouted version of EditorGUI.

docs.unity3d.com

GUILayout 래퍼런스

https://docs.unity3d.com/kr/530/ScriptReference/GUILayout.html

 

UnityEngine.GUILayout - Unity 스크립팅 API

The GUILayout class is the interface for Unity gui with automatic layout.

docs.unity3d.com

필요한 기능이 있으면 직접 찾아서 쓸것

 

아래는 자주사용했던 기능 위주로 소개

 

[CustomEditor(typeof(T))]
public class Test : Editor
{
	T value;

    private void OnEnable() // 초기설정이 필요하면 여기서
    {
        value = (T)target;
    }

	public override void OnInspectorGUI() // Inspector창에 나타낼 정보들
    {
    	// 자주 써먹을만한것들 위주로
        
        // 수직 정렬그룹. Begin과 End사이에 들어가 있는 GUI들은 전부 수직정렬됨.
        EditorGUILayout.BeginVertical();
        EditorGUILayout.EndVertical();
        
        // 수평 정렬그룹.
        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.EndHorizontal();
        
        // 여백추가
        GUILayout.Space(float);
        
        // 공백추가(빈공간을 삭제해줌 - 버튼같은거에 앞뒤에 넣어주면 가운데정렬가능
        GUILayout.FlexibleSpace();
        
        // 각종 필드추가
        EditorGUILayout.IntField(int);
        EditorGUILayout.FloatField(float);
        EditorGUILayout.TextField(string);
        EditorGUILayout.TextArea(string);
        EditorGUILayout.ObjectField("Label", object, typeof(object), true);
        
        
        // 필드에 T의 특정값을 실제로 넣을 땐 대충 아래의 형태가 됨.
        // 만약 T에 있는 mySprite라는 이름의 스프라이트 이미지를 표시할 경우
        value.mySprite = EditorGUILayout.ObjectField("이미지이름", value.mySprite, typeof(Sprite), true);
        
        
        // 버튼추가
        if (GUILayout.Button(String or Image))
        {
            // 버튼 누를시 실행될 작업
        }
    }
}

 

위에 래퍼런스중에 ObjectField는 공식문서에 Obsolete로 되있는데 왜그런진 모르겠다.

'allowSceneObjects'

키워드를 참고하라는데 쳐봐도 나오는게 없고 편집기에선 Obsolete붙어있지도 않음. 그냥 써도될듯.

 

아무튼 위에 커스텀 에디터 래퍼런스랑 ScriptableObject와 결합하면 아주 보기좋은 형태의 자신만의 에디터를 만들 수 있음.

 

 

래퍼런스함수 대부분의 매개변수에 params 타입으로 되있는 GUILayoutOption[] 을 넣을 수 있음.

 

이건 그냥 옵션배열인데 매개변수에 직접 넣어도 되고 따로 옵션을 만들어서 넣어도 됨

GUILayout.Button("버튼", GUILayout.Width(30), GUILayout.Height(30))
// 이런식으로 옵션을 직접 넣어도 되고

GUILayoutOption[] style = { GUILayout.MinHeight(50), GUILayout.MinWidth(50)};
GUILayout.Button("버튼", style)
// 이런식으로 직접 style을 만들어서 넣어도 됨

 

 


추가로 적을만한게 생기면 아래에 추가

 

 

Inspector 같은 창의 넓이를 구하는 방법 (사이즈 크기 조절할때나 가운데 정렬하고싶을 때 쓰면 좋음)

EditorGUIUtility.currentViewWidth

 

인스펙터에서 수정한 내용대로 실제 값을 변경하고싶은 경우

if (GUI.changed) EditorUtility.SetDirty(target);

 

 


 

만약 상속받은 객체에서도 사용하고싶을 경우

[CustomEditor(typeof(T))] 를 [CustomEditor(typeof(T), true)] 로 하면 된다고함.

https://docs.unity3d.com/ScriptReference/CustomEditor-isFallback.html

관련내용은 위 링크. 뭐 isFallback이라는 값을 true로 바꿔주는거라는데 상속 허용 뭐 그런건가봄.


        


 

 

추상클래스

 

 = abstract

 

 

추상함수를 포함하려면 클래스자체가 abstract Class로 선언이 되어야함.

 

abstract void _name(); 식으로 구성되고, 본문은 정의할 수 없다.

 

인터페이스와는 다르게 필드 변수도 선언 가능하고 사용하는것도 상관없음

 

해당 클래스를 상속받았을 때 사용하는 방법은 override void _name() { 내용 }

이렇게 override키워드를 사용하는것.

 

 

 

유일한 단점은 다중상속이 안된다는점 - (참고 죽음의 다이아몬드 문제)

 

그래서 사용하는것이 아래의 인터페이스

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

인터페이스

 

 = interface

 

인터페이스자체가 추상화의 형태임, abstract의 집합체라고 볼 수도 있는데, 모두가 값이없고 추상화 형태이기때문에 다중상속이 가능함(사실 상속은 아니지만 형태가 상속 옆에 붙기때문에 상속으로 보는듯)

 

I가 붙은 것들이 거진 인터페이스이고 해당 인터페이스에서 정의해놓은 함수와 변수를 무조건 써야함 (값지정)

 

추상클래스처럼 필드변수는 선언할 수 없기때문에 함수, 속성, 인덱서, 이벤트만을 선언 가능.

 

다만 저런 속성 앞에 따로 public이라던지 그런 키워드는 안넣어줘도 되는듯.

 

 

속성시스템 같은걸 구현할 때 사용하면 아주 좋을 것 같은 기능

 

 

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

상속클래스 

 

A클래스 = 오리지날 : MonoBehaviour

B클래스 = 타겟클래스 : A

 

게임오브젝트에 B클래스만 넣고 쓸경우 B클래스에서 런타임 동작함수를 사용한다면, A클래스에 동작함수를 작성해놨어도 무시하고 B클래스의 함수만을 실행함 (Awake, Start, Update)

 

따라서 초기화를 A클래스에서 자체적으로 할 경우, B클래스에선 Awake를 쓰면 안됨. 다른 함수도 마찬가지

 

반대로 OnTriggerEnter같은 함수를 A클래스에 구현했다 하더라도, B클래스에서 그걸 구현하지않았다면 어떠한 객체가 B클래스만 가지고 있다 하더라도 부딪힐경우에 A클래스에 있는 OnTriggerEnter가 발동됨.

 

 

 

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

virtual 과 override 키워드

 

상속클래스에서 사용하는거고 기존에 부모가 가진 함수가 있을 때 그 함수를 virtual 키워드로 선언했으면

그 부모를 상속받은 자식클래스에서 override로 덮어씌울수가 있음.

 

만약 일반 부모클래스에서 public void Move(); 라는 함수가있고

자식에서 public void Move(); 라는 함수를 비슷한 기능이지만 살짝 다르게 사용하고 싶을 때는 public new void Move();  이런식으로 사용해서 아예 부모의 Move를 덮어버릴 수 있지만 그렇게되면 부모.Move()를 사용하는게 아니라 자식.Move()를 사용할 때만 new로 덮어씌운 애가 호출된다.

 

그래서 virtual과 override키워드를 사용하게되는데 부모에서 virtual void Move()를 선언하고 자식이 override void Move()를 했을 때, 부모.Move()를 호출하더라도 해당 오브젝트가 부모와 자식속성을 둘다 가진 객체일경우 override한 버전의 자식 Move()가 호출이 된다. (런타임에서 컴파일러가 알아서 체크함)

 

 

 

 

 

번외 - 오버로딩과 오버라이딩의 차이점

오버로딩 = 함수이름의 재사용 (매개변수를 바꿔서)

오버라이딩 = 다형성을 이용한 virtual, override키워드를 사용해서 덮어씌우는것

 

번외 2 override 앞에 sealed라고 봉인 조건을 넣을 수 있는데 그렇게 될 경우 해당 override를 제외하고 다른곳에선 추가적으로 오버라이드를 더 할 수 없음.

 

Text Mesh Pro 텍스트 매쉬 프로

 

 

 

 

간단한 사용법 - 패키지를 다 설치하고, 사용할 폰트(TTF)를 모두 준비했다면

 

 

폰트 - 오른쪽클릭 - Create - TextMeshPro - FontAsset 클릭

 

그럼 해당 폰트의 SDF파일이 만들어지는데 이 SDF파일이 해당 폰트의 텍스트매쉬프로 파일이다.

 

 

 

후에 텍스트매쉬프로를 사용한 버튼의 텍스트, 일반 캔버스의 텍스트, 오브젝트의 3D텍스트를 만들고 해당 SDF파일을 넣으면 사용준비완료

 

 

상세옵션은 하나하나 뜯어보면 쉬은데, 그냥 포토샾에서 쓸수있는 레이어옵션과 거의 동일하다고 보면 된다.

 

 

 

 

 

1. Main Settings

 

일반 문서작성 워드 한글 블로그 등에서 제공하는 대부분의 옵션과 비슷함. 하나하나 눌러보면 쉽게알 수 있다.

 

Font Style = 볼드체, 이텔릭, 줄긋기, 대문자 소문자 전환 등의 옵션

 

Font Size = 폰트사이즈

Auto Size = 알아서 여백크기에 맞춰서 최적크기로 맞춰줌. 일반텍스트의 Best Fit과 같은기능

 

Vertex Color = 폰트의 색을 바꿀 수 있음. 아래의 그래디언트 옵션을 선택하면 최대 4가지 색깔을 혼합해서 사용가능.

Color Gradient = 색을 혼합할지의 여부

Override Tags = 이건 아직 무슨기능인지 모르겠다. 태그 기본설정을 덮어쓴다는 설명인거같은데 일단 보류

 

 

Spacing Options = 순서대로 자간, 단어간, 줄간, 문단간 간격조절

 

Alignment = 정렬옵션, 하나하나 눌러보면 바로 이해가능

 

 

 

기타옵션은 일반 텍스트와 같음.

 

전체적으로보면 일반 텍스트옵션과 비슷비슷한데 사용할 수 있는게 좀 더 확장된 느낌임.

 

 

 

2. Extra Settings

 

 

Margins = 여백조절

 

Sorting Layer = 레이어 태그설정 (보여짐 순서관련)

Order in Layer = 해당 레이어에서의 우선순위 설정

 

Orthographic = 입체로 볼지 여부

 

Rich Text = 리치텍스트 사용할지 여부 (스크립트 또는 텍스트내에서 <color, Size, b, i 등 옵션을 설정해줄 수 있음)

 

 

나머진 딱히 건드릴 이유없거나 모르는거라 생략

 

 

3. Material 관련 옵션

 

 

메테리얼 옵션은 일반 메테리얼과 비슷함. 텍스쳐도 입힐 수 있고, 색 변경, 외곽선, 그림자, 라이팅, 글로우 기능이 가능함.

 

 

Face = 글자자체의 색조정, 텍스쳐를 입힌다면 해당 텍스쳐의 색이 변경됨.

color = 색선택

Texture = 텍스쳐 선택

Softness = 해당 글자의 부드러움 정도. 그냥 브러쉬같은걸로 문댄다고 생각하면 이해하기 편함

Dilate = 글자의 두께조절

 

OutLine = 글자의 외곽선 추가. 일반 텍스트에서 Add Component - OutLine과 동일한 효과임 물론 더 상세하게 설정할 수 있음 텍스쳐도 입힐 수 있고

Color = 색선택, 텍스쳐를 선택시 텍스쳐의 색변경

Texture = 텍스쳐 선택

Thickness = 외곽선의 두께조절

 

 

Underlay = 그림자효과, 일반 텍스트에서 Add Component - Shadow와 동일한 효과, 옵션은 더 많음.

Underlay Type = 타입설정, None이면 체크해제이고 Normal이 일반그림자. Inner은 안쪽에서 그림자를 만든다는 것 같은데 글자가 투명하지 않으면 안보이는 것 같음.  보통 Normal로 사용하면 될듯

Color = 그림자의 색선택, 기본적으로 알파값이 0.5f임 (절반)

Offset X = 그림자 X포지션

Offset Y = 그림자 Y포지션

Dilate = 그림자 두께

Softness = 부드러움정도. 안티앨리어싱으로 봐도되고 브러쉬로 봐도됨. 블러로 봐도되나?

 

 

 

Lighting = 라이팅 옵션은 라이팅 자체만으로도 알아야할게 너무많고 글자에는 또 어떤식으로 적용되는지 직접 알아보는게 좋고 설명으로 어려운 부분이라 생략. 글자 자체를 하나의 메테리얼로 생각하고 3D로 보면서 확인해야될 듯 함

 

 

 

Glow = 포토샵에서 외부광선 내부광선의 효과와 같음. 잘쓰면 퀄리티상승, 못쓰면 촌스러워보이게하는 마법의 옵션

Color = 광선의 색선택, 기본적으로 알파값이 0.5f임 (절반)

Offset = 광선의 포지션. 글자기준으로 넓어지거나 좁아짐.

Inner = Offset값을 기준으로 안쪽으로 두꺼워짐 = 내부광선

Outer = Offset값을 기준으로 바깥쪽으로 두꺼워짐 = 외부광선

Power = 광선자체의 선명도인듯. 

 

 

 

이정도옵션이면 포토샵에서 예쁘게 만든 글자를 어느정도는 흉내낼 수 있을정도는 됨

 

다만 이쁘게 만드는건 디자인의 영역이라 기능을 다 안다고 누구나 다 이쁘게 만들수는 없다는 사실........... 

 

 

 


 

TextMeshPro - TMPro에서 한글 사용하는 방법

TTF파일을 SDF파일로 변환할 때 유니코드 범위를 지정해주면 됨.

 

- 32-126 : 영어
- 44032-55203 : 한글의 범위
- 12593-12643 : 한글 자모음
- 8200-9900 : 특수문자

아래는 복붙용

32-126, 44032-55203, 12593-12643, 8200-9900

Window - TextMeshPro - Font Asset Creator를 연 뒤
원하는 폰트와 사이즈 등을 선택하고
Character Set 을 Custom Range로 설정한 뒤
위의 범위 숫자를 붙여넣고 Generate 하면 된다.

완료되면 save로 SDF 파일을 저장하면 사용 가능.

 

추가로 일본어,중국어, 기타 외국어등을 추가할 때도 마찬가지로 해당 언어의 유니코드 범위를 검색해서 추가해주면 된다.

 

 


 

 

 

생성 


GameObject - Effects - ParticleSystem





메인섹션(ParticleSystem , 만든 파티클 이름으로되어있음)


파티클시스템의 Inspector탭의 첫번째 항목부터


Duration = 지속시간, 파티클 시스템자체가 얼마나 지속될지 정함. 바로 아래의 Looping이 켜져있으면 Duration시간과 상관없이 계속 지속되는것으로보임.


Looping = 반복할지의 여부

Prewarm = Looping이 켜져있을 때, 반복시에 파티클의 초기화 여부




Start Delay = 시작시 첫 파티클생성까지 딜레이 여부

Start Lifetime = 시작시 얼마나 생성된 파티클조각이 얼마나 살아있을지 시간

Start Speed = 파티클 처음생성시 속도


3D Start Size = 3d파티클이라면 이걸로 사이즈 조절(체크박스 체크하면 사이즈바꿀수있게 바뀜)

Start Size = 2d파티클이라면 이걸로 사이즈조절


Start Rotation = 시작시 첫 각도

Flip Rotation = 일부파티클의 Start Rotation값을 반대로 적용시킴. 공식문서에는 Randomize Rotation Direction이라고 되어있음. 0이 0%의 확률, 1이 100%의 확률로 반전시킴


Start Color = 시작시 컬러. 오른쪽 화살표로 Color, Gradient, Random Between Two Color, Random Between Gradient, Random Color 를 고를 수 있는데, 각각 

ㅡㅡㅡㅡㅡ

Color = 해당 색으로 설정

Gradient = 색이 점점 변하는 그래디언트 효과

Random Between Two Color = 두가지 색을 설정해서 두 색 사이의 모든색중에 랜덤으로 설정. 단색만 설정가능

Random Between Gradient = 두가지 그래디언트를 설정해서 두개중의 하나의 그래디언트로 설정

Random Color = 랜덤 비트윈 투컬러랑 거의 비슷하지만 투컬러는 두가지 단색사이의 색만 가능한데 랜덤컬러는 컬러마커를 추가해서 원하는 색들을 다 섞을 수 있음. 그 색중에 한가지로 설정해줌

ㅡㅡㅡㅡㅡ

아래와같은 기능을 가지고있음.



메인시스템 이하 생략




Emission



Rate over Time = 시간당 방출할 파티클의 개수. 1초가 기준인거같고 절대치는 아님. Duration이 1이고 오버타임이 10이라고 꼭 10개는아님 9~10개인듯함.  Duration이 1초 미만이라면 파티클개수를 초로 곱한만큼 나옴. 개수가 10이고 Duration이 0.5초라면 4~5개정도 되는식


Rate over Distance = 파티클 객체가 움직인 거리당 방출할 파티클의 개수. 자동차 바퀴에서 나오는 흙먼지로 생각하면 쉽다고함. 움직이는 객체라면 두값을 적절히 섞어쓰면 효과가 더 좋을듯하다.





Shape



방출되는 형태를 정해주는 섹션

Shape = 말그대로 어떤형태로 방출을 시킬지 각 형태에 따라서 하위값들이 조금씩 다름

설명보단 직접해보는것이 훨씬 빠르고 직관적으로 알 수 있음


Angle = 각도

Radius = 너비


Arc = 분사기의 각도라고 생각하면됨

Mode = 설정한 범위내에서 파티클방출을 랜덤하게할지, 특정형태로 할지 정해줌

Spread = 퍼짐의 정도. Arc값을 퍼센트로 조절하는것같음.





Size over Lifetime이랑 Texture Sheet Animation 추가해야함







가장 좋은건 직접해보는것

기타 자세한 정보는 아래 공식문서 참고

https://docs.unity3d.com/kr/current/Manual/PartSysMainModule.html



+ Recent posts