- Today
- Total
프로그래밍 농장
유데미 스타터스 유니티 개발자 1기 취업 부트캠프 - 7주차 학습 일지 본문
어느덧 유데미 스타터스 과정도 7주차에 접어들었다. 부트캠프과정을 시작한게 엊그제같은데 벌써 두달이 다되어간다는 사실에 놀라면서도 그만큼 열심히 하고 있다고 생각했다 .
지난주에는 유니티엔진의 동작방식과 프로젝트 수행시의 생명주기, 그리고 유니티의 클래스형식과 구조에 대하여 학습했다. 이번주에는 이와같은 근본적인 유니티엔진에 대한 개념에 기반하여 다양한 랜더링과 파티클, 그리고 포스트프로세싱에 대하여 학습하였다.
그리고 추가적으로 2D 환경에서의 각종 Pivot, Multiple Sprite, 등 Canvas 내에서 그려지는 다양한 UI들에 대한 학습내용에 기반하여서 한가지 과제를 수행하였다.
- 싱글톤 패턴
싱글톤 패턴은 지난주에 이어서, 그 중요성이 높다고 생각하여 다시 한번 정리하며 프로젝트과제에 적용시켰다.
일반적으로 싱글톤 패턴을 사용할때, 그리고 유니티상에서 게임을 구현할때에는 단순히 해당 스크립트에 static 멤버변수 instance를 선언하여 초기화한 후, 타 Scene으로 전환될때 또는 프로젝트가 수행되는 동안 계속 유지가 될수있도록 하는 방식을 사용하였다.
public class GameManager : MonoBehaviour
{
// instance 멤버변수는 private하게 선언
private static GameManager instance = null;
private void Awake()
{
if (null == instance)
{
// 씬 시작될때 인스턴스 초기화, 씬을 넘어갈때도 유지되기위한 처리
instance = this;
DontDestroyOnLoad(this.gameObject);
}
else
{
// instance가, GameManager가 존재한다면 GameObject 제거
Destroy(this.gameObject);
}
}
// Public 프로퍼티로 선언해서 외부에서 private 멤버변수에 접근만 가능하게 구현
public static GameManager Instance
{
get
{
if (null == instance)
{
return null;
}
return instance;
}
}
좀 더 구체화하여 정리를 하자면 일단 아래와 같이 싱글톤 패턴을 정의할수있다.
1. 클래스의 instance가 하나만 존재하고, 어디서든 해당 instance에 접근할 수 있어야한다.
2. public으로 지정된 생성자가 없어야한다
3. instance를 만들어 놓는 것이 아닌, 참조할때마다 실시간으로 생성해야한다.
위 3요소를 참고하면 위와 같이 GameObject가 존재하지 않아도 아래와 같이 충분히 구현이 가능하다.
// 유니티 GameObject에 붙이는 스크립트가 아니기때문에 MonoBehaviour 제거
public class Singleton
{
// Static 자기자신 클래스 멤버변수
private static Singleton instance;
private Singleton()
{
// 초기화 - 싱글톤을 처음 사용할때 호출
}
public static Singleton GetInstance()
{
// 해당 싱글톤 사용할때 호출, instance == null 일때만 생성
if(instance == null)
{
instance = new Singleton();
}
return instance;
}
}
위와 같이 구현하게 되면, 필요할때 Singleton 클래스를 생성하고 게임이 끝날때까지 유일한 instance를 가진 클래스가 된다.
하지만 여기서 모든 클래스에 저렇게 싱글톤 구현부가 존재하는 것보다는 서브클래스를 만들수있게도 구현이 가능하다.
// 제네릭 클래스로 구현한 싱글톤
public class Singleton<T> where T : new()
{
protected static T instance;
protected static T GetInstance()
{
if(instance == null)
{
instance = new T();
}
return instance;
}
}
그에 따른 서브클래스 GameManager
// 제네릭 클래스 싱글톤을 사용해서 instance가 GameManager임을 짐작할 수 있습니다.
public class GameManager : Singleton<GameManager>
{
protected int gold = 0;
public GameManager()
{
Debug.Log("게임 매니저 초기화");
// 초기화
}
// 편리한 사용을 위해 모든 함수를 Static 매소드로 구현했습니다.
public static int GetGold()
{
return GetInstance().gold;
}
public static void AddGold(int _gold)
{
GetInstance().gold += _gold;
}
}
싱글톤 패턴에 대한 개념이해는 아래 포스팅을 통해 더 구체적으로 참조하였다.
- Post Processing (포스트 프로세싱)
포스트 프로세싱 : 말그대로 뒤에(후에) 전체내용을 처리한다는 의미이다.
이전까지의 단일 이펙트 등. . 은 오브젝트 1개가 있을떄 하나하나가 작동하지만, 해당사항에서는 카메라 자체에다가 필터를 씌우는것처럼 오브젝트 전체에 영향을 주는 방식이기때문에 오브젝트 1개마다 주는것보다 카메라 하나에 효과를 주는것이 더 효과적이기때문에 이와같이 동작되는 방식이다.
카메라에 post-process Layer를 붙혀준다.
- Global : world전체에 영향을 미침
- local : 일정범위내에 영향을 미침
이 외에 카메라에 안붙히는 경우도 있음.
(TPS : 3인칭 슈팅게임같은경우는 -> 캐릭터가 기준이되어 트리거가 들어와야함 )
아래와 같이 3d boject - post processing 을 생성하여 카메라 범위내에 넣고, Instansity와 Threshold 두가지만 적용해준다.
아래와 같이 isglobal로 주었기 때문에 포스트 프로세스 볼륨에 카메라가 들어가있지않아도 블룸 효과가 적용된다.
만약 isglobal을 끄면 카메라가 포스트프로세스볼륨 밖에있을때에는 효과적용이 안되고, 볼륨안에들어가면 효과가 적용되는것을 확인할수있다.
아래와 같이 두 포스트프로세싱을 겹친 후 Blend값을 주어 자연스럽게 변경되도록 할 수 있다.
- Particle ( 파티클)
Duration : 시간조절가능
Looping : 처음시작과 끝 애니메이션이 다를수있기때문에 루프를 사용할때도 있음
prewarm : 미리 로딩하는것 (프리로딩? → 메모리적으로 효율성있음)
start delay : 몇초 뒤 시작할것인지
start lifetime : 파티클은 일종의 스프라이트(이미지)의 집합임으로, 이 이미지 하나가 없어지는데 걸리는 시간을 lifetime이라 칭한다.
Particle은 아래와 같이 수많은 Quad들의 집합이고, 아래와 같이 two side를 체크해주면 뒷면도 출력해주게 된다.
위와 같은 파티클의 쿼드들은 전부 알파값을 처리해주는것이 일반적이다.
아래와 같이 SHAPE에 따라 쿼드들의 생성방향이 정해진다.
SPHERE : 생성점을 기점으로 퍼지듯이 생성된다. . .
유데미코리아 바로가기 : https://bit.ly/3b8JGeD
본 포스팅은 유데미-웅진씽크빅 취업 부트캠프 유니티 1기 과정 후기로 작성되었습니다.
#유데미, #유데미부트캠프, #취업부트캠프, #개발자부트캠프, #IT부트캠프, #부트캠프후기
'STARTERS' 카테고리의 다른 글
유데미 스타터스 유니티 개발자 1기 취업 부트캠프 - 9주차 학습 일지 (0) | 2022.08.21 |
---|---|
유데미 스타터스 유니티 개발자 1기 취업 부트캠프 - 8주차 학습 일지 (0) | 2022.08.14 |
유데미 스타터스 유니티 개발자 1기 취업 부트캠프 - 6주차 학습 일지 (0) | 2022.07.31 |
유데미 스타터스 유니티 개발자 1기 취업 부트캠프 - 5주차 학습 일지 (0) | 2022.07.24 |
유데미 스타터스 유니티 개발자 1기 취업 부트캠프 - 4주차 학습 일지 [ 유데미 [retr0의 유니티(Unity C#)게임 프로그래밍 에센스 / 쉽게 배우는 c# 알고리즘 입문 / 게임 인류 / 인류는 메타버스로 .. (0) | 2022.07.17 |