게임엔진/Unity

    [Unity] New Input System 키 입력을 스크립트에 전달하여 처리하기

    1. 로직을 제어할 스크립트(script) 부착하기 Player 게임 오브젝트에 키 입력값을 전달받고, 해당 로직을 제어할 스크립트를 만들어서 붙여줬다. 입력이 들어왔을 때, 해당 내용을 전달해주는 방법을 설정할 수 있는 'Behavior' Send Messages, Broadcast Messages : 유니티의 Send Message 기능을 사용하여 특정 함수를 호출하는 방식 Invoke Unity Events, Invoke C Sharp Events : 유니티나 C#의 이벤트 기능을 사용하는 방식 위 방식들을 스크립트에서 사용하기 위해서는 다음과 같은 네임스페이스 적용이 필요 using UnityEngine.InputSystem; Send Messages 기능을 사용할 경우 특정 키가 들어오면, 특정..

    [Unity] New Input System 세팅하기

    게임은 특정 플랫폼 하나만을 겨냥하고 개발하는 경우는 거의 없다. 스케일이 커지게 되면 PC 말고도 모바일, 콘솔 등의 플랫폼도 지원을 해야 할텐데, 그 중에서도, 기존 Unity Input System은 게임 플랫폼 환경 서비스를 추가할 때 골머리를 앓게하는 요소라고 한다. PC에서는 키보드와 마우스, 모바일은 화면 터치, 콘솔에서는 조이스틱을 이용하는 등 플랫폼마다 사용하는 입력 방식이 다르기 때문이다. 즉, 다음과 같이 코드를 짜게 되면 플랫폼 추가 확장할 때 게임 Input System을 수정해야 하는 번거로움이 생긴다. if(Input.GetKey(KeyCode.UpArrow)) // PC에서 다른 플랫폼으로 변경할 때, 번거로움이 생긴다. { ... } 그래서 Unity에서는 2019버전부터 ..

    [Unity] Input Action을 사용해야 하는 이유

    1. 플랫폼 간 제어를 쉽게 만든다. - 키보드, Xbox 컨트롤러, PlayStation 게임패드 등을 통해 동일한 작업을 수행하도록 개발하는 것이 더 수월 - 모든 장치를 일관되고 동기화된 상태로 유지 2. 편집기를 통해 Action Maps, Actions 등을 쉽게 편집할 수 있다. - 또한 현재 사용되는 입력들에 대해 한 눈에 파악할 수 있다. 3. 이벤트로 작동되기 때문에 Update()에서 계속 확인하지 않아도 되어 이산 입력에 최적화된다. - 단 스틱과 같은 연속 입력에는 폴링과 정기적인 업데이트가 여전히 필요 4. 런타임 중에 현재 활성화된 입력을 빠르게 확인할 수 있는 입력 디버거가 내장되어 있다. - 추가 샘플을 설치하면 플레이 하는 동안 화면에 게임패드/기본입력을 직접 시각화 가능 ..

    [Unity] Input Manager (키보드 입력, 마우스 클릭, 조이스틱 등)

    Edit-Project Settings - Input Manager카테고리내에서 확인 가능. Key: 실제 키보드 상의 키, 예) W, Shift, space bar 등 Buttons: 물리적 콘트롤러의 버튼, 예) Xbox One 컨트롤러의 X 버튼 등 Virtual Axis: 매핑되어 있는 버튼이나 키. Axis는 -1~1의 값을 받는다. (중립값은 0). Mouse delta (한 frame내 마우스를 움직인 정도)는 마우스의 움직임 정도에 따라-1보다 작을 수 있으며 1보다 클 수 있다. Input Manager에서 각 Axis의 설정값 설명 구분 설명 Name Axis 이름. 이 이름을 사용해서 Script에서 접근 가능 Negative/Positive Button 키보드의 키, 마우스/조이스틱..

    [Unity] 애니메이션 내 추가 버튼이 비활성화인 이유

    Add Property가 비활성화 되있는데 이는 대상 오브젝트를 선택 안했기 때문이다. 클릭하면 활성화 되는 모습

    [Unity] 타일맵에 콜라이더(충돌체) 추가하기

    플랫폼 게임을 만드는데 노란 공이 떨어져서 바닥에 닿으면 튕기게 만들고 싶다고 가정해보자. 노란 공에 물리효과를 주기 위해서 Circle Collider 2D 컴포넌트와 Rigidbody 2D 컴포넌트를 부착해주었다. 그리고 꽤 그럴듯하게 공처럼 튀기게 만들기 위해서 물리 머티리얼(Physics Material)까지 넣어주었다. 하지만 타일맵에 물리적인 컴포넌트가 아무것도 없는 상태이기 때문에 플레이를 시작하면 떨어지는 공은 타일맵을 그냥 통과해버린다. 타일맵 콜라이더 2D 컴포넌트(Tilemap Collider 2D Component) 이전 섹션을 진행해왔다면 하이어라키 뷰에 존재하는 타일맵은 게임 오브젝트하나로 존재하기 때문에 어떻게 콜라이더를 배치해야할지 난감할 수도 있다. 타일맵을 위한 콜라이더를..

    [Unity] 2D 게임의 기본 타일맵!

    예전에 RPG메이커를 사용했을 때는 맵이 타일(Tile) 방식으로 이루어져 있어서 타일 팔레트를 가져와서 마치 그림 그리듯이 원하는 타일을 칠해주는 방식으로 맵을 만들 수 있었다. 유니티 엔진을 처음 배웠던 5 버전에서는 이러한 기능이 없어서 2D 맵 오브젝트를 직접 배치하거나 타일맵 기능을 직접 구현해야만 했었다. 하지만 유니티 2017.2 버전에서부터 타일맵 기능이 유니티에도 추가되었다. 맵오브젝트를 배치할 필요없이 그림 그리듯이 맵을 만들 수 있다는 것은 굉장한 장점이다. 샘플용 간단한 타일맵 이미지를 다운받은 뒤, 타일맵의 사용법에 대해서 알아보자. 구글에서 적당한 리소스를 다운받아서 사용해도 좋다. 타일 팔레트(Tile Palette) 만들기 타일맵을 씬에 배치하기 이전에 먼저 타일맵을 색칠할 ..

    [Unity] (Rule Tile)룰 타일로 타일맵 자동 연결하기

    타일의 자동 연결은 어떻게? 같은 타일을 놓으면 오른쪽 십자가처럼 자동으로 연결되기를 바랄 수 있다. 하지만 유니티 타일맵 기본 기능 만으로는 같은 타일을 옆에 놓아봤자 왼쪽 십자가처럼 끊어진 십자가만 놓아지고 오른쪽 십자가처럼 만들려면 직접 일일이 배치를 해야한다. 유니티 2D 엑스트라(Unity 2D Extra) 타일을 자동으로 연결해주는 기능은 기본 타일맵에서는 제공하지 않고, 유니티 테크놀러지에서 만들어서 깃허브에 올려둔 별도의 기능인 2D 엑스트라를 임포트해서 사용해야 한다(링크에서 2D Extra를 다운로드 받으면 된다). 그리고 다운로드 받은 파일의 압축을 풀고 2d-extra-master 폴더를 프로젝트 뷰의 Assets 폴더 안에 넣어주면 된다. 룰 타일(Rule Tile) 유니티에서 같..

    [Unity] 이벤트 함수는 어떻게 실행되는 것일까?

    유니티엔진에서 ‘스크립트’를 작성한다고 하면, 보통 MonoBahaviour를 상속받는 클래스의 스크립트를 작성하는 것을 떠올릴 것이다. 그리고 자연스럽게 이 클래스 내에 Awake(), Start(), Update() 등의 메소드를 작성하게 된다. 심지어 비주얼 스튜디오 같은 개발 환경에서는 이런 메소드들에 대해 자동 완성도 해주고, 메소드 위에는 Unity 메시지라는 글자도 띄워준다. 이런 메소드들은 ‘Unity Event Function’, ‘Unity Message’ 또는 ‘Magic Method’라고 불린다. 그런데 생각해보면 이 메소드들은 MonoBehaviour 또는 그 부모 클래스로부터 상속받은 메소드도 아닌데, 어떻게 유니티가 알아서 찾아 적절한 타이밍에 호출해줄 수 있는 걸까? Send..

    [Unity] 강체 관련 Rigidbody / AddForce / AddTorque

    Rigidbody Rigidbody(강체)는 gameObject가 유니티 물리 엔진에 제어 받게 한다. 한마디로 힘과 질량을 갖고 움직일 수 있도록 하는 것이다. Mass : 오브젝트의 질량 Drag : 오브젝트가 받는 공기 저항 값 Angular Drag : 오브젝트가 토크로 회전 시 받는 공기 저항 값 Use Gravity : 중력의 영향 유무 Is Kinematic : 활성화 시 물리엔진의 제어없이 Transform으로만 조작됨 Interpolate : 오브젝트의 움직임 부드러움 옵션 처리 Collision Dectection : 오브젝트 충돌 감지 / 감지 옵션 처리 Constraints : 오브젝트의 움직임 고정 위는 대표적인 rigidbody의 프로퍼티이다. Unity Documentation..