유니티에서 객체를 이동시키거나 회전시키는 방법은 2가지가 있다. 

1. 모든 객체에 있는 Transform컴포넌트의 position, rotation 속성을 지속해서 변경하는 것이다.

2. 내장된 물리엔진을 이용해 물리적인 힘(Force)또는 회전력(Torque)을 가해 변경시키는 것이다. 

 

애니메이션으로도 이동및 회전을 할 수 있지만, 이건 Transform컴포넌트의 속성값을 연속적으로 기록한 것을 재생하는 것이기 때문에  Transform컴포넌트를 이용하는 방법이다.

 

하이라키의 Player Object을 선택한후 인스펙터뷰에서 Add Component에서 new Script를 선택하고 PlayerCtrl로 한다. 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerCtrl : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");
        transform.position += new Vector3(h, 0f, v);
    }
}

h,v를 입력 받아 Vector3 구조체를 만들어 transform.position에 "+=" 연산해준다.

h,v의 범위는 WASD나 화살표키에 따라 -1f~1f의 범위를 갖기 때문에 Player는 전후좌우로 잘 움직인다.

주의할건 Vector3(h,v,0f)가 아니라 Vector(h,0f,v)라는 거다 유니티는 3차원 좌표시스템인데 y는 위아래를 뜻한다. 따라서 x는 좌우 z는 전후를 뜻한다.

Play해보면 무지하게 빠르지만 잘 움직인다. 왜냐하면 Update()함수는 컴퓨터마다 다르자만 1초에 대략 60번 정도는 호출되기 때문이다. 그리고 이렇게 자주 호출되기때문에 되도록이면 무거운 처리를 피해야한다.

다음과 같이 자주호출될 Transform의 참조를 tr에 저장해놓고 사용하면 좀 가벼워진다. 이걸 컴포넌트캐시라고 한다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerCtrl : MonoBehaviour
{
    // Start is called before the first frame update
    Transform tf;
    void Start(){
        tf = GetComponent<Transform>();
    }

    // Update is called once per frame
    void Update(){
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");
        tf.position += new Vector3(h, 0f, v);
    }
}

tf.position += new Vector3(h, 0f, v);를 처리해주는 Translate()라는 함수가 있다

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerCtrl : MonoBehaviour
{
    // Start is called before the first frame update
    Transform tf;
    void Start(){
        tf = GetComponent<Transform>();
    }

    // Update is called once per frame
    void Update(){
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");
        tf.Translate(new Vector3(h, 0f, v));
    }
}

현재 움직임이 너무 빠르다. 왜냐하면 매프레임 호출되기 때문이다. 따라서 움직임을 작게하면 되지만 그렇게 되면 컴퓨터의 성능에 따라 속도차이가 나게 된다. 따라서 매 프레임의 시간간격을 곱해주면 컴퓨터의 성능에 관계없이 움직임 속도가 일정하게 된다. 성능이 나쁜 컴퓨터는 시간간격이 크기 때문에 그만큼 많이 움직이기 때문이다.

d(거리) = v1*t1 = v2*t2 , 컴퓨터 성능에 속도는 비례하지만 프레임간시간간격은 반비례한다.

간단하게 빠른 컴퓨터는 조금 움직이게 해주는거다.

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerCtrl : MonoBehaviour
{
    // Start is called before the first frame update
    Transform tf;
    void Start(){
        tf = GetComponent<Transform>();
    }

    // Update is called once per frame
    void Update(){
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");
        tf.Translate(Time.deltaTime * new Vector3(h, 0f, v));
    }
}

단위벡터를 이용해 이동 벡터를 만들수 있다.

Vector3 dir = Vector3.right*x + Vector3.forward*v;

단위벡터와 단위벡터의 합은 √2가 될수 있으므로 스칼라값을 1로 만들기 위해 단위벡터로 만들려면 dir.normalized를 사용해야한다. 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerCtrl : MonoBehaviour {
    // Start is called before the first frame update
    Transform tf;
    private float speed;
    void Start() {
        tf = GetComponent<Transform>();
        speed = 8f;
    }

    // Update is called once per frame
    void Update() {
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");
        Vector3 dir = Vector3.right* h + Vector3.forward* v;
        tf.Translate(dir.normalized * speed * Time.deltaTime);
    }
}

 

'유니티게임강좌 > 주인공 캐릭터 제작' 카테고리의 다른 글

Assembly  (0) 2023.02.25
[Player제작] 접근제한자  (0) 2023.02.25
[Player제작] InputManager  (2) 2023.02.25
[Player제작] 유니티 Class 종류  (0) 2023.02.25
[Player제작] 스크립트  (0) 2023.02.25

 Input은 외부에서 들어오는 입력값을 관리하는 클래스다. 최근에 추가된 InputSystem도 있지만 다음에 설명하겠다.

유니티는 자주 사용하는 키보드, 마우스, 조이스틱 입력에 대한 조합을 미리 정의해 놓왔고 InputManager에서 관리한다.

입력 관리자

Input Manager 창에서 프로젝트에 대한 입력 축 및 축과 관련된 행동을 정의할 수 있습니다. 액세스하려면 Unity의 메인 메뉴에서 Edit > Project Settings로 이동한 후 오른쪽 내비게이션에서 Input Manager를 선택합니다.

입력 관리자는 다음 타입의 컨트롤을 사용합니다.

  • 는 W 키, Shift 키, 스페이스바 등과 같은 물리적 키보드의 모든 키를 의미합니다.
  • 버튼은 리모콘의 X 버튼처럼 물리적 컨트롤러(예: 게임패드)에 있는 버튼을 가리킵니다.
  • 가상 축(복수형: )은 버튼, 키 등과 같은 컨트롤에 매핑됩니다. 사용자가 컨트롤을 활성화하면 축은 [–1..1] 범위의 값을 수신합니다. 이 값은 스크립트에서 사용할 수 있습니다. Horizontal, Vertical, Fire1, Fire2, Mouse X와 같은 추상적인 개념의 이름으로 정의되어 있다.

 

Input.GetKey("a")와 같이 위에 명시된 명명 규칙을 사용하여 특정 키 또는 버튼에 대한 입력을 쿼리할 수도 있습니다. 예를 들면 다음과 같습니다.

스크립트에서 가상 축 사용
스크립트에서 가상 축에 액세스하기 위해 축 이름을 사용할 수 있습니다.
예를 들어 Horizontal 축의 현재 값을 쿼리하고 변수에 저장하려면 다음과 같이 Input.GetAxis를 사용할 수 있습니다.

Input.GetAxis("Input Manager Axes 이름")으로 값을 얻어 올수 있다.

Input.GetAxis는 -1.0f~1.0f의 변화하는 값을 얻어오는데, 누루고 있으면 0f에서 -1f나 1f로 가속되는 값이 리턴된다.

Input.GetAxisRaw -1.0f, 0f, 1.0f의 3개중 하나의 값이 전달된다.

움직임이 아니라 이벤트(예: 게임 내에서 무기 발사)를 설명하는 축의 경우에는 대신에 Input.GetButtonDown을 사용하십시오.

두 개 이상의 축이 동일한 이름을 사용하는 경우 쿼리는 절대값이 가장 큰 축을 반환합니다. 따라서 축 이름에 두 개 이상의 입력 기기를 할당할 수 있습니다.

예를 들어 Horizontal이라는 이름으로 두 개의 축을 만든 후 하나는 키보드 입력에 할당하고 다른 하나는 조이스틱 입력에 할당할 수 있습니다. 사용자가 조이스틱을 사용하는 경우 입력은 조이스틱에서 수신되고 키보드 입력은 null입니다. 그렇지 않으면 입력은 키보드에서 수신되고 조이스틱 입력은 null입니다. 이를 통해 여러 컨트롤러의 입력을 처리하는 단일 스크립트를 작성할 수 있습니다.

예제

Horizontal  Vertical 축의 입력과 transform.Translate 메서드를 사용하여 XZ 공간(전방, 후방, 왼쪽, 오른쪽)에서 게임 오브젝트를 움직일 수 있습니다. 움직이려는 게임 오브젝트에 연결된 스크립트의 update() 메서드에 다음 코드를 추가하십시오.

float moveSpeed = 10;
//Define the speed at which the object moves.

float horizontalInput = Input.GetAxis("Horizontal");
//Get the value of the Horizontal input axis.

float verticalInput = Input.GetAxis("Vertical");
//Get the value of the Vertical input axis.

transform.Translate(new Vector3(horizontalInput, verticalInput, 0) * moveSpeed * Time.deltaTime);
//Move the object to XYZ coordinates defined as horizontalInput, 0, and verticalInput respectively.

Time.deltaTime은 마지막 프레임 이후 경과한 시간을 나타냅니다. moveSpeed 변수를 Time.deltaTime과 곱하면 게임 오브젝트가 프레임마다 일정한 속도로 움직입니다.

 

Input class는 다음과 같은 함수들을 지원하면 눌렸을때 눌리고 있을때 떨어졌을때를 구별할 수 있습니다.

GetAccelerationEvent Returns specific acceleration measurement which occurred during last frame. (Does not allocate temporary variables).
GetAxis Returns the value of the virtual axis identified by axisName.
GetAxisRaw Returns the value of the virtual axis identified by axisName with no smoothing filtering applied.
GetButton Returns true while the virtual button identified by buttonName is held down.
GetButtonDown Returns true during the frame the user pressed down the virtual button identified by buttonName.
GetButtonUp Returns true the first frame the user releases the virtual button identified by buttonName.
GetJoystickNames Retrieves a list of input device names corresponding to the index of an Axis configured within Input Manager.
GetKey Returns true while the user holds down the key identified by name.
GetKeyDown Returns true during the frame the user starts pressing down the key identified by name.
GetKeyUp Returns true during the frame the user releases the key identified by name.
GetMouseButton Returns whether the given mouse button is held down.
GetMouseButtonDown Returns true during the frame the user pressed the given mouse button.
GetMouseButtonUp Returns true during the frame the user releases the given mouse button.
GetTouch Call Input.GetTouch to obtain a Touch struct.
IsJoystickPreconfigured Determine whether a particular joystick model has been preconfigured by Unity. (Linux-only).
ResetInputAxes Resets all input. After ResetInputAxes all axes return to 0 and all buttons return to 0 for one frame.

이 섹션에서는 스크립팅 시 사용할 수 있는 Unity에서 가장 자주 사용되고 중요한 빌트인 클래스에 대한 간략한 정보를 제공합니다.

이 페이지는 Unity에서 스크립팅 기본 사항을 발견하기 위한 시작점 역할을 하며 Unity의 모든 클래스를 다루지 않습니다. 이는 여기서 다루는 클래스의 모든 멤버도 마찬가지입니다.

빌트인 클래스와 사용 가능한 모든 멤버에 대한 보다 온전한 레퍼런스는 스크립트 레퍼런스를 참조하십시오.

  • GameObject: 씬에 존재할 수 있는 오브젝트의 타입을 나타냅니다.
  • MonoBehaviour: 기본적으로 모든 Unity 스크립트가 파생되는 기본 클래스입니다.
  • Object: Unity가 에디터에서 참조할 수 있는 모든 오브젝트의 기본 클래스입니다.
  • Transform: 스크립트를 통한 게임 오브젝트의 포지션, 회전 및 스케일뿐만 아니라 부모 및 자식 게임 오브젝트의 계층적 관계에 대한 다양한 작업 방법을 제공합니다.
  • Vectors: 2D, 3D, 4D 포인트, 라인 및 방향을 표현하고 조작하는 클래스입니다.
  • Quaternion: 절대 또는 상대 회전을 나타내는 클래스이며, 이를 생성하고 조작하는 방법을 제공합니다.
  • ScriptableObject: 많은 양의 데이터를 저장하는 데 사용할 수 있는 데이터 컨테이너입니다.
  • Time (and framerate management): Time 클래스를 사용하면 시간을 측정 및 제어하고 프로젝트의 프레임 속도를 관리할 수 ​​있습니다.
  • Mathf: 게임 및 앱 개발에 일반적으로 필요한 삼각 함수, 로그 함수, 기타 함수를 비롯한 일반적인 수학 함수 컬렉션을 제공합니다.
  • Random: 흔히 요구되는 다양한 타입의 랜덤 값을 쉽게 생성할 수 있는 방법을 제공합니다.
  • Debug: 프로젝트가 실행되는 동안 어떤 일이 일어나고 있는지 파악하거나 조사하는 데 도움이 되는 정보를 에디터에서 시각화할 수 있습니다.
  • Gizmos and Handles: 씬 뷰와 게임 뷰에 라인과 모양뿐만 아니라 인터랙티브 핸들과 컨트롤도 그릴 수 있습니다.

C# 스크립트

유니티엔진의 코어 부분은 C++로 제작됐다. 유티는 스크립트언어로 C#을 지원한다. C++와 비슷해서 어렵지 않다. 객체지향 다형화에 대해 선지식이 필요하다.

 

여기서는 C#을 사용하는 법에 대해서는 다른곳에서 많이 다루었기 때문에 자세히 설명하지 않겠다. 책이나 다른 사이트를 참조해주시기 바란다.

 

유니티의 주요 이벤트 함수

프로젝트뷰에서 Scripts폴더를 하나만들고 우클릭을 하고 Create>Script를 하고 Ex란 이름으로 Scripts폴더에 저장하자.

더블클릭하면 지정된 에디터가 열리면서 자동생성된 코드가 보인다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ex : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

Ex로 저장된 스크립터에는 공교롭게 Ex라는 class가 만들어져 있다. 

Ex라는 class는 MonoBehaviour라는 class에서 상속되었다.

MonoBehaviour 클래스는 기본적으로 모든 Unity 스크립트가 파생되는 기본 클래스입니다. Unity의 프로젝트 창에서 C# 스크립트를 생성하면 MonoBehaviour에서 자동으로 상속되며, 템플릿 스크립트를 제공합니다. MonoBehaviour 클래스는 에디터에서 게임 오브젝트에 스크립트를 연결할 수 있는 프레임워크를 제공할 뿐만 아니라, 시작  업데이트 등과 같은 유용한 이벤트에 대한 연결을 제공합니다.

MonoBehaviour 클래스를 사용하면 코루틴을 시작, 중지 및 관리할 수 ​​있습니다. 코루틴은 특정 시간 동안 기다리거나 특정 작업이 완료될 때까지 기다리면서 다른 코드가 계속 실행되도록 해주는 비동기 코드 작성 방식입니다.

Ex class는 내부에 Start()와 Update()라는 이벤트 함수가 보인다. 이벤트 함수란 특정 상화에서 유니티엔진이 자동으로 호출해주는 함수이다.

이벤트

MonoBehaviour 클래스는 대규모 이벤트 메시지 컬렉션에 대한 액세스를 제공하며, 이를 통해 현재 프로젝트에서 발생하는 상황에 따라 코드를 실행할 수 있습니다. 다음은 일반적인 몇 가지 예입니다. 전체 리스트는 MonoBehaviour 스크립트 레퍼런스 페이지 Messages 섹션을 참조하십시오.

Start - 게임 오브젝트가 존재하기 시작할 때 호출됩니다(씬이 로드될 때 또는 게임 오브젝트가 인스턴스화될 때 호출).

Update - 프레임마다 호출됩니다.

FixedUpdate - 물리 타임스텝마다 호출됩니다.

OnBecameVisible  OnBecameInvisible - 게임 오브젝트의 렌더러가 카메라의 뷰에 들어오거나 나갈 때 호출됩니다.

OnCollisionEnter  OnTriggerEnter - 물리 충돌 또는 트리거가 발생할 때 호출됩니다.

OnDestroy - 게임 오브젝트가 파괴될 때 호출됩니다.

좀더 자세한 생명주기는 다음과 같은데 지금은 어렵고 나중에 필요할때 읽어도 될것 같다.

스크립트 라이프사이클 플로우차트

참고: 일부 브라우저에서는 SVG 이미지 파일을 지원하지 않습니다. 위 이미지가 올바르게 표시되지 않는 경우(예를 들어 텍스트가 보이지 않는 경우) Google Chrome 또는 Mozilla Firefox 등 다른 브라우저를 사용해 보십시오.

 

첫 번째 씬 로드

다음 함수는 씬이 시작할 때(씬에서 오브젝트마다 한 번) 호출됩니다.

  • Awake: 이 함수는 항상 Start 함수 전에 호출되며 프리팹이 인스턴스화 된 직후에 호출됩니다. 게임 오브젝트가 시작하는 동안 비활성 상태인 경우 Awake 함수는 활성화될 때까지 호출되지 않습니다.
  • OnEnable: (오브젝트가 활성화된 경우에만): 오브젝트 활성화 직후 이 함수를 호출합니다. 레벨이 로드되거나 스크립트 컴포넌트를 포함한 게임 오브젝트가 인스턴스화될 때와 같이 MonoBehaviour를 생성할 때 이렇게 할 수 있습니다.

씬에 추가된 모든 오브젝트에 대해 Start, Update 등 이전에 호출된 모든 스크립트를 위한 Awake 및 OnEnable 함수가 호출됩니다. 따라서 게임플레이 도중 오브젝트를 인스턴스화될 때는 실행되지 않습니다.

 

에디터

  • Reset: 오브젝트에 처음 연결하거나 Reset 커맨드를 사용할 때 스크립트의 프로퍼티를 초기화하기 위해 Reset을 호출합니다.
  • OnValidate: OnValidate는 오브젝트가 역직렬화될 때를 포함하여 스크립트의 프로퍼티가 설정될 때마다 호출되며, 이는 에디터에서 씬을 열 때와 도메인을 다시 로드한 후와 같이 다양한 시기에 발생할 수 있습니다.

 

첫 번째 프레임 업데이트 전에

  • Start: 스크립트 인스턴스가 활성화된 경우에만 첫 번째 프레임 업데이트 전에 호출됩니다.

씬 에셋에 포함된 모든 오브젝트에 대해 Update 등 이전에 호출된 모든 스크립트를 위한 Start 함수가 호출됩니다. 따라서 게임플레이 도중 오브젝트를 인스턴스화될 때는 실행되지 않습니다.

 

프레임 사이

  • OnApplicationPause: 이 함수는 일시 정지가 감지된 프레임의 끝, 실질적으로는 일반 프레임 업데이트 사이에 호출됩니다. 게임에 일시정지 상태를 가리키는 그래픽스를 표시하도록 OnApplicationPause 가 호출된 후에 한 프레임이 추가로 실행됩니다.

 

업데이트 순서

게임 로직, 상호작용, 애니메이션, 카메라 포지션의 트랙을 유지할 때, 사용 가능한 몇몇 다른 이벤트가 존재합니다. 일반적인 패턴은 Update 함수에 대부분의 작업을 수행하는 것이지만, 사용할 수 있는 다른 함수도 있습니다.

  • FixedUpdate: FixedUpdate 는 종종 Update 보다 더 자주 호출됩니다. 프레임 속도가 낮은 경우 프레임당 여러 번 호출될 수 있으며 프레임 속도가 높은 경우 프레임 사이에 호출되지 않을 수 있습니다. 모든 물리 계산 및 업데이트는 FixedUpdate 후 즉시 발생합니다. FixedUpdate 의 움직임 계산을 적용할 때 Time.deltaTime 만큼 값을 곱할 필요가 없습니다. FixedUpdate 가 프레임 속도와 관계없이 신뢰할 수있는 타이머에서 호출되기 때문입니다.
  • Update: Update 는 프레임당 한 번 호출됩니다. 프레임 업데이트를 위한 주요 작업 함수입니다.
  • LateUpdate: LateUpdate  Update 가 끝난 후 프레임당 한 번 호출됩니다. Update 에서 수행된 모든 계산은 LateUpdate 가 시작할 때 완료됩니다. LateUpdate 는 일반적으로 다음의 3인칭 카메라에 사용합니다. 캐릭터를 움직이고 Update 로 방향을 바꾸게 하는 경우 LateUpdate 에서 모든 카메라 움직임과 로테이션 계산을 수행할 수 있습니다. 이렇게 하면 카메라가 포지션을 추적하기 전에 캐릭터가 완전히 움직였는지 확인할 수 있습니다.

일반적으로 순서가 명시적으로 문서화되거나 설정 가능한 경우를 제외하고, 다른 게임 오브젝트에 대해 동일한 이벤트 함수가 호출되는 순서를 사용해서는 안 됩니다. (플레이어 루프를 보다 세세하게 제어해야 하는 경우 PlayerLoop API를 사용할 수 있습니다.)

동일한 MonoBehaviour 서브 클래스의 다른 인스턴스에 대해 이벤트 함수가 호출되는 순서를 지정할 수 없습니다. 예를 들어 한 MonoBehaviour의 Update 함수는 다른 게임 오브젝트(해당 부모 또는 자식 게임 오브젝트 포함)의 동일한 MonoBehaviour에 대해 Update 함수 전후에 호출될 수 있습니다.

한 MonoBehaviour 서브 클래스의 이벤트 함수가 다른 서브 클래스의 이벤트 함수 전에 호출되도록 지정할 수 있습니다(Project Settings 창의 Script Execution Order 패널 사용). 예를 들어 두 개의 스크립트(EngineBehaviour, SteeringBehaviour)가 있는 경우 EngineBehaviour가 항상 SteeringBehaviour 전에 업데이트되도록 스크립트 실행 순서를 설정할 수 있습니다.

 

애니메이션 업데이트 루프

Unity가 애니메이션 시스템을 평가할 때 이러한 함수와 프로파일러 마커가 호출됩니다.

  • OnStateMachineEnter: State Machine Update 단계 동안 컨트롤러의 상태 머신이 엔트리 상태를 통과하는 전환을 만들 때 이 콜백이 첫 번째 업데이트 프레임에 대해 호출됩니다. StateMachine 하위 상태에 대한 전환의 경우에는 호출되지 않습니다.

    이 콜백은 Controller 컴포넌트(예: AnimatorController 또는 AnimatorOverrideController 또는 AnimatorControllerPlayable)가 애니메이션 그래프에 있을 때에만 발생합니다.

    참고: 이 콜백을 StateMachineBehaviour 컴포넌트에 추가하면 멀티스레드 상태 머신 평가가 비활성화됩니다.
  • OnStateMachineExit: State Machine Update 단계 동안 컨트롤러의 상태 머신이 종료 상태를 통과하는 전환을 만들 때 이 콜백이 마지막 업데이트 프레임에 대해 호출됩니다. StateMachine 하위 상태에 대한 전환의 경우에는 호출되지 않습니다.

    이 콜백은 Controller 컴포넌트(예: AnimaorController 또는 AnimatorOverrideController 또는 AnimatorControllerPlayable)가 애니메이션 그래프에 있을 때에만 발생합니다.

    참고: 이 콜백을 StateMachineBehaviour 컴포넌트에 추가하면 멀티스레드 상태 머신 평가가 비활성화됩니다.
  • Fire Animation Events: 마지막 업데이트 시간과 최신 업데이트 시간 사이에 샘플링된 모든 클립에서 모든 애니메이션 이벤트를 호출합니다.
  • StateMachineBehaviour (OnStateEnter/OnStateUpdate/OnStateExit): 레이어가 최대 3개의 활성 상태(현재 상태, 중단된 상태, 다음 상태)를 가질 수 있습니다. 이 함수는 OnStateEnter, OnStateUpdate 또는 OnStateExit 콜백을 정의하는 StateMachineBehaviour 컴포넌트가 포함된 각 활성 상태에 대해 호출됩니다.

    제일 먼저 함수가 현재 상태에 대해 호출되고 중단된 상태에 대해 호출된 후 마지막으로 다음 상태에 대해 호출됩니다.

    이 단계는 Controller 컴포넌트(예: AnimatorController 또는 AnimatorOverrideController 또는 AnimatorControllerPlayable)가 애니메이션 그래프에 있을 때에만 발생합니다.
  • OnAnimatorMove: 업데이트 프레임마다 루트 모션을 수정할 수 있도록 각 Animator 컴포넌트에 대해 한 번 호출됩니다.
  • StateMachineBehaviour(OnStateMove): 이 콜백을 정의하는 StateMachineBehaviour가 포함된 각 활성 상태에 대해 호출됩니다.
  • OnAnimatorIK: 애니메이션 IK를 설정합니다. IK pass가 활성화된 각 애니메이터 컨트롤러 레이어에 대해 한 번 호출됩니다.

    휴머노이드 릭을 사용하는 경우에만 이 이벤트가 실행됩니다.
  • StateMachineBehaviour(OnStateIK): IK pass가 활성화되어 있는 레이어에서 이 콜백을 정의하는 StateMachineBehaviour 컴포넌트가 포함된 각 활성 상태에 대해 호출됩니다.
  • WriteProperties: 다른 모든 애니메이션화된 프로퍼티를 메인 스레드에서 씬에 작성합니다.

유용한 프로파일 마커

스크립트 라이프사이클 플로우차트에 표시된 일부 애니메이션 함수는 호출할 수 없는 이벤트 함수입니다. 즉, Unity가 애니메이션을 처리할 때 호출되는 내부 함수입니다.

이 함수에는 프로파일 마커가 있으므로 프로파일러를 사용하여 프레임에서 Unity가 호출하는 시간을 확인할 수 있습니다. Unity가 이러한 함수를 호출하는 시간을 알면 호출한 이벤트 함수가 실행된 시간을 정확하게 파악하는 데 도움이 됩니다.

예를 들어 FireAnimationEvents 콜백에서 Animator.Play를 호출한다고 가정해 보겠습니다. State Machine Update  Process Graph 함수가 실행된 후에 FireAnimationEvents 콜백이 발동했다는 사실을 알면 애니메이션 클립이 즉시 재생되는 것이 아니라 다음 프레임에서 재생된다는 것을 예측할 수 있습니다.

  • State Machine Update: 이 단계에서 모든 상태 머신이 실행 시퀀스대로 평가됩니다. 이 단계는 Controller 컴포넌트(예: AnimatorController 또는 AnimatorOverrideController 또는 AnimatorControllerPlayable)가 애니메이션 그래프에 있을 때에만 발생합니다.

    참고: 상태 머신 평가는 대개 멀티스레드이지만, 특정 콜백(예: OnStateMachineEnter  OnStateMachineExit)을 추가하면 멀티스레딩이 비활성화됩니다. 자세한 내용은 위의 애니메이션 업데이트 루프를 참조하십시오.
  • ProcessGraph: 모든 애니메이션 그래프를 평가합니다. 여기에는 평가할 모든 애니메이션 클립에 대한 샘플링과 루트 모션 계산이 포함됩니다.
  • ProcessAnimation: 애니메이션 그래프의 결과를 블렌딩합니다.
  • WriteTransforms: 모든 애니메이션화된 트랜스폼을 워커 스레드에서 씬에 작성합니다.

    IK pass가 활성화된 여러 개의 레이어가 있는 휴머노이드 릭은 여러 개의 WriteTransforms 패스를 가질 수 있습니다(스크립트 라이프사이클 플로우차트 참조).

 

렌더링

  • OnPreCull: 카메라가 씬을 컬링하기 전에 호출됩니다. 컬링은 어떤 오브젝트를 카메라에 표시할지 결정합니다. OnPreCull은 컬링 발생 직전에 호출됩니다.
  • OnBecameVisible/OnBecameInvisible: 오브젝트가 카메라에 표시되거나/표시되지 않을 때 호출됩니다.
  • OnWillRenderObject: 오브젝트가 표시되면 각 카메라에 한 번 호출됩니다.
  • OnPreRender: 카메라가 씬 렌더링을 시작하기 전에 호출됩니다.
  • OnRenderObject: 모든 일반 씬 렌더링이 처리된 후 호출됩니다. 이 때 커스텀 지오메트리를 그리는 데에 GL 클래스 또는 Graphics.DrawMeshNow를 사용할 수 있습니다.
  • OnPostRender: 카메라가 씬 렌더링을 마친 후 호출됩니다.
  • OnRenderImage: 씬 렌더링이 완료된 후 호출되어 이미지의 포스트 프로세싱이 가능합니다. 포스트 프로세싱 효과를 참고하십시오.
  • OnGUI: GUI 이벤트에 따라 프레임당 여러 번 호출됩니다. 레이아웃 및 리페인트 이벤트는 우선 처리되며 각 입력 이벤트에 대해 레이아웃 및 키보드/마우스 이벤트가 다음으로 처리됩니다.
  • OnDrawGizmos: 시각화 목적으로 씬 뷰에 기즈모를 그릴 때 사용됩니다.

참고: 이러한 콜백은 빌트인 렌더 파이프라인에서만 작동합니다.

 

코루틴

일반적인 코루틴 업데이트는 Update 함수가 반환된 후 실행됩니다. 코루틴은 주어진 YieldInstruction이 완료될 때까지 실행을 중단(양보)할 수 있는 함수입니다. 코루틴의 다른 사용법은 다음과 같습니다.

  • yield 코루틴은 모든 Update 함수가 다음 프레임에 호출된 후 계속됩니다.
  • yield WaitForSeconds 지정한 시간이 지난 후, 모든 Update 함수가 프레임에 호출된 후 계속됩니다.
  • yield WaitForFixedUpdate 모든 FixedUpdate가 모든 스크립트에 호출된 후 계속됩니다. FixedUpdate 전에 코루틴이 양보하면 현재 프레임의 FixedUpdate 이후에 재개합니다.
  • yield WWW WWW 다운로드가 완료된 후 계속됩니다.
  • yield StartCoroutine 코루틴을 연결하고 MyFunc 코루틴이 먼저 완료되기를 기다립니다.

 

오브젝트를 파괴할 때

  • OnDestroy: 오브젝트 존재의 마지막 프레임에 대해 모든 프레임 업데이트를 마친 후 이 함수가 호출됩니다. 오브젝트는 Object.Destroy 또는 씬 종료에 대한 응답으로 파괴될 수 있습니다.

 

종료할 때

다음 함수는 씬의 활성화된 모든 오브젝트에서 호출됩니다.

  • OnApplicationQuit: 이 함수는 애플리케이션 종료 전 모든 게임 오브젝트에서 호출됩니다. 에디터에서 사용자가 플레이 모드를 중지할 때 호출됩니다.
  • OnDisable: 동작이 비활성화되거나 비활성 상태일 때 이 함수가 호출됩니다.

 

Models/Player폴더에서 Player를 하이라키로 끌어다 놓는다. 씬뷰에 끌어다 놓을 경우 Position을(0,0,0)으로 설정한다.

 

유니티 엔진의 개발방식

유니티는 컴포넌트 기반과 멀티스레드 기반의 DOTS  두가지 개발방식을 지원한다.

 

컴포넌트 기반의 개발방식

독립적인 기능 단위로 컴포넌트를 제작한 다음 필요한 기능을 조립하는 방식을 말한다. 블록조립같은 방식이고 컴포넌트의 재사용이 가능하고 높은 생산성이 장점인 개발 방법론이다.

 

 

 

 

게임에서 하늘을 표현하는 방식으로는 Skybox와 SkyDome이 있다. 먼저 Skybox는 카메라가 볼 수 있는 하늘의 여섯 방면의 이미지를  Cube 형태로 배치해 표현한다. 플레이어가 하늘 박스안에 들어가 있는 듯한 느낌이다. 반면 SkyDome은 돔 형태의 메시에 하늘의 이미지 텍스처를 입혀 구현한다.

 

스카이박스

Images>Material 폴더안에 우클릭 Create>material만든후 Skybox로 저장한다.

인스펙터의 Shader 콤보박스를 눌러 Skybox>6 Sided를 선택한다.

그럼 다음과 같이  6 Sided를 설정할수 있는 뷰가 뜨는데 오른쪽 네모에 아래 폴더에서 그림을 끌어다 놓는다.

스카이박스 적용

Window>Rendering>Lighting을 선택하면 라이팅뷰가 열린다. 상단에서 Environment탭을 선택하고 Skybox Material 속성에 지금 만든 Skybox 머티리얼을 끌어다 놓는다.

 

텍스트를 씬뷰의 하늘 영역에 직접 드래그드롭해도 된다.

멋진 씬뷰를 볼 수 있다.

 

프로시저럴 스카이박스

유니티를 처음 열었을때 적용된 하늘은 프로시저럴 스카이박스다. 기본값인 Default>Skybox는 여러가지 설정값을 수정할 수 없으므로 별도의 머터리얼을 만들어야 한다.

Image>Material 폴더에 새로운 머터리얼을 만들고 SkyboxPC로 저장한다. Shader 속성을 Skybox>Procedural로 수정한다.

그럼 여러가지 속성을 변경해보자

뷰밑에 프리뷰를 보면서 하면 쉽다.

Window>Render>Light>Environment탭에서 SkyboxPC를 적용후

하이라키에서 Directional Light를 선택한후 Y Rotation을 적당히하면 

Y Ratation을 돌려 태양이 보이게 한다.

게임뷰에 태양을 볼수 있다.

x Roation으로 태양을 아래로

 

큐브맵 스카이박스

큐브맵(Cubemap) 은 환경에 대한 반사를 나타내는 여섯 개의 사각형 텍스처 컬렉션입니다. 여섯 개의 사각형은 오브젝트를 둘러싸는 가상 큐브면을 형성합니다. 각각의 면은 월드 축의 방향을 따른 뷰를 나타냅니다 (위, 아래, 좌, 우, 앞, 뒤).

큐브맵은 오브젝트의 반사나 “주변 환경”을 캡처하는 데 사용됩니다. 예를 들어, skyboxes  environment reflections는 주로 큐브맵을 사용합니다.

 

큐브맵화된 스카이박스와 반사

텍스처에서 큐브맵(Cubemap)을 생성하는 방법

큐브맵을 생성하는 가장 빠른 방법은 특별히 레이아웃된 텍스처에서 임포트하는 것입니다. 프로젝트 창에서 Texture를 선택하고 인스펙터 창에서 Import Settings를 확인합니다. Import Settings에서 Texture Type  Default, Normal Map 또는 Single Channel 로 설정하고 Texture Shape  Cube 로 설정합니다. 그러면 텍스처가 자동으로 큐브맵으로 설정됩니다.

큐브맵 텍스처 임포트 타입

일반적으로 사용되는 큐브맵 레이아웃 몇 가지가 지원되고, 대부분의 경우 Unity에서 자동으로 인식됩니다.

수직 및 수평 교차 레이아웃과 큐브맵 면의 행과 열이 다음 그림과 같이 지원됩니다.

일반적으로 사용되는 다른 레이아웃으로는 LatLong(위도-경도로, 원통형이라고도 함)이 있습니다. 파노라마 이미지는 다음과 같이 이 레이아웃에 포함되는 경우가 많습니다.

SphereMap(구형 환경 맵) 이미지 역시 자주 사용됩니다.

기본적으로, Unity는 임포트된 텍스처의 종횡비를 고려하여 위의 레이아웃 중 가장 적합한 것을 선택합니다. 텍스처를 임포트하는 경우, 스카이박스와 반사에 사용될 수 있는 큐브맵이 생성됩니다.

Glossy Reflection 옵션은 반사 프로브에서 사용될 큐브맵 텍스처에 유용하게 사용할 수 있습니다. 이것은 평활도가 서로 다른 표면의 반사를 시뮬레이션하는 데 사용할 수 있는 특별한 방법(스페큘러 컨볼루션)으로 큐브맵 밉 레벨을 처리했습니다.

평활도가 다른 표면의 반사 프로브에 사용된 큐브맵

레거시 큐브맵 에셋

Unity는 서로 다른 여섯 개의 textures에서 큐브맵을 생성하는 기능도 지원합니다. 메뉴에서 Assets > Create > Legacy > Cubemap 을 선택해야 합니다. 그런 다음, 인스펙터에서 여섯 개의 텍스처를 각각 빈 슬롯에 드래그해야 합니다.

레거시 큐브맵 인스펙터

프로퍼티:기능:

Right..Back Slots 각각의 큐브맵 면에 해당하는 텍스처입니다.
Face Size 각각의 큐브맵 면의 픽셀 단위 너비 및 높이입니다. 텍스처는 이 크기에 맞게 자동으로 스케일됩니다.
Mipmap 밉맵이 생성되어야 하는지 여부입니다.
Linear 큐브맵이 리니어 색상을 사용해야 하는지 여부입니다.
Readable 큐브맵이 스크립트가 픽셀 데이터에 액세스할 수 있도록 할지 여부입니다.

위와 같이, 큐브맵을 생성하려면 큐브맵 텍스처 임포트 타입을 사용하는 것이 좋습니다(상단 참조). 이는 큐브맵 텍스처 데이터가 압축될 수 있게 하며, 에지 보정과 글로시 반사 컨볼루션을 가능하게 합니다. 또한, HDR 큐브맵도 지원됩니다.

기타 기법

다른 유용한 기법으로는, 큐브맵을 스크립트를 사용하여 Unity 씬의 콘텐츠에서 생성하는 방법이 있습니다.  Camera.RenderToCubemap 함수는 씬 내의 원하는 임의의 포지션에서 여섯 면의 이미지를 기록할 수 있습니다. 이 함수의 스크립트 레퍼런스 페이지에 있는 코드 예제를 사용하면 이 작업을 쉽게 수행할 수 있도록 하는 메뉴 커맨드를 추가할 수 있습니다.

 

파노라마 스카이박스

스카이박스를 생성하기 위해 파노라마 셰이더는 단일 텍스처를 씬 주위에 구체 모양으로 감쌉니다.

선행 조건 텍스처

파노라마 스카이박스를 생성하려면 다음과 같이 위도-경도(원통형) 매핑을 사용하는 단일 2D 텍스처가 있어야 합니다.

텍스처가 2D인지 확인하려면 다음 단계를 따르십시오.

  1. 프로젝트 창에서 텍스처를 선택합니다.
  2. 인스펙터에서 Texture Shape 2D로 설정되었는지 확인합니다.

최고의 주변광을 생성하려면 텍스처가 HDR(High Dynamic Range)을 사용해야 합니다.

프로퍼티

프로퍼티설명

Tint Color 스카이박스에 적용할 컬러입니다. Unity는 기본 텍스처 파일을 변경하지 않고 형상을 변경할 수 있도록 텍스처에 이 컬러를 추가합니다.
Exposure 스카이박스의 노출을 조정합니다. 이를 통해 스카이박스 텍스처에서 색조 값을 수정할 수 있습니다. 값이 클수록 노출이 증가하여 더 밝게 보이는 스카이박스를 생성하고, 값이 작을수록 노출이 감소하여 더 어둡게 보이는 스카이박스를 생성합니다.
Rotation 양의 y축을 중심으로 하는 스카이박스의 회전입니다. 이 설정은 스카이박스의 방향을 변경하며, 스카이박스의 특정 섹션을 씬의 특정 부분 뒤에 배치하려는 경우에 유용합니다.
Spherical (HDR) 이 머티리얼이 하늘을 표현하기 위해 씬 주위를 구체 모양으로 감싸는 텍스처입니다. 입력 텍스처에서 큐브맵 에셋을 생성하는 방법은 큐브맵 에셋을 참조하십시오.
Mapping 이 머티리얼이 스카이박스 생성 시 텍스처를 투사하기 위해 사용하는 방법을 지정합니다. 사용 가능한 옵션은 다음과 같습니다.6 sided: 텍스처를 스카이박스에 매핑하기 위해 그물망 형식을 사용합니다.Latitude Longitude Layout: 텍스처를 스카이박스에 매핑하기 위해 원통형 감싸기 방식을 사용합니다.
Image Type 이 머티리얼이 스카이박스를 투사하는 y축 주위의 각도를 지정합니다. 사용 가능한 옵션은 다음과 같습니다.180: 양의 z축 방향에 피크가 있는 반구 모양으로 Spherical 텍스처를 그립니다. 이 머티리얼이 텍스처를 그리는 씬의 면을 변경하려면 Rotation 프로퍼티를 수정하십시오. 기본적으로 스카이박스의 뒷면은 검은색이지만, 이 머티리얼은 대신 뒷면에 Spherical 텍스처의 복제본을 그릴 수 있습니다. 이렇게 하려면 Mirror on Back을 활성화하십시오.360: 전체 씬 주위를 감싸는 완전한 구체 모양으로 텍스처를 그립니다.
- Mirror on Back 머티리얼이 스카이박스 뒷면의 Spherical 텍스처를 검은색으로 그리지 않고 복제할지 여부를 지정합니다. 이 옵션은 Image Type 180으로 설정된 경우에만 나타납니다.
Render Queue Unity가 게임 오브젝트를 그리는 순서를 결정합니다. Render Queue에 대한 자세한 내용은 SL-SubShaderTags를 참조하십시오.
Double Sided Global Illumination 라이트매퍼가 전역 조명을 계산할 때 지오메트리의 양면을 고려할지 여부를 지정합니다. true이면 프로그레시브 라이트매퍼를 사용할 때 후면이 전면과 동일한 이미션과 알베도를 사용하여 광원을 반사합니다.

조명 소개

이 페이지에서는 Unity에서 조명이 작동하는 방식을 설명합니다.

Unity의 조명은 현실 세계에서 빛이 동작하는 방식을 근사화합니다. Unity는 광원의 동작에 대한 세밀한 모델을 사용하여 더욱 사실적인 결과를 구현하거나, 단순화된 모델을 사용하여 더욱 세련된 결과를 구현합니다.

직접 조명과 간접 조명

직접광은 방출되어 표면에 한 번 닿은 후 센서(예: 눈의 망막 또는 카메라)에 직접 반사되는 광원입니다. 간접광은 표면에 여러 번 닿는 광원, 스카이 라이트 등을 포함하여 궁극적으로 센서에 반사되는 다른 모든 광원입니다. 사실적인 조명 결과를 얻으려면 직접광과 간접광을 모두 시뮬레이션해야 합니다.

Unity는 직접 조명, 간접 조명 또는 둘 다를 계산할 수 있습니다. Unity가 사용하는 조명 기술은 프로젝트의 설정 방식에 따라 다릅니다.

실시간 조명과 베이크된 조명

실시간 조명은 Unity가 런타임 시점에 계산하는 조명입니다. 베이크된 조명은 Unity가 조명 계산을 미리 수행하고 결과를 조명 데이터로 저장한 후 런타임 시점에 적용되는 조명입니다. Unity에서 프로젝트는 실시간 조명, 베이크된 조명, 또는 이 두 가지의 조합(혼합 조명)을 사용할 수 있습니다.

실시간 조명, 베이크된 조명, 혼합 조명을 제공하기 위한 Light 컴포넌트의 설정 방법은 광원 모드를 참조하십시오.

전역 조명

전역 조명은 직접 조명과 간접 조명을 모두 모델링하여 사실적인 조명 결과를 제공하는 기술 그룹입니다. Unity에는 직접 조명과 간접 조명을 결합하는 두 가지 전역 조명 시스템이 있습니다.

베이크된 전역 조명 시스템은 라이트매핑, 라이트 프로브, 반사 프로브로 이루어져 있습니다. 모든 렌더 파이프라인은 베이크된 전역 조명 시스템을 지원합니다. 베이크된 전역 조명 시스템의 각 기능에 대한 렌더 파이프라인 지원은 해당 기능에 대한 문서에 나와 있습니다.

실시간 전역 조명 시스템은 인라이튼을 사용하는 실시간 전역 조명으로 이루어져 있으며 라이트 프로브에 기능을 추가합니다. 빌트인 렌더 파이프라인은 실시간 전역 조명을 지원합니다. 고해상도 렌더 파이프라인(HDRP)과 유니버설 렌더 파이프라인(URP)은 실시간 전역 조명 시스템을 지원하지 않습니다. 인라이튼은 지원이 중단되었으며, 실시간 전역 조명 시스템은 Unity에서 곧 제거될 예정입니다. 자세한 내용은 Unity 블로그를 참조하십시오.

 

씬을 새로만들면 Directional Light가 기본으로 생성되지만,  필요에 따라 Point, Spot, Area Light를 추가할수 있다.

GameObject>Light로 조명을 생성할수 있다.

Light가 추가하면 그만큼 렌더링 계산이 늘어나기때문에 부하가 늘어날 수밖에 없다. 따라서 시각적인효과와 게임수행속도 사이의 균형을 맞추는데 신경써야한다.

유니티는 게임 속도를 저하하지 않고 실시간 조명의 효과를 낼 수 있는 라이트매핑및 라이트 프로브 기능을 제공한다.

 

실시간 라이트매핑 기능

유니티는 백그라운드로 라이트맵을 베이킹할 수 있는 기능이 있다. 개발중에 조명의 효과를 볼 수 있어 반복적인 작업에 매우 편리하다. 메뉴에서 Window>Rendering>Lighting 을 선택하면 라이팅뷰가 열린다.

 

Lighting Setting 에셋

라이팅뷰 New Lighting Settings버튼을 클릭해 에셋을 생성한다. 이름은 Play로 한다. Secenes폴더로 이동시킨다.

 

Auto Generate옵션

라이팅뷰 아래에 있는 오토제너레이션 옵션을 체크하면 실시간 라이트맵을 베이크한다. 아직은 라이트매핑을 위해 설정한 것이 없기때문에 문제가 되자 않지만 복잡해지면 에디터의 속도를 떨어트리는 원인이 된다. 

 

프리팹(Prefab)

사전적의미를 미리만들어 놓다는 뜻이다. 자주사용하는 객체를 부품처럼 만들어놓고 재사용할수 있다. 원본이 변경되면 자동으로 복사본들이 변경된다.

 

네스티드 프리팹

프리팹 하위에 프리팹을 추가할 수 있다.

OOP개념의 상속이 가능하다.

프리팹모드 기능으로 프리팹만 수정할 수 있는 별도의 인터페이스를 제공한다.

 

벽만들기

GameObject>3D Object>Cube를 선택해 씬뷰에 Cube모델을 생성후 이름을 Wall로 변경후 transform속성을 다음과 같이 변경. Position(0,3,0), Scale(50,6,1)

 

벽용 머터리얼제작

머터리얼을 하나만들어 Wall로 이름을 바꾼다. 모바일용이라면 부하를 줄이기위해 인스펙터뷰의 Shader속성을 클릭후 Mobile>Bumped Diffuse를 선택한다.

04.Image>Metal>Pattern 08>diffse텍스처를  Base슬롯으로 끌어다 연결한다. 

머터리얼을 wall에 적용한다.

타일링속성중 X를 10으로 한다

04.Image>Metal>Pattern 08>normal텍스처를 Wall>Shader컴포넌트의 Normalmap에 적용한다.

해보니 Shader가 모바일에서는 효과가 없고 Standard에서는 확실히 보였다.

Wall오브젝트를 끌어다 프로젝트의 Prefabs폴더에 넣는다.

Prefab은 하이라키뷰에서 파란색으로 표시된다.

 

Edit>ProjectSettings>Editor>Numbering Scheme에서 (1)에서 _1로 바꾼다.

 Wall을 Wall_1로 바꾼다.

Ctrl-D를 눌러 프리팹을 3개 복사한다.

 

스내핑기능

같은 위치에 4개의  Wall_1234가 있다.

wall_1이동시켜 Floor의 모서리에 붙일것이다. 이게 딱 떨어지게 하기 힘든데 스내핑기능을 사용할 거다.

툴바의 MoveTo를 선택한다.

 V를 누른후  Wall의 붙이고자하는 꼭지점을 잡고 Floor에 접근시키면 딱 붙게 된다.

이런식으로 wall2도 하고 wall3 4는 90로 회전시킨후 한다.

3D 모델에 텍스처를 적용하려면 머티리얼이라는 매개체가 필요하다. 머티리얼은 3D모델에 적용할 텍스처의 다양한 속성을 설정하는 역할을 한다. 텍스처의 재질, 반복간격, 표현방법등의 속성을 설정한다.

 

머티리얼의 자동 작용

diffuse 텍스처를 씬뷰나 하이라키뷰의 Floor에 끌어다 놓으면 자동으로 적용된다. 대신 diffuse텍스처가 있던 폴더에 자동으로 Material이라는 폴더가 생기고 그안에 머터리얼이 자동생성된다.

Floor를 선택하면 Inspedtor뷰에도 diffuse머터리얼이 적용되여 있는걸 볼수 있다.

이렇게 하면 편해보이지만 머티리얼 폴더및 파일이 여기저기 생겨 관리가 어렵다 새로생긴 머터리얼 폴더를 지우자. 그럼  Floor오브젝트가 분홍색으로 변경되어 오브젝트에 적용된 머터리얼이 끊긴걸 나타낸다

머터리얼 생성

Images폴더에 Materials폴더를 만들고 들어가 우클릭후 Create>Materal로 객체를 만들고 이름을 Floor로 바꾼다.

이후 인스펙터 우상 열쇠를 잠구고 Pattern10폴더의 diffuse를 끌어다 Albedo 왼쪽박스에 놓고 Normal을 Normal Map 왼쪽에 놓는다.다른곳에는 안들어 간다.   

Albedo왼쪽 동그라미를 누르면 텍스처를 선택할 수 있는 팝업창이 나와 선택할 수도 있다.

 

머터리얼 적용방법

완성된 머터리얼을 Floor 게임오브젝트에  끌어다 적용한다. 실제적으로는 Floor게임오브젝트의 Mesh Renderer  컴포넌트의 Materials 속성에 Floor머터리얼이 연결된 것이다.

 

Mesh Filter, Mesh Rendere 컴포넌트

Mesh Filter는 해당모델의 3차원 형상정보인 메시 데이터를 갖고 있고, 이 메시 데이터를 토대로 화면에 렌더링 처리를 하는 컴포넌트가 Mesh Rendere다.

 

타일링 속성

텍스처를 타일처럼 반복시키는 기능이 타일링 속성이다. 머터리얼의 인스펙터뷰의 Emission의 타일링 속성을 (10,10)으로 바꿔보자. Secondary Maps에서 타일링속성이 있지만 이건 특정부분을 세밀하게 표현하기 위한 영역이다.

셰이더및 물리 기반 셰이딩

Shader는 렌더링할 때 픽셀의 농담, 색조, 명암을 결정하는 프로그래밍 방식을 말한다. 쉽게 쓴다면 화면에 텍스처를 표현할때 재질감 또는 효과를 표현하는 기능이다. 세이더는 많은 지식을 요구한다.

유니티는 손쉽게 사용할수 있는 내장 쉐이더를 제공한다. 유니티는 여러가지 재질감을 하나의 쉐이더에서 표현할 수 있게 설계되어 있다. 

유니티의 기본쉐이더인 Standard 쉐이더는 물리기반 쉐이딩을 위해 다양한 옵션을 제공한다. 이 가운데 몇가지 중요한 머터리얼 파라미터는 다음과 같다.

 

렌더링모드

OPaque(불투명), Cutout(그물망표현), Fade(페이드인/아웃), Transparent(투명)의 네가지 설정을 통해 다양한 재질감을 표현할 수 있다.

 

알베도

빛을 반사하는 정도를 말하며, 반사율이라고 한다. 모든 물체는 고유의 빛반사율을 가진 것에서 착안했다. 가장 기본이 되는 텍스처를 연결하는 속성이다.

 

메탈릭속성

객체표면에 금속의 재질을 표현하기 위한 텍스처다. 1에 가까워질수록 금속에 가깝다.

 

노멀맵

3D모델링이 표면의 세밀한 입체감이나 질감을 표현하기 위해 많은 폴리곤을 소모하는걸 막기위한 텍스처의 일종, 텍스처의 엠보싱/음영 효과를 이용.

 

높이맵/ 하이트맵 (Height Map)

노멀맵과 비슷하나 텍스처로 높낮이를 표현하는 것이다. 좀 더 돌출시켜 사물을 가리는(Occlusion)효과를 낼 수 있다.

 

가려지는/오클루전(Occulusion)

흑백의 텍스처로 간접조명에  의해 생기는 명암을 더욱더 뚜렷이 표시해 사물의 입체감과 싶이감을 살리는데 사용. 일반적으로 3D 모델링툴 또는 서드파티툴에서 추출.

 

방출/이미션(Emission)

스스로 빛을 방출하는 속성.

 

디테일 마스크

Secondary Maps에 적용할 마스크를 설정하는 텍스처 슬롯이다.특정부분만 좀 더 세부적인 텍스처를 표현할때 사용한다.

텍스처란 3D모델의 표면에 매핑시킬 이미지 파일을 지칭한다. 3D모델에 입힐 옷이다.

유니티는 다양한 포맷의 이미지파일을 지원하며 크기는 2n승 형태(256x256, 1024x1024)일때 압축을 지원하며 속도가 빠르다.

프로젝트의 Metal Textures pack>Pattern10>diffuse를 선택한후

inspector창에서 Max Size를 1024에서 512로 변경하면 용량을 74%줄일수 있다.

+ Recent posts