멋사교육

멋쟁이사자처럼부트캠프 유니티 게임 개발 5기 9일차

나른한여우 2025. 5. 25. 22:10
  • 유니티 C#

유니티 C#

GetAxis(), GetAxisRaw(), LookAt함수와 normalized

 //부드럽게 증감하는 값 -1 ~ 1
 float h = Input.GetAxis("Horizontal");
 float v = Input.GetAxis("Vertical");

 //딱 떨어지는 값 -1, 0, 1
 //float h = Input.GetAxisRaw("Horizontal");
 //float v = Input.GetAxisRaw("Vertical");

 //                        x  y  z
 Vector3 dir = new Vector3(h, 0, v);
 //nomalized 1, 1, 0.71
 Vector3 normalDir = dir.normalized; // 정규화 과정 (0~1)

 //Debug.Log($"현재 입력 : {dir}");

 transform.position += normalDir * moveSpeed * Time.deltaTime;

 //회전 기능
 //      바라보는 기능   현재 위치         방향
 transform.LookAt(transform.position + normalDir);

 

캐릭터의 움직임에 있어서 GetAxis()GetAxisRaw() 적용시 GetAxis의 경우 움직임에 스무딩처리가 되어 입력값이 부드럽게 변한다. 키를 누르면 0에서 1로 서서히 변화하는걸 볼 수 있음. GetAxisRaw는 스무딩처리 없이 입력값이 즉시 반영되어 캐릭터가 즉시 움직인다. 키를 누르면 바로 1이되고 떼면 바로 0으로 변함

 

GetAxis() 사용 :

  • 부드러운 캐릭터 이동
  • 카메라 회전
  • 아날로그 스틱 같은 느낌이 필요할 때

GetAxisRaw() 사용 :

  • UI 메뉴 탐색 (위/아래/좌/우)
  • 턴제 게임에서의 이동
  • 정확한 입력 타이밍이 중요한 경우
  • 2D 플랫포머에서 점프나 대시 같은 즉시 반응이 필요한 액션

normalized정규화의 경우 벡터의 방향은 유지하면서 크기를 1로 만드는 과정

캐릭터가 움직일때 w, d를 같이 눌러 서로 1과 1의 값을 입력받았을때 대각선으로의 움직임이 1보다 더 빠른것을 볼수있는데 normalized 정규화를 적용하게되면 입력값 정규화로 대각선 이동 시에도 속도를 1로 일정하게 유지시켜줌

 

정규화방향은 보존하고 크기만 통일하고 싶을 때 사용하는 핵심 개념!

 

LookAt함수는 오브젝트가 특정 대상을 바라보도록 회전시키는 함수. 오브젝트의 forward방향(Z축)이 타켓을 향하도록 회전시킨다.

 transform.LookAt(transform.position + normalDir);

 

매개변수에 현재위치에 방향을 더해 캐릭터가 움직이는 방향을 바라보도록 하는 코드

 

터렛에 LookAt함수 적용

터렛을 만들어 오브젝트를 바라보도록 하는 실습

 

터렛의 머리가 targetTf를 따라가도록 LookAt함수에 매개변수로 targetTf를 넣어주고 타이머 기능을 넣어 Instantiate로 생성되는 총알이 타이머가 cooldwantTime에 도달했을때마다 생성되게 해줌

생성되는 총알은 firePos 변수를 만들어 터렛의 머리앞부분쪽에 넣어줘 그 위치에서 총알이 나오게 만듬

//타켓을 하기위해선 transform을 추적하기때문에 변수도 transform타입으로 만들어주는게 나름 괜찮다.
public Transform targetTf;
public Transform turretHead;

public GameObject bulletPrefab; // 총알 프리팹
public Transform firePos; // 발사 위치

public float timer;
public float cooldownTime;

void Start() // 무엇인가를 세팅하는 기능
{
    //targetTf가 Transform타입이기때문에 마지막에 transform을 붙여준다.
    targetTf = GameObject.FindGameObjectWithTag("Player").transform.GetChild(0);
}

void Update() // 무언가를 바라보는 기능
{
    turretHead.LookAt(targetTf);

    //타이머 기능
    timer += Time.deltaTime;
    //현재 타이머가 쿨다운 시간보다 커졌다면
    if(timer >= cooldownTime) 
    {
        //타이머는 계속 1초씩 늘어나고 cooldownTime에 도달했을때 타이머를 0으로 바꾸고 생성한다.
        timer = 0f;
        //생성함수 Instantiate 총알 생성
        //           생성 대상         생성 위치           회전상태
        Instantiate(bulletPrefab, firePos.position, firePos.rotation);
    }
}

 

유니티 에디터에서 보는 Turret의 스크립트 오브젝트

 

생성된 총알이 앞으로 나아가게 만드는 코드

 //                     vector3를 쓰게되면 월드상의 정면
 //transform.position += Vector3.forward * bulletSpeed * Time.deltaTime;
 //                     자기자신의 포워드
 transform.position += transform.forward * bulletSpeed * Time.deltaTime;

 

실습과정에서 캐릭터의 생성과 캐릭터의 태그를 찾아 게임오브젝트에 넣어주는 코드가 둘다 start()에 들어있어 실행 순서에 문제가있었는데 Awake함수와 start함수로 구분해서 코드를 넣어줌 실행순서는 Awake함수가 가장 먼저 시작되어 캐릭터 생성을 Awake함수에 넣고 태그를 찾는 코드를 start함수에 넣어 순서를 정렬해줌

 

대표적으로는 GameManager라는 스크립트를 만들고 여기서 Awake함수를 사용해 대부분의 세팅을 잡는다. 만약 스크립트 여러개에서 Awake함수를 사용한다면 오류가 발생할 수 있기때문에 나머지 서브스크립트를 비활성화 해두고 가장 먼저 실행될 Main의 Awake함수가 끝나면 순차적으로 스크립트를 활성화시켜 나머지 Awake함수를 실행하는 방식을 사용하기도 한다.

 

마지막으로 무료 에셋인 Planets of the Solar System 3D라는 태양계를 표현해주는 에셋을 받아 자전과 공전을 구현하는 코드를 생성함

 

자전을 표현할때는 Rotate함수를 사용해 Vector3.up을 회전축을 지정해주고 자전 속도를 정해준다.

공전을 표현할때는 RotateAround함수를 사용해 특정 점을 중심으로 오브젝트를 회전시켜준다. 매개변수로 중심점과 회전축, 속도를 넣어 표현함 아래 코드에서는 targetPlanet.position으로 중심점을 잡고 Vector3.up은 회전축, revolutionSpeed로 속도를 잡아줌

public Transform targetPlanet;

public float rotSpeed = 30f; // 자전 속도

public float revolutionSpeed = 100f; // 공전 속도

public bool isRevolution = false;

void Update()
{
    //자기 자신이 회전하는 기능
    transform.Rotate(Vector3.up * rotSpeed * Time.deltaTime);

    if (isRevolution == true)
    {
        //공전하는 기능
        //                        어떤 대상 목표(Vector3)        회전축(Vector3)          속도(float)
        transform.RotateAround(targetPlanet.position, Vector3.up, revolutionSpeed * Time.deltaTime);
    }
}

 

 

태양계의 자전과 공전 표현

 

교육시간에 강사님이 게임수학에 대해서도 많이 얘기를 해주셨는데 자주 사용되는 제곱, 제곱근, 로그, 루트, 거속시, 미적분, 원주율, 호도법 Radian, 벡터의 내적을 활용한 시야각 연산과 몬스터 ai의 fsm등 알려주셨다. 게임 수학에 관한 내용은 따로 공부해 정리할 예정