Unity 내배캠 TIL

Unity 게임 개발 숙련 - (6주차1일)

오늘도즐겨 2024. 10. 24. 20:35

🔥 10/23 수요일 목표 🔥 

🔎 Unity 게임 개발 숙련 강의 수강하기

🔎 개인과제발제

📌 필수 기능 가이드
더보기

기본 이동 및 점프 Input System, Rigidbody ForceMode (난이도 : ★★☆☆☆)  3강
           플레이어의 이동(WASD), 점프(Space) 등을 설정
체력바 UI (난이도 : ★★☆☆☆)  4강 
            UI 캔버스에 체력바를 추가하고 플레이어의 체력을 나타내도록 설정. 플레이어의 체력이 변할 때마다 UI 갱신.
동적 환경 조사 Raycast UI (난이도: ★★★☆☆) 10강, 11강
             Raycast를 통해 플레이어가 조사하는 오브젝트의 정보를 UI에 표시.
            예) 플레이어가 바라보는 오브젝트의 이름, 설명 등을 화면에 표시.
점프대 Rigidbody ForceMode (난이도 : ★★★☆☆)
            캐릭터가 밟을 때 위로 높이 튀어 오르는 점프대 구현
            OnCollisionEnter 트리거를 사용해 캐릭터가 점프대에 닿았을 때 ForceMode.Impulse를 사용해 순간적인 힘을 가함.
아이템 데이터 ScriptableObject (난이도 : ★★★☆☆)  9 - 12강
             다양한 아이템 데이터를 ScriptableObject로 정의. 각 아이템의 이름, 설명, 속성 등을 ScriptableObject로 관리
아이템 사용 Coroutine (난이도 : ★★★☆☆) 12강 ,14강
             특정 아이템 사용 후 효과가 일정 시간 동안 지속되는 시스템 구현
             예) 아이템 사용 후 일정 시간 동안 스피드 부스트.

📌 도전 기능 가이드
더보기

추가 UI (난이도 : ★★☆☆☆) 4강
              점프나 대쉬 등 특정 행동 시 소모되는 스태미나를 표시하는 바 구현
              이 외에도 다양한 정보를 표시하는 UI 추가 구현
3인칭 시점 (난이도 : ★★★☆☆)
              기존 강의의 1인칭 시점을 3인칭 시점으로 변경하는 연습
              3인칭 카메라 시점을 설정하고 플레이어를 따라다니도록 설정
움직이는 플랫폼 구현 (난이도 : ★★★☆☆)
              시간에 따라 정해진 구역을 움직이는 발판 구현
              플레이어가 발판 위에서 이동할 때 자연스럽게 따라가도록 설정
벽 타기 및 매달리기 (난이도 : ★★★★☆)
              캐릭터가 벽에 붙어 타고 오르거나 매달릴 수 있는 시스템 구현.
              Raycast와 ForceMode를 함께 사용해 벽에 닿았을 때 적절한 물리적 반응을 구현
다양한 아이템 구현 (난이도 : ★★★★☆)
              추가적으로 아이템을 구현해봅니다.
              예) 스피드 부스트(Speed Boost): 플레이어의 이동 속도를 일정 시간 동안 증가시킴.
              더블 점프(Double Jump): 일정 시간 동안 두 번 점프할 수 있게 함.
              무적(Invincibility): 일정 시간 동안 적의 공격을 받지 않도록 함.
장비 장착 (난이도 : ★★★★☆)
              장비를 장착하여 캐릭터의 능력을 강화하는 시스템 구현
              예) 속도 증가 장비, 점프력 증가 장비 등
레이저 트랩 (난이도 : ★★★★☆)
              Raycast를 사용해 특정 구간을 레이저로 감시하고, 플레이어가 레이저를 통과하면 경고 메시지나 트랩 발동
상호작용 가능한 오브젝트 표시 (난이도 : ★★★★★)
              상호작용 가능한 오브젝트에 마우스를 올리면 해당 오브젝트에 UI를 표시
              예) 문에 마우스를 올리면 'E키를 눌러 열기' 텍스트 표시.
              레버(Lever): 'E키를 눌러 당기기' 텍스트 표시.
              상자(Box): 'E키를 눌러 열기' 텍스트 표시.
              버튼(Button): 'E키를 눌러 누르기' 텍스트 표시.
플랫폼 발사기 (난이도 : ★★★★★)
              캐릭터가 플랫폼 위에 서 있을 때 특정 방향으로 힘을 가해 발사하는 시스템 구현
               특정 키를 누르거나 시간이 경과하면 ForceMode를 사용해 발사
발전된 AI (난이도 : ★★★★★)
              AI Navigation 시스템을 활용하여 맵에 다양한 구조물에 대한 계산 가중치를 설정
              Navigation 시스템 활용 예시
                            예1) 동적 베이크 NavMeshSurface.BulidNavMesh()
                            에디터에서 NavMeshSurface를 베이크하는 것이 아닌 런타임에 동적으로 베이크를 수행
                            예2) 구조물의 가중치를 설정 NavMeshObstacle, NavMesh Modifier
                            특정 구조물에 NavMeshObstacle 컴포넌트를 추가하여 AI 캐릭터가 해당 구조물을 피하게 설정합니다.
                            Carve 옵션을 활성화하여 AI가 구조물을 정확히 인식하도록 합니다.
                            특정 구조물이나 영역에 대해 가중치를 설정하려면

                            Navigation 창의 Areas 탭에서 새로운 Area Type을 정의합니다.
                            예를 들어, HighCostArea라는 새로운 영역을 만들고, 이 영역에 높은 가중치를 설정할 수 있습니다.
                            구조물에 NavMesh Modifier 컴포넌트를 추가하여 특정 Area Type을 할당합니다.
                            이를 통해 AI 캐릭터가 특정 구조물을 지나갈 때 더 높은 비용을 지불하게 됩니다.
                            예3) 가중치에 따른 경로 변경 NavMeshAgent.CalculatePath()
                            AI 캐릭터가 이동 중 특정 구조물을 만나면, 가중치에 따라 경로를 변경하거나 피하는 로직을 구현합니다.
                            이를 통해 AI 캐릭터가 고유한 경로 선택 전략을 가지게 됩니다.

📌 스카이박스 제작

🔗스카이박스

큐브 맵(Cube Map)과 구체형 스카이박스(Sphere Map) 등

[Skybox/6Sided]  6개의 텍스처로 구성

스카이박스는 6개의 텍스처로 구성된 큐브 맵 또는 하나의 구체로 텍스처가 매핑된 구체형 스카이박스로 구성됩니다.

[Skybox/Procedural]  반구형태의 스카이박스를 이용해 강의를 할 예정

 

📌 SkyBox Material 설정하기 (SkyBox/Procedual)

                  Window - Lighting - SkyBox Material : 만들어놓은 SkyBox Material을 넣어준다.

 

Lighting 찾아 들어가기
미리 만들어둔 Material을 넣어주기
Material값 조정하기 SkyTint + Ground

 

 

📌 Rigidbody - ForceMode

Force: 힘을 지속적으로 적용합니다.

                Rigidbody.AddForce(Vector3 force, ForceMode.Force);

Acceleration: 가속도를 적용합니다. 이전 힘의 누적에 따라서 점진적으로 더 빠르게 움직이게 됩니다.

                Rigidbody.AddForce(Vector3 force, ForceMode.Acceleration);

Impulse: 순간적인 힘을 적용합니다. 짧은 시간에 갑작스러운 움직임이 발생합니다.

               Rigidbody.AddForce(Vector3 force, ForceMode.Impulse);

VelocityChange: 변화하는 속도를 적용합니다. 물체의 현재 속도를 변경하면서 움직입니다.

                Rigidbody.AddForce(Vector3 force, ForceMode.VelocityChange);

 

📌 Raycast

Ray - 직선의 시작점(origin)과 방향(direction)

                Ray ray = new Ray(transform.position, transform.forward); // 오브젝트에서 앞으로 레이를 쏨

                Ray ray = Camera.main.ViewportPointToRay(new Vector3(0.5f, 0.5f, 0)); // 카메라의 중심에서 레이를 쏨

                Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); // 마우스로 클릭했을때 마우스의 포지션

 

Raycast - 눈에 보이지 않는 광선(Ray)에 맞은 물체가 무엇인지 여부를 판단한 뒤 여러 가지 후처리를 하는 방식.

               Ray, RaycastHit, MaxDistance, LayerMask 등의 옵션

 

RaycastHit - Raycast에 의해 검출된 객체의 정보가 담겨있다.

                RaycastHit.point - 레이캐스팅이 감지된 위치

                RaycastHit.distance - Ray의 원점에서 충돌 지점까지의 거리

                RaycastHit.transform - 충돌 객체의 transform에 대한 참조

 

📌 InputSystem의 SendMessage vs InvokeEvent

SendMessage : On+Action name인 함수를 찾아서 호출하는 방식

InvokeEvent : Inspector상에서 Action에 함수를 설정하고 키입력이 들어왔을때 호출.

Invoke Cshorp Event : C#스크립트에서 InvokeEvent수행

                 + (키입력 실행전 / 실행완료 / 키입력해제) 등의 구체척인 상황에 따라 별도의 함수를 등록할 수 있다.

Player Input Action 설정하기
Invoke Unity Events로 설정하기
Event -> Player 안에 CallBackContext 호출

 

public void OnMove(InputAction.CallbackContext context)
{
    if (context.phase == InputActionPhase.Performed) //설정키를 누르고 있는 동안
    {
        curMovementInput = context.ReadValue<Vector2>();
    }
    else if (context.phase == InputActionPhase.Canceled)
    {
        curMovementInput = Vector2.zero;
    }
}

 

 

📌 캐릭터매니저 Script 인스턴스화 + 방어코드

 private static CharacterManager instance;
 public static CharacterManager Instance
 {
     get
     {
         if (instance == null)
         { 
             instance = new GameObject("CharacterManager").AddComponent<CharacterManager>();
         }
         return instance;
     }
 }
 private Player player;
 public Player Player
 {
     get { return player; }
     set { player = value; }
 }

CharacterManager가 null일때!!!!

CharacterManager 라는 이름으로 새 오브젝트를 생성하고,

CharacterManager스크립트 붙여서 생성해줘라는 의미

private void Awake()
{
    if (instance == null)
    {
        instance = this;
        DontDestroyOnLoad(gameObject);

    }
    else
    {
        if (instance == this)
        { 
            Destroy(gameObject);
        }
    }
}

 

매니저스크립트가 든 오브젝트를 다른씬에서도 파괴되지 않도록 하기 위함

 

📌 최솟값, 최댓값 제어하기

curValue = Mathf.Min(curValue + value, maxValue); //더 작은 값 넣기

curValue가 80이고, value가 5 일때 = 앞의값은 85가 되고, maxValue = 100으로 세팅 한경우

curValue에는 85가 들어가게 되고,

curValue가 100이고, value가 5 일때 = 앞의값은 105가 되고, maxValue = 100으로 세팅 한경우

curValue에는 100이 들어가게 된다.

curValue = Mathf.Max(curValue - value, 0); //더 큰 값 넣기

curValue가 0 이고, value가 5 일때 = 앞의값은 -5가 되고, 0 으로 세팅 한경우

curValue에는 0이 들어가게 되고,

curValue가 10 이고, value가 5 일때 = 앞의값은 5가 되고, 0 으로 세팅 한경우

curValue에는 5 이 들어가게 된다.

          

🔥 10/24 목요일 목표 🔥 

🔎 Unity 게임 개발 숙련 강의 수강하기