개발단에 가입하여 베르의 게임 개발 유튜브를 지원해주세요!

 

베르의 게임 개발 유튜브

안녕하세요! 여러분들과 함께 게임 개발을 공부하는 베르입니다! 게임 개발에 도움이 되는 강좌들을 올리는 채널입니다! [투네이션 후원] https://toon.at/donate/637735212761460238 [유니티 어필리에이트

www.youtube.com

 

리소스 패키지 : https://drive.google.com/file/d/1jwGmgfUo0-VPD-yfIQsmge8wE-iFzjPB/view?usp=sharing

 

안녕하세요! 여러분들과 함께 게임 개발을 공부하는 베르입니다!

이번 영상에서는 임포스터로 의심되는 플레이어에게 투표하고 추방하는 기능을 만들어 봅시다!

 

사용 엔진 버전 : 2019.4

 

타임라인

0:00 인트로

0:12 회의 UI 배치

2:56 플레이어 패널 띄우기

6:57 플레이어 패널 선택 기능 만들기

10:00 아웃트로

스크립트

인트로

안녕하세요. 여러분들과 함께 게임 개발을 공부하는 베르입니다.

이번에는 신고 이후에 플레이어들끼리 투표하고 가장 많은 표를 받은 플레이어를 추방하는 기능을 만드는 과정을 진행해보겠습니다.

회의 UI 배치

작업에 들어가기에 앞서 영상 하단의 링크에서 리소스 패키지를 다운로드 받아서 프로젝트에 임포트해줍니다.

리소스 임포트가 완료된 다음에는 회의 UI를 배치해보겠습니다.

먼저 Canvas 오브젝트 아래에 Image 게임오브젝트를 생성하고 화면 전체를 덮도록 세팅한 다음 색을 투명하게 만들어줍니다.

그 아래에는 임포트한 리소스들을 이용해서 실제 게임 화면과 유사하게 배치해줍니다.

그리고 플레이어 패널을 만들어야 합니다.

패널을 만들고 플레이어 이미지를 올린 다음 닉네임을 표시할 텍스트를 추가해줍니다.

그리고 빈 게임오브젝트를 추가하고 Horizontal Layout Group 컴포넌트와 Content Size Fitter 컴포넌트를 붙여줍니다.

그리고 Horizontal Layout Group의 Child Alignment는 Middle Left로 변경하고 Content Size Fitter의 프로퍼티는 Min Size로 변경해줍니다.

그리고 이 레이아웃 그룹 오브젝트의 Pivot X 값을 0으로 맞춰줍니다.

그러면 이 레이아웃 그룹 오브젝트 밑에 다른 플레이어가 투표했음을 표시하는 이미지를 추가하면 제대로 정렬되어서 추가되는 모습을 볼 수 있습니다.

그 다음에는 빈 게임오브젝트도 추가해서 그 아래에 투표 버튼과 취소 버튼도 올려줍니다.

그리고 투표했을 때 표시되는 UI와 죽은 플레이어에게 표시되는 부가 UI까지 올려줍니다.

플레이어 패널을 완성한 다음에는 빈 게임오브젝트를 만들고 Grid Layout Group 컴포넌트를 붙여줍니다.

그리고 Sell Size를 348x63으로 변경하고 플레이어 패널을 복제해서 2열 5행으로 배치되게 크기를 맞추고 간격을 조절해줍니다.

그리고 그 아래쪽에 Skip vote 버튼과 투표를 스킵한 플레이어를 보여주는 UI를 만들어줍니다.

투표를 스킵한 플레이어를 보여주는 UI를 만들 때는 플레이어 패널에서 다른 플레이어가 투표했음을 보여주는 UI와 똑같이 만들어주면 됩니다.

기본적인 배치를 마친 다음에는 만든 플레이어 패널과 투표 표시용 캐릭터 이미지를 프리팹으로 만들어주고 배치되어 있는 오브젝트는 삭제해줍니다.

그리고 Skipped Voting UI도 숨겨줍니다.

플레이어 패널 띄우기

이제 이 Meeting UI의 기능을 차례대로 만들어보겠습니다.

먼저 플레이어 패널에 붙일 MeetingPlayerPanel 스크립트를 생성하고 스크립트 에디터를 엽니다.

스크립트 에디터가 열리고 나면 스크립트의 상단에 UnityEngine.UI 네임스페이스를 using 선언해줍니다.

그리고 멤버 변수로 캐릭터 이미지 색을 바꾸는데 쓰일 Image 타입의 characterImg 변수와 닉네임을 표시하는데 쓰일 Text 타입의 nicknameText 변수, 죽은 플레이어를 표시할 때 사용될 GameObject 타입의 deadPlayerBlock과 신고자를 표시하기 위한 reporterSign 변수를 추가해줍니다.

그리고 어떤 플레이어의 패널인지 구분하기 위한 용도로 IngameCharacterMover 타입의 targetPlayer 변수도 만들어줍니다.

그 다음에는 SetPlayer 함수를 만들어서 characterImg의 머티리얼을 인스턴싱하고 매개변수로 받아온 캐릭터를 저장한 뒤에 캐릭터 이미지의 색을 바꾸고 닉네임을 세팅해줍니다.

그리고 임포스터인 플레이어가 다른 임포스터 플레이어의 패널을 볼 때는 이름이 빨간색으로 표시되도록 만들어줍니다.

그리고 패널의 대상이 되는 플레이어가 죽은 상태라면 플레이어 패널을 가리는 회색 패널이 켜지도록 만들어줍니다.

마지막으로는 해당 플레이어가 신고자라면 확성기 모양의 이미지가 활성화되도록 해야하는데 관련 변수가 없는 상태이니 IngameCharacterMover 클래스로 이동해서 bool 타입으로 isReporter 변수를 추가하고 SyncVar 어트리뷰트를 붙여줍니다.

그리고 아래 쪽에 있는 CmdReport 함수에서 isReporter 변수를 true로 변경하게 만들어줍니다.

다시 MeetingPlayerPanel 스크립트로 돌아와서 targetPlayer가 isReporter라면 reporterSign을 활성화시키도록 코드를 작성합니다.

코드를 모두 작성한 다음에는 저장하고 에디터로 돌아가서 Meeting Player Panel 오브젝트에 작성한 컴포넌트를 붙여줍니다.

그리고 각 프로퍼티를 할당해줍니다.

잠시 앞에서 빼먹은 확성기 모양의 신고자 표시 이미지를 추가하고 비활성화한 뒤 프로퍼티에 할당해줍니다.

그 다음에는 MeetingUI라는 이름으로 C# 스크립트를 생성하고 스크립트 에디터를 엽니다.

스크립트 에디터가 열리고 나면 스크립트의 상단에 UnityEngine.UI 네임스페이스를 using 선언해줍니다.

그리고 멤버 변수로는 플레이어 패널 프리팹을 담고 있을 GameObject 타입의 playerPanelPrefab 변수와 생성된 플레이어 패널들의 부모 오브젝트가 될 Transform 타입의 playerPanelsParent 변수, 그리고 생성된 플레이어 패널들을 저장하고 있을 List<MeetingPlayerPanel> 타입의 meetingPlayerPanels 변수를 선언해줍니다.

변수 선언을 끝낸 다음에는 Open 함수를 만들고 내 캐릭터의 패널을 먼저 만들어서 배치해주고 그 후에 FindObjectsOfType 함수로 다른 플레이어들을 찾아서 각 플레이어의 패널을 만들어 줍니다.

그 다음에는 IngameUIManager 스크립트로 이동해서 MeetingUI를 캐싱해서 접근하기 쉽게 만들어줍니다.

그리고 GameSystem 스크립트로 이동해서 StartMeeting_Coroutine 함수를 만들고 3초 후에 Report UI를 닫고 Meeting UI를 열도록 코드를 작성합니다.

그리고 이 StartMeeting_Coroutine 함수를 RpcSendReportSign 함수에서 호출하도록 만들어 줍니다.

코드를 모두 작성한 다음에는 저장하고 에디터로 돌아갑니다.

에디터로 돌아온 다음에는 Meeting UI 오브젝트에 작성한 컴포넌트를 붙이고 프로퍼티를 할당해줍니다.

그리고 Canvas 오브젝트에 붙어있는 IngameUIManager 컴포넌트에 MeetingUI를 캐싱해줍니다.

작업을 끝낸 다음에는 게임을 빌드합니다.

빌드가 완료되면 게임을 실행하고 테스트합니다.

시체를 발견하고 리포트 버튼을 누르면 리포트 UI가 뜬 뒤에 Meeting UI가 뜨고 죽은 플레이어는 어두운 색으로 표시되고 신고한 플레이어에게는 확성기 마크가 뜬 모습을 확인할 수 있습니다.

패널 선택 기능 만들기

이제 플레이어 패널을 선택하는 기능을 만들 차례입니다.

플레이어 패널을 선택했을 때 투표를 위한 버튼을 뜨게 해야합니다.

MeetingPlayerPanel 스크립트를 엽니다.

그리고 GameObject 타입으로 투표 버튼 그룹을 컨트롤할 voteButtons 변수를 선언하고 패널을 클릭했을 때 동작할 OnClickPlayerPanel 함수를 만들어줍니다.

이 함수에서는 먼저 voteButtons를 활성화시키도록 코드를 작성해줍니다.

코드를 작성한 다음에는 저장하고 에디터로 돌아갑니다.

그리고 프리팹에서 Vote Buttons 프로퍼티에 Player Panel 프리팹 아래에 있는 Vote Buttons 게임오브젝트를 할당해줍니다.

그 다음에는 Player Panel 오브젝트에 Button 컴포넌트를 붙인 다음 Transition을 None으로 변경하고 On Click 이벤트에 Meeting Player Panel의 OnClickPlayerPanel 함수를 등록해줍니다.

작업을 마치면 게임을 빌드해서 테스트 합니다.

회의 창이 뜬 이후에 플레이어 패널을 클릭해보면 투표를 위한 체크 버튼과 X 버튼이 뜨는 모습을 볼 수 있습니다.

그런데 지금은 다른 플레이어 패널을 선택했을 때 앞에서 선택한 플레이어 패널의 버튼이 사라지지도 않고 죽은 플레이어도 선택해서 투표를 할 수 있습니다.

그리고 죽은 플레이어도 다른 플레이어에게 투표할 수 있죠.

스크립트로 돌아가서 이 부분들을 수정해보겠습니다.

먼저 죽은 플레이어의 패널이 클릭되지 않도록 하는 부분은 SetPlayer 함수에서 처리하면 됩니다.

deadPlayerBlock을 활성화하기 위해서 판정한 값을 isDead 변수에 따로 저장해서 사용하도록 코드를 수정합니다.

그리고 isDead 값을 GetComponet 함수로 가져온 버튼의 interactable에 넣어줍니다.

그 다음은 한 패널을 선택했을 때 다른 패널의 선택을 해제하는 것입니다.

이것을 위해서는 다른 패널에 접근이 가능해야하는데 생성된 패널들은 MeetingUI에서 가지고 있으니 그쪽을 통해서 접근하는 것이 좋습니다.

먼저 MeetingPlayerPanel 클래스에 Unselect 함수를 만들어서 voteButtons를 비활성화 시키도록 만들어줍니다.

그 다음에는 MeetingUI 클래스로 이동해서 SelectPlayerPanel 함수를 만들고 선택한 패널을 제외한 다른 패널을 비활성화시키도록 코드를 작성합니다.

그리고 다시 MeetingPlayerPanel 클래스의 OnClickPlayerPanel 함수로 이동해서 MeetingUI의 SelectPlayerPanel 함수를 호출하도록 만들어줍니다.

마지막으로 죽은 플레이어가 투표를 하지 못하게 막기 위해서는 OnClickPlayerPanel 함수에서 플레이어가 죽은 상태라면 투표 기능이 동작하지 못하게 만들어줍니다.

코드를 모두 작성한 다음에는 저장하고 에디터로 돌아갑니다.

그리고 프리팹의 Vote Buttons 아래에 있는 Cancel Button을 선택하고 On Click 이벤트에 Unselect 함수를 등록해줍니다.

작업을 모두 마치면 게임을 빌드합니다.

그리고 게임을 실행해서 테스트해보면 한 패널을 선택하고 다른 패널을 선택하면 이전에 선택한 다른 패널의 선택이 취소되고 죽은 플레이어의 패널은 선택되지 않는 것을 볼 수 있습니다.

그리고 X 버튼을 누르면 패널 선택이 취소되는 모습도 볼 수 있습니다.

마지막으로 죽은 플레이어는 다른 플레이어를 선택할 수 없는 모습도 볼 수 있습니다.

아웃트로

이번 영상에서는 회의에서 임포스터로 의심되는 플레이어에게 투표해서 추방하는 기능을 만들기 위해 회의 UI를 만들고 플레이어 패널을 선택하는 기능을 만들어 보았습니다.

이상 베르의 게임 개발 유튜브였습니다. 감사합니다.

 

[유니티 어필리에이트 프로그램]

아래의 링크를 통해 에셋을 구매하시거나 유니티를 구독하시면 수익의 일부가 베르에게 수수료로 지급되어 채널의 운영에 도움이 됩니다.

 

에셋스토어

여러분의 작업에 필요한 베스트 에셋을 찾아보세요. 유니티 에셋스토어가 2D, 3D 모델, SDK, 템플릿, 툴 등 여러분의 콘텐츠 제작에 날개를 달아줄 다양한 에셋을 제공합니다.

assetstore.unity.com

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Create 2D & 3D Experiences With Unity's Game Engine | Unity Pro - Unity Store

Unity Pro software is a real-time 3D platform for teams who want to design cross-platform, 2D, 3D, VR, AR & mobile experiences with a full suite of advanced tools.

store.unity.com

[투네이션]

 

-

 

toon.at

[Patreon]

 

WER's GAME DEVELOP CHANNEL님이 Game making class videos 창작 중 | Patreon

WER's GAME DEVELOP CHANNEL의 후원자가 되어보세요. 아티스트와 크리에이터를 위한 세계 최대의 멤버십 플랫폼에서 멤버십 전용 콘텐츠와 체험을 즐길 수 있습니다.

www.patreon.com

[디스코드 채널]

 

Join the 베르의 게임 개발 채널 Discord Server!

Check out the 베르의 게임 개발 채널 community on Discord - hang out with 399 other members and enjoy free voice and text chat.

discord.com

 

반응형

스크립트

인트로

안녕하세요. 여러분들과 함께 게임 개발을 공부하는 베르입니다.

지난 강좌까지 크루원을 죽이는 기능을 만들었으니 이번 영상에서는 크루원의 시체를 발견하면 신고하는 기능을 만들어봅시다.

시체 감지해서 리포트 버튼 활성화 시키기

제일 먼저 해야할 작업은 플레이어가 시체를 감지했을 때 리포트 버튼을 활성화시키는 것입니다.

그러기 위해서는 시체 오브젝트에 감지할 수 있는 콜라이더를 추가해줘야 합니다.

프로젝트 뷰에서 Deadbody 프리팹을 찾아서 선택합니다.

그리고 캐릭터를 감지할 CircleCollider2D 컴포넌트를 부착해준 뒤 is Trigger 프로퍼티를 체크해줍니다.

그리고 캐릭터가 감지하게 될 거리로 반지름을 6으로 설정해줍니다.

그 다음에는 인스펙터 뷰 상단의 레이어에서 Add Layer를 선택하고 Deadbody 레이어를 추가해줍니다.

레이어를 추가한 다음에는 프리팹을 다시 선택하고 프리팹의 레이어를 Deadbody로 설정해줍니다.

그 다음에는 Deadbody 레이어의 콜라이더가 Player 레이어의 콜라이더와 만났을 때만 반응하게 만들어 주기 위해서 상단 메뉴 바에서 [Edit > Project Settings] 항목을 선택해서 프로젝트 세팅 창을 열어줍니다.

그리고 Physics 2D 카테고리의 제일 아래에서 Deadbody 레이어는 Player 레이어에만 반응하도록 만들어줍니다.

콜라이더 세팅이 끝난 다음에는 Deadbody 스크립트를 열어줍니다.

Deadbody 클래스에서는 OnTriggerEnter2D 콜백 함수와 OnTriggerExit2D 콜백 함수를 만들어줍니다.

그리고 감지된 플레이어가 들어오거나 나갈 때마다, 자기 자신이고 유령이 아닌 상태라면 리포트 버튼을 활성화시키거나 비활성화시켜 줘야합니다.

우선 코드를 저장하고 에디터로 돌아갑니다.

그리고 ReportButtonUI라는 이름으로 C# 스크립트를 생성하고 스크립트 에디터를 다시 열어줍니다.

스크립트 에디터가 열리고 나면 스크립트의 상단에 UnityEngine.UI 네임스페이스를 using 선언해줍니다.

그리고 멤버 변수로 Button 타입의 reportButton을 선언해주고 SetInteractable 함수를 만들어서 매개변수인 isInteractable 값에 따라서 버튼을 활성화시키거나 비활성화시키도록 코드를 작성해줍니다.

그 다음에는 IngameUIManager 클래스로 이동해서 ReportButtonUI를 캐싱해서 쉽게 접근할 수 있도록 해줍니다.

캐싱 작업이 끝나면 Deadbody 클래스로 이동해서 OnTriggerEnter2D 콜백 함수에서는 SetInteractable 함수로 리포트 버튼을 활성화 시키게 만들어주고 OnTriggerExit2D 콜백 함수에서는 SetInteractable 함수로 리포트 버튼을 비활성화시키게 만들어줍니다.

코드를 모두 작성한 다음에는 저장하고 에디터로 돌아갑니다.

에디터로 돌아온 다음에는 Report Button을 찾아서 ReportButtonUI 컴포넌트를 붙여주고 프로퍼티를 할당합니다.

그리고 캔버스에 붙어있는 IngameUIManager에 방금 붙여준 ReportButtonUI를 프로퍼티에 할당해줍니다.

그리고 메인 카메라와 All See Camera에서 레이어가 Deadbody인 시체를 보이게 만들기 위해서 두 카메라를 선택하고 Culling Mask에 Deadbody 레이어를 추가합니다.

작업이 끝나면 게임을 빌드합니다.

빌드가 완료되고 게임을 실행해서 테스트해보면 시체가 시야에 잡히기 시작하면 리포트 버튼이 활성화되고 멀어지면 비활성화되는 모습을 볼 수 있습니다.

리포트 UI 배치

그 다음 작업은 신고 버튼을 누른 뒤에 시체 리포트 UI를 띄우는 것입니다.

먼저 영상 하단의 링크에서 작업에서 사용될 리소스 패키지를 다운로드 받아서 임포트합니다.

리소스 임포트가 끝나면 Canvas 아래에 Report UI라는 이름으로 Image 게임오브젝트를 만들고 화면 영역 전체를 덮도록 만들어 줍니다.

그리고 이미지의 알파 값을 0으로 내려서 투명하게 만들어 줍니다.

그 다음에는 그 아래에 이미지 오브젝트를 생성하고 임포트한 스프라이트들을 넣어서 게임의 리포트 UI와 비슷하게 만들어줍니다.

리포트 UI 기능 구현

이미지를 모두 배치한 다음에는 ReportUI라는 이름으로 C# 스크립트를 생성하고 스크립트 에디터를 엽니다.

스크립트 에디터가 열리고 나면 스크립트의 상단에 UnityEngine.UI 네임스페이스를 using 선언해줍니다.

그리고 멤버 변수로 Image 타입의 deadbodyImg와 Material 타입의 material을 선언해줍니다.

그 다음에는 Open 함수를 만들어서 캐릭터가 움직이지 못하게 만든 다음 머티리얼을 인스턴싱해주고 매개변수로 받은 deadbodyColor로 deadbodyImg의 색을 변경하도록 만들어줍니다.

그 다음에는 Close 함수를 만들어서 이 ReportUI를 닫는 기능도 만들어줍니다.

이 다음 단계로는 IngameUIManager 클래스로 이동해서 reportUI에 접근하기 쉽도록 캐싱하는 코드를 작성합니다.

이렇게 ReportUI 클래스의 작업이 끝난 다음에는 버튼을 눌렀을 때 모든 플레이어의 화면에서 리포트 UI가 뜨게 만들어야 합니다.

리포트 UI를 뜨게 만들기 전에 모든 유저에게 알려주기 위해서 발견한 시체의 색을 전달할 필요가 있습니다.

IngameCharacterMover 클래스로 이동해서 EPlayerColor 타입으로 foundDeadbodyColor 변수를 추가해줍니다.

그리고 Deadbody 클래스로 이동해서 OnTriggerEnter2D 콜백 함수에서 발견한 시체의 색을 발견자의 캐릭터에 전달해줘야 합니다.

그전에 아직 Deadbody 클래스에 죽은 플레이어 색이 저장되어 있지 않기 때문에 EPlayerColor 멤버 변수를 추가하고 RpcSetColor 함수에서 매개변수로 받은 값을 저장해줍니다.

그리고 OnTriggerEnter2D 콜백 함수에서 자신의 캐릭터에 발견한 시체의 색을 저장해줍니다.

그 다음에는 다시 IngameCharacterMover 클래스로 돌아가서 Report 함수와 CmdReport 함수를 만들어줍니다.

Report 함수에서는 매개변수로 발견한 죽은 크루원의 색상을 넣어서 CmdReport 함수를 호출하게 코드를 작성합니다.

그리고 CmdReport 함수에는 Command 어트리뷰트를 붙여줍니다.

이렇게 CmdReport 함수를 통해서 서버로 전달된 리포트 신호를 다른 플레이어들에게 전달해주면 됩니다.

GameSystem 클래스로 이동해서 StartReportMeeting 함수를 만들어 줍니다.

이 함수를 통해서 리포트 미팅이 시작됩니다.

지금은 간단하게 다른 플레이어들에게 시체 발견 신호를 보내는 역할만을 하게 될 겁니다.

RpcSendReportSign 함수를 만들고 ClientRpc 어트리뷰트를 붙여준 뒤 StartReportMeeting 함수에서 호출하도록 만들어 줍니다.

그리고 RpcSendReportSign 함수에서는 ReportUI의 Open 함수를 호출하게 만들어줍니다.

그 다음에는 ReportButtonUI 클래스로 이동합니다.

여기서는 버튼을 눌렀을 때 호출될 OnClickButton 함수를 만들고 내 캐릭터의 Report 함수를 호출하게 만들어 줍니다.

다시 IngameCharacterMover의 CmdReport 함수로 돌아가서 GameSystem의 StartReportMeeting 함수를 호출해줍니다.

코드를 모두 작성한 다음에는 코드를 저장하고 에디터로 돌아갑니다.

에디터로 돌아온 다음에는 Report UI 오브젝트에 방금 작성한 ReportUI 컴포넌트를 붙여주고 시체 이미지와 크루원 머티리얼을 프로퍼티에 할당해줍니다.

그리고 Report Button을 선택하고 On Click 이벤트에 Report Button UI의 OnClickButton 함수를 등록해줍니다.

그 다음에는 Canvas를 선택해서 IngameUIManager 컴포넌트의 ReportUI 프로퍼티에 Report UI 오브젝트를 할당해줍니다.

작업을 마친 다음에는 게임을 빌드합니다.

빌드가 완료된 다음 게임을 실행해서 테스트해보면 리포트 버튼을 누른 뒤에 모든 플레이어의 화면에 리포트 UI가 뜨는 모습을 볼 수 있습니다.

아웃트로

이번 영상에서는 시체를 발견했을 때 리포트 버튼이 활성화되고 버튼을 누르면 모든 플레이어의 화면에 리포트 UI가 뜨는 기능을 만들어 보았습니다.

다음 영상에서는 여기에 이어서 회의를 하는 기능을 만들어 보도록 하겠습니다.

이상 베르의 게임 개발 유튜브였습니다. 감사합니다.

타임라인

0:00 인트로

0:12 시체를 감지해서 리포트 버튼 활성화 시키기

3:08 리포트 UI 배치

3:52 리포트 UI 기능 구현

7:30 아웃트로

 

[유니티 어필리에이트 프로그램]

아래의 링크를 통해 에셋을 구매하시거나 유니티를 구독하시면 수익의 일부가 베르에게 수수료로 지급되어 채널의 운영에 도움이 됩니다.

 

에셋스토어

여러분의 작업에 필요한 베스트 에셋을 찾아보세요. 유니티 에셋스토어가 2D, 3D 모델, SDK, 템플릿, 툴 등 여러분의 콘텐츠 제작에 날개를 달아줄 다양한 에셋을 제공합니다.

assetstore.unity.com

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Create 2D & 3D Experiences With Unity's Game Engine | Unity Pro - Unity Store

Unity Pro software is a real-time 3D platform for teams who want to design cross-platform, 2D, 3D, VR, AR & mobile experiences with a full suite of advanced tools.

store.unity.com

[투네이션]

 

-

 

toon.at

[Patreon]

 

WER's GAME DEVELOP CHANNEL님이 Game making class videos 창작 중 | Patreon

WER's GAME DEVELOP CHANNEL의 후원자가 되어보세요. 아티스트와 크리에이터를 위한 세계 최대의 멤버십 플랫폼에서 멤버십 전용 콘텐츠와 체험을 즐길 수 있습니다.

www.patreon.com

[디스코드 채널]

 

Join the 베르의 게임 개발 채널 Discord Server!

Check out the 베르의 게임 개발 채널 community on Discord - hang out with 399 other members and enjoy free voice and text chat.

discord.com

 

반응형

 

스크립트

인트로

안녕하세요. 여러분들과 함께 게임 개발을 하는 베르입니다.

지난 영상에서는 죽은 플레이어들을 유령으로 만드는 작업을 진행해보았습니다.

이번에는 지난 영상에 이어서 남은 작업을 마무리하고 크루원 킬 기능을 끝내보겠습니다.

유령 플레이어끼리 서로 보이게 만들기

지난 작업에서는 죽어서 유령이 된 플레이어가 투명해지게 만들어줬지만 실제 게임과 다르게 유령 플레이어끼리 서로를 볼 수 없는 상태였습니다.

제일 처음할 작업은 이 문제를 해결해서 유령 플레이어들끼리 보이게 만들어 주는 것입니다.

먼저 IngameCharacterMover 스크립트를 찾아서 열어줍니다.

스크립트 에디터가 열리고 나면 먼저 Dead 함수로 가서 지난 영상에서 빼먹었던 플레이어가 죽은 뒤에 플레이어 타입이 Ghost로 바뀌는 코드를 추가해줍니다.

그 다음에는 SetVisibility 함수를 만들고 매개변수인 isVisible 값에 따라서 캐릭터를 숨기거나 보이게 해주는 코드를 작성합니다.

그리고 RpcDead 함수로 가서 내가 죽지 않은 상태일 때 다른 캐릭터가 죽었다면 투명하게 만들어주는 코드를 이 SetVisibility 함수로 대체해줍니다.

그 다음에는 자기가 죽었을 때 나보다 먼저 죽은 유령 플레이어들을 보이게 만들어줘야 합니다.

그대로 RpcDead 함수에서 내 캐릭터를 유령으로 바꾼 뒤 GameSystme의 GetPlayerList 함수로 플레이어 목록을 가져와서 이미 유령 상태인 플레이어들의 캐릭터를 SetVisibility 함수로 보이게 만들어주는 코드를 작성합니다.

코드를 모두 작성한 다음에는 저장하고 에디터로 돌아가서 게임을 빌드합니다.

빌드가 완료된 다음 테스트해보면 임포스터에게 죽어서 유령이 된 플레이어끼리 서로 볼 수 있게 되는 모습을 확인할 수 있습니다.

유령 플레이어가 벽뚫고 다니게 만들기

두 번째 작업은 유령이 된 플레이어가 장애물에 걸리지 않고 벽을 뚫고 다니게 만들어 주는 것입니다.

이 부분은 간단하게 IngameCharacterMover 클래스로 이동해서 GetComponent 함수로 게임오브젝트에 붙어있는 BoxCollider2D 컴포넌트를 찾아서 비활성화시키게 만들어 줍니다.

코드를 작성하고 저장한 다음 에디터로 돌아가서 게임을 빌드합니다.

빌드가 완료된 다음 실행해서 테스트해보면 유령이 된 플레이어는 자유롭게 벽을 뚫고 다니는 모습을 확인할 수 있습니다.

유령 플레이어의 시야

하지만 벽을 넘어다니다 보면 벽의 그림자가 이상해지는 모습을 볼 수 있습니다.

이런 문제를 제거하고 유령 플레이어의 시야 제한을 없애기 위해서 유령이 된 플레이어의 그림자 세팅을 바꿔주겠습니다.

Hierarchy 뷰를 보면 빛이 닿는 영역을 밝게 하고 그렇지 않은 영역은 어둡게 하기 위한 Shadow Light와 어두운 영역을 보이게 만들어주는 Global Light, 그리고 빛이 닿는 영역에 있는 캐릭터만 보이게 만들기 위해 영역을 구분짓는 Light Map Light가 있는 것을 볼 수 있습니다.

유령이 된 플레이어가 화면 전체를 볼 수 있게 만들어주기 위해서는 Light Map Light의 타입을 Global로 바꾸고 Shadow Light의 Intensity를 0, Global Light의 Intensity를 1로 변경해주면 될 것 같습니다.

우선 GameSystem 스크립트를 찾아서 열어줍니다.

스크립트 에디터가 열리고 나면 스크립트의 상단에 UnityEngine.Experimental.Rendering.Universal 네임스페이스를 using 선언해줍니다.

그리고 Light2D 타입의 shadowLight, lightMapLight, globalLight를 멤버 변수로 선언해줍니다.

그 다음에는 ChangeLightMode 함수를 선언하고 앞에서 이야기 한대로 매개변수로 받은 타입이 Ghost라면 lightMapLight의 lightType을 global로 변경하고 shadowLight의 intensity를 0, globalLight의 intensity를 1로 변경해줍니다.

그 다음에는 IngameCharacterMover의 RpcDead 함수로 이동해서 자신의 캐릭터가 죽은 뒤에 GameSystem의 ChangeLightMode 함수를 호출하도록 만들어줍니다.

코드를 모두 작성한 다음에는 저장하고 에디터로 돌아가서 Game System 오브젝트의 프로퍼티에 각 라이트들을 할당해줍니다.

그리고 작업이 완료되면 게임을 빌드합니다.

빌드가 완료되고 테스트해보면 유령이 된 플레이어는 그림자의 방해없이 모든 곳을 볼 수 있게 된 것을 확인할 수 있습니다.

아웃트로

이번 영상에서는 드디어 기나긴 크루원 킬 기능을 마무리했습니다.

다음 영상부터는 어몽어스의 다른 기능을 만들어보도록 하겠습니다.

이상 베르의 게임 개발 유튜브였습니다. 감사합니다.

타임라인

0:00 인트로

0:15 유령 플레이어끼리 보이게 만들기

1:42 유령 플레이어가 벽 뚫고 다니게 만들기

2:13 유령 플레이어 시야

4:23 아웃트로

 

[유니티 어필리에이트 프로그램]

아래의 링크를 통해 에셋을 구매하시거나 유니티를 구독하시면 수익의 일부가 베르에게 수수료로 지급되어 채널의 운영에 도움이 됩니다.

 

에셋스토어

여러분의 작업에 필요한 베스트 에셋을 찾아보세요. 유니티 에셋스토어가 2D, 3D 모델, SDK, 템플릿, 툴 등 여러분의 콘텐츠 제작에 날개를 달아줄 다양한 에셋을 제공합니다.

assetstore.unity.com

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Create 2D & 3D Experiences With Unity's Game Engine | Unity Pro - Unity Store

Unity Pro software is a real-time 3D platform for teams who want to design cross-platform, 2D, 3D, VR, AR & mobile experiences with a full suite of advanced tools.

store.unity.com

[투네이션]

 

-

 

toon.at

[Patreon]

 

WER's GAME DEVELOP CHANNEL님이 Game making class videos 창작 중 | Patreon

WER's GAME DEVELOP CHANNEL의 후원자가 되어보세요. 아티스트와 크리에이터를 위한 세계 최대의 멤버십 플랫폼에서 멤버십 전용 콘텐츠와 체험을 즐길 수 있습니다.

www.patreon.com

[디스코드 채널]

 

Join the 베르의 게임 개발 채널 Discord Server!

Check out the 베르의 게임 개발 채널 community on Discord - hang out with 399 other members and enjoy free voice and text chat.

discord.com

 

반응형

스크립트

인트로

안녕하세요. 여러분들과 함께 게임 개발을 하는 베르입니다.

이번에는 문돌이가 다루는 한없이 가벼운 게임 수학이라는 주제로 돌아왔습니다.

게임을 만들면서 사용되는 수학이나 계산 등에 관련된 것을 알아보도록 할 겁니다.

베르의 한없이 가벼운 게임 수학 그 첫 번째 주제는 비트 연산입니다.

캐릭터 상태 예시

보통 게임에서 캐릭터는 여러 가지의 상태를 가질 수 있습니다.

간단하게 RPG 캐릭터를 예시로 들어보겠습니다.

보통의 열거형으로 구현한다면 가장 기본 상태인 정상 상태와 기절 상태, 중독 상태, 화상 상태 등등 여러가지 상태를 이렇게 만들 수 있습니다.

하지만 이렇게 기본 열거형에 순서대로 상태를 정의하는 방법은 캐릭터가 한 번에 하나의 상태만 가질 수 있게 만듭니다.

0이 정상이면 1은 기절, 2는 중독, 3은 화상, 이렇게 값이 정의됩니다.

이 방법에서는 상태가 바뀌면 다른 상태로 전환될 뿐이지 여러 개의 상태가 중복으로 적용되지 못하는 것을 볼 수 있습니다.

이진법

그럼 여기에 비트 연산을 사용하면 어떻게 되느냐.

비트 연산에 대해서 이해하려면 우선 2진법에 대한 이해가 필요합니다.

2진법은 컴퓨터 내부에서 사용되는 수 체계로 0과 1이라는 두 개의 숫자만으로 수를 나타내는 방법입니다.

0과 1만으로 수를 표현하면 0은 0이고 1은 1이지만 2부터는 자릿수가 올라가면서 10이 됩니다.

그리고 3은 11, 4는 100이 되죠.

한마디로 제일 오른쪽 첫 자리에서의 1은 1, 둘째 자리의 1은 2, 셋째 자리의 1은 4, 넷째 자리의 1은 8, 이렇게 2의 n승으로 자릿수가 올라갈 때마다 커지는 방식입니다.

컴퓨터에서 2진수의 한 자리를 1bit라고 부릅니다.

그리고 이 비트 8개가 모이면 1바이트라고 부르는 단위가 됩니다.

그리고 이 바이트 4개가 모이면 보통의 컴퓨터에서 int 변수 하나를 저장하는 크기가 되죠.

보통의 열거형은 int 타입으로 다뤄지기 때문에 4바이트의 크기를 차지합니다.

4바이트를 다시 비트로 환산하면 32개의 비트가 됩니다.

비트는 2의 n승으로 표현된다고 했으니 2의 32승, 즉 42억이 넘는 수가 표현이 가능한 겁니다.

이 숫자를 모두 캐릭터의 상태 열거형에 사용하면 최대 42억 개의 캐릭터 상태를 표현할 수 있습니다.

이진법을 이용한 중첩 상태 표현

하지만 앞에서도 이야기했듯이 그렇게 상태를 표현하면 한 번에 하나의 상태만 표현할 수 있고 다른 상태가 중첩되는 것을 전혀 표현할 수 없죠.

그래서 이 중첩된 상태를 표현하기 위해서 비트 하나에 상태 하나를 매핑해주는 겁니다.

모든 비트의 값이 0이면 아무런 상태도 적용되지 않은 정상이고, 첫째 자리가 1이면 기절 상태, 둘째 자리가 1이면 중독, 셋째 자리가 1이면 화상인 것입니다.

각 자리는 독립적으로 1이 될 수도 있고 0이 될 수도 있기 때문에 기절 상태이면서 화상에 걸릴 수도 있고, 화상에 걸린 상태에서 중독될 수도 있습니다.

거기에 더해서 모든 상태에 동시에 걸릴 수도 있죠.

이렇게 비트로 표현하는 상태의 단점은 열거형의 기본 타입이 int로 32비트라서 최대 32개의 상태까지만 표현할 수 있다는 점이지만 어지간한 게임에서는 32개의 상태면 필요로 하는 상태를 거의 다 표현할 수 있을 겁니다.

만약 32개의 상태가 부족한 경우에는 enum의 타입을 long으로 바꿔주면 64비트로 확장되어서 64개의 상태를 표현할 수 있게 됩니다.

그럼 여기까지 이진법의 비트 단위를 이용해서 어떻게 중첩된 캐릭터 상태를 표현할 수 있는지 알아보았습니다.

잘못된 상태 계상 방법

그렇다면 이제 이 비트 단위로 각 상태가 지정된 열거형 변수에 개발자가 원하는 상태를 적용하려면 어떻게 해야할까요?

이렇게 각 비트마다 상태 의미가 매핑되어서 각 상태들이 복잡하게 섞인 상태라면 내가 원하는 상태에 걸려있는지 어떻게 판단해야 할까요?

그리고 상태를 제거하고자 할 때는 또 어떻게 해야할까요?

그냥 상태를 추가할 때는 원하는 자리에 상태 값을 더하고 상태를 제거할 때는 원하는 자리에 상태 값을 빼주면 될까요?

이제부터 이 비트들에 대한 연산 방법을 알아보겠습니다.

값을 눈에 보기 쉽게 하기 위해서 잠시 윈도우 계산기를 찾아서 실행해줍니다.

그리고 계산기의 모드를 프로그래머로 바꾸면 비트 계산이 가능해집니다.

현재 상태가 0001이면 캐릭터는 기절 상태입니다.

거기에 중독 상태를 추가하기 위해서 0010을 더해주면 0011이 되서 기절 상태와 중독 상태가 중복됩니다.

그럼 0011처럼 이미 중독이 걸린 상태에 중독 공격을 한 번 더 당하면 어떻게 될까요?

더하기 계산으로는 두 번째 자리에 값을 더해주기 때문에 자릿수가 올라가서 0101이 되버립니다.

중독 상태가 갑자기 화상 상태로 바뀌어버리는 거죠.

명백한 버그입니다.

반대로 상태를 제거하기 위해서 값을 빼는 것도 마찬가지 입니다.

0101 상태로 중독 값이 없는 상태에서 중독을 제거하려고 0010을 빼면 0011이 되서 갑자기 화상 상태가 사라지고 중독 상태가 걸립니다.

그리고 0001 처럼 그 위에 값이 없는 상태에서 0010을 빼버리면 더 큰 문제가 발생할 수 있습니다.

위 값이 전혀 없는 상태에서 0001에서 0010을 빼면 가장 윗 자리수 앞에 1이 있는 것으로 간주해서 빼는 계산을 해버리기 때문에 그 위의 모든 자릿수들이 1로 바뀌어 버립니다.

그리고 지금 예시에서야 0101과 같이 눈으로 볼 수 있게 이야기를 하고 있지만 실제 값은 5일 겁니다.

이 5라는 값에서 기절과 화상이 걸린 상태라는 것을 어떻게 판단해야 할까요?

AND 연산과 OR 연산

이런 문제 없이 원하는 자리에 값을 넣고 빼기 위해서는 비트들끼리 연산하는 방법에 대해서 알아야 합니다.

컴퓨터 관련 공부를 해보셨거나, 마인크래프트에서 손에 레드스톤 가루를 좀 묻혀보신 분들이라면 AND 게이트와 OR 게이트에 대해서 알고 계실 겁니다.

그래도 모르시는 분들을 위해서 조금만 설명하도록 하죠.

AND 연산은 각 자릿수 끼리 계산을 해서 둘 중 하나라도 0이면 0이되고 두 수가 모두 1이면 각 자리가 1이 되는 방식의 계산입니다.

여기 이렇게 0011과 0101, 두 이진수를 AND 연산으로 처리하면 제일 앞자리는 0과 0이니 0, 두 번째 자리는 0과 1이니 0, 세 번째 자리는 1과 0이니 역시 0, 마지막 자리는 1과 1이니 1이 나와서 0001이 됩니다.

그리고 OR 연산은 각 자릿수 끼리 계산해서 둘 중 하나라도 1이면 그 자리의 수가 1이 되는 방식의 계산입니다.

다시 0011과 0101, 두 이진수를 OR 연산으로 처리하면 제일 앞자리는 0과 0이니 0, 두 번째 자리는 0과 1이니 1, 세 번째 자리는 1과 0이니 역시 1, 마지막 자리는 1과 1이니 1이 나와서 0111이 됩니다.

비트 연산을 이용한 상태 계산

그럼 이제 이 AND 계산과 OR 계산을 이용해서 앞에서 말한 문제를 해결해봅시다.

우선 상태를 추가하는 방법입니다.

상태를 추가하기 위해서는 OR 계산을 사용하면 됩니다.

0001에서 중독상태를 추가하기 위해서는 0010을 OR 연산해주면 0001과 0010에서 1인 자리들이 합쳐져서 0011이 되면서 중독 상태가 추가됩니다.

그리고 0011처럼 이미 중독된 상태에서 0010을 OR 연산해도 값이 증가하면서 엉뚱한 상태가 추가되지 않는 것도 알 수 있습니다.

코드에서는 이렇게 구현됩니다.

아무런 상태 이상도 걸리지 않은 Normal을 0으로 두고 각 상태를 2의 n승 값을 가지게 만들어줍니다.

기절은 1, 중독은 2, 화상은 4. 이렇게 말이죠.

숫자 앞에 0x를 붙이면 숫자를 16진수로 쓸 수 있는데 16진수를 사용하면 2의 n승을 표현하기 쉬워지기 때문에 비트 연산을 할 때 사용하면 좋습니다.

이렇게 비트 단위로 값을 설정한 다음 수직선 기호( | )를 사용하면 OR 통해서 상태를 추가할 수 있습니다.

그 다음 상태를 제거하는 방법은 AND 연산을 사용하면 됩니다.

0011처럼 중독과 기절이 동시에 걸려있는 상태에서 중독 상태를 제거하기 위해서는 1101처럼 빼고자 하는 자릿수만 0이고 나머지는 모두 1인 값과 AND 연산을 해주면 됩니다.

그러면 두 자리가 모두 1이 되는 자릿수만 그대로 남고 0인 자리들은 0이 됩니다.

거기서 중독 상태 자리는 계산되는 값이 0이기 때문에 무조건 0이 되어서 제거됩니다.

코드에서는 이렇게 구현됩니다.

우선 열거형에 해당 상태 자릿수만 0이고 나머지는 모두 1이 되는 반대 상태를 정의해주는 것이 작업에 도움이 됩니다.

NotStun이라는 이름으로 값을 정의해줍니다.

16진수로 반대가 되는 값을 넣어주면 되는데 값이 헷갈릴 수 있으니 계산기를 켜고 해당 비트를 0으로 만들어서 값을 만든 다음 확인하고 입력해줍니다.

정의가 끝난 다음에는 현재 상태와 Not 상태값을 & 기호를 사용해서 AND 연산해주면 원하는 상태만 제거할 수 있게 됩니다.

그 다음으로 지금 캐릭터가 어떤 상태에 걸렸는지 확인하는 방법입니다.

상태 확인 역시 AND 연산을 사용하면 되는데 Not 상태값 대신 확인하고자 하는 상태값을 현재 상태와 AND 연산을 해주면 됩니다.

그러면 그 상태에 걸려있으면 그 상태값이 나오고 그렇지 않으면 0이 나옵니다.

이렇게하면 어떤 상태에 걸려있는지 확인할 수 있습니다.

마지막으로 비트 연산의 응용법을 하나 알아보겠습니다.

일반 열거형을 사용하면 그 값이 int가 되어서 총 32개의 비트를 사용한다는 것과 어떤 자리가 어떤 상태를 나타내는지 각 비트에 상태를 매핑해서 사용한다는 것을 앞에서 말씀드렸었습니다.

이때 상태를 무작위로 매핑하는 것이 아니라 상위의 16개 비트에는 플레이어에게 이로운 효과를 매핑하고 하위의 16개 비트에는 플레이어에게 해로운 효과를 매핑하는 겁니다.

그러면 게임에서 자주 보던 것처럼 플레이어에게 적용되고 있는 모든 해로운 디버프를 한 번에 제거할 수도 있고 반대로 이로운 버프들을 모두 제거할 수도 있게 됩니다.

아웃트로

이번 영상에서는 이진법과 비트 연산을 이용해서 캐릭터의 상태를 표현하는 방법을 알아보았습니다.

이상 베르의 게임 개발 유튜브였습니다. 감사합니다.

타임라인

0:00 인트로

0:20 캐릭터 상태 예시

0:57 이진법

1:38 이진법을 이용한 중첩 상태 표현

3:20 잘못된 상태 계산 방법

5:19 AND 연산과 OR 연산

6:13 비트 연산을 사용한 상태 계산

9:39 아웃트로

 

[유니티 어필리에이트 프로그램]

아래의 링크를 통해 에셋을 구매하시거나 유니티를 구독하시면 수익의 일부가 베르에게 수수료로 지급되어 채널의 운영에 도움이 됩니다.

 

에셋스토어

여러분의 작업에 필요한 베스트 에셋을 찾아보세요. 유니티 에셋스토어가 2D, 3D 모델, SDK, 템플릿, 툴 등 여러분의 콘텐츠 제작에 날개를 달아줄 다양한 에셋을 제공합니다.

assetstore.unity.com

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Create 2D & 3D Experiences With Unity's Game Engine | Unity Pro - Unity Store

Unity Pro software is a real-time 3D platform for teams who want to design cross-platform, 2D, 3D, VR, AR & mobile experiences with a full suite of advanced tools.

store.unity.com

[투네이션]

 

-

 

toon.at

[Patreon]

 

WER's GAME DEVELOP CHANNEL님이 Game making class videos 창작 중 | Patreon

WER's GAME DEVELOP CHANNEL의 후원자가 되어보세요. 아티스트와 크리에이터를 위한 세계 최대의 멤버십 플랫폼에서 멤버십 전용 콘텐츠와 체험을 즐길 수 있습니다.

www.patreon.com

[디스코드 채널]

 

Join the 베르의 게임 개발 채널 Discord Server!

Check out the 베르의 게임 개발 채널 community on Discord - hang out with 399 other members and enjoy free voice and text chat.

discord.com

 

반응형

'게임 제작 > 게임 수학' 카테고리의 다른 글

[Math] 정규화 (1) - 벡터와 좌표의 정규화  (1) 2021.10.04

개발단에 가입하여 소소한 혜택과 함께 베르의 게임 개발 유튜브를 지원해주세요!

 

베르의 게임 개발 유튜브

안녕하세요! 여러분들과 함께 게임 개발을 공부하는 베르입니다! 게임 개발에 도움이 되는 강좌들을 올리는 채널입니다! [투네이션 후원] https://toon.at/donate/637735212761460238 [유니티 어필리에이트

www.youtube.com

안녕하세요! 여러분들과 함께 게임 개발을 공부하는 베르입니다!

이번에는 지난 영상에 이어서 크루원을 죽이는 기능을 계속해서 만들어 보겠습니다.

 

리소스 : https://drive.google.com/file/d/1mkCyQ1PJ0oN61vnpxTXa_98c656TQHPv/view?usp=sharing

 

사용 엔진 버전 : 2019.4

 

타임라인

0:00 인트로

0:19 임포스터 위치 이동 구현

1:02 Kill UI 만들기

3:06 Kill UI 띄우기

5:08 죽은 크루원 유령으로 만들기

6:29 유령 플레이어 투명하게 만들기

8:38 아웃트로

 

스크립트

인트로

안녕하세요. 여러분들과 함께 게임 개발을 공부하는 베르입니다.

이번 영상에서는 지난 작업에 이어서 임포스터가 크루원을 죽이는 기능을 계속해서 만들어 보겠습니다.

지난 영상을 잘 따라서 오셨다면 이렇게 임포스터가 크루원 옆에 다가가서 킬 버튼을 누르면 크루원의 시체가 생겨나는 데까지 완성이 됐을 겁니다.

임포스터 위치 이동 구현

본격적인 작업에 들어가기 전에 소소한 기능을 추가해보겠습니다.

지금은 킬 버튼을 누르면 크루원의 시체만 생겨나는데 게임을 플레이해보신 분들을 아시겠지만, 실제 게임에서는 킬 버튼을 누르는 순간 임포스터가 죽이려는 크루원의 위치로 짧게 순간이동됩니다.

이 기능을 만들기 위해서 IngameCharacterMover 클래스를 엽니다.

그리고 CmdKill 함수에서 타깃을 찾은 다음에 RpcTeleport 함수를 이용해서 타깃의 위치로 이동하는 코드를 작성해줍니다.

코드 작업이 끝나고 코드를 저장한 뒤 에디터로 돌아옵니다.

게임을 빌드해서 테스트 해보면 임포스터가 다른 크루원을 죽일 때 크루원의 위치로 텔레포트되는 모습을 볼 수 있습니다.

Kill UI 만들기

그 다음 작업을 이어나가기 전에 영상 하단의 링크에서 작업에 필요한 리소스를 다운로드 받아서 프로젝트에 임포트해줍니다.

그리고 인게임의 캔버스 아래에 Kill UI라는 이름으로 빈 게임오브젝트를 만들고 영역이 화면 전체를 덮도록 만들어 줍니다.

그 다음에는 그 아래에 임포트한 배경 이미지와 Kill 폴더 안에 들어있는 캐릭터 이미지들을 배치해주고 캐릭터 이미지 오브젝트에는 플레이어 색상을 표현하는 머티리얼을 넣어줍니다.

그 다음에는 [Ctrl + 6] 단축키를 눌러서 애니메이션 뷰를 켜고 Create 버튼을 눌러 새 애니메이션 클립을 만들어줍니다.

새 애니메이션 클립을 만든 다음에는 애니메이션의 샘플레이트를 15로 변경합니다.

그리고 Add Property 버튼을 눌러서 크루원 오브젝트의 Anchored Position과 크루원 이미지의 스프라이트, 임포스터 이미지의 스프라이트 프로퍼티를 추가해줍니다.

그 다음엔 임포트한 리소스 중에 Kill 이미지 시퀀스들을 올려줍니다.

그리고 애니메이션 뷰의 타임라인을 클릭해서 시간을 움직여보면 임포스터와 크루원의 동작이 전혀 맞지 않게 애니메이션이 재생되는 것을 볼 수 있습니다.

시간을 움직이면서 두 이미지의 동작이 맞아떨어지게 애니메이션 키들을 조정해줍니다.

그리고 Anchored Position 프로퍼티에서 시간 별 위치도 조절해서 애니메이션을 완성합니다.

애니메이션을 재생했을 때 이런 느낌으로 완성되면 됩니다.

애니메이션이 완성된 다음에는 애니메이션 뷰를 닫고 만든 애니메이션 클립을 찾아서 Loop Time을 꺼줍니다.

Kill UI 띄우기

이제 이 UI가 죽임을 당하는 크루원에게 뜨게 만들어줘야 합니다.

KillUI라는 이름으로 C# 스크립트를 생성하고 스크립트 에디터를 엽니다.

스크립트 에디터가 열리고 나면 스크립트의 상단에 UnityEngine.UI 네임스페이스를 using 선언해줍니다.

그리고 Image 타입으로 imposterImg 변수와 crewmateImg 변수, Material 타입 변수를 하나 선언해줍니다.

그 다음에는 Open 함수를 만들어서 두 이미지의 머티리얼을 인스턴싱해준 다음 두 이미지의 색을 바꾸고 UI를 활성화시킵니다.

그리고 애니메이션이 재생된 뒤에 닫히도록 코드를 작성해줍니다.

그 다음에는 IngameUIManager로 이동해서 KillUI를 캐싱해줍니다.

다음으로는 KillUI를 띄우기 위해서 IngameCharacterMover로 이동합니다.

타깃 크루원이 죽는 기능을 처리하기 위한 Dead 함수를 만들어주고 시체를 만드는 코드를 이 Dead 함수로 이동시켜줍니다.

그리고 원래 시체를 생성시키던 부분에서는 target의 Dead 함수를 호출시키도록 만들어줍니다.

이 부분은 원래 임포스터 플레이어 객체에서 크루원을 죽이고 시체를 생성하는 부분을 모두 처리했던 것을 임포스터 객체는 죽이는 기능만하고 시체를 생성하고 죽는 과정은 크루원 객체로 분리한 것입니다.

그 다음은 RpcDead 함수를 만들고 ClientRpc 어트리뷰트를 붙여줍니다.

RpcDead 함수에서는 죽은 크루원이 자신일 때만 KillUI를 열도록 만들어 줍니다.

그리고 Dead 함수가 RpcDead 함수를 호출하도록 만들어 줍니다.

코드 작성이 완료되면 저장하고 에디터로 이동합니다.

에디터로 돌아온 다음에는 Kill UI 오브젝트에 KillUI 컴포넌트를 붙여주고 각 프로퍼티를 할당해줍니다.

그리고 IngameUIManager에 KillUI 오브젝트를 캐싱해줍니다.

작업이 끝나면 게임을 빌드해서 테스트합니다.

임포스터가 크루원을 죽이면 죽은 크루원의 화면에 임포스터가 크루원을 죽이는 UI가 표시되는 모습을 볼 수 있습니다.

죽은 크루원 유령으로 만들기

그 다음 작업은 죽은 플레이어의 캐릭터를 유령 상태로 만드는 것입니다.

AmongUsGamePlayer 프리팹을 찾아서 열어주고 [Ctrl + 6] 단축키를 눌러서 애니메이션 뷰를 열어줍니다.

그리고 Anim_Ghost 애니메이션 클립을 만들고 샘플레이트를 30으로 맞춘 뒤 유령 스프라이트들을 찾아서 타임라인에 올려줍니다.

그 다음에는 애니메이터 뷰를 열어줍니다.

애니메이터 뷰에서는 bool 타입으로 isGhost 파라미터를 만들고 Anim_Ghost 스테이트로 향하는 트랜지션을 만든 뒤 그 트랜지션의 조건으로 isGhost 값이 true일 때 넘어가도록 추가해줍니다.

그 다음에는 스크립트 에디터로 가서 이 isGhost 값을 변경하도록 코드를 작성할 차례입니다.

animator에 접근이 가능해야하기 때문에 CharacterMover 클래스로 이동해서 animator 변수의 접근 권한을 protected로 변경해줍니다.

그 다음에는 IngameCharacterMover의 RpcDead 함수로 이동해서 isGhost 변수를 활성화시키도록 만들어줍니다.

코드를 모두 작성한 다음에는 저장하고 에디터로 이동합니다.

그리고 게임을 빌드한 다음 테스트해보면 임포스터에게 당한 크루원은 유령으로 바뀌는 것을 볼 수 있습니다.

유령 플레이어 투명하게 만들기

하지만 아직 해야할 작업들이 남아있습니다.

먼저 처리할 것은 유령이 된 플레이어가 다른 플레이어들에게 보이지 않게 하는 것입니다.

다만 현재 셰이더에서는 알파 값을 처리할 수 없게 되어있으니 셰이더를 조금 수정하겠습니다.

크루원의 색상을 결정하는 Shader_Crew 셰이더 그래프를 찾아서 엽니다.

Sprite Lit Master 노드 앞에서 PlayerColor 프로퍼티에서 알파 값을 뽑아서 최종 결과물과 한 번 곱한뒤 Sprite Lit Master 노드에 결과 값으로 전해주도록 수정합니다.

셰이더 에셋을 저장하고 에디터를 닫아줍니다.

다시 IngameCharacterMover 스크립트로 이동합니다.

플레이어의 상태에 따라서 셰이더의 색상을 바꿔주어야 하는데 EPlayerType 열거형에 유령 타입을 추가해야 합니다.

여기서는 임포스터 유령과 크루원 유령 타입이 추가되어야 하는데 비교 작업을 쉽게 하기 위해서 비트 연산을 하도록 하겠습니다.

간단하게 이진법에서 첫 자리가 0이면 크루원, 1이면 임포스터입니다.

그리고 두 번째 자리가 0이면 살아있는 플레이어고, 1이면 죽은 플레이어입니다.

이것을 합쳐서 00이면 살아있는 크루원, 01이면 살아있는 임포스터 입니다.

그리고 10이면 죽은 크루원, 11이면 죽은 임포스터로 판단하는 겁니다.

RpcDead 함수로 가서 죽은 캐릭터가 내 것이 아니면서 이 캐릭터를 바라보는 플레이어는 아직 살아있는 상태라면 캐릭터를 투명하게 만들어줘야 합니다.

다만 플레이어의 색상에 개입할 수 있는 spriteRenderer 변수가 private이므로 CharcterMover 클래스로 이동해서 이 변수의 공개수준을 protected로 변경해줍니다.

그리고 닉네임 텍스트도 숨겨줍니다.

코드를 모두 작성한 뒤에는 저장하고 에디터로 돌아갑니다.

그리고 게임을 빌드해서 테스트 해보면 죽임을 당한 크루원은 투명 상태의 유령이 되고 다른 플레이어들 시야에 보이지 않게 되는 것을 볼 수 있습니다.

아웃트로

이번 영상에서는 지난 영상에 이어서 임포스터가 크루원을 죽일 때 죽는 플레이어에게 크루원이 죽임을 당하는 UI가 뜨는 기능과, 죽은 플레이어가 유령으로 바뀌고 투명해지는 기능을 만들어보았습니다.

이상 베르의 게임 개발 유튜브였습니다. 감사합니다.

 

[유니티 어필리에이트 프로그램]

아래의 링크를 통해 에셋을 구매하시거나 유니티를 구독하시면 수익의 일부가 베르에게 수수료로 지급되어 채널의 운영에 도움이 됩니다.

 

에셋스토어

여러분의 작업에 필요한 베스트 에셋을 찾아보세요. 유니티 에셋스토어가 2D, 3D 모델, SDK, 템플릿, 툴 등 여러분의 콘텐츠 제작에 날개를 달아줄 다양한 에셋을 제공합니다.

assetstore.unity.com

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Create 2D & 3D Experiences With Unity's Game Engine | Unity Pro - Unity Store

Unity Pro software is a real-time 3D platform for teams who want to design cross-platform, 2D, 3D, VR, AR & mobile experiences with a full suite of advanced tools.

store.unity.com

[투네이션]

 

-

 

toon.at

[Patreon]

 

WER's GAME DEVELOP CHANNEL님이 Game making class videos 창작 중 | Patreon

WER's GAME DEVELOP CHANNEL의 후원자가 되어보세요. 아티스트와 크리에이터를 위한 세계 최대의 멤버십 플랫폼에서 멤버십 전용 콘텐츠와 체험을 즐길 수 있습니다.

www.patreon.com

[디스코드 채널]

 

Join the 베르의 게임 개발 채널 Discord Server!

Check out the 베르의 게임 개발 채널 community on Discord - hang out with 399 other members and enjoy free voice and text chat.

discord.com

 

반응형

개발단에 가입하여 소소한 혜택과 함께 베르의 게임 개발 유튜브를 지원해주세요!

 

베르의 게임 개발 유튜브

안녕하세요! 여러분들과 함께 게임 개발을 공부하는 베르입니다! 게임 개발에 도움이 되는 강좌들을 올리는 채널입니다! [투네이션 후원] https://toon.at/donate/637735212761460238 [유니티 어필리에이트

www.youtube.com

 

안녕하세요! 여러분들과 함께 게임 개발을 공부하는 베르입니다!

이번에는 임포스터가 크루원을 죽이는 기능을 만들어 보겠습니다!

 

리소스 : https://drive.google.com/file/d/1XB5KINqSiamXRt_HgEHNT9o4cZGBtY9W/view?usp=sharing

 

사용 엔진 버전 : 2019.4

 

타임라인

0:00 인트로

0:11 리소스 임포트

0:19 킬 버튼 만들기

1:44 킬 쿨타임 구현

4:25 킬 범위 구현

6:54 크루원 시체 만들기

8:38 킬 버튼을 누르면 크루원 시체 생성되게 만들기

9:55 아웃트로

 

[유니티 어필리에이트 프로그램]

아래의 링크를 통해 에셋을 구매하시거나 유니티를 구독하시면 수익의 일부가 베르에게 수수료로 지급되어 채널의 운영에 도움이 됩니다.

 

에셋스토어

여러분의 작업에 필요한 베스트 에셋을 찾아보세요. 유니티 에셋스토어가 2D, 3D 모델, SDK, 템플릿, 툴 등 여러분의 콘텐츠 제작에 날개를 달아줄 다양한 에셋을 제공합니다.

assetstore.unity.com

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Create 2D & 3D Experiences With Unity's Game Engine | Unity Pro - Unity Store

Unity Pro software is a real-time 3D platform for teams who want to design cross-platform, 2D, 3D, VR, AR & mobile experiences with a full suite of advanced tools.

store.unity.com

[투네이션]

 

-

 

toon.at

[Patreon]

 

WER's GAME DEVELOP CHANNEL님이 Game making class videos 창작 중 | Patreon

WER's GAME DEVELOP CHANNEL의 후원자가 되어보세요. 아티스트와 크리에이터를 위한 세계 최대의 멤버십 플랫폼에서 멤버십 전용 콘텐츠와 체험을 즐길 수 있습니다.

www.patreon.com

[디스코드 채널]

 

Join the 베르의 게임 개발 채널 Discord Server!

Check out the 베르의 게임 개발 채널 community on Discord - hang out with 399 other members and enjoy free voice and text chat.

discord.com

 

반응형

안녕하세요! 여러분들과 함께 게임 개발을 공부하는 베르입니다!

이번에는 어몽어스 인게임 UI를 만들어 봅시다!

 

사용 엔진 버전 : 2019.4

 

타임라인

0:00 인트로

0:12 리소스 임포트

0:20 UI 배치하기

1:13 임무 목록 UI 만들기

4:17 인게임 설정 UI 만들기

6:14 미니맵 만들기

9:49 아웃트로

 

[유니티 어필리에이트 프로그램]

아래의 링크를 통해 에셋을 구매하시거나 유니티를 구독하시면 수익의 일부가 베르에게 수수료로 지급되어 채널의 운영에 도움이 됩니다.

 

에셋스토어

여러분의 작업에 필요한 베스트 에셋을 찾아보세요. 유니티 에셋스토어가 2D, 3D 모델, SDK, 템플릿, 툴 등 여러분의 콘텐츠 제작에 날개를 달아줄 다양한 에셋을 제공합니다.

assetstore.unity.com

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Create 2D & 3D Experiences With Unity's Game Engine | Unity Pro - Unity Store

Unity Pro software is a real-time 3D platform for teams who want to design cross-platform, 2D, 3D, VR, AR & mobile experiences with a full suite of advanced tools.

store.unity.com

[투네이션]

 

-

 

toon.at

[Patreon]

 

WER's GAME DEVELOP CHANNEL님이 Game making class videos 창작 중 | Patreon

WER's GAME DEVELOP CHANNEL의 후원자가 되어보세요. 아티스트와 크리에이터를 위한 세계 최대의 멤버십 플랫폼에서 멤버십 전용 콘텐츠와 체험을 즐길 수 있습니다.

www.patreon.com

[디스코드 채널]

 

Join the 베르의 게임 개발 채널 Discord Server!

Check out the 베르의 게임 개발 채널 community on Discord - hang out with 399 other members and enjoy free voice and text chat.

discord.com

 

반응형

안녕하세요! 여러분들과 함께 게임 개발을 공부하는 베르입니다!

이번에는 어몽어스에서 사용되는 그림자 효과를 만들어보겠습니다!

 

사용 엔진 버전 : 2019.4

 

타임라인

0:00 인트

0:26 그림자 세팅

2:43 라이트 세팅

4:44 라이트 맵 세팅

8:02 셰이더 만들기

10:41 아웃트로

 

[유니티 어필리에이트 프로그램]

아래의 링크를 통해 에셋을 구매하시거나 유니티를 구독하시면 수익의 일부가 베르에게 수수료로 지급되어 채널의 운영에 도움이 됩니다.

 

에셋스토어

여러분의 작업에 필요한 베스트 에셋을 찾아보세요. 유니티 에셋스토어가 2D, 3D 모델, SDK, 템플릿, 툴 등 여러분의 콘텐츠 제작에 날개를 달아줄 다양한 에셋을 제공합니다.

assetstore.unity.com

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Create 2D & 3D Experiences With Unity's Game Engine | Unity Pro - Unity Store

Unity Pro software is a real-time 3D platform for teams who want to design cross-platform, 2D, 3D, VR, AR & mobile experiences with a full suite of advanced tools.

store.unity.com

[투네이션]

 

-

 

toon.at

[Patreon]

 

WER's GAME DEVELOP CHANNEL님이 Game making class videos 창작 중 | Patreon

WER's GAME DEVELOP CHANNEL의 후원자가 되어보세요. 아티스트와 크리에이터를 위한 세계 최대의 멤버십 플랫폼에서 멤버십 전용 콘텐츠와 체험을 즐길 수 있습니다.

www.patreon.com

[디스코드 채널]

 

Join the 베르의 게임 개발 채널 Discord Server!

Check out the 베르의 게임 개발 채널 community on Discord - hang out with 399 other members and enjoy free voice and text chat.

discord.com

 

반응형

+ Recent posts