23.04.13. Unity 기초 정리, 마이노

김도익·2023년 4월 13일
0

Unity

목록 보기
17/23
post-thumbnail
post-custom-banner

Time.deltaTime

Update는 초당 50 ~ 60 프레임이다.
내가 코드를 Update 함수에서 transform.Translate(Vector3.forward)로 작성하면 초당 60m씩 Z축으로 나간다.

하지만 내가 Time.deltaTime을 사용하면 시간에 통제를 받게 된다.
transform.Translate(Vector3.forward * Time.deltaTime)을 사용하면 1초당 1m를 움직이게 만들 수 있다.

  • speed 변수를 만들고 곱해주면 내가 원하는 속도로 제어가 가능하다.

LateUpdate

  • Update() 메서드 호출 후 업데이트가 된다.

  • 예시로 카메라가 게임 오브젝트를 따라가는 FollowCamera 스크립트를 만들 때 Update를 사용해서 만들면 차량이 Update되고, 카메라가 Update되거나, 반대로 호출되거나 하는 상황이 발생할 수 있기 때문에 FollowCamera를 LateUpdate에 두는 것이 떨림 현상 없이 만들 수 있다.

Rotate


Unity 문제

Instantiate




이 방법으로 플레이어가 Bullet을 발사하는 모습을 구현할 수 있다.
ObjectPool 기법을 사용할 때 사용하니까 잊지말자.

한 지점에서 적을 랜덤하게 배출하는 방법

Plants vs Zombies를 생각할 때 Zombie들을 랜덤하게 배출할 수 있는 방법이다.

  • 빈 오브젝트를 생성한다.

  • Scripts를 만들고 배열을 생성한다.

  • Scripts를 빈 오브젝트 SpwanManager에 넣는다.
    내가 원하는 만큼 배열 칸 생성이 가능하다. 이제 내가 넣고 싶은 Object를 넣어주면 된다.

  • animal이 생성되는 x축에 범위를 랜덤으로 만들어준다.

  • 카메라에 관점을 변경시켜줄 수 있습니다.
    • Perspective : 모든 3D 캐릭터와 모델의 뎁스가 잘 표현됩니다.


  • Orthographic : 2D게임처럼 평평한 화면을 제공한다.

  • InvokeRepeating

    • 특정 시점에 해당 메서드의 호출을 시작하고, 시간 경과에 따라 원하는 속도로 호출을 반복하는 것이다. 문자열을 사용해 호출할 수 있다.
    • 랜덤하게 메소드를 호출하고 싶다면 Invoke함수를 사용해서 재귀적으로 접근하는 방법이 있다.

Box Collider

collider는 Rigidbody가 필요하다.
collider만 있고 Rigidbody가 없다면 충돌은 처리가 되지만 물리적인 효과가 발생하지 않는다.

아래 예시처럼 Player(점박이)가 Enemy(십자가 검은색 공)와 충돌 했을 때, 충돌은 처리 되지만, Enemy는 마치 무거운 돌처럼 움직이지 않는다.

  • Enemy 인스펙터엔 Rigidbody가 없다.

코드 줄단이 맞지 않을 때 코드 줄 깔끔하게 맞출 수 있는 팁

Export

  • Assets 파일에서 우측 마우스 버튼을 클릭한다.

  • Unity 파일에 폴더를 하나 만든다.

  • 완전 기초 버전이라서 0.1로 만든다.


Rigidbody 힘!

  • 플레이어 이동 키!

중력 조절하기 - Physics


배경을 움직이게 만들기

플레이어는 가만히 있지만, 배경을 움직임으로서 플레이어가 움직이게 보이는 효과를 만들 수 있다.

  • 배경에 Box Collider 컴포넌트, 필요한 Scripts를 넣는다.
  • 배경을 이동 시킨다.

  • 배경을 다시 원위치로 되돌린다.

CompareTag 응용

  • CompareTag를 이용해서 내가 원하는 오브젝트에만 명령을 내릴 수 있도록 만들 수 있다.

Particle System - 파티클 시스템

  • simulation speed는 파티클 재생 속도를 조절할 수 있다.

  • Play on Awake를 체크하면 게임 시작하자마자 파티클이 작동된다.

  • ParticleSystem
    Play(), Stop()을 이용해서 파티클을 실행하고, 멈출 수 있다.


  • Instantiate 활용




Audio

현실세계에서 귀가 있어야 소리를 들을 수 있듯이 카메라에도 Audio Listener가 있어야 소리를 들을 수 있다.

  • 오디오 소스 컴포논트를 추가한다.

  • Loop는 음악을 계속 반복해서 틀어주고, Volume은 소리를 조절해준다.

음향 효과

음향 효과는 음악과 다르다. 음향 효과는 코드에서 Trigger를 해야한다.


  • 오디오 소스 컴포넌트가 없다면 당연히 음향이 재생이 안된다.
    그러니 꼭 추가하는 것을 잊지말자.

2단 점프

빈 오브젝트 활용

1. 카메라 위치를 잡아준다.

  • y축을 돌리면 맵 중앙점(공 있는 곳) 기준으로 회전하는 모습을 구현할 수 있다.

2. Scripts를 빈 오브젝트 SpwanManager에 넣는다.

내가 원하는 만큼 배열 칸 생성이 가능하다. 이제 내가 넣고 싶은 Object를 넣어주면 된다.
적을 랜덤하게 배출하는 용도로 사용이 가능하다.

Physics Material

마찰을 변경할 수 있다.


Dynamic Friction

  • 물체가 움직일 때 적용되는 마찰력

Bounciness

  • 다른 물체와 부딪힐 때 발생하는 탄력을 조정

Average

  • 두 값을 반으로 나눈다.

Minimum

  • 두 물체가 충돌할 때 발생하는 탄력이 적은 쪽을 선택한다.

Multiply

  • 두 물체가 충돌할 때 두 물체의Bounciness값이 증폭된다.

Maximum

  • 두 물체가 충돌할 때 발생하는 탄력이 큰 쪽을 선택한다.

Vector - normalized : 정규화

코드를 예쁘게 정리하자.

Coroutine - 코루틴

코루틴 최적화 및 정의 정리한 내용

IEnumerator

코루틴 반환 타입은 IEnumerator이란 걸 절대 잊지 말자
진짜 고생했다...실수로 IEnumerable 작성해서 삽질 한 걸 생각하면서 같은 실수는 반복하지 말자.

IEnumerable
이런 실수는 절대 하지말자 이제 코루틴은 반환 타입은 IEnumerator이라는 점을 반드시 인지하자.

WaitForSeconds

WaitForSeconds 변수를 만들고, Awake에서 생성하고 재사용하면 가비지가 덜 생성된다.

offset - 위치 설정하는 꿀팁

객체에 위치를 설정해줄 수 있다.
예를 들어 플레이어 객체에 효과를 보여주는 객체를 추가할 때, 효과를 보여주는 객체의 위치를 내가 원하는 곳에 설정할 수 있는 방법이다.

예시는 코드로 보자.



다음과 같은 상황으로 아주 애를 탔다.
1. 플레이어 객체에 효과를 넣는데, powerIndicator를 prefab파일에다 두고 사용하니 효과가 전혀 보이지 않았다.
2. player 자식으로 두니 player가 굴러가는데로 똑같이 굴러가서 원하는 그림이 아니였다.

결론적으론 Hierarchy창에 게임 오브젝트를 두고, 해당 객체를 보이지 않게 처리한 상태로 게임을 시작하니 해결됐다.




new 연산자를 사용하고, 사용하지 않는 상황

Game Manager

우리가 앞서 했던, SpawnManager과 비슷한 방식이다. 이젠 Game Manager이라고 이름 짓고, 게임 상태를 제어하자.

빈 오브젝트를 생성하고, GameManager 스크립트를 생성하고, 빈 오브젝트 컴포넌트에 GameManager 스크립트를 추가한다.

OnMouseDown

Unity가 만들어놓은 함수로, 마우스를 눌렀을 때 작동된다.

  • OnMouseUp은 눌렀다 땠을 때 작동한다.

  • 그 외 많은 것들이 있는데, 실험해보자.

Text - TextMeshPro

처음 실행하면 프로그램을 설치해야한다는 창이 뜬다. 설치하면 된다.

  • 내가 원하는 Text를 작성하고, 폰트를 설정하면 된다. 그리고 폰트 사이즈도 설정이 가능하다.
    폰트는 인터넷에서 다운로드한 폰트를 사용해도 된다. 네이버 폰트에 예쁜 것들이 많다.

  • TextMeshPro 설정하는 방법
    Wrapping을 Disabled하면 박스안에 글자를 넣는 형태가 되지 않아 글씨가 박스 안이라는 제한이 걸리지 않게된다.

    • Enabled할 때 모습

  • Script에 TMPro 적용하기




  • SetActive로 키고 끄고 할 수 있다.

각 객체마다 점수를 다르게 부여하는 방법



Button

UI는 Canvas안에서 이루어저야하나.

Button 사용 방법


스크립트를 가지고 오면 안된다. 오브젝트를 가지고 와야한다.

Game Manager 스크립트에 Button 오브젝트를 할당한다.

Button 오브젝트를 비활성화 시켜놓는다.

게임화면

Restart 버튼을 누르면?

난이도 조절하도록 만들기

AddListener

특정 이벤트 발생 지점에 주의를 기울이도록 해줍니다.

GameManager 스크립트에서 StartGame()을 만듭니다.

이제 Button을 눌렀을 때 게임이 실행됩니다.

UI화면 간편하게 작업하는 방법

Title Screen이라는 빈 게임오브젝트를 만들고, 같은 역할을 하는 오브젝트들을 자식으로 묶어 넣습니다.

  • GameManager Script

  • GameManager 스크립트에 할당한다.

생성 속도를 조절해서 난이도를 만들어준다.

DifficultyButton Script에서 난이도 조절 변수를 만들고 인수로 전달한다.

GameManager Script에서 difficulty를 나눠서 난이도가 올라가는 만큼 객체가 생성될 시간을 짧게 만들어준다.

각 모드마다 Difficutly에 정수 값을 정해준다.

마이노 꿀팁

1. 어떤 상태에서도 데미지를 받는다면 Any State에 TakeDamage를 연결하고, 기본 상태로 연결하면 된다.

2. Animator Override Controller

캐릭터들에 상태가 동일하다면 Animator Override Controller를 사용하면 된다.

  • 원하는 애니메이터 클립을 넣으면 된다.

  1. PlayerData 만드는 법
    아직 잘 모르겠음..ㅋㅋㅋ

Animator

Any State에서 이어지는 Transition에만 있는 기능이 있다.
그건 바로 Can Transition To Self라는 기능이 있다.

이 기능은 자기 자신한테도 Transition이 있어서 계속 갈 수 있다는 것이다.

만약 내가 원하는 상황이 Die라는 애니메이션 클립이 딱 한 번만 실행되길 원해서 Transition이 한 번만 이동하도록 만들었지만, Can Transition To Self가 ON이 라면 계속 애니메니션 클립이 작동하게 된다. 그러니 내가 의도한 대로 만들고 싶다면 Can Transition To Self를 OFF 하면 된다.

아이디어

플레이어가 장애물과 충돌 할 때, 장애물한테 받은 데미지를 플레이어가 갖으면 컴포넌트도 받아와야 되고, 일이 많아진다.

하지만 장애물이 플레이어와 충돌 할 때 데미지를 주는 것을 갖고 있으면 아래와 같이 간결하게 코드 작성이 된다.

  • PlayerController 스크립트 (부모 클래스)
  • 장애물 스크립트

  • Layer처리하는 것도 잊지말자. Layer을 제대로 하지 않으면 Null레퍼런스가 발생한다.

플레이어가 죽는 모션이 2개라면 PlayerDeath가 매개변수를 갖는다.
그리고 조건을 걸어서 상황에 맞는 애니메이션을 만들면 된다.

profile
고급 개발자가 되고 싶어요!
post-custom-banner

0개의 댓글