Update는 초당 50 ~ 60 프레임이다.
내가 코드를 Update 함수에서 transform.Translate(Vector3.forward)로 작성하면 초당 60m씩 Z축으로 나간다.
하지만 내가 Time.deltaTime을 사용하면 시간에 통제를 받게 된다.
transform.Translate(Vector3.forward * Time.deltaTime)을 사용하면 1초당 1m를 움직이게 만들 수 있다.
Update() 메서드 호출 후 업데이트가 된다.
예시로 카메라가 게임 오브젝트를 따라가는 FollowCamera 스크립트를 만들 때 Update를 사용해서 만들면 차량이 Update되고, 카메라가 Update되거나, 반대로 호출되거나 하는 상황이 발생할 수 있기 때문에 FollowCamera를 LateUpdate에 두는 것이 떨림 현상 없이 만들 수 있다.
이 방법으로 플레이어가 Bullet을 발사하는 모습을 구현할 수 있다.
ObjectPool 기법을 사용할 때 사용하니까 잊지말자.
Plants vs Zombies를 생각할 때 Zombie들을 랜덤하게 배출할 수 있는 방법이다.
빈 오브젝트를 생성한다.
Scripts를 만들고 배열을 생성한다.
Scripts를 빈 오브젝트 SpwanManager에 넣는다.
내가 원하는 만큼 배열 칸 생성이 가능하다. 이제 내가 넣고 싶은 Object를 넣어주면 된다.
Orthographic : 2D게임처럼 평평한 화면을 제공한다.
InvokeRepeating
collider는 Rigidbody가 필요하다.
collider만 있고 Rigidbody가 없다면 충돌은 처리가 되지만 물리적인 효과가 발생하지 않는다.
아래 예시처럼 Player(점박이)가 Enemy(십자가 검은색 공)와 충돌 했을 때, 충돌은 처리 되지만, Enemy는 마치 무거운 돌처럼 움직이지 않는다.
Assets 파일에서 우측 마우스 버튼을 클릭한다.
Unity 파일에 폴더를 하나 만든다.
완전 기초 버전이라서 0.1로 만든다.
플레이어는 가만히 있지만, 배경을 움직임으로서 플레이어가 움직이게 보이는 효과를 만들 수 있다.
배경을 이동 시킨다.
배경을 다시 원위치로 되돌린다.
simulation speed는 파티클 재생 속도를 조절할 수 있다.
Play on Awake를 체크하면 게임 시작하자마자 파티클이 작동된다.
ParticleSystem
Play(), Stop()을 이용해서 파티클을 실행하고, 멈출 수 있다.
현실세계에서 귀가 있어야 소리를 들을 수 있듯이 카메라에도 Audio Listener가 있어야 소리를 들을 수 있다.
오디오 소스 컴포논트를 추가한다.
Loop는 음악을 계속 반복해서 틀어주고, Volume은 소리를 조절해준다.
음향 효과는 음악과 다르다. 음향 효과는 코드에서 Trigger를 해야한다.
내가 원하는 만큼 배열 칸 생성이 가능하다. 이제 내가 넣고 싶은 Object를 넣어주면 된다.
적을 랜덤하게 배출하는 용도로 사용이 가능하다.
마찰을 변경할 수 있다.
Dynamic Friction
Bounciness
Average
Minimum
Multiply
Maximum
코드를 예쁘게 정리하자.
코루틴 반환 타입은 IEnumerator이란 걸 절대 잊지 말자
진짜 고생했다...실수로 IEnumerable 작성해서 삽질 한 걸 생각하면서 같은 실수는 반복하지 말자.
IEnumerable
이런 실수는 절대 하지말자 이제 코루틴은 반환 타입은 IEnumerator이라는 점을 반드시 인지하자.
WaitForSeconds 변수를 만들고, Awake에서 생성하고 재사용하면 가비지가 덜 생성된다.
객체에 위치를 설정해줄 수 있다.
예를 들어 플레이어 객체에 효과를 보여주는 객체를 추가할 때, 효과를 보여주는 객체의 위치를 내가 원하는 곳에 설정할 수 있는 방법이다.
예시는 코드로 보자.
다음과 같은 상황으로 아주 애를 탔다.
1. 플레이어 객체에 효과를 넣는데, powerIndicator를 prefab파일에다 두고 사용하니 효과가 전혀 보이지 않았다.
2. player 자식으로 두니 player가 굴러가는데로 똑같이 굴러가서 원하는 그림이 아니였다.
결론적으론 Hierarchy창에 게임 오브젝트를 두고, 해당 객체를 보이지 않게 처리한 상태로 게임을 시작하니 해결됐다.
우리가 앞서 했던, SpawnManager과 비슷한 방식이다. 이젠 Game Manager이라고 이름 짓고, 게임 상태를 제어하자.
빈 오브젝트를 생성하고, GameManager 스크립트를 생성하고, 빈 오브젝트 컴포넌트에 GameManager 스크립트를 추가한다.
Unity가 만들어놓은 함수로, 마우스를 눌렀을 때 작동된다.
OnMouseUp은 눌렀다 땠을 때 작동한다.
그 외 많은 것들이 있는데, 실험해보자.
처음 실행하면 프로그램을 설치해야한다는 창이 뜬다. 설치하면 된다.
내가 원하는 Text를 작성하고, 폰트를 설정하면 된다. 그리고 폰트 사이즈도 설정이 가능하다.
폰트는 인터넷에서 다운로드한 폰트를 사용해도 된다. 네이버 폰트에 예쁜 것들이 많다.
TextMeshPro 설정하는 방법
Wrapping을 Disabled하면 박스안에 글자를 넣는 형태가 되지 않아 글씨가 박스 안이라는 제한이 걸리지 않게된다.
Script에 TMPro 적용하기
SetActive로 키고 끄고 할 수 있다.
UI는 Canvas안에서 이루어저야하나.
스크립트를 가지고 오면 안된다. 오브젝트를 가지고 와야한다.
Game Manager 스크립트에 Button 오브젝트를 할당한다.
Button 오브젝트를 비활성화 시켜놓는다.
게임화면
Restart 버튼을 누르면?
특정 이벤트 발생 지점에 주의를 기울이도록 해줍니다.
GameManager 스크립트에서 StartGame()을 만듭니다.
이제 Button을 눌렀을 때 게임이 실행됩니다.
Title Screen이라는 빈 게임오브젝트를 만들고, 같은 역할을 하는 오브젝트들을 자식으로 묶어 넣습니다.
DifficultyButton Script에서 난이도 조절 변수를 만들고 인수로 전달한다.
GameManager Script에서 difficulty를 나눠서 난이도가 올라가는 만큼 객체가 생성될 시간을 짧게 만들어준다.
각 모드마다 Difficutly에 정수 값을 정해준다.
캐릭터들에 상태가 동일하다면 Animator Override Controller를 사용하면 된다.
Any State에서 이어지는 Transition에만 있는 기능이 있다.
그건 바로 Can Transition To Self라는 기능이 있다.
이 기능은 자기 자신한테도 Transition이 있어서 계속 갈 수 있다는 것이다.
만약 내가 원하는 상황이 Die라는 애니메이션 클립이 딱 한 번만 실행되길 원해서 Transition이 한 번만 이동하도록 만들었지만, Can Transition To Self가 ON이 라면 계속 애니메니션 클립이 작동하게 된다. 그러니 내가 의도한 대로 만들고 싶다면 Can Transition To Self를 OFF 하면 된다.
플레이어가 장애물과 충돌 할 때, 장애물한테 받은 데미지를 플레이어가 갖으면 컴포넌트도 받아와야 되고, 일이 많아진다.
하지만 장애물이 플레이어와 충돌 할 때 데미지를 주는 것을 갖고 있으면 아래와 같이 간결하게 코드 작성이 된다.
장애물 스크립트
Layer처리하는 것도 잊지말자. Layer을 제대로 하지 않으면 Null레퍼런스가 발생한다.
플레이어가 죽는 모션이 2개라면 PlayerDeath가 매개변수를 갖는다.
그리고 조건을 걸어서 상황에 맞는 애니메이션을 만들면 된다.