게임 매니저란?
게임에 활용되는 전역적인 데이터나 게임 승패에 관련된 조건을 체계적으로 관리하는 등, 게임의 전체적인 흐름을 관리하는 역할을 수행
프로퍼티란?
메소드를 사용하지 않고 객체의 데이터를 바로 읽고 쓸 수 있도록 객체 생성시 읽고 쓰는 형식을 미리 정해놓는 방식이다.
Invoke관련 함수
// 대기 시간 후에 특정 함수를 호출
Invoke("함수명", 대기 시간);
// 대기 시간 후에 특정 함수를 대기 시간마다 호출
InvokeRepeating("함수명", 대기 시간, 반복시간);
// 모든 인보크 함수를 취소
CancelInvoke();
// 특정 함수 호출을 취소
CancelInvoke("함수명");
싱글톤 패턴이란?
▶ 게임 실행시 오로지 한개의 객체만을 생성하고 그 생성된 객체가 게임 종료시까지 계속적으로 살아있는 패턴을 말함
▶ 변수/함수/객체 3개 중에 하나는 무조건 정적(static)으로 선언되어 있어야한다.
▶ 게임 메니저에 자주 사용된다.
public class GameManager : MonoBehaviour
{
private static GameManager Inst = null;
void Awake(){
if(Inst == null){
DontDestroyOnLoad(this.gameObject);
Inst = this;
else
Destroy(this.gameObject);
}
}
오브젝트 풀링이란?
계속해서 생성, 삭제되는 오브젝트로 인해 가비지 컬렉터가 작동하여 생기는 부하를 막기 위해 사용할 객체를 미리 만들어 놓은 후 필요할 때 SetActive 함수를 활용해 가져다 사용하는 방식
오브젝트 풀링에서의 OnEnable()함수 사용 이유
OnEnable(): 오브젝트나 스크립트가 활성화 될 때 실행되는 함수
Awake나 Start 함수는 최초로 활성화 될 때, 단 한 번만 호출되기 때문에, OnEnable 함수를 통해 활성화 될 때 마다 오브젝트의 패턴을 정해주기 위해서이다.
레이캐스팅이란?
눈에 보이지 않는 광선(ray)를 쏘아 해당 광선에 맞은 콜라이더의 정보를 반환하는 방식
또는
레이 캐스팅은 화면에 보이지 않는 광선(ray)를 쏘아 물체가 있는지 없는지 충돌 감지를 해준다.
레이캐스팅 구조체 및 레이캐스팅 함수 구성 요소
▶ 한 개만 반환 받을 경우
RaycastHit hit; // 반환받을 변수
Physic.RayCast(시작위치, 방향, out hit, 거리, 검출할 레이어);
▶ 여러 개 반환 받을 경우
RaycastHit[] hit;
Physic.RayCastAll(시작위치, 방향, out hit[], 거리, 검출할 레이어);
▶ RaycastHit 구조체
collider, transform, point, distance, normal
마우스 클릭으로부터 레이캐스팅을 활용한 총알 발사 단계
1. Update문에서 마우스 버튼을 클릭하면 레이를 발사한다.
2. 레이에 오브젝트가 맞으면, hit 구조체로부터 맞은 게임 오브젝트의 정보를 가져온다.
3. 맞은 게임 오브젝트에서 피격 이벤트를 실행한다.
동적 장애물 처리란? + 사용되는 컴포넌트는?
Navigation Static을 이용한 정적 장애물 처리는 오브젝트가 이동하거나 파괴되어도 해당 지역을 장애물로 인식하기 때문에, 동적 오브젝트에 NavMeshObstacle 컴포넌트를 추가하여 오브젝트 자체를 장애물로 판단하게끔 처리할 수 있다.
Off Mesh Link Generation
목표물을 추적할 때, 서로 분리된 메시는 추적할 수 없지만, Off Mesh Link를 사용하여 추적이 가능하도록 서로 분리된 메쉬를 연결할 수 있다.
유니티에서의 조명 방법
전역 조명
직접 광원과 간접 광원 및 그림자를 렌더링 해 좀 더 사실적인 조명을 구현하는 것
조명 방법
1. RealTime
- 실시간 조명으로 씬에 직접 광을 적용하며, 매 프레임마다 조명 연산을 하여 연산 부하가 크다.
- 직접 광원만 적용된다.
2. Mixed
- Baked Indirect: 간접 광원만 미리 계산하여 베이크하는 방식
- Subtractive: 정적인 객체의 직접/간접 광원과 그림자를 모두 베이크 하는 방식
- Shadowmask: 직접 광원은 실시간으로 처리하고, 간접 광원과 Light Probe는 라이트 맵에 저장한다.

3. Baked
- 런타임시 조명 연산을 처리하지 않는 조명이다.
- 정적인 물체에 전역 조명과 그림자를 생성한다.
- 동적인 물체의 조명효과는 라이트 프로브를 통해 적용한다.
- 스펙큘러 조명 효과를 표현할 수 없어서 리플렉션 프로브를 사용해 구현한다.
라이트 맵과 베이크
라이트 맵핑: 씬에 배치된 모든 3D 모델의 직·간접 조명 및 그림자의 효과를 텍스처로 미리 만드는 과정
라이트 맵: 라이트 맵핑의 결과로 만들어진 텍스처 파일
베이크: 라이트 맵을 만드는 일련의 과정
라이트 프로브
라이트 프로브에 주변부의 광원 데이터를 미리 저장해 두고, 실행 시 근처를 지나가는 동적 객체에 광원 데이터를 전달해 해당 객체의 색상과 보간 시켜 마치 실시간 조명과 같은 효과를 내는 방식이다.
씬 메니저 메서드 정리
메서드 | 설명 |
CreateScene | 새로운 빈 씬을 생성 |
LoadScene | 씬의 이름 또는 인덱스 번호로 씬을 로드 |
LoadSceneAsync | 씬을 비동기 방식으로 로드 |
MergeScene | 소스 씬을 다른 씬으로 통합 소스 씬은 모든 게임오브젝트가 통합된 이후 삭제 |
MoveGameObjectToScene | 현재 씬에 있는 특정 게임 오브젝트를 다른 씬으로 이동 |
UnloadScene | 현재 씬에 있는 모든 게임오브젝트를 삭제 |
씬 병합
- LoadScene의 두 번째 매개인자로는 LoadSceneMode.Single과 LoadSceneMode.Additive가 있다.
- 디폴트로는 LoadSceneMode.Single이 실행된다.
- 첫 번째 씬 로드 후 LoadSceneMode.Additive를 통해 LoadScene을 실행하면 이전 씬의 오브젝트들이 파괴되지 않고 멀티 씬 형태가 된다.
멀티 씬 에디터
프로젝트 뷰에 있는 씬을 현재 열려있는 씬의 하이어라키 뷰로 드래그 하면 두 개의 씬을 한 번에 로드할 수 있다.
컬링 방식
- 프러스텀 컬링: 카메라의 시야에 들어와 있는 물체만을 렌더링
- 거리비례에 의한 컬링: LOD(Level Of Detail)를 이용해 일정 거리 밖의 물체를 컬링시킨다.
- 오클루전 컬링
오클루전 컬링
카메라 시야에서 다른 물체에 가려 보이지 않는 물체를 렌더링 하지 않는 기법
가릴 물체는 Occuluder Static, 가려질 물체는 Occludee Static 으로 플래그를 지정함
1인칭 시점일 때 사용 강추!
기존 입력 방식과 Input System과의 차이점
기존 입력 방식은 외부 입력 장치의 입력 값을 미리 정의해 두어 다양한 플랫폼에서의 사용이 어렵고, Update() 함수에서 사용되기 때문에 프레임 마다 호출되어 성능상 좋지 않다.
Input System은 스키마를 나누어 다양한 플랫폼에서 사용할 수 있고, 액션을 입력 장치와 매핑(바인딩)하여 액션의 이름 앞에 On을 붙인 함수를 실행시켜 코드의 양을 줄일 수 있다.
포톤 게임 엔진의 타입
포톤 리얼타임(포톤의 핵심 코어 엔진), 포톤 서버(직접 서버 운영), 포톤 클라우드(엔진을 바탕으로 클라우드 서비스를 제공)가 있다.
URP
Universal Render Pipeline의 약자로 범용으로 사용 가능한 렌더링 파이프라인이다.
포스트 프로세싱 기능과 통합되어 다양한 후처리 그래픽 효과를 처리할 수 있다.
포스트 프로세싱
렌더링된 결과물에 다양한 필터와 효과를 적용하는 후처리 작업, 퀄리티를 높일 수 있다.
비네팅
화면의 주변이나 모서리를 어둡게 처리하는 효과
Bloom
빛을 받는 물체가 주위의 빛을 발산하는 효과
Tonemapping
HDR(32비트 또는 16비트) 이미지를 SDR(8비트) 이미지로 변환할 때 사용하는 효과
※ HDR 이미지는 노출의 정도가 다른 여러개의 SDR이미지로 만들며, 이 때 더욱 광범위한 색상과 밝기를 나타내어 일반 디스플레이에서는 이를 표현할 수 없기에 톤 맵핑을 통해 다시 8비트의 SDR이미지로 변환한다.
포톤 클라우드 준비하기
콜백 함수
// 서버 접속
PhotonNetwork.ConnectUsingSettings()
// 서버 접속 후 콜백
public override void OnConnectedToMaster()
// 서버와 연결 끊기
PhotonNetwork.Disconnect()
// 서버와 연결이 끊기면 콜백
public override void OnDisconnected(DisconnectCause cause)
// 로비 접속
PhotonNetwork.JoinLobby()
// 로비 접속 후 콜백
public override void OnJoinedLobby()
// 방 생성 후 참가
PhotonNetwork.CreateRoom(룸 이름, RoomOptions{ MaxPlayers = 2, IsOpen = true, IsVisible = true; })
// 방 생성하면 콜백
public override void OnCreatedRoom()
// 방 생성에 실패하면 콜백
public override void OnCreateRoomFailed(short returnCode, string message)
// 방 참가
PhotonNetwork.JoinRoom(룸 이름)
// 방 참가하면 콜백
public override void OnJoinedRoom()
// 방 참가에 실패하면 콜백
public override void OnJoinRoomFailed(short returnCode, string message)
// 랜덤 방 참가
PhotonNetwork.JoinRandomRoom()
// 랜덤 방 참가 실패하면 콜백
public override void OnJoinRandomFailed(short returnCode, string message)
// 방에 참가하는데 방이 없으면 생성 후 참가
PhotonNetwork.JoinOrCreateRoom(룸 이름, 옵션, null)
// 방에서 나가기
PhotonNetwork.LeaveRoom()
// 룸 리스트가 업데이트 될 때 콜백
public override void OnRoomListUpdate(List<RoomInfo> RoomList)
// 룸에 들어갔을 때 방장의 씬과 동기화
PhotonNetwork.AutomaticallySyncScene = true
// 같은 버전의 유저끼리 접속 허용
PhotonNetwork.Version = 버전
// 서버와의 전송 횟수
PhotonNetwork.SendRate
// 내 닉네임
PhotonNetwork.LocalNickName
// 현재 룸의 정보
PhotonNetwork.CurrentRoom.Name
PhotonNetwork.CurrentRoom.PlayerCount
PhotonNetwork.CurrentRoom.MaxPlayers
// 현재 룸에 접속한 유저의 정보
PhotonNetwork.CurrentRoom.Players.NickName
PhotonNetwork.CurrentRoom.Players.ActorNumber // 포톤 뷰 넘버
동기화
- OnPhotonSerializeView, IPunObservable => 초당 10번 전송, 포톤 뷰에 등록
- RPC => 필요할 때 함수 실행
- RaiseEvent => 객체에 포톤 뷰가 없어도 이벤트 전송 가능
동기화 컴포넌트: 편하게 동기화 할 수 있도록 미리 만들어둔거, 결국 OnPhotonSerializedView로 실행됨
- PhotonView: 동기화될 오브젝트 등록, 생성될 오브젝트는 1000번대 부터 시작, 다른 오브젝트는 1번대 부터 시작
- Photon Trasform View, Photon Transform View Classic: 위치 동기화
- Photon Animator View: 애니메이션 동기화
'학교 수업 > 게임프로그래밍' 카테고리의 다른 글
게임프로그래밍(2) 기말고사 정리 (2) | 2022.12.06 |
---|---|
게임프로그래밍 기말고사 정리 (0) | 2022.06.08 |
게임 프로그래밍(1) 중간 정리 (0) | 2022.04.26 |
게임프로그래밍 2주차 (0) | 2022.03.16 |