Unity/Unity Tip

[유니티] 입문 기초 강의 내용 정리

서니션 2022. 5. 21. 20:28
728x90
반응형

골드메탈님 유튜브 강의 바로가기 링크

 

✔ 키보드, 마우스 입력
Getkey : 키보드 버튼 입력을 받으면 true

down 눌렀을때
stay 누르고 있을 떄
up 뗐을 때

if (Input.GetKey(KeyCode.키))
   --

큰 enter는 return
작은 엔터는 KeypadEnter
esc는 Escape

GetMouse : 마우스 버튼 입력을 받으면 true
0이 왼쪽, 1이 오른쪽 버튼

Input Manager에서 Button 설정 가능

GetButton : Input 버튼 입력을 받으면 true
같은키를 설정할 수도 있다. (누르는거에 따라 다르게 출력되는거임)

키 설정시에 대소문자 차이 주의. 복붙하기!
마음대로 키를 더 늘리려면? Size를 늘리면 됨!

GetAxis : 수평, 수직 버튼 입력을 받으면 float
키보드 누른 값에 따라서 가중치를 받음

약간의 가속도를 붙이고싶으면 GetAxisRaw(1이랑 -1으로만)

✔ 오브젝트 이동
Transform : 오브젝트 형태에 대한 기본 컴포넌트
오브젝트는 변수 transform을 항상 가지고 있음
-> 즉, Transform = tr;로 초기화를 안 써줘도 됨

Translate : 벡터 값을 현재 위치에 더하는 함수
vector의 값만큼~

컴포넌트는 마우스 오른쪽 버튼 메뉴로 리셋 가능

스칼라 : 순수한 값
벡터 : 방향과 그에 대한 크기 값

Vector3 vec = new Vector3(0,0,0);
transform.Translate(vec);

유니티 튜토리얼 프로젝트 공식홈페이지에 있는거 따라해도 오케이
(C# 지식이 없으면 비효과적이다)

✔ 목표 지점으로 이동시키기

Vector3 클래스에서 제공하는 함수

MoveTowards() : 일정한 이동, 등속 이동
매개변수는 (현재위치, 목표위치, 속도)로 구성
마지막 매개변수에 비례하여 속도 증가

SmoothDamp() : 부드러운 감속 이동
매개변수는 (현재위치, 목표위치, 참조 속도, 속도)
마지막 매개변수에 반비례하여 속도 증가
ref : 참조 접근 -> 실시간으로 바뀌는 값 적용 가능
 
Lerp : 선형 보간, SmoothDamp보다 감속시간이 김
매개변수는 MoveTowards()와 동일
마지막 매개변수에 비례하여 속도 증가 (최대값 1)
스으윽--- 감 smooth와 값이 반대

SLerp : 구면 선형 보간, 호를 그리며 이동

✔ 델타타임 
Time.deltaTime : 이전 프레임의 완료까지 걸린 시간

Time.deltaTime 사용하는 방법
Translate : 벡터에 곱하기
transform.Translate(Vec * Time.deltaTime);

Vector 함수 : 시간 매개변수에 곱하기
Vector3.Lerp(Vec1, Vec2, T*Time.deltaTime);

deltaTime 값은 프레임이 적으면 크고, 프레임이 많으면 작음

✔ 중력 적용하기
RigidBody : 물리효과를 받기 위한 컴포넌트

✔ 충돌 영역 정하기
초록색 선같은거 보임 그게 Collider
Collider : 물리효과를 받기 위한 컴포넌트
다른 물체랑 충돌을 일으키냐, 안 일으키냐 차이
충돌 기준은 보이는 것이 아닌 Collider에 따라 보임

✔ RigidBody 무게 설정
무게를 1000으로 하면 다름


RigidBody > Mass 수치가 높을수록 충돌이 무거워짐
RigidBody > Use Gravity로 중력을 받을지를 결정
RigidBody > Is Kinematic 외부 물리 효과를 무시


Is kinematic 으로 움직이는 함정을 만들 때 유용

✔ 재질 만들기
Material : 오브젝트의 표면 재질을 결정하는 컴포넌트
재질 편집은 새로 생성해서 적용해야 가능함 
(Create > Material)
Material > Metalic 금속 재질 수치
Material > Smoothness 빛 반사 수치


Texture : 재질에 들어가는 이미지
Material > Tiling 텍스쳐 반복 타일 개수
- 소수점으로하면 소수만큼 텍스쳐가 잘려서 들어간다
Material > Emission 텍스쳐 발광(밝기) 조절
Emission은 빛이 물리적으로 나오는건 아님

✔ 물리 재질 만들기
Physics Material : 탄성과 마찰을 다루는 물리적인 재질
Bounciness : 탄성력, 높을수록 많이 튀어오름 (0~1까지)
Bounciness Combine : 다음 탄성을 계산하는 방식
Friction : 마찰력, 낮을수록 많이 미끄러짐
Friction Combine : 다음 마찰력을 계산하는 방식
- 스르륵 미끄러지게 할거면 Medium으로 잡아주기

만화스러운 느낌을 내려면
Friction 합산은 최소로, Bounciness 합산은 최대로!

**** 물체 필수 요소 : Mesh, Material, Collider, RigidBody ****

✔ 힘을 이용하여 물체 움직여보기
코드 흐름은 선언 < 초기화 < 호출

* 속력 바꾸기
GetComponent<T> : 자신의 T타입 컴포넌트를 가져옴
velocity : 현재 이동 속도

RigidBody 관련 코드는 FixedUpdate에 작성
안정된 물리효과를 받음

* 물체에 힘을 가해서 움직이기
AddForce(Vec) : Vec의 방향과 크기로 힘을 줌

ForceMode : 힘을 주는 방식(가속, 무게 반영)
- Acceleration
- Force
- Impulse (가장 많이 씀)
- VelocityChange

Mass 무게 값이 클수록 움직이는데 더 많은 힘이 필요

AddForce의 힘 방향으로 계속 속도 velocity가 증가

* 회전력 주기
AddTorque(Vec) : Vec방향을 축으로 회전력이 생김
Vec을 축으로 삼기 때문에 이동 방향에 주의

 
✔ 물리 충돌 이벤트
* 물리 충돌 이벤트
오브젝트의 재질 접근은 MeshRenderer를 통해서
(Start에 넣어주기 때문에 Update는 지워줘도 됨)

CollisionEnter : 물리적 충돌이 시작할 때 호출되는 함수
private void OnCollision
CollisionExit : 물리적 충돌이 끝났을 때 호출되는 함수

Color : 기본 색상 클래스
Color32 : 255 색상 클래스

Collision : 충돌 정보 클래스

TriggerStay : 콜라이더가 계속 충돌하고 있을 때 호출

OnTrigger는 물리적인 충돌이 아님.
즉 충돌정보가 없음
그나마 알고 있는 사실은 Collider정도

✔ 게임 인터페이스

*캔버스
Canvas : UI가 그려지는 도화지 역할인 컴포넌트

*스크린
: 게임이 표시되는 화면, 해상도로 크기 조정
마우스 커서도 스크린 좌표계에 포함

*텍스트 UI
Text : 문자열을 표시하는 UI
폰트는 꼭 라이센스 확인
잘리는거 Overflow로 설정하면 잘 보임

* 이미지 UI
Image : 이미지를 표시하는 UI
이미지 파일을 Sprite로 설정해야 UI 적용 가능
이미지가 깨진 느낌이라면 비율이나 실제 크기가 안 맞아서임
Preserve Aspect (비율조정)
Set Native Size (실제크기로 맞춰주기)

이미지 타입
- Simple
-Sliced : 이미지를 잘라서 배제하고 가운데를 채워주는 것
- Tiled : 크기는 고정이고 복사해주는 것
- Filled : 이미지가 어떻게 채워지느냐? fillamount조정
(이런 효과로 쿨타임 효과 구현 가능)

UI는 Hierarcy의 순서에 따라 위 아래 결정

* 버튼 UI
Button : 클릭 이벤트를 가지고 있는 반응형 UI

Sliced 자유자재 크기로 이미지 구현 가능

OnClick() : 버튼 클릭 시 호출되는 이벤트 함수

* 앵커
앵커-빨간점 : 캔버스에서의 기준점
앵커-파란점 : 컴포넌트에서의 기준점 (Shift)
앵커-중앙네모 : 컴포넌트의 위치 (Alt)

//
만약 UI 크기를 일정하게 만들고 싶다면 UI Scale Mode를 Scal With Screen size로 바꿔주시면 일정하게 유지됩니다

쉐이더 관점에서 게임 속 좌표계는 총 3개입니다.
첫 번째는 Object 그 자체의 좌표계
두 번쨰는 Object들이 실질적으로 위치하는 World 좌표계
세 번째는 (영상에선 골드메탈님이 Screen 좌표계라고 말씀하신) Projection 좌표계입니다.

플레이 버튼을 눌렀을 때, Game 화면에 보이는 것이 Projection 좌표계일겁니다.

이때,  좌표계들이 서로 상호작용 하는 과정은 먼저 Object 좌표계에 World 좌표계를 행렬곱 해주고, 이 결과물을 다시 Projection 좌표계에 행렬곱해주는 것입니다.

다만, 이건 그래픽 프로그래머가 쉐이더 짤 때 필요한 정보

✔ 기초만 꾹꾹 눌러담은 3D 게임 만들기

게임 개발은 계획부터 차근차근!!
게임이름, 장르, 목표, 구성, 구상도

Roll-a-ball이 근본.

SetActive(bool) : 오브젝트 활성화 함수

AudioSource : 사운드 재생 컴포넌트, AudioClip 필요
AudioClip : 사운드 파일 컴포넌트

에셋 스토어 : 게임 개발에 유용한 에셋들을 판매하는 스토어
음량-효과음-Free Assets
FREE Casual Game SFX Pack 다운로드
AudioClip에 드롭해서 넣어주기
비활성화 구간에는 컴포넌트 함수가 실행되지 않을 수 있어요

Tag : 오브젝트를 구분하는 단순한 문자열
AddTag로 Item이라는 태그 만들어주기

*카메라
플레이하는 공이 보일 수 있도록하고,
카메라 전용 스크립트 하나 만들기

FindGameObjectWithTag() : 주어진 태그로 오브젝트 검색

*결승점
형태가 없고 전반적인 로직을 가진 오브젝트를 매니저로 지정

Find 계열 함수는 부하를 초래할 수 있으므로 피하는 것을 권장
(유니티에서도 권유안함)

*장면이동
SceneManager : 장면을 관리하는 기본 클래스
LoadScene() : 주어진 장면을 불러오는 함수
Scene을 불러오려면 꼭 Build Setting에서 추가!

*스테이지
LoadScene의 매개변수는 장면 순서(int)도 가능

*UI
게임의 친절도는 UI에 달려있다
UI를 사용하려면 UnityEngine.UI 라이브러리 적용 필수

728x90
반응형