Development/Unity Engine 35

[Retro유니티] PostProcessing과 최종빌드

Post Processing은, 게임화면이 최종출력되기 전에 Camera의 Image Buffer 에 삽입하는 추가 처리이다.적은 노력으로 뛰어난 영상미를 구현할 수 있다.유니티는 Post-processing Stack 패키지를 제공한다. v1과 v2 중 v2가 최신이니 v2를 사용한다. 렌더링경로추가Main Camera의 Rendering Path를 Deffered로 변경한다.-> 렌더링 처리순서와 방법을 결정하는 옵션인데, 기본값인 Forward Rendering 옵션은 가볍지만 라이팅표현이 간략하고 왜곡된다. 따라서 Deffered Shading 을 사용하여 빛을 온전하게 표현하기로 한다.Forward Rendering각 오브젝트를 그릴 때마다 해당 오브젝트에 영향을 주는 모든 lighting도 함..

[Retro유니티] 아이템 생성기 및 Item 구현

주기적으로 아이템 생성플레이어 근처 내비메시 위에서 랜덤한 한 점에 아이템 생성 EnemySpawner와 유사한 구조로 구현한다.다만, NavMesh 위의 랜덤한 점을 선택하는 기능은 구현난이도가 높으니 ItemSpawner 스크립트에 미리 완성된 것을 사용하기로 한다. 생성할 Item Prefab을 GameObject 배열에 저장한다. public GameObject[] items; // 생성할 아이템들 public Transform playerTransform; // 플레이어의 트랜스폼(위치) private void Start() { // 생성 간격과 마지막 생성 시점 초기화 timeBetSpawn = Random.Range(timeBetSpawnMin, timeB..

[Retro유니티] 적 생성기

요구명세는 아래와 같다.새로운 웨이브마다 적을 한꺼번에 생성현재 웨이브의 적이 모두 사망시 다음 웨이브로 넘어감웨이브가 증가할 때마다, 생성되는 적의 수 증가적을 생성할 때, 전체 능력치 0%에서 100%까지 랜덤설정게임 오버시, 적 생성 중단Prefab으로 제공된 Spawn Point를 드래그하자.(그림에 실수가 있는데, HUD Canvas가 아니라, SpawnPoint를 드래그해야한다)네 입구를 지정하고 있는것을 확인할수있다. 새 Empty 오브젝트로 EnemySpawner를 만들고, EnemySpawner.cs Script를 추가한다.EnemySpawner.cs Script를 보자.EnemySpawner.cs스폰된 좀비는 Array가 아니라 List로 관리할 것이다. List는, 배열과 다르게 le..

[Retro유니티] HUD Canvas 및 GameManager.cs

이제 최종완성할 차례다. 추가구현할 내용은 아래와 같다.UI버튼게임오버상태, 점수를 관리하는 GameManager적 생성기아이템 생성기포스트프로세싱을 통한 비주얼개선  HUD Canvas주어진 Prefab을 그대로 사용한다. UIManager.csusing UnityEngine;using UnityEngine.SceneManagement; // 씬 관리자 관련 코드using UnityEngine.UI; // UI 관련 코드// 필요한 UI에 즉시 접근하고 변경할 수 있도록 허용하는 UI 매니저public class UIManager : MonoBehaviour { // 싱글톤 접근용 프로퍼티 public static UIManager instance { get {..

[Retro유니티] NavMesh를 통한 길찾기 구현 및 Enemy.cs 완성

Navigation System경로계산 및 실시간 장애물회피 알고리즘을 Navigation 이 제공한다.Navigation 에 사용되는 Object는 4가지이다.NevMesh - Agent가 걸어다닐 표면NavMesh Agent - NevMesh상에서 경로를 계산하고 이동하는 컴포넌트NavMesh Obstacle - Agent를 가로막는 장애물Off Mesh Link - 끊어진 NavMesh 사이를 잇는 연결지점(ex. 뛰어넘을 수 있는 울타리/기어오를 수 있는 담벼락)우리는 볼드체 2가지만 사용할 것이다. NavMesh 빌드NavMesh는 정적 게임오브젝트를 대상으로 생성된다(Bake라고 한다).현재 프로젝트의 Level Game Object에는 static 체크가 되어있으므로, NavMesh가 사용가..

[Retro유니티] PlayerHealth.cs 완성

PlayerHealth.cs앞서 정의한 feature 는 아래와 같다.LivingEntity를 확장할 것.LivingEntity의 생명체 기본기능을 구현할 것.체력이 변경되면 Slider에 반영피격시 효과음 재생사망시 다른 컴포넌트 비활성화사망시 효과음과 애니메이션 재생아이템 감지 및 사용 자주 반복하여 알겠듯이, Awake 함수는 스크립트가 처음 로드될 때 수행된다.  Awake호출 시점: 스크립트가 처음 로드될 때 호출됩니다.주요 용도: 초기화 작업을 수행합니다. 다른 스크립트나 컴포넌트에 접근하기 전에 필요한 설정을 할 수 있습니다.특징: 게임 오브젝트가 비활성화된 상태에서도 호출됩니다.OnEnable호출 시점: 게임 오브젝트가 활성화될 때마다 호출됩니다.주요 용도: 게임 오브젝트가 활성화될 때마다..

[Unity] 기본 Editor 변경: Visual Studio -> VSCode

최근에 컴퓨터를 포맷해서, 환경 다시 setting하는 김에 VSCode를 쓰기로 했다.  Extension 다운로드   Package Manager에 Visual Studio Editor 가 있는 것 확인.  대충 vscode 경로 찾아가서 exe 넣어주자. 잡히면 아래와 같이 옵션 나오는 것 확인가능.  cs 스크립트 더블클릭시,기본 editor로 vscode 가 잘 열리는 것, 그리고 copilot이 잘 먹히는 것을 확인할 수 있다.  번외: 닷넷 설치매우 간단하다.Get the SDK 클릭한다. https://dotnet.microsoft.com/ko-kr/download/dotnet/thank-you/sdk-9.0.101-windows-x64-installer?journey=vs-code .NE..

[Retro유니티] UI 슬라이더 사용을 통한 체력바 구현 & PlayerHealth.cs

체력을 표시할 원형 UI를 만들 것이다. UGUI 캔버스는 게임화면을 기준으로 UI를 배치한다. 체력슬라이더는 3D공간에서 캐릭터를 따라다녀야 한다. Canvas 컴포넌트의 Render Mode를 World Space으로 변경한다. 이 경우, 캔버스와 그 위의 UI 게임 오브젝트들은 3D 게임월드에 배치된다. 즉, 게임월드상에서의 위치/회전/크기를 가지게 된다. Reference Pixel per Unit 은, UI 스프라이트의 픽셀크기와 게임 월드의 유닛크기가 대응되는 비율을 결정한다. 100이라면 100유닛이 1픽셀이므로 뿌옇고, 1이면 깔끔하게 보인다. 캔버스 위치와 크기 설정캔버스가 캐릭터 발밑에 배치된 것을 확인할수있다. tip) Hierarchy 에서 Alt + 클릭으로 화살표를 누르면, Ca..

[Retro유니티] 다형성 및 Action, Delegate를 통한 Event 구현: Virtual/Abstract/Interface 차이

다형성적 AI 및 Player 모두 포함하여 공유하는 기능을 가진, LivingEntity 클래스를 만들자.느슨한 커플링을 사용해서, 어느 자식클래스인지 구체적으로 모르더라도, 부모가 가진 메서드면 호출하게끔 구현할 수 있다. 다형성 사용 패턴- C#에서 부모클래스의 함수는 base로 접근할 수 있다. 이 정도만 추가로 숙지하면 될듯하다. LivingEntity ClassMonoBehaviour 및 IDamageable을 상속체력체력회복공격당할수있음살거나 죽는 상태가 존재함.using System;using UnityEngine;// 생명체로서 동작할 게임 오브젝트들을 위한 뼈대를 제공// 체력, 데미지 받아들이기, 사망 기능, 사망 이벤트를 제공public class LivingEntity : Mono..

[Retro유니티] Shooter 구현 - IK를 사용한 손/발 위치와 총 위치 <-> Animation 대응

PlayerShooter 스크립트를 만들자.1. 입력에 따라 총을 쏘거나 재장전한다.2. 손은 항상 총의 손잡이에 위치하게 한다. -> IK를 사용해야 한다. IK란?먼저 FK를 알아야 한다.FK란?Forward Kinematics 의 줄임말이다.부모 joint에서 자식 joint 순서로 움직임을 적용한다.FK로 물건을 집으면1. 어깨를 움직인다2. 팔을 움직인다3. 손을 움직인다. 순으로 동작한다.FK로 물건을 집는다면, 손의 위치는 누적계산된 최종결과이기 때문에, 손의 위치를 먼저 정하고 거기에 맞춰서 애니메이션을 변형할 수 없기 때문에, 손의 위치로 물건을 순간이동해야 한다. 반대로, IK는 자식 joint 에서 부모 joint 순서로 움직임을 적용하는 것이다. Inverse Kinematics1...