NC의 신작 퍼즐게임인 가 9월 26일 출시되었습니다! 모바일 3-match 퍼즐 게임이고, 이틀 동안 천천히 플레이해서 현재까지 나와있는 모든 레벨을 플레이해봤습니다! 일반 난이도는 중하 정도이고, 어려움/매우 어려움 단계는 중상 정도 되는 것 같아요! 현재까지 총 400개의 레벨이 있고, 저는 글로벌 랭킹 12위로 모두 플레이 완료했습니다! 그리고 출시 이후 클랜전이나 운명의 탑같은 추가 콘텐츠가 적용될 예정이라고 알고 있습니다. 클랜, 공성에 자신 있는 NC가 퍼즐 게임에서는 어떻게 잘 녹여낼 지 매우 궁금하기도 하네요! 몇 가지 아쉬운 점은, 아쉬운 점은 어려움과 매우 어려움 단계 사이의 격차를 좀 더 뒀으면 더 좋았을 것 같고, 게임을 급하게 낸 것 같다는 느낌이 듭니다..ㅠ 클랜전과 같은 콘텐..
INTRO VR 전시 프로젝트를 진행하면서 5분 동안 유저의 이동이 없을 때 시작 Scene으로 이동하는 기능을 개발하게 되었다. 기존 Input System을 이용한다면 UnityEngine 내부에 있는 Input.anyKeyDown을 이용하면 간단히 구현할 수 있지만, XR Interaction Toolkit Package를 사용하면서 새로운 Input System에 대해서는 작동하지 않았다. 그래서 transform.position과 Coroutine을 이용하여 Input System없이 간단하게 구현해보았다. CONTENT 먼저, TimeSceneChagne.cs의 전체 코드는 아래와 같다. using System.Collections; using System.Collections.Generic;..
UnityEngine 내 Color를 사용할 때 주의해야할 점이 있다. 드로잉 월드를 제작하면서 로컬이 색깔을 선택하고 서버로 보낼 때, 선택한 색깔의 r,g,b,a 값을 number로 보냈다. 서버에서는 받은 data를 로컬을 제외한 다른 플레이어에게 보내며, 데이터를 받은 다른 플레이어들은 Color을 아래와 같이 설정했었다. Connector.Instance.DrawStartRes = (data: { sessionId: string; lineWidth: number; color_r: number; color_g: number; color_b: number; color_a: number; }) => { const line = Manager.Resource.Instantiate("Prefabs\\Lin..
유니티에서 옵저버 패턴을 사용하여 프로그래밍한 것은 매우 중요한데, 만약 두 개의 컴포넌트가 서로의 정보(변수, 메서드 등)를 공유해야하는 상황에서 서로 결합(tightly-coupled)되어있다면, 서로가 영향을 미치기에 하나의 컴포넌트를 수정하면 다른 컴포넌트에서 에러가 발생하기에 수정에 불리하다. 이는 객체지향 원칙에 걸맞지 않는 상황인 것이다. 디자인 패턴 중 옵저버 패턴(Observer Pattern)은 시스템을 확장성(Scalable), 유지성(Maintainable), 비결합성(Loosely-coupled) 모두를 충족하게 만들어준다. OOP 코드를 작성할 때, 비결합(Decoupled)으로 코드를 작성해야 에러가 날 확률도 적고 모듈화하기도 쉬우며, 디버깅하기도 쉽다. 아래 코드는 싱글톤 ..
INTRO Unity AI Navigation을 이용하여 플레이어를 추적하는 몬스터 시스템을 Tag를 이용하여 구현하던 도중, 동일한 Tag의 플레이어가 다수일 경우 몬스터는 어떤 플레이어를 우선순위로 따라갈지 궁금해졌다. 여러 테스트를 통해 우선순위 기준이 Tag라는 시스템에 있었다는 것을 알았고, 그 과정에 대해 적어보려고 한다. CONTENT 우선 몬스터 Control에 대한 기본적인 코드를 첨부하면 아래와 같다. using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.AI; public class MonsterCtrl : MonoBehaviour { private Transform..
INTRO Unity3D를 학습하다보면 이동(Translate)과 회전(Rotation)을 배우게 되는데, 이 때 보간법(Interpolation)을 배우게 된다. 원하는 시작 지점과 끝 지점 사이에 원하는 함수를 사용하여 함숫값이나 근삿값을 구하는 방법이다. 가장 기초적으로 배우는 보간법은 바로 선형 보간법(Linear Interpolation), Lerp이다. 말 그대로 선형, 직선 함수를 사용하여 두 지점 사이에 함숫값을 구하는 보간법인데, 실제로 유니티에서 구현하다보면 선형으로 변하는게 아닌 곡선으로 값이 나올 때가 있다. 의도적으로 그런 효과를 원한다면 괜찮겠지만, 선형(직선) 보간법을 사용한만큼 선형적으로 변해야만 정확하게 사용한 것이다. 언제 그렇고, 어떻게 코드를 작성하면 그런지, 그리고 ..
Base Equippable Actor Class : Implement functionality inside the base equippable actor that you want all equippable items to inherit. - Equip/Unequip functionality - Attach functionality 즉, 장착/미장착 여부와 장착 시 손에 붙이는 가장 베이스 역할을 한다. 아래 클래스들은 이 클래스를 상속받아서 실행한다. Base Weapon Actor Class : Inherits functionality of base equippable so that the functionality can be accessed or overriden. Implement function..
INTRO 언리얼 엔진 5의 Lighting을 학습하던 중 학습하면서, 이전 버전의 언리얼 엔진에서 사용한 Lighting과 Lumen을 비교하여 어떤 장단점이 있는 지 알아보았다. 그 전에 Lumen에 대하여 간단히 살펴보자면, 언리얼 엔진의 Global Illumination과 Reflection에서 추가된 기술로, 미리 Light을 Bake하여 Lightmap을 이용하는 방식이 아닌, Fully Dynamic Realtime Lighting 시스템이다. GPU 연산을 줄이기 위해, 대부분 Static Light로 사용할 수 밖에 없었던 이전과는 다르게 이제는 빛이 움직여도 실시간으로 랜더링되며 이전보다 퀄리티도 좋아지고 연산량도 줄어들게 되었다. 위와 관련된 내용을 직접 UE5의 Level에서 세팅..
Skeletal Mesh와 Static Mesh를 Output으로 Return하려할 때는 반드시 Component를 Primitive Component로 설정해야한다. USkeletalMeshComponent와 UStaticMeshComponent가 모두 UPrimitiveComponent를 상속받은 SubClass Component기 때문이다.
유니티든 언리얼이든 기본 애니메이션에 추가 애니메이션을 사용할 때 Blend를 사용하지 않으면 자연스럽지 못한 출력을 얻게 된다. 예를 들어, 플레이어가 움직이면서 동시에 무기를 꺼낸다면 하체의 다리는 계속 걷고 있어야하며, 상체는 칼을 꺼내고 있어야한다. 각각의 애니메이션은 Walk / DrawWeapon으로 분리되어있지만 동시에 실행돼야하므로 Blend를 사용하여 상하체가 동시에 두 개의 애니메이션을 사용하도록 설정해야한다. 언리얼 엔진5에서, 플레이어가 이동하면서 무기를 꺼낼 때/넣을 때 Animation Blend를 사용하지 않고 Main States를 Default Slot 그대로 출력하게 된다면, 마찬가지로 무기꺼내는 애니메이션을 취하면서 움직이기에 매우 어색한 연출을 얻게 된다. 언리얼에서는..