![thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgHohW%2FbtrREWYNEhd%2FAU3kpPXkKtBy2kxH79TeYK%2Fimg.png)
[Unity] Mixamo 캐릭터 Import 시 Material 하얗게 나오는 현상
2022. 11. 19. 17:54
Unity
유튜브에서 어떤 튜토리얼을 따라 하다가, 모델이 필요하여 Mixamo를 방문하게 되었다. Adobe에서 무료로 캐릭터 모델과 애니메이션을 제공해 주는 감사한 사이트이다. https://www.mixamo.com/ Mixamo www.mixamo.com 내가 고른 것은 이 AMY라는 귀여운 캐릭터! 딱딱한 프로토타입 모델들보다는 색깔도 귀여운 이 친구를 써 보고 싶었다. 우측 다운로드를 누르고, FBX for Unity를 선택해 준다. 다운로드된 파일을 Asset 폴더에 끌어와서, Scene에 추가해 줬는데... Mixamo 사이트에서 보던 Material이 어디로 사라진 건지 하얀 모델만 보이고 있었다. 같이 import된 Material 파일도 하얀색으로만 보여서... 몹시 당황스러웠다. ㅠㅠ 컬러가 ..
![thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzgZfQ%2FbtrK5DkM1se%2FcAvDUk331oc2jyvnArTIZ1%2Fimg.gif)
[Unity/UniRx] UniRx의 간단한 샘플 - 2. Where 및 Select
2022. 8. 31. 18:50
Unity/UniRx
첫 필터 메소드 IObservable은 IEnumerable와 쌍이 되어 있으니까, LINQ의 Where을 사용할 수 있다. ⇒ 이벤트에 대해 다루고 있는데 웬 LINQ? IObservable/IObserver인터페이스의 수행 자체가 IEnumerable/IEnumerator인터페이스를 반전시켜 만들어진 것이기 때문이다. ⇒ ?! LINQ를 통해, 실제로 푸시되는 값에 관해서 여러가지 할 수 있다는 이야기이다. '반전'과 관련해서는 나중에 확실히 이해할 수 있다. 우선 신경 쓰지 말고 넘어가자! 준비 using UnityEngine; public class Base : MonoBehaviour { public void Move (float dx,float dy) { gameObject.transform...
![thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgRmsU%2FbtrKZovdkXg%2F7mMNVb7RHHYtTxEGItJWT0%2Fimg.png)
[Unity/UniRx] UniRx의 간단한 샘플 - 1. UniRx와 Subscribe
2022. 8. 30. 22:18
Unity/UniRx
UniRx? Reactive Extensions C#용 비동기 처리를 위한 라이브러리 디자인 패턴 중 하나인 Observer 패턴을 기반으로 설계되어 있음 시간에 관한 처리, 실행 타이밍이 중요한 곳에서 쉽게 작성할 수 있도록 되어 있음 완성도가 높고, Java, JavaScript, Swift 등 다양한 언어로 포팅되어 있음 UniRx Reactive Extensions for Unity Unity C#에 최적화되어 있음 Unity 개발에 유용한 기능이나 Operator가 추가적으로 구현되어 있음 ReactiveProperty 등이 추가되어 있음 철저하게 성능 튜닝이 진행되어서 원래 .Net Rx보다 메모리 퍼포먼스가 좋음 Subscribe Rx란? C# : 다기능 event web: 다기능 jQuer..
![thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FefRJHR%2FbtqLeqHzCgS%2FcDEAgz8NJDfhmGbIqSDD11%2Fimg.png)
[Unity Project] Moongazer - 8일차 (完)
2020. 10. 20. 17:17
프로젝트/Moongazer (Unity RPG)
오늘 한 작업 디버깅 드래곤 사운드 조절 인벤토리 구현 포션 사용 상점 구현 파이어볼 충돌 수정 구현 중 막힌 것 JSON 인코딩 타입이 한국어로 되어 있어서 글자 깨짐 현상이 발생했다. 다른 이름으로 저장할 때 인코딩을 유니코드로 지정하니까 정상적으로 동작했다. 아이템을 클릭하면 정보를 볼 수 있게끔 구현하고 싶었다. 나의 경우에는 현재 인벤토리와 서브 아이템이 분리되어 있기 때문에 인벤토리 좌측 상단에 아이템 정보가 뜨는 방식으로 결정했다. 앱으로 테스트해 보고, 버그 있으면 후딱 수정해서 얼른 영상 따야겠다! 😃 +) www.youtube.com/watch?v=mTBuRThR8pA
![thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbs3YC4%2FbtqLlBUTcMp%2FgaXKVu6ZJG6xapGgTkAWV1%2Fimg.png)
[Unity Project] Moongazer - 7일차
2020. 10. 20. 01:06
프로젝트/Moongazer (Unity RPG)
오늘 한 작업 필드 씬 레벨 디자인 던전 씬 레벨 디자인 플레이어 스탯 JSON 연동 플레이어 인벤토리 JSON 연동 퀘스트 오류 수정 보스 및 스켈레톤 오류 수정 로딩 씬 안 보이는 오류 수정 내일 목표 3타 딜 안 들어가는 오류 수정 드래곤 사운드 체크(어긋나는 게 있었던 것 같음) 인벤토리 구현 마무리 상점 구현 드래곤 파이어볼 충돌 수정 구현 중 막힌 것 처음에 레벨 디자인이 너무 귀찮아서 그냥 애셋에 있는 샘플 씬을 사용했더니 모바일 환경에 맞지 않았고, 최적화를 해도 프레임 드랍 현상이 너무 심했다. 그래서 필드 씬과 던전 씬을 각각 구현해 봤다. 최적화하는 김에 Batch도 사용해 보았다. JSON은 유니티에서 처음 사용해 봤던 것이라서 좀 헤맸었다. 또한 어느 시점에서 해당 파일을 읽어 와..
![thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8SIO1%2FbtqKIo2W5c4%2Ftblcfn0KXG3FdFIPWT4461%2Fimg.png)
[Unity Project] Moongazer - ~6일차
2020. 10. 12. 11:52
프로젝트/Moongazer (Unity RPG)
그동안 한 것 youtu.be/FPoed32ImIc 에너미 보스 플레이어 스킬 구현 충돌처리 NPC 퀘스트 다이얼로그 인벤토리 간단한 퍼즐 사운드 및 이펙트 와... 너무 급하게 치느라 포스팅을 하나도 못 했다... 심지어 커밋도 못 했다. 진짜 일어나서 밥 먹고, 코딩하고, 밥 먹고 잤다. 이런 생활 처음 해 보는 것 같다. 학교 시험 기간에도 이렇게는 안 했다. 학원 일정 때문에 2주짜리를 급하게 일주일만에 끝내려니까 빠진 기능도 많고, 코드를 너무 막 짠 게 아닌가 싶은 생각이 든다... 코드로 해결하고 싶었는데, 급하게 만들다 보니까 하이어라키에 점점 뭐가 많아지고 직렬화 남발했다. 마음에 안 든다. 😒 그리고 영상 찍으려니까 갑자기 보스 충돌처리가 안 돼서 ㅋㅋㅋ 학원 가기 두 시간 전인데 갑자..
![thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcsTq4z%2FbtqKhk1gRCd%2F9mhIyNJ8bPhSYXkVuK9Dk1%2Fimg.png)
[Unity Project] Moongazer - 2일차
2020. 10. 7. 01:32
프로젝트/Moongazer (Unity RPG)
오늘 한 작업 UI 프로토타입 완료 플레이어 콤보 공격 구현 bool 변수 하나를 추가해서 플레이어 콤보 기능을 구현했다. 공격 시 시간을 저장하고, 일정 길이 범위 안일 경우 콤보 공격을 진행한다. 공격을 진행할 때마다 코루틴 함수를 멈췄다가 다시 호출함으로써 시간 카운트를 진행하였다. 1.4초 안에 유효한 입력이 들어오지 않으면 콤보가 끊긴다. public void StartAttack() { isAttacking = true; if (State != Define.State.Attack) { State = Define.State.Attack; AttackType = PlayerAttack.None; _time = Time.fixedTime; } else if (AttackType 0.35f || At..
![thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqNW0w%2FbtqJ93sOsee%2F1QqLKJVWnvarA1qKKgDfs0%2Fimg.png)
[Unity Project] Moongazer - 1일차
2020. 10. 6. 02:06
프로젝트/Moongazer (Unity RPG)
애셋 문제도 있고, 딱히 모작하고 싶은 작품이 안 보여서 퍼즐 기능이 있는 자작 RPG 게임을 만들어 보기로 했다. UI는 애셋에 있는 프리팹을 기반으로 하되, 기본적인 구조와 배치된 오브젝트 구조만 이용하고 스크립트는 직접 붙이려고 한다. 레벨도 직접 만들어 보고 싶었는데, 생각보다 시간이 많이 들 것 같아서 애셋에 있는 데모 씬을 그대로 이용하려고 한다. UI와 플레이어, 에너미 기능이 얼추 완성된다면 테스트 씬을 지우고 옮겨서 배치해 보려고 한다. 오늘은 급하게 진행하느라 진행 중 메모를 따로 적지 못했다... 내일부터는 스크린샷도 찍으며 차근차근 기록하면서 작업해 보려고 한다. 💪 오늘 한 작업 조이스틱으로 캐릭터 움직이기 UI 배치 및 생성하기 팝업 UI는 X 버튼 누르거나 화면 바깥 터치하면 ..
![thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAPCRS%2FbtqJWSc2SWM%2FEbfxoiFKwComQdDCsQGEKk%2Fimg.png)
[TIL] 2020-10-01
2020. 10. 1. 21:14
TIL(Today I Learned)
게임 제작 : 어메이징 볼링 Tag: 일반적인 경우, 1:1 비교 / Layer: 물리 관련, 필터링 여러 개 가능 Physics.OverlapSphere(Vector3 위치, float 반지름): 가상의 Sphere를 그려서 겹치는 Collider 배열을 반환해 준다. 오브젝트들이 랜덤으로 생성될 수 있는 범위를 Box Collider로 지정한다. Camera - Projection Perspective: 한 소실점으로 모인다. 멀리 있는 건 작게, 가까이 있는 건 크게 보인다. Orthographic: 원근감이 없다. Property: 변수처럼 사용할 수 있지만, 내부에서는 함수로 작동한다. ref 키워드: 함수 안에서 변경된 값을 그대로 들고 나온다. Update(): 화면이 갱신될 때마다 호출된다..
[TIL] 2020-09-30
2020. 9. 30. 23:41
TIL(Today I Learned)
평행이동과 좌표계 transform.Translate()는 기본적으로 Local space를 기준으로 움직인다. 단, 함수 옵션으로 Space.Self(Local), Space.World(World)를 넣어 기준점을 지정할 수 있다. Inspector view의 transform은 부모의 상대 좌표를 기준으로 한다. 상대적인 기준이 될 부모 오브젝트가 존재하지 않는 오브젝트는 월드 좌표를 기준으로 한다. transform.position은 Global space 기준 좌표, transform.localPosition은 Local space 기준 좌표이다. rotation, scale 또한 Rotation/localRotation, lossyScale/localScale이 존재한다. 회전과 쿼터니언 Qua..
![thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSOJa2%2FbtqJP6J7zKW%2F18yWU5uQrtvR2C2KPgGMK0%2Fimg.png)
[TIL] 2020-09-29
2020. 9. 29. 23:18
TIL(Today I Learned)
게임 제작 : 소코반(창고지기) Material: Shader + Texture Albedo: 기본 색상 Smoothness: 물체의 표현이 반들반들한 정도 Input.GetAxis("Horizontal") Input.GetAxis - 직접 키가 연결돼 있는 게 아니라, 이름을 찾아가서 맵핑되어 있는 키를 가져온다. Input Manager는 조이스틱을 지원하기 때문에 float형으로 값을 처리한다. Rigidbody.AddForce - 힘이 주어지고, 해당 힘을 내부에서 계산해서 관성이 적용된다. Rigidbody.velocity - 바로 속도를 컨트롤할 수 있다. Time.deltaTime: 화면이 한 번 깜빡이는 시간 = 한 프레임의 시간 youtu.be/uZA1z90x1Eg
[TIL] 2020-09-28
2020. 9. 28. 23:26
TIL(Today I Learned)
메시지와 브로드캐스팅 MonoBehaviour 1. 컴포넌트로써 게임 오브젝트에게 추가될 수 있다. 2. 유니티의 통제를 받는다. 3. 유니티 이벤트 메시지를 감지할 수 있게 된다. 유니티 엔진은 컴포넌트의 초기화 메소드 등... 메시지에 담아서 브로드캐스팅한다. 메시지 1. 보내는 쪽은 누가 받는지 신경 쓰지 않는다. 2. 받는 쪽은 누가 보냈는지 신경 쓰지 않는다. 3. 메시지에 명시된 기능을 가지고 있으면 실행, 없으면 무시한다. 브로드캐스팅: 메시지를 무차별적으로 많이 보내는 것 => 복잡한 참조 관계를 끊고 라이프 사이클을 스스로 관리할 수 있게 한다.
![thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcg4sNw%2FbtqJKwU1WiF%2F7ltAjChuWcekgK0vB6Cff1%2Fimg.png)
[TIL] 2020-09-27
2020. 9. 27. 23:24
TIL(Today I Learned)
미니 RPG tag를 사용하면 오브젝트를 손쉽게 찾을 수 있다. magnitude를 사용할 경우, 루트 값을 적용하기 때문에 조금 느릴 수 있다. 따라서 성능 최적화를 하고 싶다면 sqrMagnitude를 이용해서 제곱값을 가지고 처리한다. float distance = (player.transform.position - transform.position).magnitude; float distanceSqr = (player.transform.position - transform.position).sqrMagnitude; 아직 참조 중이기 때문에 메모리에서 날라가지는 않았지만, null 체크 시 null로 인식하게끔 강제로 변경한다. 연산자 오버로딩 => Object 클래스에 존재한다. GameObjec..
![thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxNqC2%2FbtqJxHRGhxN%2F0CVDHnx3TOaGitHa62enK0%2Fimg.gif)
[TIL] 2020-09-25
2020. 9. 25. 23:40
TIL(Today I Learned)
미니 RPG 커서를 사용하는 법 1. Texture Type이 Sprite인 경우, 일반 UI처럼 직접 관리하는 방법 2. Texture Type을 Cursor로 설정하는 방법 Cursor.SetCursor(사용할 Texture2D, 마우스 기준점 Vector2, CursorMode) CursorMode.Auto: 해당 플랫폼에 맞춰서 CursorMode.ForceSoftware: 소프트웨어용 커서 Ctrl + m + o: 전체 블록 닫기 Ctrl + m + l: 전체 블록 열기 상태 머신보다 코드에서 직접 컨트롤하는 경우가 좋을 때가 있다. Play를 이용해도 되지만, 자연스럽게 전환되길 원한다면 => Animation.CrossFade docs.unity3d.com/kr/530/ScriptRefere..
![thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbumK4P%2FbtqJluSA1Kt%2Fbf5twYdcHfGYrX9mdm3aS1%2Fimg.png)
[TIL] 2020-09-24
2020. 9. 24. 23:09
TIL(Today I Learned)
미니 RPG Light Map Directional Light: 아주 멀리 있으면서 한쪽 방향으로 빛을 쏴 주는 태양 같은 조명이다. "어느 방향"으로 쏘고 있는지가 중요하다. Point Light: "전구" 같은 느낌으로 특정 범위 안에서 빛을 쏴 주는 조명이다. 횃불 등에 사용한다. Spot Light Light - Mode Realtime: 실시간으로 빛을 연산하겠다. => 어마어마한 부하가 일어난다. Mixed: Realtime과 Baked를 반반 섞어서 사용하겠다. Baked: 계산된 파일을 이용해서 빛을 적용하겠다. 움직이는 물체만 연산 처리한다. Inspector창의 Static을 체크하면 해당 오브젝트가 움직이지 않는다고 가정한다. 1. Collider가 있기 때문에, 두 Collider가..
![thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FldsFH%2FbtqJikvTlS7%2FR1YiSObYUnksYHfFriFzw1%2Fimg.png)
[TIL] 2020-09-23
2020. 9. 24. 03:03
TIL(Today I Learned)
Coroutine 길 찾기 등 오래 걸리는 로직이라면 여러 프레임에 거쳐서 처리하는 게 나을 수도 있다. 함수를 일시정지를 했다가 다음 Tick에 해당 작업을 이어서 수행할 수 있게끔 한다. class CoroutineTest : IEnumerable { public IEnumerator GetEnumerator() { yield return 1; yield return 2; yield return 3; yield return 4; } } protected override void Init() { base.Init(); SceneType = Define.Scene.Game; Managers.UI.ShowSceneUI(); CoroutineTest test = new CoroutineTest(); fore..
[TIL] 2020-09-22
2020. 9. 23. 03:38
TIL(Today I Learned)
Object Pooling Pooling할 Object / Pooling하지 않을 Object를 Poolable Component로 구분한다. Pool Manager는 Resource Manager를 보조하는 개념으로써, 기존 Resource Manager의 문제점을 개선해야 한다. public GameObject Instantiate(string path, Transform parent = null) { // 1. original 이미 들고 있으면 바로 사용 GameObject prefab = Load($"Prefabs/{path}"); if (prefab == null) { Debug.Log($"Failed to load prefab: {path}"); return null; } // 2. 혹시 po..
![thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbz7eN5%2FbtqI7w3ta09%2Fsb3xMJDz9oKXZJYDGHmKI0%2Fimg.png)
[TIL] 2020-09-21
2020. 9. 22. 02:57
TIL(Today I Learned)
Scene Manager Scene에서 Scene으로 넘어가려면 Scene 등록을 거쳐야 한다. LoadSceneAsync(): LoadScene을 해 버리면 현재 Scene의 내용을 다 날리고, 다음 Scene을 Load 처리할 텐데, 만약 GameScene의 규모가 큰 경우 한참 기다려야 할 수 있다. Sound Manager MP3 Player => AudioSource MP3 음원 => AudioClip 관객(귀) => AudioListener Audio Listener는 기본적으로 Scene의 메인 카메라에 설정되어 있다. AudioSource의 PlayOneShot()을 이용하면 해당 Audio Clip을 플레이한다. 두세 개가 겹쳐도 그냥 플레이된다. 단, 실행 중 GameObject를 De..