[Unity] 8. SkyBox & Translate

치치·2025년 2월 26일

Unity

목록 보기
10/27
post-thumbnail

SkyBox란?

  • 스카이박스(Skybox)는 3D 씬의 하늘과 배경을 나타내는 컴포넌트이다

  • 씬의 전체 배경을 이미지 또는 텍스처로 쉽게 설정할 수 있다

  • 정육면체 도면이 카메라를 감싼듯한 느낌으로 360도 어딜 보든 다 보인다

  • 씬 창에서 바로 드래그 하거나, Window -> Rendering -> Lighting - >Environment에서 설정 가능



Fake Interior Shader (페이크 인테리어 셰이더)

  • 가짜로 실내를 만들때 쓰는 셰이더이다
  • 예를 들면, 게임에서 건물을 표현할때, 건물 창문 하나하나 마다 안에 꾸며져 있을텐데, 이를 실제 게임 오브젝트로 다 배치하게 되면 렌더링이 과하게 많이 들어갈 것이다
    -> 이를 해결하기 위해 '페이크 인테리어 셰이더'를 쓴다

참고: https://chulin28ho.tistory.com/522



방향키 입력받기 (WASD & 방향키)

  • Input Manager는 게임에서 사용자 입력을 관리하는 시스템이다

  • Input Manager 를 살펴보면 HorizontalVertical이 유니티 내에서 수치가 미리 지정이 되어있다

  • 움직임 제어에 대해 사용할 것이니 실제 GetAxis()함수를 사용해보자


이동하는법

P = P0 + vt

  • P : 다음으로 이동할 위치
  • P0 : 현재위치
  • vt : (벡터) 방향 * t (시간)

앞 시간에서 사용한 Vector3()로 값을 지정한 방식은 Vector3가 구조체이기 때문에
위치값을 변경하려면 transform.position을 사용했어야했다

  • 이게 무슨 말이냐?
    -> Vector3가 구조체이기 때문에 Vector3의 값을 직접 수정하려면 transform.position과 같은 참조를 통해 접근하여야 한다는 의미



GetAxis()

  • 연속적인 입력값을 처리할때 사용된다

  • 값은 float형식으로 반환되며 -1 ~ 1 사이의 값을 가진다

  • 현재 위치에 입력받아서 호출된 GetAxis가 반환하는 값을 더해주면 된다



GetAxis() GetAxisRaw() 차이점

GetAxis : 입력 값이 부드럽게 변화한다. 값이 서서히 증가하고 서서히 감소한다
-> 그래서 묘하게 멈출때 밀리는 현상이 있다 (잔여값이 남아있어서)

GetAxisRaw : 값이 -1, 0, 1로만 반환된다. 부드러운 변화가 아닌 값이 즉각적으로 변한다


FPS 맞추기

FPS (Frames Per Second) : 초당 프레임 수

  • 만약, FPS가 높을수록 객체의 움직임이 빠르고, FPS가 낮을수록 객체의 움직임이 느리다면
    게임이 공정하게 진행될 수 없다
    -> 이를 위해, 프레임 속도와 관계없이 객체가 일정한 속도로 움직이거나 회전하게 만들어주는 Time.deltaTime

  • ex) 서로 다른 FPS여도 동일한 속도로 실행된다



Normalize() 벡터의 정규화

  • 벡터의 정규화란? 벡터의 크기를 1로 만드는 과정

  • Vector3.Normalize(); 로 사용

  • 크기를 일정하게 유지하고 싶을때 사용된다

  • ex) 게임 오브젝트를 키 입력을 받아 이동시키고 싶은데 x축이 1만큼 z축이 1만큼 움직일때, y축의 움직임이 묘하게 조금 더 빠르다 (벡터 정규화를 하지 않았기에 실제 값이 1보다 큰것)
    -> 모든 방향의 속도가 일정하지 않다

  • 아래의 그림 '피타고라스의 정리'



Translate 전체 코드

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

public class AirCrapt : MonoBehaviour
{
    [SerializeField] Vector3 direction;

    [SerializeField] float speed;

    void Update()
    {
        direction.x = Input.GetAxisRaw("Horizontal");
        direction.z = Input.GetAxisRaw("Vertical");

        // Time.deltaTime
        // 마지막 프레임이 완료된 후 경과한 시간입니다.
        
        // 벡터의 정규화
        direction.Normalize();

        transform.position = transform.position + direction * Time.deltaTime * speed;
    }
}


결과물

profile
뉴비 개발자

0개의 댓글