게임 만들 때 사용할 함수 등
[SendMessage]
SendmessageUpwards : 자시(GameObject)을 포함하여 부모 GameObject까지 메시지를 전달
SendMessage : 함수는 현재 스크립트가 실행중인 GameObject에 붙어있는 모든 MonoBehaviour
스크립트의 원하는 함수를 호출
*주의사항*
SendMessage 계열의 함수를 사용할 경우에는 함수의 이름이 중복되지 않도록 설계하는것이 좋다
==========================================================================
[이동]
물체속도를 설정해서 이동
rigid.velocity : 현재 이동속도
물체에 힘을 가해서 이동
rigid.AddForce(Vec) : Vec의 방향과 크기로 힘을 줌
버튼 입력을 받아서 이동
Input.GetAxisRaw("Horizontal")
Input.GetAxisRaw("Vertical")
transform.Translate() : 설정해준 x y z 축을 받고 mode를 설정해 줄 수 있다
mode - self 좌표계와 유니티(world) 좌표계를 선택 할 수 있다
유니티의 NavMeshAgent를 사용한다는 전제조건
1.NavMeshAgent + Animator를 연결해서 사용하는경우
(간단한 RPG 게임을 제작할때)
2.NavMeshAgent를 사용(연산) + CharacterController에 전반적인 로직
(액션 게임을 제작할때)
3.(길찾기 알고리즘 + 이동로직) 대규모 게임을 제작할때
==========================================================================
[회전력]
rigid.AddTorque(Vec) : Vec방향을 축으로 회전력이 생김
==========================================================================
[Vector3 함수]
Vector3.MoveTowards(transform.position, 이동할 목표 위치, 스피드); : 일정한 시간이 지나면 목표에 도착
Vector3.Distance(transform.position, 목표점); - 목표점까지의 거리를 구한다
==========================================================================
[충돌 이벤트 함수]
실제 물리적인 충돌로 발생하는 이벤트
OnCollisionEnter(Collision collision){}
OnCollisionStay(Collision collision){}
OnCollisionExit(Collision collision){}
콜라이더 충돌로 발생하는 이벤트
OnTriggerEnter(Collision other){}
OnTriggerStay(Collision other){}
OnTriggerExit(Collision other){}
==========================================================================
[Physics, Physics2D]
IgnoreCollision : 두개의 컬라이더를 받고 충돌 방지역할
GetIgnoreCollision : 두 컬라이더의 충돌이 무시되는지 그 여부값을 리턴
IgnoreLayerCollision : 두 레이어 값을 받아 충돌처리되지 않도록 수행
GetIgnoreLayerCollision : 두 레이어의 충돌이 무시되는지 그 여부값을 리턴
==========================================================================
[Cast 계열]
Cast 계열의 함수 : 면과 면이 닿았을 때 이벤트가 발생
Cast계열의 함수를 사용할때 받아주는 값으로 RaycastHit2D 변수로 받아줘아햠
LineCast(시점, 종점) : 시점과 종점을 받아서 충돌된 물체가 있는지 체크하기 위한 함수
복수일땐 LineCastAll(시점, 종점)
RayCast( 시점 , 방향, 거리) : 시점과 방향을 받아서 체크하는 함수(거리값을 넣어주지 않으면 무한)
BoxCast(시점, 사이즈, 방향)
CircleCast(시점, 반지름, 방향)
CapsuleCast(시점, 사이즈, 캡슐방향, 각도, 방향)
==========================================================================
[Overlap 계열]
Overlap 계열의 함수 : 교차되었을 때 이벤트가 발생
Overlap 함수를 사용할때는 받아주는값으로
OverlapBox(시점, 사이즈) : 현재의 설정된 지점에서 특정 범위만 검사하는 용도로 사용
OverlapCircle(시점, 반지름)
OverlapCapsule()시점, 사이즈, 방향, 각도)
==========================================================================
[Find 계열]
Find계열의 함수는 cpu를 사용하기 때문에 부하를 초래할 수 있으므로 안쓰는게 좋다
GameObject.Find() : 주어진 이름으로 오브젝트 검색
GameObject.FindGameObjectsWithTag() : 주어진 Tag로 오브젝트 검색
GameObject.FindObjectOfType() : 지정한 타입의 오브젝트중 가장 처음에 활성화된 오브젝트를 반환
(해당 타입 오브젝트가 씬에 하나만 있을때 사용하면 좋음)
==========================================================================
[SceneManager]
SceneManager : 장면을 관리하는 기본 클래스
using UnityEngine.SceneManagement; - 선언을 해줘야 SceneManager 사용 가능
Scene을 불러오려면 꼭 Build Setting에서 Scene을 추가 해줘야함(없을시 에러)
SceneManager.LoadSceneAsync("Scene 이름"); : 해당 이름의 Scene을 호출
==========================================================================
[Update]
LateUpdate : 카메라회전, 카메라이동, UI관련은 보통 Late업데이트에서 사용
캐릭터의 이동로직은 Update()를 사용
Update함수에서 연산이 끝나고 그 뒤에 호출되기 때문에
FixedUpdate는 물리시간을 사용하기 때문에 Update와LateUpdate와는 다른 시간을 사용
==========================================================================
[Image]
SetNativeSize() 제작된 이미지의 사이즈로 변경해주는 함수
==========================================================================
[EventSystem]
UnityEngine.EventSystems; 선언 후 사용
Drag and Drop 관련 : IDropHandler, IPointerUpHandler, IPointerDownHandler 등 사용할 기능을 가진
인터페이스를 상속 받은 후 사용(오류 이유 : public으로 함수를 선언해 줘야함)
IBeginDragHandler : 드래그가 시작될때 한번 호출되는 인터페이스
IDragHandler : 드래그 중일때
IEndDragHandler : 드래그가 끝났을때 한번 호출
==========================================================================
[카메라]
Cinemachine
-FreeLook
-Virtual
post processing로 카메라 효과, 톤의 변화를 줄 수 있다(패키지 매니저로 추가)
isGlobal를 체크를 해야 아래 효과들 사용 가능
-vignette : 카메라 효과
-Color Grading : 색상, 톤의 변화
-Bloom :
Depth Of Field : 화면의 모자이크 같이 변화를 줄 수 있음
==========================================================================
[통신]
Socket을 사용하려면 System.net.Sockets를 선언해주어야 하고 System.net도 선언
가장 기본이 되는 방법
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
SocketType.Stream : 입출력 방식 protocolType이 Tcp면 Stream이어야함
socket.Bind(new IPEndPoint(IPAddress.Any, 0)); : pc에 연결된 IP중 하나를 가져온다
socket.Listen(1); : 연결될 수 있는 소켓으로 설정(한번에 연결될 수 있는 클라이언트의 개수를 설정)
Poll함수 : 읽어들일 데이터가 있는지 확인하는 함수
ex socket.Poll(0, SelectMode.SelectRead) :서버 소켓에 접속 요청을 한 클라이언트가 있는지 체크
빌드 할때 Player Setting에서 Run in BackGround가 체크 되있는지 확인 해야함
(실행파일이 백그라운드에 있을때도 제대로 실행이 되도록 체크)
==========================================================================
[hp 관련]
1. Image를 사용하는 방법
Image의 FillAmount를 사용하면 hp바 등을 만들 수 있다
이 때 FillAmount를 사용할 때는 정사이즈의 이미지가 있어야 깨짐없이 작업 할 수 있다
2. Slider 사용
OnValue Changed -> Slider Object넣은 후 -> SetValueWithOutNotify 함수 선택
3. Scrollbar 사용
hp bar를 설정해줄 때
슬라이더 또는 이미지는 범위의 값이 0~1 범위로 사용하기 때문에, hp를 설정할 때 hp변수와
origin변수를 만들어 주고 originhp = hp 로 설정 후
float sliderValue = (float)hp/originHp; 방식처럼 범위값의 비율을 맞춰준다
*주의사항*
이미지의 Filled모드를 사용하려면 정사이즈 이미지를 사용해야함
HPSlider, 캐릭터의 스킬 아이콘, 슬라이더류의 이미지는 정사이즈를 사용하는게 좋음
==========================================================================
[최대 공격력 방어력 등]
최대 공격력, 방어력, 체력의 경우 테이블로 설정한다
==========================================================================
[TMPro] - Text Mesh Pro
Using TMPro; 선언해서 사용
==========================================================================
[날짜, 시간]
DateTime, TimeSpan을 사용하려면 using System; 선언해서 사용
DateTime : 값 형식의 구조체로 날자와 시간에 대한 정보를 가져올 때 사용
DateTime new = DateTime.Now; : 현재 날짜와 시간 구하기
TimeSpan : 몇일, 몇시간, 몇분, 몇초 와 같은 시간의 크기를 나타내며 DateTime과 함께 사용
분과 초단위의 문자열 값을 사용하기 위해 사용
==========================================================================
[Animator]
Culling Mode 3가지
Always Animate : 항상 애니메이션하고 컬링을 하지 않음
cull update transform - 실질적인 연산은 하지 않고 시점만 기록해두고 있는 모드
0.5초분량의 애니메이션
cull Compretely - 카메라 화면 밖에 애니메이터들은 멈춰있음
==========================================================================
[길찾기]
A* 알고리즘의 절차
1. 시점과 종점을 설정한다
2. 시점을 현재의 기준으로 설정한다
3. 기준점에서 8방향 이웃노드를 찾는다
4. 기준점의 이웃노드를 모두 계산한다
이웃노드의 계산방식은 다음과 같습니다
(이웃노드로부터 타겟까지의 거리값(추정치) + 이웃노드의 위치로부터 시점까지의 거리)
5. 이웃노드를 오픈된 목록 리스트에 저장
오픈목록 리스트란 : 기준노드였던 이웃노드 집합
6. 오픈목록리스트중에서 목표점까지 최소 비용을 갖는 노드를 찾고 이 노드를 새로운 기준점으로 설정
7. [3, 4, 5, 6] 과정을 반복해서 새로운 기준노드가 타겟으로 하는 노드인지를 비교해보고
새로운 기준노드가 타겟 기준노드가 되었을때 에이스타 알고리즘을 종료한다
길찾기 알고리즘에서 사용되는 용어
Hcost(추정치)
Gcost(현재시점에서 시작점까지의 소비된 거리값)
Fcost(Hcost+Gcost)
==========================================================================
[카메라]
캐릭터쪽에서 카메라를 제어한다면 캐릭터쪽에 카메라를 연결할 수 있다
캐릭터에 대한 정보를 참고하여 카메라를 제어할 목적이라면 카메라에 연결하여
사용하는 것이 일반적
==========================================================================
[Scroll View]
Scroll Rect
Movement Type :
-Elastic : 스크롤시 팅기듯이 돌아옴
-Clamped : 범위에 맞게 스크롤
-Unrestricted : 끊임없이 스크롤됨
==========================================================================
[3d 애니메이터]
Humanoid 형식으로 만들어진 애니메이션이 아니면 Humanoid 타입으로 메뉴를 바꿔도 애니메이션이
동작하지 않음
하나의 노드에 하나의 애니메이션 = 2D
하나의 노드에 하나 이상의 애니메이션을 배치하고 1개 이상의 애니메이터용 변수를 활용해서
애니메이션을 제어하는 시스템 = Blend Tree
==========================================================================
[셰이더]
URP 셰이더 사용시 주의사항 : 프로젝트를 만들때부터 Urp프로젝트로 만들지 않으면 제대로 동작을
안하는 경우가 많음
==========================================================================
[내적과 외적을 사용하여 충돌처리]
중요 : 내적한 결과값은 cos값이고 비율값입니다
==========================================================================
[기타]
LayerMask.NameToLayer("레이어이름") : 해당 레이어 불러옴
OnDrawGizmo : 박스 등의 도형을 출력할 때 사용
GameObject.SetActive(bool) : 게임 오브젝트 활성화/비활성화
배경이미지를 설정할 때
SpriteRenederer -> 일반 3D 좌표
Image -> 스크린 좌표계
스테이지를 관리 방법 2가지
1.프리팹으로 구성
2.Scene파일로 구성(꼭 Scene으로 해야하는 경우 2가지)
-광원 베이크
-지형 베이크
블랜드트리 : 하나의 노드에 여러 애니메이션을 두고, 한개, 또는 두개정도의 애니메이터 변수를
사용하여 관리하는 방법
리깅 :
정점 - 메쉬 폴리곤(정점으로구성 ) - 정점에 영향을 주는 행렬 설정
using EngineInput = UnityEngine.Input; : Input 클래스를 축약적으로 사용
프로그램 : 실행될 수 있는 파일
프로세스 : 실행되고 있는 파일
-스레드 : 프로세스에서 실행되고 있는 일련의 코드조각
-루틴 : 코드 조각의 일부
멀티스레드 : Thread 클래스를 여러개 만들어서 사용하는 시스템
task :
코루틴 : 출입구가 여러개 있는 코드
==========================================================================
[문제해결 및 주의사항]
2D 캐릭터가 넘어졌을 경우 누워서 걷는 모션 해결 방법
-캐릭터의 오브젝트의 Rigidbody2D - Constraints - FreezeRotation z 체크
z축 회전의 영향을 받지 않게끔 처리
Cinemachine의 FreeLook Camera를 사용할 때 Minimum Distance From Target을 코드로 제어하면
Raycast 처리를 하지 못한다
Gizmos.DrawLine이 안그려지는경우 관련 변수가 초기화 잘 되있는지 확인
애니메이터를 사용했을때 공중에 뜨거나 하는 현상이 발생한 경우에는 애니메이터의 Motion - Root Motion Node를
Root transform으로 변경해줘야 함
*주의사항*
Start 함수 등 함수의 호출 시점에 따라 값을 못얻어 오는 경우도 생김(호출 시점 확인)
캐릭터 정보등 엑셀파일을 csv파일로 저장후 수정을 하다보면 파일이 깨지는 경우가 발생하기
때문에 원본 엑셀파일은 보관해놓는게 좋음
RectTransform는 Sealed형식이라 상속을 할 수 없기 때문에 변수에 값을 넣을때 as키워드를 사용해서
넣어줘야한다.
Scene에 EventSystem은 반드시 하나만 있어야 한다
2d game을 만들경우엔 카메라를 orthgraphic으로 설정을 안해놓으면 충돌처리를 했을때 좌표값이
안맞을수가 있음
유니티가 멈추거나 꺼지는 경우에는 파일이 깨지거나 빠져 있는 부분들이 있을 수 있기 때문에
확인작업을 해야함
아이템구매같은 경우에는 TCP 방식을 사용해야함
최상의 클래스에 공통된 기능을 갖는 함수를 작성해 놓으면 점점 커지는 문제점이 생길 수 있다
애니메이션 사용시 애니메이션 안에 이벤트함수가 구현되어 있을 경우 그이벤트를 선언을 안하면 에러뜸
(구현을 해줘야함)
애니메이션 이벤트를 사용할 때 하나의 값만 보낼 수 있기 때문에 복합적으로 string, int 등 여러가지를 보내면
오류가 발생하게됨
항상 같은코드를 다른쪽에서 사용할 때 초기화가 잘되있는지 확인
==========================================================================
[자주쓰는 클래스]
Quaternion
: 회전
Mathf
: 숫자를 계산할때(최소값 최대값 등)
Physics
: 물리 프레임워크
Vector3
: 벡터값
Transform
: 위치값
LayerMask
: 레이어의 이름 또는 태그 값을 이용할때 사용
Camera
: 카메라를 사용하기 위해 사용
Image
: Image값을 사용하기 위해 사용
TMP_Text
: Text Mesh Pro를 사용
List
: 활용은 배열과 동일하며 필요할 때 추가, 제거 하며 데이터를 관리할 수 있음
Dictionary
: 사용자가 원하는대로 키를 설정할 수 있는 자료구조
Sprite
:
Sprite2D
:
SpriteRenderer
:
GameObject
:
RectTransform
:
Slider
:
Color
:
Gizmos
:
Ray
:
EventSystem
:
NavMeshAgent
: 길찾기 알고리즘(내부적으로 A*알고리즘 사용)
ParticleSystem
:
ResourceRequest
: 비동기적으로 얻어올때(화면에 멈추는 현상을 방지하기 위해 사용)
IPointerEnterHandler ,IPointerExitHandler
:마우스 클릭, 터치 등 인터페이스
ContextMunu
: 마우스 우클릭시 나오는 메뉴 추가
JsonUtility
: Unity 오브젝트를 JSON 포맷으로 상호 전환
IEnumerator
:
Socket
:
InputField
:
[자주쓰는 함수]
TryParse
: 숫자로 표기된 문자열을 숫자 데이터 형식으로 변환하는함수
(각 데이터 형식에 TryParsr 메서드를 사용하면됨)
GetComponent
:
GetComponentInChildren
:
Load
:
FindObjectOfType
: 스크립트 이름을 이용해서 찾는 방법
GetChild
: 순차적으로 받아올때 사용
Abs
:
OnDrawGizmos
:
Instantiate
:
Replace
:
Split
: 분리시킬때 사용하는 함수
isNullOrEmpty
:
ContainsKey
:
AddRange
:
Physics.IgnoreLayerCollision
: 해당 레이어의 콜라이더 끼리 충돌이 일어나지 않도록 설정하는 함수
SetActive
:
Replace
:
Invoke
: 시간을 지연시킬때 사용
ex) Invoke("asd", 2f); 2초뒤에 asd함수 호출
AngleAxis(float angle, Vector3 axis);
: axis주위를 angle만큼 회전한 rotation생성
Euler(float x, float y, float z);
: z축주위로z, x축 주위로x, y축 주위로 y 각도만큼회전한 rotation값 반환
(transform.rotation에 대입하기 위한 변수 타입)
Clamp(float vlaue, float min, float max);
: float value 값이 min 최소값과 max 최대값 사이에 있게 해주는 함수
ToJson()
: 저장된 형식대로 Json파일의 형태로 만들어주는 함수
FromJson()
: Json파일을 읽어올때 사용하는 함수
localEulerAngles()
: 부모가 있을때 부모의 상대적인 회전량 Degree값을 Vector3로 접근하는 프로퍼티
SetAsLastSibling : 가장 나중에 그려질 수 있도록 하는 함수
Mathf.Max() 두값중 큰값을 넘겨줌
Mathf.Min() 두값중 작은값을 넘겨줌
==========================================================================
[확장 클래스(확장 메소드)]
확장 메소드 형태 : public static 반환형식 메소드명(this 확장대상형식, 매개변수..)
==========================================================================
[알고리즘]
정렬알고리즘
링크드리스트
스택,큐(배열, 링크드리스트)
트리
힙
그래프
dfs 깊이 탐색, bfs 너비탐색(중요한 알고리즘)
다익스트라알고리즘
에이스타 알고리즘(길찾기) - 다익스트라 알고리즘의 개량형
플로킹 알고리즘(회피 알고리즘)
==========================================================================
유니티에서 기본(표준) 으로 제공하는 컴포넌트
Rigidbody
Transform
CharacterController
==========================================================================
연봉을 올리고 싶거나 중견이상 가고 싶을 경우 필수(알고리즘 포함)
-컴퓨터 구조
-네트워크 구조 : 인강추천 - 유니와이즈 : 하은실
-운영체제
셰이더에 관심이 생긴다면
1.책추천 :
아티스트를 위한 유니티를 URP셰이더 입문
유니티 쉐이더 스타트업 테크니컬 아티스트를 위한
(SurfaceShader)
셰이더 프로그래밍 입문, DirectX9 셰이더 프로그래밍(HLSL 문법기초)
참고해서 공부 후 아래 순서로 순차적으로 자기개발
2.셰이더 그래프의 사용법 익히기
3. 수학(증명 및 활용)
4.그래픽카드 제조사(최신 기술 문서 살펴보면됨)
서버쪽에 관심이 있거나 배우고싶으면
인프런(C++,C#) : 게임서버, 웹서버 강의 추천
비동기 기반 프로그래밍 작성법, 스레드
1.네이버 카페(리버시 공략집) : 간단한 AI를 만들고 싱글 형태로 게임이 진행 되도록 처리해보기
2.봐주기 기능을 넣어보기
3.사운도, 이펙트 기능을 넣어보기
게임 만들때
인벤토리, 상점, 강화, 퀘스트, 미니맵 + *재활용스크롤*
인벤토리, 상점, 강화 등은 기본적으로 구성해야하고 재활용스크롤을 구성하면
취업하기 좋음
분활(particle)클래스를 사용하여 코드를 구분지어 줄 수있음
C#으로 모듈화를 할 경우에는 델리게이트를 많이 활용한다
(어떠한 파트별로 실행부가 다를 경우에)
데미지를 구성하는 방법은 애니메이터 효과를 주는 방법과 코드로 효과를 주는 방법이 있다
(윗줄로 차례대로 나오는 데미지는 코드로 효과를 주는 방법)
싱글톤 방식 다시 확인
skined mesh renderer는 내부의 정점의 위치를 갖고있다? 강의참고하기
면접때 렌더링파이프라인 물어보기 때문에 렌더링파이프라인에 대해 알아두기
백버퍼, 프론트버퍼 등 용어 꼭 알아두기
캐릭터 기본 FullBody를 사용하려면 Animator에 Controller넣어주고
nh Avatar 스크립트 넣어준뒤 SetUp에 캐릭터의 Root와 Geometry를 넣어주고
머테리얼 값들 넣어주면 오류 없음
프로젝트 완성 후 코딩테스트 참고
코딩 테스트 의 검색 결과 - 인프런 | 강의 (inflearn.com)
김태원 의 검색 결과 - 인프런 | 강의
관심 있는 강의가 있다면 지금 당장 시작하세요! 인프런은 언제나 당신의 성장을 응원합니다. - 학습하기 | 인프런...
www.inflearn.com