✅ 오늘의 학습 목표
1. FPS 게임 - 스나이퍼 줌 UI
2. 파티클 실습
3. FPS 게임 - 라이트 베이크 적용
1. 스나이퍼 줌 UI
저번시간에 스나이퍼의 크로스헤어를 바꿔주었다.
사용자의 몰입도를 더 높여주기 위해서 스나이퍼를 줌인 했을 때 조준경 영역만 보이도록 구현해 주겠다.

public class FPSPlayerFire : MonoBehaviour
{
public GameObject crosshair02_zoom;
void Update()
{
if (Input.GetMouseButtonDown(1))
{
switch (wMode)
{
// 스나이퍼 모드 - 스나이퍼 줌 In/Out
case WeaponMode.Sniper:
ZoomMode = !ZoomMode; // 현재 줌 모드 상태 변경
float fov = ZoomMode ? 15f : 60f;
Camera.main.fieldOfView = fov;
crosshair02_zoom.SetActive(ZoomMode);
crosshair02.SetActive(!ZoomMode);
break;
}
}
}
2. 파티클 실습 - 교재
🥕 예행 작업
1. Asset 다운로드War FX | 시각 효과 파티클 | Unity Asset Store
Add depth to your next project with War FX from Jean Moreno. Find this & more 시각 효과 파티클 on the Unity Asset Store.
assetstore.unity.com
1. 파티클 생성

2. 파티클 설정
2.1. 파티클 기본 설정

| 옵션명 | 한줄 요약 |
| Duration | 파티클 시스템이 한 번 재생되는 시간 (초 단위) |
| Looping | 파티클을 반복해서 재생할지 여부 |
| Prewarm | Looping이 켜져 있을 때, 처음부터 시간이 지난 것처럼 시작 |
| Start Delay | 파티클이 시작되기 전 지연 시간 |
| Start Lifetime | 각 파티클이 살아있는 시간 |
| Start Speed | 파티클이 생성될 때의 초기 속도 |
| Start Size | 파티클의 초기 크기 |
| Start Size X/Y/Z | 각 축별로 파티클 크기를 따로 지정 가능 |
| Start Rotation | 파티클의 초기 회전값 (라디안 단위) |
| Start Rotation X/Y/Z | 각 축별 회전값 설정 가능 (3D 모드일 때 사용) |
| Start Color | 파티클의 시작 색상 |
| Gravity Modifier | 중력의 영향을 얼마나 받을지 조절 |
| Simulation Space | 파티클이 월드 기준인지 로컬 기준인지 선택 |
| Simulation Speed | 파티클 재생 속도를 전반적으로 조절 |
| Scaling Mode | 파티클이 부모 오브젝트의 스케일을 어떻게 반영할지 결정 |
| Play On Awake | 씬 시작과 동시에 자동 재생할지 여부 |
| Emitter Velocity Mode | 파티클이 생성될 때 오브젝트 속도의 영향을 얼마나 받을지 설정 |
| Stop Action | 파티클이 끝났을 때 어떤 동작을 할지 정하는 옵션 (비활성화 / 파괴) |
2.2. Emission - 파티클 방출량

파티클이 얼마나 자주, 몇 개씩 생성될지를 설정하는 부분이다. 숫자를 올리면 화면에 뿌려지는 파티클 양이 많아지고, 줄이면 조금씩 흩뿌려지는 느낌을 낼 수 있다. 연출에 따라 적절히 조절해 주는 게 중요하다.
2.3. Shape - 파티클 틀

파티클이 어떤 모양의 범위에서 퍼져나갈지를 결정한다. 파란색으로 표시되는 원뿔 모양이 바로 그 틀인데, 이걸 조절해서 파티클이 퍼지는 방향이나 범위를 자유롭게 바꿀 수 있다.
2.4. Color over Lifetime - 파티클 지속 색

파티클이 살아있는 동안 색이 어떻게 변할지를 설정할 수 있다. 예를 들어, 처음엔 밝은 색이었다가 점점 투명해지거나 어두워지게 할 수 있어서, 자연스러운 소멸 효과를 만들 때 자주 사용된다.
2.5. Size over Lifetime - 파티클 지속 사이즈

시간이 흐르면서 파티클의 크기가 어떻게 바뀔지를 정할 수 있다. 작게 시작해서 커졌다가 사라지거나, 반대로 커지다가 점점 작아지는 등 다양한 크기 변화를 줄 수 있다.
2.6. Nosie - 시각 효과

파티클의 움직임에 랜덤한 흔들림을 추가할 수 있는 기능이다. 덕분에 너무 규칙적으로 움직이지 않고 자연스럽고 불규칙한 느낌을 줄 수 있다. 연기나 마법 같은 효과에 자주 쓰인다.
2.7. Rotation over Lifetime - 파티클 지속 회전

파티클이 생성되고 나서 사라질 때까지 얼마나 회전할지를 설정하는 항목이다. 회전을 넣어주면 파티클이 더 생동감 있게 보이고, 시각적으로도 풍성한 느낌을 줄 수 있다.
3. 머테리얼 적용
3.1. 머테리얼 생성

빛의 영향을 받지 않도록 쉐이더를 Ulit으로 적용시켜 준다.
3.2. 렌더링 모드

파티클끼리 겹칠수록 더 밝게 표현하기 위해 렌더링 모드를 Additive로 설정해 주었다.
3.3. Maps

좀 더 시각적인 효과를 주기 위해 에셋에 포함된 텍스처를 적용해 주었다.
3.4. 머테리얼 적용

해당 머테리얼을 파티클 오브젝트에 드래그 앤 드롭하면 머테리얼이 적용된 것을 확인할 수 있다.
4. 연기 파티클 추가

기존에 만들어둔 파티클을 복사한 후 FX_Fire 오브젝트 자식으로 이동시킨 후
파티클 설정을 위와 같이 해준다.

머테리얼도 복사한 후 렌더링 모드를 Fade로 변경해 준 후 적용시켜 준다.
(겹칠수록 밝아지는 효과를 없애줌)

3. 파티클 실습 - 수업
🥕 예행 작업
1. Scene 생성 (Draw Line)

using System.Collections.Generic;
using UnityEngine;
public class DrawLine : MonoBehaviour
{
private LineRenderer line;
private int lineCount = 0;
private int lineObjectCount = 1;
public Color color;
public float lineWidth = 0.05f;
public List<GameObject> lineObjs = new List<GameObject>();
void Start()
{
color = new Color(1, 1, 1, 1);
}
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
GameObject lineObject = new GameObject("Line Object");
lineObjectCount++;
line = lineObject.AddComponent<LineRenderer>();
line.useWorldSpace = false;
line.startWidth = lineWidth;
line.endWidth = lineWidth;
line.startColor = color;
line.endColor = color;
line.material = new Material(Shader.Find("Universal Render Pipeline/Particles/Unlit"));
lineObjs.Add(line.gameObject);
}
if (Input.GetMouseButton(0))
{
Vector3 screenPos = Input.mousePosition;
screenPos.z = 10f;
Vector3 worldPos = Camera.main.ScreenToWorldPoint(screenPos); // 월드 상에 마우스 위치
lineCount++;
line.positionCount = lineCount;
line.SetPosition(lineCount - 1, worldPos);
}
if (Input.GetMouseButtonUp(0))
{
lineCount = 0;
}
if (Input.GetKeyDown(KeyCode.Space))
{
foreach (var line in lineObjs)
Destroy(line);
lineObjs.Clear();
}
}
}
- useWorldSpace = false → 로컬 좌표계를 기준으로 선을 그릴 지를 설정하는 옵션
- screenPos.z → z값이 0이면 월드 위치가 이상하게 계산될 수 있어서 10으로 고정해 줌
- line.SetPosition(lineCount - 1, worldPos) → 점 개수를 하나 늘리고, 직전 마우스 위치를 새로운 점으로 추가함
4. 라이트 맵핑 (Light Mapping)
라이트 맵핑(Lightmapping)은 움직이지 않는 오브젝트에만 적용할 수 있는 조명 최적화 기법이다.
조명 정보를 이미지(Texture) 형태로 미리 구워(bake) 놓고,
움직이지 않는 오브젝트에 적용해서 게임 실행 중에 실시간 계산 없이 조명이 적용된 것처럼 보이게 할 수 있다.
성능 향상이나 낮은 하드웨어의 부담을 줄이기 위해 주로 사용된다.
🥕 예행 작업
1. Asset 다운로드RPG/FPS Game Assets for PC/Mobile (Industrial Set v2.0) | 3D 공장 | Unity Asset Store
Elevate your workflow with the RPG/FPS Game Assets for PC/Mobile (Industrial Set v2.0) asset from Dmitrii Kutsenko. Find this & other 공장 options on the Unity Asset Store.
assetstore.unity.com
라이트 맵핑을 씬에 적용시키고 (오브젝트를 삽입해주었음)
빛의 영역을 설정해주기 위해 Light 값을 조정해줄 것이다.

Light의 Mode는 Mixed로 설정해주었는데, 이는 실시간과 스태틱 모두에 영향을 미치는 빛으로
실시간으로 움직이는 오브젝트를 실시간으로 계산하고, 스태틱 오브젝트는 미리 계산한 빛을 구워놓는다는 뜻이다.

라이트맵의 설정 값은 Ctrl + 9 단축키를 통해 확인하거나 [Window] - [Rendering] - [Lighting] 을 통해서 확인할 수 있다.
라이트맵을 생성하기 위해서는 Lighting Settings Assets을 생성해야하고 [New] 버튼을 통해 생성 후 Generate 해주면 된다.
5. 번외
1. 무료 Material 사이트
Poly Haven • Poly Haven
The Public 3D Asset Library
polyhaven.com
ambientCG - Free Textures, HDRIs and Models
Free 3D Assets Never Looked This Good! Get 2000+ PBR Materials, HDRIs and more for free under the CC0 Public Domain license.
ambientCG.com
2. 주석
#region과 #endregion은 C#에서 코드 블록을 접고 펼 수 있도록 도와주는 주석 태그이다.
#region 설명글
// 여기에 기능 관련 코드
#endregion
3. Renderer
타일/라인
'Unity > 멋쟁이사자처럼 부트캠프' 카테고리의 다른 글
| [멋쟁이사자처럼부트캠프] 유니티 게임 개발 5기(52일차) - FPS 게임 마무리 (9) (7) | 2025.07.31 |
|---|---|
| [멋쟁이사자처럼부트캠프] 유니티 게임 개발 5기(51일차) - FPS 게임 (8) (7) | 2025.07.30 |
| [멋쟁이사자처럼부트캠프] 유니티 게임 개발 5기(49일차) - FPS 게임 (6) (0) | 2025.07.25 |
| [멋쟁이사자처럼부트캠프] 유니티 게임 개발 5기(48일차) - Nav 실습 및 FPS 게임 (5) (3) | 2025.07.24 |
| [멋쟁이사자처럼부트캠프] 유니티 게임 개발 5기(47일차) - FPS 게임 (4) (4) | 2025.07.23 |