유니티 미니 맵 | 유니티 기초 – 초간단 미니맵 (렌더 텍스쳐) 모든 답변

당신은 주제를 찾고 있습니까 “유니티 미니 맵 – 유니티 기초 – 초간단 미니맵 (렌더 텍스쳐)“? 다음 카테고리의 웹사이트 th.taphoamini.com 에서 귀하의 모든 질문에 답변해 드립니다: https://th.taphoamini.com/wiki/. 바로 아래에서 답을 찾을 수 있습니다. 작성자 Jayce Lee 이(가) 작성한 기사에는 조회수 2,813회 및 좋아요 24개 개의 좋아요가 있습니다.

유니티 미니 맵 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 유니티 기초 – 초간단 미니맵 (렌더 텍스쳐) – 유니티 미니 맵 주제에 대한 세부정보를 참조하세요

렌더 텍스쳐 이용한 인스턴트 미니맵 만들기
(Easy Minimap using RenderTexture)
♪ Subscribe : https://www.youtube.com/channel/UCM03FnWGdgpfO7kHix2UA6A/featured?view_as=subscriber

유니티 미니 맵 주제에 대한 자세한 내용은 여기를 참조하세요.

Unity – MiniMap 설정

주행 시뮬레이터도 마찬가지로 차량의 현재 위치를 실시간으로 보여주는 수단이 필요하다. 따라서 이번 글에서는 미니맵을 생성한 후 가시성을 높이는 …

+ 여기를 클릭

Source: qkrguscjf176.tistory.com

Date Published: 8/23/2021

View: 8559

유니티) 미니맵 만들기 RenderTexture – 뻔뻔한블로그

미니맵 만들기 ( RenderTexture). 미니맵을 만드는 방법도 여러가지가 있겠지만. 이번에 학습할 내용은 랜더텍스처로 카메라를 추가해 캐릭터를 밑에 …

+ 여기를 클릭

Source: funfunhanblog.tistory.com

Date Published: 12/21/2022

View: 4755

유니티 심플 미니맵만들기 – UnityBeginner

안녕하세요 유니티 비기너입니다. 이번 시간에는 미니맵을 만드는 방법에 대해 소개해보겠습니다. 결과 화면. 1. 인스펙터 창 우측 상단에 Layer를 …

+ 여기에 자세히 보기

Source: unitybeginner.tistory.com

Date Published: 8/6/2021

View: 5025

유니티 미니맵 만드는 법

메인카메라와 다른 카메라를 논 경기장에 설치해 아래 물건을 상영하면서 지도를 만드는 방법 같은 방법을 쓴다. 여기에 설명된 방법은 미니맵에서 특정 대상(Player 등만) …

+ 여기에 표시

Source: intrepidgeeks.com

Date Published: 1/22/2022

View: 3861

Ace Combat Zero: 유니티로 구현하기 #8 : UI (3) – 미니맵 + 1 …

유니티에서 미니맵을 만드는 고전적인 방식이 있습니다. 미니맵 오브젝트만 보일 레이어를 하나 만듭니다. UI처럼 미니맵 아이콘만 보여줄 레이어요.

+ 여기에 더 보기

Source: velog.io

Date Published: 1/22/2022

View: 1288

게임에 미니맵을 추가해보자! – 컴퓨터속 세상

조용한 개발자 님의 블로그입니다. 구독하기. 프로필 사진. 유니티 세상/유니티 스크립트 및 기술 저장의 다른 글.

+ 여기에 더 보기

Source: computer-warehouse.tistory.com

Date Published: 9/15/2021

View: 4179

How To Make A Minimap Ui In Unity! | 유니티 미니 맵 255 개의 …

유니티 미니 맵 주제에 대한 자세한 내용은 여기를 참조하세요. … Unity 3D RenderTexure를 이용한 미니맵을 클릭한 오브젝트 … … 게임에 미니맵을 추가 …

+ 여기에 보기

Source: ko.taphoamini.com

Date Published: 10/13/2022

View: 1022

유니티 – 미니맵 만들기 (RenderTexture) – 뚜르의 공대일기

안녕하세요 러드입니다. 오늘은 유니티에서 미니맵 만들기를 해보겠습니다. 저격 스코프를 만드는 방식과 동일합니다만 새로운 블로그인만큼 ㅋ …

+ 자세한 내용은 여기를 클릭하십시오

Source: ddur.tistory.com

Date Published: 3/11/2022

View: 6254

주제와 관련된 이미지 유니티 미니 맵

주제와 관련된 더 많은 사진을 참조하십시오 유니티 기초 – 초간단 미니맵 (렌더 텍스쳐). 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

유니티 기초 - 초간단 미니맵 (렌더 텍스쳐)
유니티 기초 – 초간단 미니맵 (렌더 텍스쳐)

주제에 대한 기사 평가 유니티 미니 맵

  • Author: Jayce Lee
  • Views: 조회수 2,813회
  • Likes: 좋아요 24개
  • Date Published: 2018. 11. 13.
  • Video Url link: https://www.youtube.com/watch?v=F9QnjlrUUNU

Unity – MiniMap 설정

게임을 해본 사람이라면 미니맵이란 단어가 굉장히 익숙할 것이다. 현재 나의 위치가 어디 있는지 확인할 수 있는 유일한 수단이기 때문이다.

주행 시뮬레이터도 마찬가지로 차량의 현재 위치를 실시간으로 보여주는 수단이 필요하다. 따라서 이번 글에서는 미니맵을 생성한 후 가시성을 높이는 과정까지 진행하고자 한다.

순서는 다음과 같다.

1. 카메라 생성 & 시점 조정

2. RenderTexutre

3. UI 설정

4. 플로팅

5. 가시성 높이기(선택)

1. 카메라 생성 & 시점 조정

미니맵을 만들기 위해선 위에서 차량을 내려다보는 카메라를 생성해야 한다.

가장 먼저 Hierarchy 창에서 카메라를 생성한다.

익숙한 과정일 것이다

카메라가 생성됐다.

팁을 주자면, Unity 작업량이 많아질수록 파일을 구분하기 어렵기 때문에 폴더화와 이름 변경이 굉장히 중요하다.

방금 생성한 카메라도 다른 Object와 구분하기 위해 MiniCam으로 이름을 바꿔준 후, Car의 child class로 만들었다.

원근법 X 카메라

카메라의 포지션과 Projection을 정해준 후, Rotation의 x 값을 변경하여 위에서 내려다보는 각도로 만들었다.

여기서 잠깐 , Perspecitve와 Othographic의 차이는 무엇인가?

Unity의 카메라는 원근법을 적용하는 Perspective와 적용하지 않는 Orthographic이 있다.

보통 3D 게임은 Perspective로, 2D 게임은 Orthographic으로 만들지만, 3D 시점에서 Orthographic을 적용할 경우 아래와 같은 쿼터뷰 게임이 된다.

Perspective의 경우 카메라와 Object를 멀리 떨어뜨리면 더 많은 화면을 담을 수 있다.

Othographic의 경우엔 카메라의 거리와 무관하므로, Size라는 변수를 통해 촬영 범위를 결정한다.

2. RenderTexture

RenderTexture는 다른 정적인 Texture와는 다르게 실시간으로 업데이트되는 특징을 가진다. 예를 들면, 카메라 뷰, 거울, 동영상 같은 경우에 사용한다.

Project / Hierarchy 창은 헷갈리기 쉽다.

Project 창에서 RenderTexture를 생성하고 이름을 알아보기 쉽게 변경했다.

Depth Buffer는 깊이감을 의미하고, 미니맵에선 필요없으므로 ‘No depth buffer’를 선택하면 된다.

3. UI 설정

Raw Image가 생성됐다

UI(User Interface)는 사용자가 보는 화면을 의미한다

Raw image를 원하는 위치로 이동시킨 후 Rect Transform의 위치를 오른쪽 하단으로 변경하자.

Anchor Preset이란, Position의 좌표기준을 의미하며, 이전 글에서 Camera를 child class로 만들었을 때 상대좌표로 변환되는 것과 같은 원리이다.

4. 플로팅

이제 Raw Image라는 프레임 안에 카메라가 보는 시점을 넣어줄 차례다.

Raw Image 채우기

Hierarchy에서 RawImage 선택 후, Project의 MiniMapRen을 Inspector의 Texture로 끌어온 후 화면을 확인해보자.

화면상의 raw image 부분이 투명해진 것을 확인할 수 있다.

그 이유는, MiniMapRen에서 랜더링 중인 이미지가 없기 때문이다.

따라서, 특정한 이미지를 추가해줄 필요가 있다.

여기가 끝인가

MiniCam의 Target Texture에 MiniMapRen을 끌어오면 Raw Image에 MiniCam이 촬영하는 장면이 보인다.

이제 게임을 시작해보자. 위 이미지와 같이 미니맵을 볼 수 있게 됐다.

5. 가시성 높이기

사실 미니맵 제작 과정은 여기서 마쳐도 괜찮다.

하지만 우리가 일상에서 보는 네비게이션과 달리 게임 환경에선 화면 한 쪽에 네비게이션을 띄워야 하기 때문에 미니맵 사이즈에 제약이 있다.

따라서, 작은 사이즈로도 가시성이 좋은 미니맵을 만들고자 한다.

도로 그리기

가장 먼저 가시성이 좋은 미니맵을 그려보자.

Unity 환경을 캡쳐해서 일러스트레이터나 포토샵 같은 프로그램을 이용하여 길을 그려주면 된다.

발 그림

누구든지 이것보단 잘 그릴 것이다.

곧 업로드할 예정인 외부 프로그램으로 도로를 그려 Unity로 가져오는 과정을 진행한다면, 이 것보다 훨씬 이쁜 그림을 그릴 수 있다.

팁 : 획을 넣으면 훨씬 깔끔하다

Unity에 들여오기

필요한 부분만 따로 저장하여 Unity에 들여보내도록 하겠다.

드래그로 파일을 끌어와도 좋다

Sprite는 UI와 2D 게임 제작에 많이 활용되는 타입이다.

특정 구간을 반복하거나 타일 이미지, 애니메이션 이미지 등 다양하게 활용된다.

불러온 도로 이미지의 Texture Type을 Sprite로 바꾸면 된다.

새로운 바닥판 만들기

기존 미니맵은 Terrain을 촬영하여 띄운 형식이었다.

하지만 이번 과정에선 새로운 바닥판을 만들어 사용할 것이다.

만들 것이 많다

새로 만든 Plane에 위에서 그린 도로 이미지를 씌울 것이다.

바로 씌울 수 없기 때문에 Material을 만들어 이름을 Plane으로 지정하겠다.

첨부 파일에서 다운로드 받으면 된다

02Texture_Background라는 파일은 첨부해두었으니 다운로드하여 사용하면 되겠다.

Hierachy와 Project의 파일명이 Plane으로 같아서 material의 Plane을 Plane_m으로 수정했다.

생각보다 복잡하다

파일이 많지 않은데도 복잡하다. 파일 정리를 틈틈이 해야한다.

스케일 맞추기

그리드는 확대하지 않으면 잘보이지 않는다

생성한 Plane의 스케일을 키워보자.

손으로 직접 키워도 좋지만 한 가지 팁을 주자면, Grid를 확인하는 것이다.

5칸인 경우 Scale 값을 50으로 변경하면 기존 Terrain과 같은 크기의 Plane을 만들 수 있다.

Plane이 안보인다면 고개를 숙여보자. 밑에 있을 수도 있다

짤막하게 material에 대해 설명하자면,

Object와 Texture 사이의 매개체 역할을 수행하며, prefeb과 비슷한 기능을 가진다.

원하는 texture로 material을 만들어두면 어떤 object에든 드래그하여 적용할 수 있다.

빈 공간이었던 Plane에 Plane_m이라는 material을 적용하여 도로가 보이게 되었다.

꽤나 정교한 작업이 필요하다

도로를 기존 환경 위로 올리고 크기를 맞춰주자.

주의해야 할 점은, 꼭 2D 환경에서 작업해야 한다는 것이다.

3D로 작업한다면 object가 기울어지는 등 오차가 생길 확률이 높다.

2D로 작업하는 방법은 우측 상단 코너의 방향계를 클릭하면 되는데 Iso는 2D Persp는 3D를 의미한다.

미니맵의 차량 마커 만들기

GameObject는 기본 이름이다

Hierarchy 창에서 빈 object를 만든 후, 기존에 생성한 Plane을 child class로 넣어주자.

그리고 다시 Plane을 생성하여 Marker라는 이름으로 설정했다.

정리하면, Plane은 네비게이션의 배경 역할이고 Marker는 자동차의 역할을 한다.

Marker의 Y축 값은 곧 수정될 것이다

Plane과 Marker의 y 값을 맞춰주도록 하자.

terrain으로부터 얼마나 멀리 띄울지에 따라 값을 변경해주면 된다.

위로 살짝 당기면 된다

Y좌표가 완전 같다면 겹쳐서 잘 보이지 않으니 Marker의 y 값을 수정했다.

[ctrl + d]로 Plane_m의 사본을 만든 후 이름을 Marker_m으로 변경했다.

Marker_m의 Main Texture를 화살표 모양의 이미지로 설정하고, 스포이드를 이용하여 Main Color를 빨간색으로 바꾸자.

다시 같은 방법으로 Marker라는 plane에 Marker_m을 끌어오면 된다.

대체 shaded는 무엇인가

이쯤되면 material에서 건드는 shaderDev가 무엇인지 궁금할 것이다.

그렇다면 그 전에 Render Queue라는 개념에 대해 이해하고 가자.

Render Queue란, Object의 순서를 조정하는 기능으로서 종류마다 포토샵의 레이어와 그 역할이 비슷하다.

From Shader : shader 파일의 설정 값을 우선으로 함

Geometry : 불투명 물체

AlphaTest : 알파테스트 물체

Transparent : Geometry와 AlphaTest 이후에 그려짐. 순서는 뒤에서부터 앞으로.

Marker의 위계가 더 높아야 한다

배경이 되는 MiniMap과 차량이 되는 Marker의 Render Queue 값을 비교해보면, Marker가 더 높은 것을 확인할 수 있다.

이제 얼마 남지 않았다.

빨간색 화살표를 움직이게 하고, 카메라로 찍기만 하면 끝난다.

마커와 차량의 위치를 연동하자

카메라 조절은 이제 익숙하다

Marker를 parent class로 두는 카메라를 하나 만들고 Marker가 잘 보이도록 각도를 조정했다.

차량의 움직임과 마커를 연동하기 위해서는 Script를 조금 손봐야 한다.

Car의 Inspector에서 Car User Control을 더블 클릭하여 Visual Studio를 열자.

입력할 내용이 많지 않다

위 이미지에서 표시한 부분만 Visual Studio에서 수정하면 된다. 수정 후 [ctrl + S] 로 저장하면 된다.

게임을 실행해보자

게임을 실행하면 차량의 움직임을 마커가 따라가는 것을 확인할 수 있다.

이제 이와 같은 화면을 미니맵으로 만들 차례다.

카메라 레이어의 개념 이해하기

Depth의 개념은 이해하고 넘어가자

게임을 실행했을 때 차량을 비추는 카메라가 활성화되어야 하지만 Depth가 0, 0으로 동일하기 때문에 다른 카메라가 활성화된다.

그러므로 마커를 비추는 카메라의 Depth를 -1로 조정해주도록 하자.

(차량을 비추는 카메라는 이보다 큰0 값이어야 한다.)

카메라 Depth 기능에 대해 잠깐 설명하자면,

그리기 순서에서의 카메라 위치를 의미한다. 메인 카메라의 Depth가 -1이고 서브 카메라의 Depth가 0이라면 값이 더 큰 서브 카메라가 게임 화면에서 비춰지게 된다.

주로 여러 대의 카메라를 사용할 때 특정 연출을 위해 사용한다.

필요없는 레이어 OFF

포토샵 레이어 개념과 유사하다

레이어를 이용해서 마커와 도로만 비춰지도록 필터링할 것이다.

Layer의 이름을 변경하는 것이다

Plane은 Object는 미니맵을 만들기 위한 것이므로 MiniMap이란 레이어를 하나 추가한 후,

GameObject의 Layer를 모두 MiniMap으로 바꿔주도록 하자.

도로와 마커를 제외한 레이어는 off

미니맵 카메라를 확인해보자.

위 사진과 같이 도로와 마커만 보이게 됐다.

+ 차량을 비추는 카메라의 MiniMap 레이어도 꺼주도록 하자.

이제 미니맵 카메라를 화면에 띄우면 되는데 그 과정은 위에서 미니맵을 만들었던 과정과 동일하다.

위 과정까지 잘 따라왔다면 다음과 같이 미니맵이 잘 작동하는 것을 볼 수 있을 것이다.

모두 수고했습니다.

진짜 최종

유니티) 미니맵 만들기 RenderTexture

미니맵 만들기 ( RenderTexture)

미니맵을 만드는 방법도 여러가지가 있겠지만

이번에 학습할 내용은 랜더텍스처 로 카메라를 추가해 캐릭터를 밑에 바라보게 하는것이다.

(보통은 카메라도 연산비용이 크기 때문에 카메라를 추가하지 않고

캐릭터 실제 움직이는 위치를 계산해 이미지로 작은 미니맵을 만들어 준다고 한다.)

1) 카메라 추가

위에서 밑을 바라보는 카메라를 만들어 미니맵처럼 보이기위함이다.

하이라키창에서 마우스 오른쪽 클릭하고 카메라를 추가해준다.

이름은 기존 카메라와 헷갈리지 않게 미니맵카메라 정도로 바꿔준다.

2) 캐릭터 플레이어를 대신 할 오브젝트 추가

새로 추가한 카메라가 플레이어 캐릭터를 비추면되지만 보통 캐릭터에는 폴리곤과 많은 이미지들이 붙어 있기 때문에 미니맵에는 이렇게 보일 필요가 없다.

캐릭터의 어디에 있는지 위치정도만 보여주면 되기 때문에 나는 큐브를 생성하고 플레이어 자식으로 넣었다.

(미니맵 카메라는 사각이미지로 보일것이다.)

그리고 이 큐브 레이어를 ‘playercube’로 해준다. 이유는 밑에 설명

3) RenderTexture추가

랜더텍스처를 추가한다.

Render Texture는 런타임에서 생성 및 갱신되는 특수한 Texture로 카메라가 비추는 화면을 텍스처럼 가지고 있고 원하는 이미지에 그려줄 수 있는 텍스처라고 생각하면 된다.

4) 미니맵카메라 인스펙터 설정

새로 추가한 카메라에 셋팅을 해줘야한다.

첫 번째로 카메라가 Culling Mask를 설정해준다.

Culling Mask는 카메라가 보여질 레이어들은 체크하는 것이다. 맨 처음에는 Everything으로 되어 있을것이다.

방금 추가한 Cube는 ‘playercube’이기 때문에 이것은 체크해주고 player(실제 캐릭터)는 체크 해제 해준다.

나머지는 그릴 필요가 있는지 없는지 체크해서 상황에 맞게 설정해준다.

두 번째는 Target Texture를 아까 생성한 RenderTexture를 추가한다.

5) Raw Image 미니맵 이미지 생성

캔버스 밑에 Raw Image를 생성한다.

일반 Image와 다르게 텍스처를 설정 할 수 있기때문이다.

Texture에 여기에도 아까 생성한 랜더텍스처를 넣어준다.

플레이 (우측 상단)

여기서 추가 셋팅은 기존 카메라에서는 당연히 하늘을 보게 되면 아까 추가한 큐브가 보일 것이다.

기존 카메라에서 Culling Mask ‘playercube’를 체크 해제해서 안보이게 해주어야한다.

랜더 텍스처 : https://docs.unity3d.com/kr/530/Manual/class-RenderTexture.html

반응형

유니티 심플 미니맵만들기

반응형

안녕하세요 유니티 비기너입니다.

이번 시간에는 미니맵을 만드는 방법에 대해 소개해보겠습니다.

결과 화면

1. 인스펙터 창 우측 상단에 Layer를 (Minimap) 추가한다. 2. Main카메라의 Culling Mask에서 방금 추가한 Minimap을 제외시킨다. 3. 프로젝트 창 Create > RenderTexture를 생성합니다. 4. 카메라 오브젝트를 생성, 명칭을 MinimapCamera로 변경, Culling Mask에서 Minimap을 제외한 모든 mask를 제외, 3번에서 생성한 RenderTextture target Texture에 삽입 5. Ui > raw Image 생성, 3번에서 생성한 RenderTextture 삽입 6. 각각의 오브젝트에 미니맵에 표시할 이미지 추가 및 레이어 변경 한 줄 요약 ※ 특정 레이어만 보이는 카메라를 추가하고 Render Texture를 이용하여 카메라로 통해 보이는 화면을 미니맵처럼 구현합니다.

1. 인스펙터 창 우측 상단에 Layer를 추가한다.

※ Layer를 이용하여 추가 된 카메라가 Minimap 레이어층만 보이게하여 미니맵을 구현합니다.

2. Main카메라의 Culling Mask에서 방금 추가한 Minimap을 제외시킨다.

※ Main카메라에서는 Minimap을 제외하여 미니맵에 보여질 이미지들이 보이지 않게합니다.

3. 프로젝트 창 Create > RenderTexture를 생성합니다.

※ Render Texture를 이용하여 카메라에 비치는 장면을 raw image를 통해 보여지게합니다.

4. 카메라 오브젝트를 생성, 명칭을 MinimapCamera로 변경, Culling Mask에서 Minimap을 제외한 모든 mask를 제외, 3번에서 생성한 RenderTextture target Texture에 삽입

5. Ui > raw Image 생성, 3번에서 생성한 RenderTextture 삽입

6. 각각의 오브젝트에 미니맵에 표시할 이미지 추가 및 레이어 변경

※ 미니맵에 보여질 이미지들을 삽입합니다.

이상으로 미니맵을 만드는 방법에 대해 알아보았습니다.

다음엔 좀 더 좋은 정보로 찾아뵙겠습니다.

감사합니다.

반응형

유니티 미니맵 만드는 법

Reference 이 문제에 관하여(유니티 미니맵 만드는 법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 이 문제에 관하여(유니티 미니맵 만드는 법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kakichoko/items/0ec67edebcc10f53ce73 텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오. 우수한 개발자 콘텐츠 발견에 전념 ( Collection and Share based on the CC Protocol. )

유닛 공부를 시작한 지 한 달 정도 된 사람입니다.인터넷의 어떤 강좌?교육을 받는 것을 잊지 않은 틈을 타서 나는 그것을 여기에 기록할 것이다.이번에는 미니 지도를 만드는 방법입니다.메인카메라와 다른 카메라를 논 경기장에 설치해 아래 물건을 상영하면서 지도를 만드는 방법 같은 방법을 쓴다.여기에 설명된 방법은 미니맵에서 특정 대상(Player 등만)을 상영할 때의 방법이다.1, Hierrarchy의create 단추를 사용하여 새로운camera를 준비합니다.위치는 위쪽부터 전체 필드를 표시하도록 조정됩니다.로테이트(90,0,0)로 만들면 바로 위에서 상영된다.2, 설정을 변경한 Camera의 설정입니다.camera 검사기 내Clear Flag를 Solid Color로 설정합니다.Projection을 Orthographic으로 설정합니다.이런 느낌이에요.Image 2개를 준비합니다.미니맵의 배경은 (위의 그림에서 말한 흰색 부분)과 상영하고자 하는 대상을 두 개 준비합니다.Image의 위치와 색상을 좋아해요.3. 작은 지도에서 상영할 대상 아래 대상을 만든다.중요한 것은 미니맵에서 상영하고 싶은 대상 자체를 상영하는 것이 아니라 대리역을 상영하는 것이다.오른쪽 상단에 있는 간단한 미니 지도 같다.설명을 반환합니다.Hierrarchy에 있을 수 있는 대상 → 3D object (저는 3D 모드로 만들었습니다) → Cube (여기는 취향에 따라) 를 오른쪽 단추로 눌러서 대상을 생성합니다.이때 이 대상의 검사기를 보면 콜리더가 있을 것 같지만, 미니맵 전용 물건은 판정할 필요가 없다(있으면 귀찮아진다). 이건 삭제해야 한다.객체에 색을 칠하려면 Project의 Create 버튼을 사용하여 Material을 생성합니다.머티리얼즈로 맘에 드는 색상을 만들어서 객체를 첨부하면 OK.4, 3, 미니맵에서 제작된 대상을 상영하기 위해 새 도면층을 만든다.카메라에 상영하고자 하는 대상을 제한하기 위해 카메라에 있는 도층만 제한하면 된다.우선 그 층 제작부터 시작한다.3, 에서 만든 객체 검사자에서 Layers 클릭 → Edit layers 클릭User Layers에서 원하는 이름을 설정합니다.도면층 설정은 여기서 끝냅니다.그리고camera로 돌아가서 Culling Mask를 Everything에서 Nothing으로 변경한 후 방금 만든 도면층의 이름을 선택합니다.그럼 되겠네.유닛을 거의 모르는 나도 할 수 있는 방법이기 때문에 아무나 쉽게 할 수 있는 방법일 것 같아요.이상은 미니맵 제작입니다.효율적이고 좋은 설치 방법이 있으면 꼭 알려주세요.그럼 안녕히 계세요.

Ace Combat Zero: 유니티로 구현하기 #8 : UI (3) – 미니맵 + 1인칭 시점

역시 UI는 할 게 무지하게 많습니다.

할 게 산더미인데 벌써 3편이고, 이거로 끝나는 것도 아니라니요.

전체 화면:

미니맵

아군/적군 UI

게임 내 대사

조준점

기총 UI

경고 UI

색상 변경

화면에 안 보이는 목표물의 위치를 가리키는 화살표

미니맵을 제외한 부분도 해결해야 하고,

1인칭 시점 UI는 1인칭에서만 보이도록 수정

이것도 해결해야 합니다.

우선 지난 포스트에서 해야했던 1인칭 시점 UI 컨트롤부터 하죠.

1인칭 시점 UI 컨트롤

이 스크린샷은 3인칭 시점,

이 스크린샷은 1인칭 시점입니다.

1인칭 시점에서만 보이고 3인칭 시점에서 보이지 않는 UI는,

속도계 (숫자 제외)

고도계 (숫자 제외)

방향계

자세계

스로틀

이렇게 5개입니다.

여기서 속도/고도 UI는 3인칭 뷰, 1인칭 뷰 모두 보이게 되는데요,

속도/고도 UI는 3인칭 뷰에서는 고개를 돌려도 위치가 고정되지만,

1인칭 뷰에서 고개를 돌릴 때 위치가 바뀌어야 합니다.

구현 방식을 생각해보면, 속도/고도 UI를 똑 떼어놓은 다음

카메라에 따라 3인칭 뷰, 1인칭 뷰에 붙여넣으면 되겠죠.

그리고 현재 각도에 따라서 위치를 조정해주면 될 것입니다.

1인칭 뷰 표시/비표시

먼저 활성화/비활성화될 1인칭 뷰는 한 곳에 모두 몰아넣어있는지 확인합니다.

(애초에 캔버스랑 카메라가 3인칭(공통) 뷰와는 분리해서 만들었죠?)

3인칭 뷰일 때 1인칭 UI 카메라를 비활성화시키느냐, 1인칭 UI 오브젝트나 캔버스를 비활성화시키느냐는 구현하는 사람 마음입니다.

저는 1인칭 UI 오브젝트를 비활성화하는 방향 으로 가겠습니다.

UIController에서 UI 오브젝트를 이미 변수로 얻어올텐데 또 카메라 변수를 얻어오기가 좀 귀찮아서요.

UIController.cs

[ Header ( “1st-3rd View Control” ) ] public RectTransform commonCenterUI ; public RectTransform firstCenterViewTransform ; public RectTransform thirdCenterViewTransform ; public void SwitchUI ( CameraController . CameraIndex index ) { bool isFirstView = ( index == CameraController . CameraIndex . FirstView || index == CameraController . CameraIndex . FirstViewWithCockpit ) ; firstCenterViewTransform . gameObject . SetActive ( isFirstView ) ; RectTransform parentTransform = ( isFirstView ) ? firstCenterViewTransform : thirdCenterViewTransform ; commonCenterUI . SetParent ( parentTransform ) ; }

CameraController.cs

void SetCamera ( ) { . . . GameManager . Instance . uiController . SwitchUI ( ( CameraIndex ) cameraViewIndex ) ; }

UIController 에 RectTransform.parent 를 바꾸는 코드를 추가했습니다.

CameraController 에 현재 활성화된 카메라 정보인 CameraIndex 가 있고,

이 값을 넘겨줘서 1인칭 뷰/3인칭 뷰 UI에 붙여놓는 작업을 하게 됩니다.

1인칭 UI, 그 UI의 부모가 될 객체를 모두 끌어다 붙입니다.

카메라에 따라 UI를 표시/비표시하는 기능은 만들어졌고,

이제 1인칭 기준으로는 카메라를 돌릴 때 1인칭 UI 위치가 바뀌는 기능을 만들어야 합니다.

시선에 따른 UI 위치 이동

주위를 돌아볼 때의 카메라 시선 정보 (회전값) 역시 CameraController 에 있습니다.

회전값을 잘 가공해서 위치로 변환해주면 될 거에요.

UIController.cs

[ Header ( “1st-3rd View Control” ) ] public RectTransform commonCenterUI ; public RectTransform firstCenterViewTransform ; public RectTransform thirdCenterViewTransform ; public Canvas firstViewCanvas ; public Vector2 firstViewAdjustAngle ; void Start ( ) { firstViewAdjustAngle = new Vector2 ( 1 / firstViewAdjustAngle . x , 1 / firstViewAdjustAngle . y ) ; . . . } public void AdjustFirstViewUI ( Vector3 cameraRotation ) { Vector2 canvasResolution = new Vector2 ( firstViewCanvas . pixelRect . width , firstViewCanvas . pixelRect . height ) ; Vector2 convertedRotation = new Vector2 ( cameraRotation . y * firstViewAdjustAngle . x , cameraRotation . x * firstViewAdjustAngle . y ) ; firstCenterViewTransform . anchoredPosition = convertedRotation * canvasResolution ; }

CameraController.cs

void Rotate1stViewCamera ( ) { . . . uiController . AdjustFirstViewUI ( rotateValue ) ; } void Rotate1stViewWithCockpitCamera ( ) { . . . uiController . AdjustFirstViewUI ( rotateValue ) ; }

AdjustFirstViewUI(Vector3 cameraRotation) 은 카메라 회전값을 좌표로 변환해주는 기능을 수행합니다.

여기서 Vector2 firstViewAdjustAngle 이라는 변수가 있는데,

시선을 돌릴 때 가로/세로 축으로 각각 몇 도를 넘어가면 화면의 가장자리에 UI를 놓을지 결정하는 값입니다.

그리고 현재 캔버스 크기를 구한 다음, 변환된 각도 값을 서로 곱해서 1인칭 UI의 위치를 확정합니다.

그리고 CameraController 에서 시선의 회전값을 가지고 있으므로, 이 값을 UIController 에 넘겨주게 됩니다.

UIController 에 값을 설정하고 실행합니다.

X축은 방향이 반전되어야 해서 음수로 설정합니다.

모니터 해상도마다 다를 수 있지만 일단 제 기준으로는 이 값이 어느정도 적당하게 움직이는 것 같습니다.

적절한 위치에 놓인 것 같네요.

에이스 컴뱃 7에서도 1인칭 UI가 정확히 콕핏에 맞춰지진 않습니다. 대강 맞췄어요.

여기서 주의할 부분이 있는데,

1인칭 뷰 카메라의 Viewport Rect 값은 (0, 0, 1, 1)이어야 합니다.

만약 3인칭 뷰 카메라처럼 이렇게 약간의 공백이 있게 되면,

이렇게 UI가 잘리게 됩니다.

UI가 잘리지 않게 하기 위해서, 1인칭 뷰 카메라는 공백이 없도록 설정합시다.

전체 화면:

미니맵

아군/적군 UI

게임 내 대사

조준점

기총 UI

경고 UI

색상 변경

화면에 안 보이는 목표물의 위치를 가리키는 화살표

이제 전체 화면에서의 묵은 이슈들을 해결할 시간입니다.

하나씩 차례대로 하죠.

미니맵

표시할 미니맵은 3종류가 있습니다.

내가 조종하는 비행기를 기준으로 주변 상황 보기

조금 더 넓은 범위로 보기

전체 맵 보기

보시다시피 원래는 미니맵에 표현해줄 오브젝트가 되게 많습니다.

아군 비행기, 적 비행기, 적 타겟 비행기, 일반 목표물, 타겟 목표물 등이 있죠.

(뒤에 깔리는 지형 등은 둘째치고요)

근데 제가 만들려고 하는 스테이지는 1:1 보스전입니다.

게임 내내 미니맵에 빨간색 화살표 한 개만 있을 거라는 뜻입니다.

이렇게 일감을 성공적으로 줄이는군요.

1단계 미니맵

유니티에서 미니맵을 만드는 고전적인 방식이 있습니다.

미니맵 오브젝트만 보일 레이어를 하나 만듭니다.

UI처럼 미니맵 아이콘만 보여줄 레이어요.

화면에 띄우려는 오브젝트에게 Sprite Renderer를 줍니다.

그리고 Layer를 아까 만든 레이어로 설정합니다.

Orthographic 카메라를 하나 만들고, 위에서 아래를 보게 만듭니다.

(Rotation.x 를 90으로 주면 됩니다.)

Clear Flags = Solid Color , Projection = Orthographic 으로 설정합니다.

카메라의 Culling Mask를 미니맵 레이어만 선택되도록 설정합니다.

여기까지는 UI랑 비슷하죠.

Render Texture 파일을 하나 생성합니다.

생성한 Render Texture의 가로 세로 Size를 조절합니다.

미니맵이 정사각형 형태이므로 값을 동일하게 맞춰줍니다.

(298이라는 값은 미니맵 스프라이트 사이즈와 동일하게 맞추려는 용도였는데, 사실 상관없습니다.)

미니맵을 비추는 카메라의 Target Texture에 아까 만든 Render Texture를 넣어줍니다.

이제 카메라 부분을 보시면 방금 추가한 아이콘만 보이게 됩니다.

미니맵 UI를 만들어줍니다.

참고로 저는 이미지를 2개 사용해서 Map이 맨 뒤에, Map_center가 맨 앞에 오고,

화면에 띄울 오브젝트는 그 사이에 표시하게끔 만들려 합니다.

UI Raw Image를 만든 다음, Texture에 이전에 만든 Render Texture를 넣어줍니다.

그러면 Scene 화면에서 이렇게 미니맵이 만들어지게 됩니다.

움직이지 않지만 말이죠.

이제 스크립트로 카메라를 제어해야 합니다.

다시 원본 미니맵을 봅시다.

귀찮게도 플레이어가 미니맵의 중앙에 있는 게 아니라 약간 아래에 있습니다.

이 사실을 감안하면서 카메라 위치를 조정해줘야 해요.

MinimapCamera.cs

public class MinimapCamera : MonoBehaviour { public Transform target ; public float offsetRatio ; Camera cam ; void Start ( ) { cam = GetComponent < Camera > ( ) ; } void Update ( ) { Vector3 targetForwardVector = target . forward ; targetForwardVector . y = 0 ; targetForwardVector . Normalize ( ) ; Vector3 position = new Vector3 ( target . transform . position . x , 1 , target . transform . position . z ) + targetForwardVector * offsetRatio * cam . orthographicSize ; transform . position = position ; transform . eulerAngles = new Vector3 ( 90 , 0 , – target . eulerAngles . y ) ; } }

target 은 카메라가 따라갈 대상입니다. 플레이어의 비행기를 여기다 할당하면 됩니다.

offsetRatio 는 이미지 하단으로부터 몇 % 지점에 플레이어가 있는지 에 대한 값입니다. 이 값을 이용해서 카메라의 위치를 UI에 맞게 보정해줍니다.

미니맵 사진을 보면 대략 33% 쯤 되어보이네요.

간략하게 설명하면, UI에 맞도록 비행기가 향하는 방향(Y축 무시)의 일정 거리 앞에다가 카메라를 놓고, ( Vector3 position = … )

비행기의 방향에 따라 카메라도 같이 회전하도록 구현했습니다. ( transform.eulerAngles = … )

여기서 transform.position 의 y 값을 1로 고정하는데, 모든 미니맵 아이콘의 y 값은 0으로 둘 예정이기 때문입니다.

Clipping Planes 값을 최대한 낮추기 위해, 카메라와 미니맵 아이콘의 거리를 최소화하려고 합니다.

MinimapSprite.cs

[ RequireComponent ( typeof ( SpriteRenderer ) ) ] public class MinimapSprite : MonoBehaviour { void Update ( ) { transform . rotation = Quaternion . Euler ( 90 , transform . parent . eulerAngles . y , 0 ) ; transform . position = new Vector3 ( transform . parent . position . x , 0 , transform . parent . position . z ) ; } }

미니맵 아이콘 스크립트입니다. 아직은 세상 간단하죠.

우선 미니맵 스프라이트는 본체의 각도가 어떻게 되었든 간에 항상 똑바로 보여야 합니다. 사진처럼 같이 돌아가면 곤란해져요.

그러므로 transform.rotation 값에서 x = 90 을 줘서 항상 눕혀주고,

비행기가 바라보는 각도를 표현하기 위해 y = transform.parent.eulerAngles.y 로 설정합니다.

위치는 부모를 따라가도록 position.x 와 z 는 부모의 transform.position 으로 설정합니다.

아까 카메라 설명할 때 미니맵 아이콘의 y값 (글로벌 좌표)을 모두 0으로 한다고 했었기 때문에, y 값은 0으로 고정시킵니다.

이제 적 비행기에 추가했던 미니맵 아이콘 스프라이트에 MinimapSprite 를 추가하고,

미니맵 카메라에는 MinimapCamera 를 추가한 다음,

target과 offsetRatio를 할당하고 실행시켜보죠.

타겟 비행기 근처를 비행하면서 미니맵에 제대로 보이는지 확인해봅니다.

미니맵 밖에 있는 오브젝트 표시하기

사진의 왼쪽 하단을 보면, < 처럼 된 화살표가 보이죠? 미니맵 범위에 표시되지 않는 오브젝트들도 저렇게 표시해줘야 합니다. ...말하기는 쉽죠. 로직을 어떻게 짜야 할까요? 오브젝트가 화면에 안 잡히는 범위에 있는지 확인 그 때 미니맵 가장자리에 맞춰서 화살표 표시 1번 미니맵의 경우에는 플레이어의 회전 상태도 고려해서 화살표를 표시해야 함 근데 이 화살표를 띄우는 주체가 누구지? 오브젝트가 아이콘 스프라이트를 바꾸나? 아니면 미니맵이 화살표 오브젝트를 추가하나? 생각보다 신경쓸 게 많습니다. 우선 프로토타이핑만 해서 실증이 가능한지 정도만 다뤄보겠습니다. 카메라 하위에 화살표를 하나 만들어놓고, 그 화살표 하나만 움직여보죠. (어차피 1:1 보스전이니까 화살표는 하나면 되잖아요) 미리 말씀드리자면, 제가 만든 화살표 표시 스크립트는 "오브젝트가 미니맵에 화살표 추가를 요청" 하는 방식입니다. 화살표를 띄우는 주체는 미니맵입니다. MinimapCamera.cs Camera cam ; Vector2 size ; public Transform indicator ; void Start ( ) { . . . size = new Vector2 ( cam . orthographicSize , cam . orthographicSize * cam . aspect ) ; } void Update ( ) { . . . } public void ShowBorderIndicator ( Vector3 position ) { float reciprocal ; float rotation ; Vector2 distance = new Vector3 ( transform . position . x - position . x , transform . position . z - position . z ) ; distance = Quaternion . Euler ( 0 , 0 , target . eulerAngles . y ) * distance ; if ( Mathf . Abs ( distance . x ) > Mathf . Abs ( distance . y ) ) { reciprocal = Mathf . Abs ( size . x / distance . x ) ; rotation = ( distance . x > 0 ) ? 90 : – 90 ; } else { reciprocal = Mathf . Abs ( size . y / distance . y ) ; rotation = ( distance . y > 0 ) ? 180 : 0 ; } indicator . localPosition = new Vector3 ( distance . x * – reciprocal , distance . y * – reciprocal , 1 ) ; indicator . localEulerAngles = new Vector3 ( 0 , 0 , rotation ) ; } public void HideBorderIncitator ( ) { indicator . gameObject . SetActive ( false ) ; }

지금 작성한 코드는 미니맵 가장자리에 맞춰서 화살표 표시 를 구현한 부분입니다.

현재 카메라와 오브젝트 사이의 거리를 계산하고, ( Vector2 distance = … )

카메라의 회전을 고려해서 거리 벡터를 회전시킵니다. ( distance = … )

( 3. 1번 미니맵의 경우 회전 상태를 고려 를 적용했습니다. 다른 미니맵의 경우 이 코드를 실행하지 않게끔 구현하면 되겠네요.)

이렇게 계산한 거리는 카메라의 가장자리에 위치할 수 있도록 값을 조절합니다.

이렇게 오브젝트들이 배치되었을 때를 가정해봅시다.

두 빨간색 오브젝트가 X, Y 값이 모두 미니맵 범위를 넘어섰다고 해서 두 오브젝트 모두 이렇게 미니맵 코너에 화살표를 넣으면 안 됩니다.

대부분의 오브젝트가 코너에 몰릴 가능성이 있기 때문입니다.

이런식으로 거리 벡터를 재조정해서 두 빨간색 점에 위치하도록 조정해줘야 합니다.

if 문에서 이 거리를 재조정하는 계산이 들어가 있고, distance의 부호에 따라서 화살표의 회전값도 조정하고 있습니다. ( rotation = … )

화살표를 띄우는 위치와 회전값 계산이 끝나면 localPosition , localEulerAngles 에 값을 대입합니다.

MinimapSprite.cs

[ RequireComponent ( typeof ( SpriteRenderer ) ) ] public class MinimapSprite : MonoBehaviour { SpriteRenderer spriteRenderer ; public MinimapCamera minimapCamera ; void Start ( ) { spriteRenderer = GetComponent < SpriteRenderer > ( ) ; } void Update ( ) { . . . if ( spriteRenderer . isVisible == false ) { minimapCamera . ShowBorderIndicator ( transform . position ) ; } else { minimapCamera . HideBorderIncitator ( ) ; } } }

그 다음, 화면에 오브젝트가 잡히지 않는지 확인하는 방법으로

미니맵 아이콘이 그려지고 있는가? 를 사용하겠습니다.

SpriteRenderer.isVisible()

이 함수를 사용하면 아이콘이 미니맵에 그려지고 있는지 확인할 수 있습니다.

isVisible() == false 일 때 위에서 만든 미니맵 카메라의 화살표 표시 함수를 호출하도록 구현했습니다. ( minimapCamera.ShowBorderIndicator(transform.position); )

다시 보여지게 되면 minimapCamera.HideBorderIncitator() 를 호출해서 화살표를 숨깁니다.

지금 구현한 MinimapSprite 는 미니맵 카메라를 필요로 합니다.

등록한 후 실행해보죠.

(프로토타이핑하느라 일단 구조는 신경쓰지 않고 화살표 출력이 잘 되는지 봅시다.)

화살표는 잘 나오는 것 같습니다.

2단계 미니맵, 3단계 미니맵

2단계 미니맵의 특징을 보면,

1단계보다 넓음

카메라가 회전하지 않음

플레이어 아이콘이 바뀜

카메라의 Size를 조정해주고,

Render Texture의 UI 크기도 조정해주고,

회전 안 시키고,

플레이어 아이콘도 보여주게 하면 될 것 같습니다.

3단계 미니맵은 2단계에서 한 가지만 바뀝니다.

맵 전체를 보여줌

그러니까 한 번에 구현해보죠.

MinimapCamera.cs

내용이 너무 쩔어줘서 보실 분만 보세요.

public class MinimapCamera : MonoBehaviour { public enum MinimapIndex { Small , Large , All } public Transform target ; public GameObject playerIcon ; public float offsetRatio ; public float smallViewSize ; public float largeViewSize ; public float allViewSize ; Camera cam ; Vector2 size ; public Transform indicator ; public float indicatorSize ; float sizeReciprocal ; int minimapIndex ; public void ChangeMinimapView ( InputAction . CallbackContext context ) { if ( context . action . phase == InputActionPhase . Performed ) { minimapIndex = ( ++ minimapIndex ) % 3 ; SetCamera ( ) ; } } public void SetCamera ( ) { switch ( ( MinimapIndex ) minimapIndex ) { case MinimapIndex . Small : cam . orthographicSize = smallViewSize ; cam . cullingMask &= ( 1 << LayerMask . NameToLayer ( "Minimap" ) ) ; break ; case MinimapIndex . Large : cam . orthographicSize = largeViewSize ; cam . cullingMask |= ( 1 << LayerMask . NameToLayer ( "Minimap (Player)" ) ) ; break ; case MinimapIndex . All : cam . orthographicSize = allViewSize ; break ; } size = new Vector2 ( cam . orthographicSize , cam . orthographicSize * cam . aspect ) ; } public void ShowBorderIndicator ( Vector3 position ) { float reciprocal ; float rotation ; Vector2 distance = new Vector3 ( transform . position . x - position . x , transform . position . z - position . z ) ; if ( distance . x == 0 || distance . y == 0 ) return ; if ( ( MinimapIndex ) minimapIndex == MinimapIndex . Small ) { distance = Quaternion . Euler ( 0 , 0 , target . eulerAngles . y ) * distance ; } if ( Mathf . Abs ( distance . x ) > Mathf . Abs ( distance . y ) ) { reciprocal = – Mathf . Abs ( size . x / distance . x ) ; rotation = ( distance . x > 0 ) ? 90 : – 90 ; } else { reciprocal = – Mathf . Abs ( size . y / distance . y ) ; rotation = ( distance . y > 0 ) ? 180 : 0 ; } float scale = sizeReciprocal * GetCameraViewSize ( ) ; indicator . localScale = new Vector3 ( scale , scale , scale ) ; indicator . localPosition = new Vector3 ( distance . x * reciprocal , distance . y * reciprocal , 1 ) ; indicator . localEulerAngles = new Vector3 ( 0 , 0 , rotation ) ; if ( indicator . gameObject . activeInHierarchy == false ) { indicator . gameObject . SetActive ( true ) ; } } public void HideBorderIncitator ( ) { indicator . gameObject . SetActive ( false ) ; } public float GetCameraViewSize ( ) { return cam . orthographicSize ; } void Awake ( ) { minimapIndex = ( int ) MinimapIndex . Small ; cam = GetComponent < Camera > ( ) ; SetCamera ( ) ; sizeReciprocal = indicatorSize / GetCameraViewSize ( ) ; } void Update ( ) { Vector3 targetForwardVector = target . forward ; targetForwardVector . y = 0 ; targetForwardVector . Normalize ( ) ; Vector3 position ; float cameraRotation ; if ( minimapIndex == ( int ) MinimapIndex . Small ) { position = new Vector3 ( target . transform . position . x , 1 , target . transform . position . z ) + targetForwardVector * offsetRatio * cam . orthographicSize ; cameraRotation = – target . eulerAngles . y ; } else { if ( minimapIndex == ( int ) MinimapIndex . Large ) { position = new Vector3 ( target . transform . position . x , 1 , target . transform . position . z ) ; } else { position = new Vector3 ( 0 , 1 , 0 ) ; } cameraRotation = 0 ; } transform . position = position ; transform . eulerAngles = new Vector3 ( 90 , 0 , cameraRotation ) ; } }

2, 3번 미니맵에서도 사용할 수 있도록 미니맵 카메라의 기능을 그냥 많이 추가했습니다.

Input Event에 따라서 모드 변경

모드에 따라 orthographicSize (카메라가 비추는 범위) 변경

(카메라가 비추는 범위) 변경 1번 미니맵이 아닐 때는 카메라 회전 및 오프셋 미사용

카메라와 오브젝트가 겹치는 상황에 ShowBorderIndicator가 호출될 경우 에러 발생 수정

플레이어 아이콘 표시/미표시 : Culling Mask 값 변경

값 변경 미니맵 밖의 오브젝트를 표시하는 화살표도 Size에 맞게 크기 변경

AircraftController 에 연결되어 있던 Input Event를 MinimapCamera 에 연결시킵니다.

MinimapSprite.cs

public float iconSize ; public float depth ; float sizeReciprocal ; void Start ( ) { spriteRenderer = GetComponent < SpriteRenderer > ( ) ; sizeReciprocal = iconSize / minimapCamera . GetCameraViewSize ( ) ; depth *= 0.01f ; } void Update ( ) { . . . float scale = sizeReciprocal * minimapCamera . GetCameraViewSize ( ) ; transform . localScale = new Vector3 ( scale , scale , scale ) ; }

미니맵 스프라이트에는 현재 카메라 사이즈에 맞도록 크기를 조절하는 기능을 추가합니다.

카메라의 orthographicSize 가 커지면 더 넓은 범위를 비추게 되고, 미니맵 아이콘의 크기는 작게 보이게 됩니다.

크기에 맞게 스케일을 조정해서 어느 미니맵을 보든 적당한 크기로 보이도록 만들어줍니다.

*이 기능은 미니맵 밖에 있는 오브젝트를 보여주는 화살표도 적용되어야 합니다.

그리고 depth 기능도 추가했는데, 미니맵 아이콘이 겹쳐버릴 때는 아이콘들이 깜빡일 수 있기 때문에 꼭 구분되어야 하는 아이콘은 depth를 바꿔줍니다.

플레이어의 미니맵 아이콘은 항상 위에 있어야 하므로, depth를 1 올립니다.

(실제 y 좌표는 depth * 0.01만큼 올라갑니다.)

값을 모두 할당한 다음 실행합니다.

1단계 미니맵에서 벗어날 때까지 유지하다가, 2단계 – 3단계 순으로 넘어가는 모습입니다.

그러고보니 미니맵 배경을 안 바꿔줬네요.

빠르게 배경 이미지를 만들어서 넣어주고,

RenderTexture 크기도 키워줍니다.

음… 2단계와 3단계 미니맵은 아이콘 크기를 재설정해줘야 할 것 같습니다.

아니면 카메라를 좀 손보거나요.

MinimapCamera.cs

public GameObject [ ] minimaps = new GameObject [ 3 ] ; public void SetCamera ( ) { . . . for ( int i = 0 ; i < minimaps . Length ; i ++ ) { minimaps [ i ] . gameObject . SetActive ( i == minimapIndex ) ; } } CameraController 에서 카메라 전환할 때 카메라를 활성화/비활성화해줬던 것처럼, 여기서도 미니맵 3개를 활성화/비활성화해주는 코드를 넣습니다. 이제 타겟 근처를 지나가면서 아이콘들이 잘 보이는지 확인하면 됩니다. 코드의 구조가 좀 이상하고 아이콘 크기가 너무 커보이긴 하지만, 목표는 달성한 것 같습니다. 이렇게 1인칭 시점과 미니맵 부분을 끝냈는데요, 전체 화면: 미니맵 아군/적군 UI 게임 내 대사 조준점 기총 UI 경고 UI 색상 변경 화면에 안 보이는 목표물의 위치를 가리키는 화살표 이 남은 것들을 4편에 다 끝낼 수 있으면 좋겠군요. 생각보다 미니맵 만들기가 시간을 많이 잡아먹었습니다.

게임에 미니맵을 추가해보자!

게임을 만들다보면 미니맵을 만들어야 하는 상황이 발생합니다.

오늘은 미니맵 제작하는 방법에 대해 알아보고자 합니다.

혹시 경로를 타고 들어오시다가 궁금하신 분들은

1

다음과 같이 오브젝트를 생성하세요

사실 이 과정은 크게 중요하지 않습니다. 다만 미니맵이 정상적으로 작동 되는지

확인하기 위해 제작하는 단계입니다.

2

Project 항목에서 오른쪽마우스 클릭 Create -> Material을 선택합니다.

이 과정은 마테리얼 색상을 추가하는 단계인데 다른 오브젝트와 구별을 위해 사용합니다.

3

Albedo 값을 빨간색으로 바꿉니다

빨간색이 싫으시면 다른 색으로 하셔도 무방하답니다 🙂

4

다음 큐브에 플레이어가 될 오브젝트를 제외하고( 1개의 큐브를 제외하고) 나머지 오브젝트를 전부 클릭하여 해당 Material을 적용시켜 줍니다

5

다음과 같은 항목으로 저는 설정 하였습니다.

이후 Cube 자식개체로 Main Camera 오브젝트를 넣습니다.

6

이제 카메라를 하나 더! 생성합니다.

카메라를 생성하는 방법은 2가지 입니다.

하나는 Hierarchy에서 오른쪽 마우스 -> Camera를 생성

두번째 Hierarchy 에서 오른쪽 마우스 -> Create Empty 생성 -> Add Component에서 Camera 추가

첫번째 방법은 생성 후 반드시 Flare Layer GUI Layer Audio Listener 컴포넌트 항목을 삭제 하셔야 합니다.

7

생성된 오브젝트의 이름을 MiniMapCam으로 변경합니다. 사진에는 MiniMap으로 되어 있지만 제가 실수로 빼먹었습니다 🙁

만들어진 오브젝트 카메라도 플레이어 자식 개체로 추가하시고 포지션을 Y축 20

로테이션을 X축을 90도로 기울여 줍시다

8

Hierarchy 에서 오른쪽 마우스 -> UI -> Raw Image를 추가 합니다. 이제 이 영역이 미니맵으로 표시가 됩니다.

9

Rect Transform에서 Anchor을클릭하여 오른쪽으로 바꿉니다. 이 과정을 하지 않으면 해상도에 따라 값이 크게 변하게 됩니다.

이후 다음과 같은 설정값을 하시면 됩니다.

10

Project 항목에서 오른쪽마우스 -> Create -> Render Texture 항목을 생성합니다. 이름을 MiniMap으로 설정합니다

11

이제 생성했었던 MiniMapCam 항목에 있는 Target Texture에 10번에서 만들었던 Render Texture를 적용시켜 줍니다.

12

그리고 RawImage에도 Texture를 적용시켜 줍니다!

13

짠! 이제부터 정상적으로 미니맵이 적용된 것을 보실 수 있습니다.

이 과정은 텍스쳐에 카메라 값을 계속해서 받아와서 실행하는 방법이라 보시면 됩니다. 저는 미니맵으로 적용 하였으나 경우에 따라서 CCTV 같은 효과도 할수 있지요!

유니티 미니 맵 255 개의 새로운 답변이 업데이트되었습니다. – Ko.taphoamini.com

We are using cookies to give you the best experience on our website.

You can find out more about which cookies we are using or switch them off in settings.

뚜르의 공대일기

안녕하세요 러드입니다.

오늘은 유니티에서 미니맵 만들기를 해보겠습니다.

저격 스코프를 만드는 방식과 동일합니다만

새로운 블로그인만큼 ㅋ 새롭게새롭게.

유니티 버전은

5.6.0f 입니다.

준비물

적을 표시할 마크와 플레이어를 표시할 마크

sort of…

전체 맵을 찍은 텍스쳐.

위에서 밑을 바라보는 Y축 기준으로 찍으시면 됩니다.

무슨 쉐이더를 사용하면 편하게 된다고도 하는데..

걍 간편하게 캡쳐해서 하는걸로..

어차피 미니맵인만큼 자세한 건물지형보다는

찍은 후 포토샵으로 후보정 하는 경우가 많아서

저 같은 경우에는 걍 캡쳐한다음에

스프라이트모드로 바꿔버렸지만 포토샵으로 후보정하는게

좋습니다.

저 같은 경우에는 조금 스크립트를 모르셔도 할 수 있도록

쉽게 꾸며보았습니다.

전체 맵의 땅 부분만 복사를 하여서

밑으로 내린 다음 (위는 안되는게 하늘을 보면…ㄷㄷ;;)

그 땅에 (Plane아니면 Cube겠네요)

텍스쳐를 입혀버립니다.

그럼 위 같은 것이 보입니다.

밑으로 내리실 때 Y축으로만 내리셔야 하는데

이유인즉슨 적과 플레이어의 X,Z 값과 마커의 값이 같을 것이기 때문입니다.

그 후 복사해준 미니맵용 땅을 프로젝트로 가져와서

프리팹으로 선언해준다음..

Material 하나를 만들어줍니다.

RenderTexture 도 하나 만들어줍니다.

이러면 프리팹까지 총 3개의 파일이 생기는데요

Material에 Select부분에 텍스쳐를 넣어주세요~

그 다음

미니맵용 카메라를 하나 만들어서

미니맵만 비추게 조정해줍니다.

Camera의 TargetTexture 부분을 미리 만들어준

RenderTexture를 넣어주면 다른 거 말고 딱 요것만 보게 됩니다.

자 그러면 이제 미니맵은 보일겁니다.

이제 그러면 Plane이라던지 아니면 뭐

미니맵으로 볼만한 사각형하나 가져와서 메인카메라 앞에 놔주세요 위치는 뭐

놓으시고 싶으신곳..

그 다음 그 화면에다가 아까 만들어주었던 Material을

넣어주시면 뙇 보입니다.

로테이션이 안맞을 수 있으니 이 부분은

알아서 돌려서 맞춰주세요.

그럼 이제 마커를 각각 플레이어와 enemy에 넣어줍니다.

public class Marker : MonoBehaviour {

public Transform PlayerMark;

Vector3 Markert;

// Use this for initialization

void Start () {

PlayerMark = GameObject.FindWithTag(“MainCamera”).transform;

}

// Update is called once per frame

void Update () {

this.transform.position = new Vector3(PlayerMark.position.x, PlayerMark.position.y – 216, PlayerMark.position.z);

}

}

플레이어 마커 스크립트입니다.

뭐 그냥 단순히 업데이트로 해주었습니다.

근데 계속 돌아가서 메모리 잡아먹을 수 있으니

코루틴으로 바꿔주도록 하세요.

전 급하게 하느라 걍 쓴거지만…

적의 마커는 스크립트를 따로 안주었는데요

그냥 적 밑에 붙여주고 Y값만 다르게 해주었네요.

생각해보니.. 플레이어도 이렇게 하는게 더 효율적인것 같네요..? 메모리 하나더 안잡아먹어두 되구… (참고로 마커는 2D라서 3D게임에서 쓰시려면 크기 조절과 로테이션 조절은 알아서..)

오늘은 RenderTexture를 이용해서 미니맵을 간단히 구현해보았는데요.

모르시는 부분 있으시면 댓글로 남겨주세요~

그럼 오늘은 여기까지!

키워드에 대한 정보 유니티 미니 맵

다음은 Bing에서 유니티 미니 맵 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

See also  이등변 삼각형 넓이 | [Ebs 수학의 답] 피타고라스 정리 - 17. 이등변삼각형의 높이와 넓이 모든 답변
See also  Przetwornica Prądu Napięcia Sinus 12V 230V | Najlepsza Przetwornica 12V Jaką Miałem!!! 1200W Mocy A Deklarowane Tylko 700W? 28443 투표 이 답변

See also  Pachnąca Kraina Opinie O Sklepie | Czy To Faktycznie Tak Dobra Gra? A Plague Tale: Innocence - Recenzja 55 개의 자세한 답변

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 유니티 기초 – 초간단 미니맵 (렌더 텍스쳐)

  • Unity
  • Unity3D
  • 유니티
  • 유니티3D
  • 게임개발
  • 게임
  • 게임엔진

유니티 #기초 #- #초간단 #미니맵 #(렌더 #텍스쳐)


YouTube에서 유니티 미니 맵 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 유니티 기초 – 초간단 미니맵 (렌더 텍스쳐) | 유니티 미니 맵, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

Leave a Comment