Unity 내일배움캠프 TIL 0924 | AnimationCurve로 낮과 밤 구현하기 | Scriptable Object로 아이템 생성 | AI Navigation으로 NPC 만들기 | Post-Processing

cheeseonrose·2023년 9월 24일
0

Unity 내일배움캠프

목록 보기
44/89
post-thumbnail

개인 과제를 위해 강의를 미뤄놓은 업보가 이렇게 돌아온다 ..

주말 공부는 즐거?워?

26강 플레이어 데미지 처리

Invoke

Invoke(string methodName, float time)
  • methodName : 실행할 메서드의 이름을 문자열로 지정
  • time : 메서드를 실행할 시간을 초 단위로 지정 (지연 시간)

Invoke Repeating

InvokeRepeating(string methodName, float time, float repeatRate)
  • repeatRate : 메서드를 반복해서 실행할 주기를 초 단위로 지정
private void Start()
{
	// 바로(0) 실행하는데, damageRate 주기로 실행하겠다
    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 매개변수

HashSet

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강 인벤토리 만들기 & 아이템 사용하기

Outline

  • 텍스트와 이미지같은 그래픽 컴포넌트에 간단한 외곽선 효과를 추가

  • 그래픽 컴포넌트와 동일한 게임 오브젝트에 있어야 함

    프로퍼티기능
    Effect Color외곽선 컬러
    Effect Distance외곽선 효과의 수평 및 수직 거리
    Use Graphic Alpha효과 컬러에 그래픽 컬러를 중첩(muliply)시킴
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 설정
  • 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는 돌아가게 만들 수 있음
  • 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가 지나갈 수 있는 영역과 지나가지 못하는 영역 설정 가능
  • 장애물 역할
  • 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강 포스트 프로세싱 적용

포스트 프로세싱(Post-Processing)

  • Unity나 다른 게임 엔진에서 화면에 렌더링된 이미지에 추가적인 효과를 적용하는 기술
  • 기능
    • 색상 보정 및 색감 필터링 : 화면에 특정 색조, 채도, 밝기 등의 보정을 적용하여 화면의 색상 조작
    • 블러 효과 : 게임 화면에 블러 효과를 적용하여 광학적 흐림, 광학 흐림, 도형 흐림 등을 구현
    • 선 처리 및 톤 매핑 : 경계선 처리, 윤곽선 강조, 톤 매핑 등
    • 광학 효과 : 렌즈 반사, 빛 착란, 먼지 효과 등
    • 사용자 정의 효과 : Unity의 포스트 프로세싱 스택을 사용하여 사용자가 직접 쉐이더 코드를 작성하여 원하는 효과를 만들어 적용 가능



드디어 다...들었따...............


끗!

0개의 댓글