본문 바로가기

전체 글41

[Unity] 선을 그리는 UI를 만들어보자 이전 글에서 UI의 모양을 마음대로 변경하는 방법에 대해 알아보았다.[Unity] UI 모양을 내 맘대로 바꿔보자(VertexHelper) (tistory.com) [Unity] UI 모양을 내 맘대로 바꿔보자(VertexHelper)이전에 Mesh를 생성하여 도형을 만들어봤다. [Unity] Mesh를 생성하여 도형 만들기 (tistory.com) [Unity] Mesh를 생성하여 도형 만들기 3D 게임을 만들기 위해서는 다양한 모델링을 활용한다. 이 모델링들은giseung.tistory.com 이를 활용하여 선을 그리는 스크립트를 작성해보았다.일단, 결과물부터 보도록 하자.결과물스크립트구현하다보니 생각보다 많이 길어졌다.using UnityEngine;using UnityEngine.UI;using .. 2024. 4. 28.
[Unity] UI 모양을 내 맘대로 바꿔보자(VertexHelper) 이전에 Mesh를 생성하여 도형을 만들어봤다. [Unity] Mesh를 생성하여 도형 만들기 (tistory.com) [Unity] Mesh를 생성하여 도형 만들기 3D 게임을 만들기 위해서는 다양한 모델링을 활용한다. 이 모델링들은 Mesh 데이터를 통해 형상화하게 되는데, 유니티에서는 Mesh 클래스를 생성해서 원하는 도형을 만들 수 있다. 이번 글에서는 Me giseung.tistory.com 이와 같은 원리로, UI에도 VertexHelper라는 클래스를 활용하여, Canvas에서 사용할 수 있는 원하는 형태의 UI를 만들어낼 수 있다. 자세히 알아보도록 하자. 작성 방법 아래의 코드는 Image 컴포넌트 형태인 사각형을 직접 구현한 것이다. using UnityEngine; using Unity.. 2024. 4. 21.
[Unity] 동적으로 메쉬 병합하기(CombineMeshes) 같은 형태의 3D 모델을 사용하더라도, 메쉬(Mesh)와 머티리얼(Material)의 개수가 적을수록 드로우콜(Draw Call)이 감소한다. 그렇지만, 어쩔 수 없이 많은 메쉬와 머티리얼을 사용하는 경우도 있다. 예를 들어, 블럭을 조립하는 게임을 만든다고 가정해보자. 조립하기 전에는 여러 모델이 분리되어 있기에, 모델의 개수만큼 드로우콜이 늘어날 수 밖에 없다. 그러나, 조립하고 난 뒤에는 하나의 모델로도 충분하다. 유니티에서는 Mesh 클래스에 있는 CombineMeshes 함수로 여러 메쉬를 하나의 메쉬로 병합할 수 있다. 따라서, 같은 머티리얼을 가진 메쉬를 병합한다면, 원래 상태를 그대로 유지하면서 최적화할 수 있다. 그림으로 알아보자. 위 그림는 메쉬 4개, 머티리얼 1개를 사용하여, Bat.. 2024. 3. 4.
[Unity] 커스텀 단축키 만들기 Edit > Shortcuts 탭을 클릭하면, 기본으로 제공하는 단축키들을 확인할 수 있다. 이 외에도, 필요한 함수를 구현하여 단축키로 실행되게끔 할 수도 있다. 이번 글에서는 단축키를 생성해보고, 예시 코드 몇 가지를 살펴보도록 하겠다. 단축키 생성하기 우선 단축키가 에디터의 기능이므로, 예약 폴더인 Editor 폴더 내에 스크립트가 생성되어야 한다. ※ Editor 폴더 내에 있는 에셋들은 빌드 시 포함되지 않는다. 위와 같이 Editor 폴더 내에 스크립트를 생성해준다. ※ 스크립트 이름은 마음대로 해도 된다. 그리고 아래와 같이 예시 코드를 작성한다. #if UNITY_EDITOR //Editor에서만 컴파일 using UnityEngine; using UnityEditor; public cla.. 2024. 1. 11.
[Unity] 자유시점 카메라 구현하기 자유시점 카메라를 간단히 구현해보았다. 여러 상황에서 테스트를 할 때 도움이 될 것이다. 스크립트 using UnityEngine; public class FreeLookCamera : MonoBehaviour { [Header("Component")] public Transform cam; [Header("Move")] [Tooltip("이동속도")] public float moveSpeed = 1f; [Tooltip("전진 키")] public KeyCode forwardKey = KeyCode.W; [Tooltip("후진 키")] public KeyCode backKey = KeyCode.S; [Tooltip("왼쪽 키")] public KeyCode leftKey = KeyCode.A; [Tool.. 2024. 1. 2.
[Unity] 동적 Mesh로 포물선(Parabola) 그리기 이전 글에서 Mesh 클래스로 원하는 대로 도형을 생성할 수 있었다. https://giseung.tistory.com/54 [Unity] Mesh를 생성하여 도형 만들기 3D 게임을 만들기 위해서는 다양한 모델링을 활용한다. 이 모델링들은 Mesh 데이터를 통해 형상화하게 되는데, 유니티에서는 Mesh 클래스를 생성해서 원하는 도형을 만들 수 있다. 이번 글에서는 Me giseung.tistory.com 이를 활용하여, 포물선을 그리는 방법을 소개하겠다. 세부 내용은 뒤로 미루고 결과부터 보여주겠다. 결과.gif 스크립트 using UnityEngine; using System.Collections.Generic; public class MeshParabola : MonoBehaviour { [Head.. 2023. 12. 30.
[Unity] Mesh를 생성하여 도형 만들기 3D 게임을 만들기 위해서는 다양한 모델링을 활용한다. 이 모델링들은 Mesh 데이터를 통해 형상화하게 되는데, 유니티에서는 Mesh 클래스를 생성해서 원하는 도형을 만들 수 있다. 이번 글에서는 Mesh 클래스의 사용법을 이해하고, 스크립트를 작성해서 간단한 도형을 만들어보겠다. 원리 이미 많은 블로그에서 다룬 내용이기도 해서 간단히 설명하겠다. 2차원 공간에서 사각형 모델을 만든다고 가정해보자. 일단, 네 개의 정점(Vertice)을 지정해야 한다. 시계 방향으로 왼쪽 아래부터 오른쪽 아래까지 돌면서 정점 배열을 생성했다고 하자. 그러면, { (-1,-1), (-1,1), (1,1), (1,-1) } 순서로 구성이 된다. 그 다음으로 이 정점들을 이용해서 면을 만들어내야 한다. 면은 기본적으로 삼각형.. 2023. 12. 18.
[Unity] GL로 카메라 페이드 효과 구현하기 화면을 점차 어두워지거나 밝아지게끔 구현하려면 어떤 방법이 있을까? 직접 카메라 오브젝트 앞에 검은색 물체를 가져다 놓는 방법도 있고, Canvas에 검은색 이미지를 두어 알파값을 조절하는 방법도 있을 것이다. 하지만, 위의 방법들은 기능의 비중에 비해 오버헤드가 크다고 볼 수 있다. 유니티에서는 OpenGL이라는 저수준(Low-Level) 그래픽 라이브러리 문법을 일부 지원한다. 이를 활용하면, Camera에 직접 그리기 명령을 호출하여 원하는 대로 도형을 만들어낼 수 있다. 이번 글에서는 이러한 도형으로 카메라 페이드 효과를 구현해보자. 원리 도형의 종류는 Lines(선), Triangles(삼각형), Quads(사각형)가 있다. ※ Strip도 있지만, 여기서는 생략한다. 각 도형의 점 개수만큼 위.. 2023. 10. 5.
[Unity] WebGL 빌드 시 웹 페이지에서 키보드 입력받기 유니티로 WebGL 빌드를 하면, 웹 서버를 통해 콘텐츠를 실행할 수 있다. 그러나, 같은 HTML 페이지에 Input 태그와 같은 키보드 입력을 받는 경우에는 문제가 된다. 유니티 콘텐츠에서 매 프레임마다 모든 키보드 입력을 가로채기 때문이다. 이런 문제가 발생할 때는 아래의 구문을 사용하자. using UnityEngine; public class WebGLInputManager : MonoBehaviour { private void Start() { WebGLInput.captureAllKeyboardInput = false; } } ※ 기본값은 true이다. ※ WebGL Platform에서만 사용할 수 있는 구문이니 참고하자. 2023. 10. 3.
[Unity] 마우스 위치를 UI 요소의 로컬 좌표로 변환하기 RectTransformUtility 클래스의 ScreenPointToLocalPointInRectangle 함수로 쉽게 구할 수 있다. 함수의 구조는 아래와 같다. public static bool ScreenPointToLocalPointInRectangle(RectTransform rect, Vector2 screenPoint, Camera cam, out Vector2 localPoint) Image를 Canvas(1600x900)에 생성한 후, 아래의 코드를 적용하였다. using UnityEngine; public class RTUtil : MonoBehaviour { public RectTransform rt; private void Update() { if (RectTransformUtil.. 2023. 9. 28.
[Unity] 모바일 플랫폼의 터치 입력 처리하기 모바일에서 터치 입력을 처리하는 기본적인 문법들을 알아보도록 하자. 모든 터치 입력 처리는 Input 클래스에서 관여한다. 터치 입력 정보 public static Touch[] touches { get; } public static Touch GetTouch(int index) 터치 입력은 위의 두 가지 방식으로 받을 수 있고, 각 터치의 정보를 담은 Touch 구조체를 반환한다. 만약, Input.touches[0] 나 Input.GetTouch(0) 를 사용했다면, 이는 첫 번째 터치의 정보를 가져온 것이다. ※ Input.touches 가 조금 더 빠르다고 한다. 터치 입력 개수 public static int touchCount { get; } 현재 입력된 터치의 개수를 반환하는 프로퍼티이다. .. 2023. 9. 24.
[Unity] 코드 조각으로 빠르게 코딩하기 - Code Snippet 코딩을 하다보면 반복적으로 작성하게 되는 코드들이 있다. 예를 들어, 반복문을 사용하기 위해 for문을 작성하거나, 디버깅을 위해 Debug 함수를 작성하는 경우 등이 있을 것이다. 이런 코드들을 원하는 방식으로 생성해주는 코드 조각 기능을 알아보자. .snippet 확장자 코드 조각을 생성하는 파일 확장자는 snippet이다. Debug Var1 db1 Debug.Log문을 만들어냅니다. gskim Expansion SurroundsWith var var 위 코드는 Debug.Log 함수로 하나의 변수를 디버깅하는 코드를 생성하는 Snippet의 예시이다. 예를 들어, a 변수를 디버깅하고자 하면, Debug.Log($"a : {a}"); 위 코드가 생성되는 것이다. 아래에서 천천히 분석해보자. Deb.. 2023. 9. 23.
[Unity] FOV(Field of View)에 대해 알아보자 유니티에서 Camera 컴포넌트를 자세히 들여다보면,Field of View 옵션을 확인할 수 있다. 줄여서 FOV라고도 불리는 이것이 어떤 의미를 가지는지 알아보겠다.일반적으로 FOV는 시야각을 정의하는 값인데, 이 값이 커질수록 넓은 범위를 화면에 담을 수 있다.유니티 Camera 컴포넌트에서는 기본값이 60으로 설정되어있고, 수직 시야각(VFOV)을 의미한다.아래의 이미지를 보자.유니티에서는 FOV가 수직 시야각을 의미하기 때문에,화면 세로 크기가 변경되더라도, 위아래 범위가 고정되어물건의 크기가 커졌다 작아지는 것을 볼 수 있다. 일단, 수직 시야각은 FOV 그 자체인 것을 확인했다.그렇다면 수평 시야각(HFOV)은 어떻게 구할 수 있을까? 수평 시야각은 화면 비율에 영향을 받는다.화면 비율은 (.. 2023. 9. 17.
[Unity] Windows 파일 드래그 앤 드롭 구현하기(Drag and Drop) Unity에서 사용자가 파일 경로를 직접 입력해서, 파일 입출력을 해야하는 경우도 종종 있다. 만약, 접근하고자 하는 파일의 개수가 적다면 모르겠지만, 많다면 불편함을 겪게 될 것이다. 이번 글에서는 간단히 파일을 드래그 앤 드롭하는 것만으로도 파일 경로를 가져올 수 있는 방법에 대해 알아보겠다. Script 이번 기능은 직접 구현한 것은 아니고, Bunny83님의 UnityWindowsFileDrag-Drop 레포지토리를 참고했다. https://github.com/Bunny83/UnityWindowsFileDrag-Drop GitHub - Bunny83/UnityWindowsFileDrag-Drop: Adds file drag and drop support for Unity standalong bui.. 2023. 9. 10.
[Unity] TextMeshPro용 상용 한글 2350자 + 영문 + 특수문자 TextMeshPro용 Font Asset을 생성할 때 Custom Character List에 추가할 수 있는 한글 텍스트이다. 요즘은 Unity에서 기본 Text를 Legacy로 분류하여, TMP를 사용할 것을 권장하고 있다. 2023. 9. 3.
[Unity] LeanTween을 활용한 부드러운 전환 효과 만들기 이번 시간에는 LeanTween이라는 아주 유용한 에셋을 소개하도록 하겠다. 소개할 에셋은 무료이므로 걱정하지 말자. 게임을 개발하면서 캐릭터가 이동하는 모듈을 개발한다고 가정하자. 즉시 위치 값을 반영해주는 방법도 있겠지만, 그렇게 되면 이동하는 것이 아니라 순간이동을 한다는 느낌이 든다. 그렇다면, 조금씩 이동하는 것은 어떨까? 아까보다는 이동하는 듯하지만, 등속 운동을 하기에 딱딱한 느낌이 든다. 이번에는 LeanTween을 활용해보자. 가속과 감속이 부드럽게 처리된다. 더 놀라운 점은 코드 한 줄 밖에 적지 않았다는 것이다. 간단히 몇 줄만 더 적으면 아래와 같은 전환 효과들을 줄 수 있다. Asset 설치 Asset Store에 들어가서 LeanTween이라고 검색하면 첫 번째로 나온다. ※ 유.. 2023. 8. 27.
[Unity] 간단히 메모리 변조 방지하기 - 안티 치트(Anti Cheat) 이 글에서 소개하는 내용은 본인의 경험을 토대로 솔루션을 제시하는 것이므로, 실제로 사용하기에 부적절할 수도 있음을 인지하여 주시길 바랍니다. 유니티로 게임을 만들었다고 하더라도 불법 프로그램을 사용하여 데이터를 조작하는 악의적인 사용자는 있다. 만약, 그 데이터가 화폐 또는 능력치 같은 중요한 데이터라면 피해가 매우 크다. 이러한 데이터를 조작하는 예시를 한번 보자. int형의 money 변수가 있다고 해보자. 그렇게 되면 메모리에 1000이라는 숫자가 들어갔을 것이다. 그 메모리 주소를 Cheat Engine이라는 프로그램으로 찾아볼 것이다. 현재는 1000이라는 값을 가진 메모리 주소를 모두 검색했다. 이번에는 950으로 변경하고 검색을 했더니, 이전의 메모리 주소들 중에서 950으로 변경된 값을 .. 2023. 8. 20.
[Unity] GPS 기능으로 위도와 경도 불러오기 유니티에서 제공하는 LocationService 클래스로 간단히 GPS 기능을 구현해보자. 이번 글에서는 사진은 없고, 소스 코드를 위주로 진행해보겠다. 일단, 전체 소스를 먼저 보도록 하자. using UnityEngine; using UnityEngine.Android; //네임스페이스 추가 public class GPSModule : MonoBehaviour { [Header("Setting")] public bool startGPSOnStart; //Start문에서 GPS를 실행할 것인지 여부 public float desiredAccuracyInMeters; //현재 위치로부터의 최대 오차를 지정하는 변수 (정확도) public float updateDistanceInMeters; //특정 거리.. 2023. 8. 20.
[Unity] 안드로이드(Android) 카메라 연동하기 안드로이드의 카메라 화면을 실시간으로 가져와보자. Canvas 설정 먼저, RawImage 컴포넌트를 Canvas 상에 배치해야한다. 이 컴포넌트에 카메라 화면을 담을 것이다. Canvas를 생성하고, 자식으로 RawImage를 생성했다. 이때, Pivot은 따로 건드리지 말자. 나중에 스크립트에서 Width와 Height를 직접 조절할 것이기 때문이다. ※ CanvasScaler의 UI Scale Mode는 Constant Pixel Size로 지정해준다. Script 작성 [Header("Setting")] public Vector2 requestedRatio; //설정하고자 하는 카메라 비율 public int requestedFPS; //설정하고자 하는 프레임 [Header("Component").. 2023. 8. 5.
[Unity] EditorGUI를 활용한 커스텀 에디터 만들기 커스텀 에디터를 제작하면 단순 반복 작업을 일괄처리 할 수도 있고, 필요로 하는 기능을 추가할 수도 있으며, 더 나아가 난잡해진 Inspector 창을 깔끔하게 정리할 수도 있다. public class Inspector : MonoBehaviour { public bool showValue = true; public int val = 100; } 예를 들어 위와 같은 스크립트를 작성하면, 원래 이러한 Inspector 창을 생성하지만, 이렇게 만들 수도 있다는 것이다. 대부분 두 가지로 구현하는데, 첫 번째는 위에서 예시로 든 것과 같이 MonoBehavior를 상속한 클래스의 Inspector를 조작하는 것이고. 두 번째는 Lighting, Project Settings, Preference 및 Pr.. 2023. 4. 25.
[Unity] GameObject의 경로를 반환하는 함수 Hierarchy에서의 경로를 반환하는 함수이다. /* GameObject의 경로를 반환하는 함수 */ public string GetGameObjectPath(GameObject obj) { string path = null; if (obj) //오브젝트가 존재하면 { path = obj.name; while (obj.transform.parent) //부모가 존재하면 { obj = obj.transform.parent.gameObject; path = obj.name + '/' + path; //경로 추가 } } return path; //경로 반환 } 2023. 2. 26.
[Unity] 구글 애드몹 보상형 광고 구현 1) 구글 애드몹 페이지에서 새 앱 설정 2) '광고 형식 선택'에서 리워드 선택 3) 광고 단위 설정 구성 - 게제빈도를 설정하지 않으면 어뷰징으로 의심받을 수도 있다고 한다. 4) https://github.com/googleads/googleads-mobile-unity/releases 에서 .unitypackage 파일 내려받기 5) 이런 창이 뜨면 Enable 클릭하기 6) Resolving Android Dependencies 실행 - Assets/External Dependency Manager/Android Resolver/Force Resolve로 실행할 수 있다. - 에러가 발생한다면 Keystore를 지정 후 재시도하면 된다. 7) Assets/Google Mobile Ads/Sett.. 2023. 1. 17.
[Unity] 구글 플레이 인앱 결제(IAP) 구현 1) 유니티에서 Project Settings/Services/In-App Purchasing를 활성화 - 13세 이하 어린이를 대상으로 하는 경우에는 Yes, 아니면 No 2) Services/In-App Purchasing/Receipt Validation Obfuscator에 라이선스 키 입력 - 수익 창출 설정 탭에서 라이선스 키를 복사할 수 있다. - 입력 후에 Obfuscate Google Play License Key를 클릭한다. - Project Settings/Services/In-App Purchasing 탭에서 라이선스 키를 확인할 수 있다. 3) 유니티 대시보드로 이동하여, 위에서 입력한 라이선스 키를 해당 부분에 입력 4) 인앱 상품 탭에서 '상품 만들기' 버튼을 클릭하고, 모든 .. 2023. 1. 14.
[Unity] 구글 플레이 로그인 구현 1) Player Setting에서 'Package Name', 'IL2CPP', '.NET.4.x', ARM64 체크 2) Publishing Settings에서 Keystore 만들어서 적용 3) https://github.com/playgameservices/play-games-plugin-for-unity 에서 유니티 패키지 설치 - 'current-build' 디렉터리에서 .unitypackage 확장자를 찾을 수 있다. 4) Resolving Android Dependencies 실행 - 패키지 설치 후 자동으로 실행되지 않는다면, Assets/External Dependency Manager/Android Resolver/Force Resolve로 실행할 수 있다. 5) 앱 무결성 탭에서 두.. 2023. 1. 13.
[Git] Git 필수 명령어 모음 Git 버전 확인 : git --version 경로 변경 : cd [경로] Git 초기화 : git init Git 설정 보기 : git config --list Git 사용자 이름 설정 : git config --global user.name "[사용자 이름]" Git 사용자 이메일 설정 : git config --global user.email "[사용자 이메일]" Git 파일 추가 : git add [추가할 파일 및 폴더] Git 파일 추가 확인 : git status Git 커밋 : git commit -m "[커밋명]" Git 커밋 확인 : git log Git 브랜치 변경 : git branch -M [브랜치명] Git 원격 저장소 지정 : git remote add origin [HTML] .. 2022. 12. 16.