서론
- Unity 2019 LTS 기반으로 작성된 노트입니다.
Tips And Tricks
- Scene 화면에서 우클릭시 WASD로 이동이 가능하다.
- 오브젝트 클릭 후 F를 누르면 포커싱이 가능하다.
Mathf.Clamp : 값의 범위를 지정하기
- Mathf.clamp(변수, 최소값, 최대값) 과 같이 사용시 변수가 최소값보다 낮아지면 최소값을, 최대값보다 커지면 최대값을 리턴한다.
게임 오브젝트 찾기
GameObject.Find();
게임 오브젝트 내의 컴포넌트 찾기
gameObject.GetComponent<찾고자 하는 컴포넌트의 타입>();
ESC키로 게임 종료하기
- Application.Quit() 를 호출시 게임이 종료된다.
Material
- 3D 모델에 적용할 텍스쳐의 다양한 속성을 설정한다.
Naming Convention
Prefab
- 재사용 가능한 오브젝트의 타입
- 오브젝트를 프로젝트 폴더에 드래그 해 생성한다.
- 개별 객체의 변경점을 프리팹에 적용시킬수 있다.
Aspect Ratio
- Game Display의 Free Aspect 를 16:9 로 설정한다.
Script
기본 함수
- void Start()
- void Update()
사용하기
- 스크립트를 오브젝트에 드래그 드롭 하면 등록된다.
- 이후 transform 등을 호출하면 등록된 오브젝트에 스크립트가 적용된다.
멤버 변수
- 스크립트에서 멤버 변수를 public 으로 지정시, Unity Inspector 에서 조정이 가능하다.
- 멤버 변수 위에 [SerializedField] 를 붙히면 private 접근자 상태에서도 Inspector 환경에서의 조작이 가능하다.
[SerializeField]
private float _speed = 3.5f;
변수 이름짓기
- private 변수의 경우 앞에 _을 붙힌다.
position
- 현재 위치
- Vector3 타입으로 저장된다.
- 생성자를 통해 초기 x, y, z 값을 정할수 있다.
translate
- 정해진 x, y, z 값 만큼 물체가 이동한다.
- x, y, z 에 해당하는 값 만큼 이동하게 할수도 있고, Vector3 객체를 받아도 된다.
Time.deltaTime
- 이전 프레임의 시간과 현재 프레임의 시간의 차이를 계산해 초 단위로 리턴한다.
- 프레임에 상관 없이 Update() 를 통해 transform 등을 구현할수 있다.
- 사용자의 입력을 받는다.
- Edit > Project setting > Input 에서 입력 설정 가능.
- 각각의 입력과 Name이 정해져 있다, 이들을 코드에서 호출하기 위해선 아래와 같이 작성할수 있다
horizontalInput = Input.GetAxis("Horizontal");
// Input 의 Axes에서 Horizontal 이라는 이름을 가진것을 가져오기.
// a/d 혹은 왼쪽 방향키/오른쪽 방향키를 누르면 이에 해당하는 float 값이 리턴된다.
// 왜 하필이면 float이냐? 게임패드를 지원한다는것을 기본으로 하기 때문에 그런듯 하다.
// 실제로 게임패드 연결시 0 혹은 -1/+1 이 아닌 중간값만큼만 입력이 가능하다.
- 키보드 입력의 경우 아래와 같이 받아올수 있다.
Input.GetKeyDown(키코드)
/* 예시 */
Input.GetKeyDown(KeyCode.Enter); // 엔터키 입력시 true 반환.
게임 오브젝트 생성하기
- 스크립트에 private 자료형으로 GameObject 타입의 멤버 변수를 생성한다.
- 멤버 변수 위에 [SerializeField] 를 추가한다.
- Inspector 를 통해 Prefab을 드래그-드롭 한다.
- Instantiate 메소드를 통해 오브젝트를 생성한다.
Instantiate(laserPrefab, transform.position, transform.rotation);
// 생성할 GameObject, 위치, 각도
// 이 외에도 많은 Override 형식이 있다.
게임 오브젝트 제거하기
- 제거를 위해선 Destroy 함수를 사용할수 있다, Argument로 Gameobject를 받는다.
- 자기자신을 제거하기 위해선 this.gameObject 를 Argument로 줄수 있다.
Destroy(this.gameObject);
// 바로 제거하기
Destroy(this.gameObject, 1f);
// 1초 후에 제거하기
Cooldown 지정하기
- 특정 동작에 다음 동작이 가능하기 까지의 제한시간을 적용하는 방법
- 게임을 실행한 시간을 기록하는 Time.time 변수를 사용할수 있다.
private float _fireRate = 0.5f;
// 한번 발사 이후 0.5초간 발사 불가능
private float _canFire = -1f;
// 다음에 발사 가능한 시간을 기록함
if(Input.GetKeyDown(KeyCode.Space) && Time.time > _canFire)
{
_canFire = Time.time + _fireRate;
Instantiate(_laserPrefab, transform.position + new Vector3(0, 0.8f, 0), transform.rotation);
}
게임 씬 로딩 / 초기화
- 로딩은 새로운 씬을 불러오면 되고, 초기화는 기존 씬을 다시 불러오면 된다.
- SceneManager 를 사용한다.
using UnityEngine.SceneManagement; // 필요
/* 실제 코드 */
SceneManager.LoadScene("Game");
/* 현재 실행중인 Scene 불러오기 */
SceneManager.LoadScene(0);
씬 만들기
초기 실행 씬 설정하기
- Build setting의 이 부분에 씬을 추가하게 되는데, 맨 윗쪽의 Scene이 먼저 실행된다.
UI 버튼 만들기
버튼 동작 추가하기
- Inspector 의 On Click() 에서 추가한다.
애니메이션 동작 설정하기
애니메이터 화면
- 우클릭을 통해 애니메이션 상태를 생성할수 있다.
- 애니메이션과 관련된 패러미터를 설정한다.
- Transition 의 Condition 에 설정한다.
- Animator 를 통해 Trigger를 실행한다.
애니메이션 트랜지션에 지연시간이 있을경우
- Transition 의 hasExitTime 을 선택 취소하면 된다.
후처리 추가하기
후처리기 설치
- Window > Package Manager 에서 설치 가능
- Post Processing 설치
후처리기 사용하기
- 빈 게임오브젝트 생성
- Post-process Volume 컴포넌트 추가
- Global : 전체에 적용하기
- Profile 추가
- 메인 카메라에 Post Process Layer 컴포넌트 추가
- PostProcessing 레이어를 추가함
- 메인 카메라 컴포넌트의 레이어와 Volume의 레이어를 PostProcessing 레이어로 설정
컬러 그레이딩
- Build Setting > Player Setting > Player > Other Settings에서
감마를 리니어로 수정.
오디오 추가하기
- AudioSource : 유니티 컴포넌트
- AudioClip : 오디오 파일
- AudioSource.clip 에 AudioClip 을 대입, 실행할 오디오를 정할수 있다.
AudioClip 재생하기
- AudioSource.PlayClipAtPoint(오디오 클립, Vector3 위치);
게임 빌드하기
WEBGL
- player setting 에서 컬러가 linear가 아닌 gamma 여야 한다.
Mobile
일시정지 메뉴 구성하기
- 특정 키를 누르면 게임이 잠시 멈추고 메뉴가 나오도록 함.
- 정지 메뉴 UI의 Panel을 구성
- Panel 의 Children으로 각각의 구성요소를 넣음
- 기본적으로 비활성화 되어있다가 버튼을 누르면 Active 되게 함.
게임 멈추기
- Time.timeScale = 0; 으로 게임을 멈출수 있다.
- 기본값은 1
- 이를 이용해 슬로우모션 / 패스트모션을 만들수도 있다.
애니메이션 녹화하기
- Animator 지정 이후 녹화 버튼을 누르고 키프레임을 녹화한다.
- 키프레임의 시간 위치를 옮기고 다시 위치를 이동해 키프레임을 저장.
값 저장하기
저장
- PlayerPrefs.SetInt("HighScore", 10);
- PlayerPrefs.GetInt("HighScore");