Unity 기초
유니티는 에디터에서 주로 C#을 사용함.
엔진에서 기본으로 제공하는 기능 이외에 필요한 것들은 C#을 사용해 스크립트라고 부르는 파일을 만들어 구현함.
게임 오브젝트
캐릭터, 배경, 텍스트, 및, 조명 등 게임을 구성하는 요소. 오브젝트는 여러 컴포넌트의 집합체이고 이것들이 모여 하나의 Scene을 구성함.
프리팹
프리팹은 게임 오브젝트를 재사용 가능한 형태로 미리 만들어 두는 것을 의미함. 이는 웹 개발 혹은 다른 개발에서 공용 컴포넌트와 유사하게 해석됨. 프리팹을 만들고 해당 프리팹을 기반으로 여러 오브젝트를 생성하면 프리팹만 변경했을 때 모든 오브젝트가 해당 프리팹의 변경 사항을 반영함.
예를들어 웹개발에서 기본 차트를 구현해두고 해당 차트에 들어갈 데이터만 인자로 받아서 넣는 그런 형태와 유사하다고 이해했음.
Animator
오브젝트를 애니메이션화 해주는 컴포넌트. 오브젝트가 어떤식으로 움직여야 하는지 플로우 차트 형태로 이를 정의함.
아래는 Idle 과 Walk 상태를 관리하기 위한 애니메이터의 플로우차트임.
Walk와 Idle을 눌러보면 오른쪽 Inspector 창에서 Transitions 항목을 통해 변수를 제어할 수 있다.
변수를 여기서 왜 제어함?
특정 애니메이션이 작동 중일 때, 예를들어 캐릭터가 이동 중일 때 특정 기능이 실행되어야 하거나, 다른 작업이 실행되어야 하거나 이런 상황이 발생했을 때를 위해 제어함.
예를들어 캐릭터가 이동중이라면 점프 높이가 높아진다던가 하는 세부 제어를 위해 사용함.
아래는 간단한 캐릭터 이동 스크립트임
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
public float turnSpeed = 20f;
Animator m_Animator;
Rigidbody m_Rigidbody;
Vector3 m_Movement;
Quaternion m_Rotation = Quaternion.identity;
void Start()
{
m_Animator = GetComponent<Animator>();
m_Rigidbody = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");
m_Movement.Set(horizontal, 0f, vertical);
m_Movement.Normalize();
bool hasHorizontalInput = !Mathf.Approximately(horizontal, 0f);
bool hasVerticalInput = !Mathf.Approximately(vertical, 0f);
bool isWalking = hasHorizontalInput || hasVerticalInput;
// 여기서 상태를 관리함. 키보드 입력이 감지되면 isWalking을 true로 만듬
m_Animator.SetBool("isWalking", isWalking);
Vector3 desiredForward = Vector3.RotateTowards(transform.forward, m_Movement, turnSpeed * Time.deltaTime, 0f);
m_Rotation = Quaternion.LookRotation(desiredForward);
}
// 이 함수는 유니티에서 미리 정의한 함수임.
// 이 함수는 Animator 컴포넌트를 통해 애니메이션을 업데이트할 때 호출되는 콜백 함수임.
// 특정 작업을 위해 예약된 이름이며 아래 함수에 로직을 작성하면 오버라이딩됨
// 즉 FixedUpdate 에서 isWalking을 업데이트 하면 아래 콜백 함수가 실행되는 구조임
void OnAnimatorMove()
{
m_Rigidbody.MovePosition(m_Rigidbody.position + m_Movement * m_Animator.deltaPosition.magnitude);
m_Rigidbody.MoveRotation(m_Rotation);
}
}
RayCast
어떤 물체에서 광선을 발사하여 그 광선에 닿는 물체가 있는지 없는지 검사하는 하기 위한 일종의 기법이다. 오브젝트에서 직선을 그어서 이를 측정 하는데 이 직선을 Ray라고 한다. 조명, 그림자, 충돌, 시야 등을 계산하는데 사용된다.