개인 과제를 위해 강의를 미뤄놓은 업보가 이렇게 돌아온다 ..
주말 공부는 즐거?워?
26강 플레이어 데미지 처리
Invoke
Invoke(string methodName, float time)
- methodName : 실행할 메서드의 이름을 문자열로 지정
- time : 메서드를 실행할 시간을 초 단위로 지정 (지연 시간)
Invoke Repeating
InvokeRepeating(string methodName, float time, float repeatRate)
- repeatRate : 메서드를 반복해서 실행할 주기를 초 단위로 지정
private void Start()
{
InvokeRepeating("DealDamage", 0, damageRate);
}
void DealDamage()
{
for (int i = 0; i < thingsToDamage.Count; i++)
{
thingsToDamage[i].TakePhysicalDamage(damage);
}
}
TryGetComponent
- 게임 오브젝트의 컴포넌트를 가져오는 기능
- 특정 컴포넌트가 게임 오브젝트에 연결되어 있는지 확인하고, 연결되어 있다면 해당 컴포넌트를 가져옴
- 컴포넌트가 없어도 예외를 발생시키지 않기 때문에 안전하게 컴포넌트 사용 가능
public bool TryGetComponent<T>(out T component) where T : Component;
- T : 가져오려는 컴포넌트의 타입. MonoBehaviour를 상속한 컴포넌트는 모두 사용 가능
- component : 컴포넌트를 가져올 때 사용되는 out 매개변수
private List<IDamagable> thingsToDamage = new List<IDamagable>();
-
현재는 CampFire 스크립트에서 IDamagable을 List에 담아 관리함
-
하지만 이런 경우처럼 순서가 중요하지 않고, 삽입/삭제가 자주 일어날 때는 HashSet을 쓰면 속도가 더 빠름
-
집합은 중복 요소가 없고 해당 요소가 특정 순서가 없는 컬렉션
-
HashSet<T>는 고성능 집합 작업을 제공
- Dictionary<TKey, TValue> 키에 액세스 하는 것과 유사한 고성능 집합 작업을 제공
-
수학적 집합 연산을 제공
HashSet 작업 | 수학적 연산 |
---|
UnionWith | 공용 구조체 또는 집합 추가 |
IntersectWith | 교차 |
ExpectWith | 빼기 |
SymmetricExceptWith | 대칭 차이 |
27강 낮과 밤 구현
AnimationCurve
- 애니메이션의 키프레임(Keyframe)을 사용하여 값을 보간(interpolate)하는데 사용되는 클래스
- 시간에 따라 값을 부드럽게 변화시키는 커브를 정의하고, 이를 기반으로 애니메이션을 만들 수 있음
- 구성 요소
- 키프레임(Keyframe) : 시간에 따른 값을 정의하는 점. 시간(t)와 해당 시간에 대응하는 값(value)로 이루어짐
- 보간 방식(Interpolation Mode) : 인접한 키프레임 사이의 값을 보간하는 방법을 지정. 기본적으로는 Cubic Bezier 보간이 사용되며, 선형, 스텝 등 다양한 방식 선택 가능
private AnimationCurve curve;
void Start()
{
curve = new AnimationCurve();
curve.AddKey(0f, 0f);
curve.AddKey(1f, 1f);
}
void Update()
{
float time = Time.time;
float value = curve.Evaluate(time);
}
- Evaluate : 특정 시간에 해당하는 값을 보간하여 반환
- keys : 키프레임의 배열을 가져옴. 이를 통해 키프레임을 추가, 수정, 삭제 가능
28강 아이템과 상호작용
Scriptable Object로 아이템 데이터 생성
public enum ItemType
{
Resource,
Equipable,
Consumable
}
public enum ConsumableType
{
Hunger,
Health
}
[CreateAssetMenu(fileName = "Item", menuName = "New Item")]
public class ItemData : ScriptableObject
{
[Header("Info")]
public string displayName;
public string description;
public ItemType type;
public Sprite icon;
public GameObject dropPrefab;
[Header("Stacking")]
public bool canStack;
public int maxStackAmount;
}
29강 인벤토리 만들기 & 아이템 사용하기
public class ItemSlotUI
{
...
private Outline outline;
private void Awake()
{
outline = GetComponent<Outline>();
}
private void OnEnable()
{
outline.enabled = equipped;
}
...
}
30강 아이템 장착과 모션
장착 카메라
- 카메라를 하나만 사용할 경우 장착된 무기가 가려지는 문제가 생김
- 무기를 위한 EquipCamera를 준비
- Clear Flags는 Depth only로, Culling Mask는 Equip만 체크, Depth를 1로 설정
- MainCamera의 Culling Mask에서는 Equip을 해제해줘야 함
33강 적 생성과 로직
AI 네비게이션(AI Navigation)
- 인공지능이 게임이나 시뮬레이션 등 가상 환경에서 이동하는 방법을 결정하는 기술
- 주로 3D 게임에서 캐릭터나 NPC가 지능적으로 이동하도록 만들어짐
- 주요 기술과 개념
- Navigation Mesh(내비게이션 메쉬)
- 3D 공간을 그리드로 나누어 이동 가능한 지역과 장애물이 있는 지역을 구분하는 메쉬
- 캐릭터가 이동할 수 있는 영역과 없는 영역을 정의, 이를 기반으로 경로 계산
- Pathfinding(경로 탐색)
- 캐릭터의 현재 위치에서 목표 지점까지 가장 적절한 경로를 찾는 알고리즘
- 주로 A* 알고리즘이 사용되며, 최단 경로를 탐색
- Steering Behavior(스티어링 동작)
- 캐릭터나 NPC가 경로를 따라 이동할 때, 보다 자연스러운 동작을 구현하는데 사용
- 동적으로 캐릭터의 이동 방향과 속력을 조절
- Obstacle Avoidance(장애물 피하기)
- 캐릭터가 이동 중 장애물과 충돌하지 않도록 하는 기술
- Local Avoidance(근접 회피)
- 여러 캐릭터나 NPC가 서로 충돌하지 않도록 하는 기술
- 캐릭터 사이 거리를 유지하거나 회피 동작 수행
- Package Manager - AI Navigation 설치
- Object 탭에서 Walkable과 Not Walkable 설정
NavMesh
-
Object
- All : 씬에 있는 모든 오브젝트를 보여주는 필터
- Mesh Renderer : Mesh Renderer 컴포넌트를 가지고 있는 게임 오브젝트만을 보여주는 필터
- Terrains : 유니티 엔진에서 거대한 평면에 높낮이를 직접 조절하면서 지형을 만들 수 있는 터레인 오브젝트만을 보여줌
- Mesh Renderer나 Terrain을 가진 게임 오브젝트만 캐릭터가 돌아다닐 수 있는 내비게이션 영역으로 설정할 수 있음
-
Bake
- Mesh : 3D에서 삼각형이나 다각형 여러 개로 면을 구성하는 것
- NavMesh : 캐릭터가 길을 찾아서 이동할 수 있는 영역. 다각형 여러 개로 캐릭터가 이동할 수 있는 표면을 구성
- NavMesh를 만드는 작업 == NavMesh를 굽는다
- 평면 위에 장애물을 만들고 Object 탭에서 Navigation Static으로 설정해준 뒤, Bake 탭에서 NavMesh를 구울 수 있음(Bake를 누름)
- Agent Radius : NavMesh 위에서 움직일 대상의 반지름
- Agent : NavMesh 위에서 움직이는 대상
- Agent Height : Agent의 키
- Max Slope : NavMesh에 이동할 수 있는 길로 포함될 수 있는 경사로의 최대 각도
- Step Height : Agent가 가벼운 계단 정도로 여기고 올라갈 수 있는 단의 높이
-
Area
- 사용자가 필요한 내비게이션 메시 구역을 설정하고, 그 구역을 지나가는 비용을 설정할 수 있음
- Walkable, Not Walkable, Jump 세 가지가 기본으로 있고, Area마다 비용이 책정되어 있음
- Agent는 가급적 비용이 적은 경로를 선택하게 됨
-> 길은 쉽지만 몬스터가 자주 돌아다니는 구역과 몬스턴느 자주 오지 않지만 함정이 많은 구역처럼 다양한 레벨 디자인 가능
-
Agent
- Humanoid : 덩치가 큰 Agent와 덩치가 작은 Agent를 만들어서, 덩치가 작은 Agent는 지나갈 수 있는 길을 덩치가 큰 Agent는 돌아가게 만들 수 있음
NavMeshAgent
- SetDestination : Agent에게 가야 할 목적지를 알려주는 함수
- Base Offset : 길을 찾을 때 사용되는 충돌 실린더의 위치. 캐릭터와 에이전트의 위치를 맞추기 위해 사용
- Speed : Agent가 움직이는 속도
- Angular Speed : Agent가 회전하는 속도. degree/sec로 회전속도를 결정 -> 120이면 1초에 120도 회전
- Acceleration : 가속도
- Stopping Distance : 목표와 얼마만큼의 거리를 두고 멈출 지를 결정
- Auto Braking : Agent가 목적지에 도착하기 직전에 감속을 시작할 것인가를 결정
- Radius : 다른 Agent와 겹쳐지지 않게 밀어내는 역할
- Height : Agent끼리의 높이 충돌을 조절
- Quality : 장애물 회피 품질.
High일 경우 다른 Agent를 피하기 위해 최대한 정밀한 움직임을 보이며, Low일 때는 회피 움직임 간소화.
양쪽 다 None일 경우 서로 무시하고 지나감
- Priority : Agent간의 우선 순위(0이 가장 높고 99가 가장 낮음)
우선 순위가 높은 Agent는 길을 찾을 때 우선 순위가 낮은 Agent를 고려하지 않고 그냥 밀고 지나감
우선 순위가 같으면 회피하려는 노력은 하지만, 여의치 않을 때는 그냥 밀고 지나감
낮은 우선 순위의 Agent는 높은 우선 순위의 Agent를 밀어내지 못함
- Auto Repath : 내비게이션 메시에 변동이 생겼을 때 자동으로 길을 다시 찾을 것인가를 설정
경로가 막힌 구역까지 이동한 후에 경로를 다시 계산하기를 원한다면, 체크를 해제하고 해당 기능을 직접 구현해야 함
- Area Mask : 정의해둔 내비게이션 영역의 목록을 볼 수 있음. 해당 Agent가 지나갈 수 있는 영역과 지나가지 못하는 영역 설정 가능
NavMeshObstacle
- 장애물 역할
- Shape : 장애물의 형태를 결정. Box, Capsule의 두 가지 형태를 지원
- Center, Size : Box나 Capsule의 크기를 결정
- Carve : 내비게이션 메시 영역을 새로 굽지 않아도 실시간으로 "파내서" Agent가 지나갈 수 없는 영역으로 만드는 것
- Move Threshold : 최소 이동 거리
MoveThreshold보다 조금 움직인 것은 오브젝트가 움직이지 않은 것으로 간주하여 Carve를 새로 계산하지 않음
- Time To Stationary : 게임 오브젝트가 얼마나 정지해있으면 완전히 멈춘 것으로 판정하고 Carve를 새로 계산해서 내비게이션 메시를 파낼지 결정하는 값
- Carve Only Stationary : 정지된 상태에서만 내비게이션 메시를 파내도록 할 것인지를 결정
- 벽과 장애물의 차이 : Navigation Static으로 설정된 벽은 움직일 수 없지만, NavMeshObstacle로 설정된 장애물은 게임 플레이 중 언제든 움직일 수 있으며 실시간으로 Agent를 밀어내는 동작도 가능
34강 포스트 프로세싱 적용
- Unity나 다른 게임 엔진에서 화면에 렌더링된 이미지에 추가적인 효과를 적용하는 기술
- 기능
- 색상 보정 및 색감 필터링 : 화면에 특정 색조, 채도, 밝기 등의 보정을 적용하여 화면의 색상 조작
- 블러 효과 : 게임 화면에 블러 효과를 적용하여 광학적 흐림, 광학 흐림, 도형 흐림 등을 구현
- 선 처리 및 톤 매핑 : 경계선 처리, 윤곽선 강조, 톤 매핑 등
- 광학 효과 : 렌즈 반사, 빛 착란, 먼지 효과 등
- 사용자 정의 효과 : Unity의 포스트 프로세싱 스택을 사용하여 사용자가 직접 쉐이더 코드를 작성하여 원하는 효과를 만들어 적용 가능
드디어 다...들었따...............
퇴
근
끗!