프로그래밍/Unity Learn

[존 레몬의 공포 체험] 복습 및 정리

바토파 2024. 7. 30. 18:42
반응형

[1강]

모델은 삼각형의 메시로 구성되어 있으며 Mesh Renderer는 이 메시를 렌더링하여 볼 수 있도록 한다.

- Skinned Mesh Renderer : 특별한 유형의 렌더러. 모델의 뼈대 전체의 위치와 회전을 기반으로 메시 모양을 변경할 수 있게 해준다. 뼈대는 모델의 자식 게임 오브젝트이다.

 

JohnLemon의 뼈대는 Root 게임 오브젝트의 자식이다.

 

~ Animator의 Apply Root Motion

루트 모션 적용은 게임 오브젝트의 위치와 회전을 애니메이션이 제어하도록 허용한다.

앞으로 움직이는 애니메이션이 있다고 하면, 루트 모션이 적용되었을 때 캐릭터가 앞으로 움직이면 게임 오브젝트의 위치가 앞으로 이동한다,

루트 모션을 적용하지 않으면 제자리에서 걷는 애니메이션이 나오게 된다.

 

게임에서는 화면에 이미지가 표시되고 이 이미지가 초 단위로 여러번 바뀌면서 움직이는 것 처럼 보인다. 이런 이미지를 프레임이라고 하며, 프레임이 화면에서 표현되도록 하는 과정을 렌더링이라고 한다.

게임에서는 사용자의 입력에 따라 다음에 무엇을 표시할지가 계속 바뀐다. 다음에 무엇을 표시할지 결정하는 프로그래밍을 업데이트 루프라고 한다.

물리 작업을 실행하는 FixedUpdate는 업데이트 빈도에 변화가 없다는 것이 특징이다.

 

Animator 컴포넌트 - Update Mode 프로퍼티 드롭다운에서 Animate Physics를 선택하면 애니메이터가 물리에 맞게 캐릭터를 이동하게 된다. FixedUpdate 메서드와 같은 횟수로 호출된다.

Normal 항목을 선택하면 애니메이터 계산의 갱신이 스크립트의 Update 메서드와 같은 횟수로 호출되어 타임 스케일의 영향을 받는다.

Unscaled Time 항목을 선택하면 갱신은 Update 메서드와 같은 횟수로 하지만 타임 스케일의 영향을 받지 않는다. 메뉴 화면처럼 게임이 슬로우 모션 중일 때에도 정상 속도로 재생하고자 할 때 사용한다.

 

[3강]

유니티에서 직접 조명 및 간접 조명은 주로 전역 조명 라이트매핑 기능을 통해 구현된다. 라이트매핑은 씬 내의 광원 반사를 시뮬레이션하여 프로젝트 내에 저장된 에셋에 작성(또는 베이크)한다. 이 작업에는 시간이 소요되지만 매우 사실적인 씬을 만들 수 있다.

 

- NavMesh : 보이지 않는 셰이프로, 선택한 게임 오브젝트가 이동할 수 있는 영역을 정의한다.

게임 오브젝트가 Static으로 지정되어 있으면 유니티의 내비게이션 시스템은 해당 게임 오브젝트가 이동하지 않을 것으로 추정한다.

인스펙터 창에서 게임 오브젝트 이름 오른쪽에 위치한 Static 체크박스를 눌러 Static으로 설정할 수 있다.

강의에서는 천장 오브젝트는 Static을 해제하여 유령이 천장에서 걸어다니지 않도록 했다.

 

NavMesh를 생성하는 과정을 베이킹이라고 한다. Window > AI > Navigation에서 수행할 수 있다.

강의에서 내비메시 에이전트는 배회하는 유령들이다.

Bake 후에는 씬 창의 환경에 옅은 파란색 메시가 덮인다. 이 영역에서만 유령이 돌아다닐 수 있다.

Navigation 창이 열려 있고 활성화된 상태에서만 내비 메시가 표시된다.

 

[4강]
강의와 유니티 버전이 달라 문제가 있었다.

https://unblockme.tistory.com/entry/%EC%A1%B4-%EB%A0%88%EB%AA%AC%EC%9D%98-%EA%B3%B5%ED%8F%AC-%EC%B2%B4%ED%97%98-%EC%B9%B4%EB%A9%94%EB%9D%BC%EC%99%80-%ED%8F%AC%EC%8A%A4%ED%8A%B8-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8B%B1-URP-15-%EB%B2%84%EC%A0%84%EC%97%90-%EB%A7%9E%EC%B6%B0-%EC%84%A4%EC%A0%95

 

- 포스트 프로세싱 : 사진에 필터를 적용하듯 게임 이미지를 화면에 렌더링하기 전에 필터 및 효과를 적용하는 작업

- 안티 앨리어싱 : 중간 색조의 픽셀로 거친 선 주위를 에워싸서 울퉁불퉁한 선이 눈에 띄지 않도록 한다.

- 컬러 그레이딩 : 렌더링된 뷰의 밝기, 콘트라스트, 컬러를 변경할 수 있는 방법

- 블룸 : 광원이 빛나는 효과를 줄 수 있음.

- 앰비언트 오클루전 : 구석 및 좁은 틈을 어둡게 할 수 있음. 실제 광원이 좁은 구석까지 닿지 않는 것처럼 만듦.

- 비네트 : 카메라 렌즈의 가장자리 부분을 어둡게 함. 이를 통해 플레이어에게 초점을 맞추고 밀실의 공포감을 줄 수 있음.

- 렌즈 왜곡 : 스파이 카메라를 통해 게임 화면을 보고 있는 것 처럼 만들어 줌.

 

[6강]

PointOfView라는 게임 오브젝트를 만들어 캡슐 콜라이더를 씌워 플레이어를 인식하게 만듦. 몬스터의 시야에 위치하도록 자식 오브젝트에 배치함.

 

[7강]

~ Rigidbody의 Is Kinematic 설정

키네마틱 리지드바디는 충돌과 같은 외부 힘의 영향을 받지 않지만 다른 게임 오브젝트와 충돌할 수 있다.

예시로 핀볼 게임에서 공은 패들에 부딪혀 튕겨 나가지만 패들은 공의 영향을 받지 않는다.

 

Ghost 게임 오브젝트에 Nav Mesh Agent 컴포넌트를 추가하여 맵을 돌아다닐 수 있게 했다.

코드를 통해 웨이포인트를 배열에 저장하고 유령이 목적지로 설정한 마지막 웨이포인트에 도착하면 다음 웨이포인트로 이동하도록 했다.

 

using UnityEngine;
using UnityEngine.AI;

public class WaypointPatrol : MonoBehaviour
{
    public NavMeshAgent navMeshAgent;
    public Transform[] waypoints;

    private int m_CurrentWaypointIndex;
    
    void Start()
    {
        navMeshAgent.SetDestination(waypoints[0].position);
    }
    
    void Update()
    {
        if (navMeshAgent.remainingDistance < navMeshAgent.stoppingDistance)
        {
            // 현재 인덱스에 1을 더하고 만약 인덱스가 증가하여 웨이포인트 배열의 길이와 일치하면 0으로 설정할 것
            m_CurrentWaypointIndex = (m_CurrentWaypointIndex + 1) % waypoints.Length;
            navMeshAgent.SetDestination(waypoints[m_CurrentWaypointIndex].position);
        }
    }
}

 

반응형