코드 및 공부 56

깃허브 데스크탑에서 External editor가 Visual Studio로 안 열릴 때

유니티 버전 - 2022.3.17f1     목차문제 상황Visual Studio 세팅윈도우 환경설정 세팅GitHub Deskoop 세팅     문제 상황유니티에서 스크립트를 작성할때 라이더를 사용중인데, Open with default program을 눌렀을때 라이더가 아닌 비주얼 스튜디오가 나왔으면하는 상황 완전히 근본적인 해결법은 아니기에 모두 읽어보고 하시는 것을 추천드립니다     Visual Studio 세팅1. Visual Studio Installer 실행 2. 현재 설치된 Visual Studio Community 2022 우측의 수정 클릭 3. 개별 구성 요소에 git 입력 후 Git for Windows 선택 후 우측 하단의 수정 클릭  4. 설치 완료 후 빨간 박스를 눌러 실행   ..

인벤토리 슬롯 저장/로드시 간헐적으로 아이템이 사라지는 현상

유니티 버전 - 2022.3.17f1     목차문제상황InstanceID해결법마치며     문제상황데이터 저장 / 로드시 인벤토리의 아이템 일부가 삭제되어있거나 다른 아이템이 들어있는 상황   현재 저장시에 Slot[]의 형태로 저장되어지고있음   Slot의 구조입니다, ItemSo와 itemCount는 필수로 존재해야합니다   또 ItemSO에는 ItemCode가 필수로 존재해야합니다      InstanceIDJson파일을 열어보았을때 저장된 Slot[i] 번째에 instanceID가 저장되어있습니다{ "itemSo": { "instanceID": 123456 }, "itemCount": 5}// 위와 비슷하게 나옴   여기서 문제가 발생합니다, instanceID는 유니티의 특정 상태(런타임 ..

스팀웍스 등록 후 메일로 Action Required가 왔을 때 보내야 할 서류

유니티 버전 - 2022.3.17f1     목차Action Required: Important Tax Information 이하에 더 써있는 경우Action Required: Important Tax Information 이하가 비어있는 경우     Action Required: Important Tax Information 이하에 더 써있는 경우 - 2024.12.16 기준메일함에서 링크를 클릭하여 들어가줍니다그리고 여권 사진 + 여권 손으로 들고 셀카 한장을 찍어 업로드해주면 됩니다       Action Required: Important Tax Information 이하가 비어있는 경우 - 2024.12.16 기준메일함에서 링크를 클릭하여 들어가줍니다그리고 주민등록표 등본(영문)을 업로드해줍니다..

유니티 조합 시스템 - 슬롯 이용

유니티 버전 - 2022.3.17f1     목차전재 조건과 목표코드 및 설명     전재 조건해당 기능을 이용하여 슬롯에 퍼져있는 아이템들을 정렬하고, 필요한 개수만큼 슬롯 아이템의 개수를 감소시킨뒤 결과물을 반환하도록 할 수 있습니다   1. CraftRecipeSO / NeedItems / ItemSo의 구조는 다음과 같습니다     2. 슬롯의 구성은 다음과 같습니다   3. 인벤토리의 구성은 다음과 같습니다public Slot[] inventorySlots = new Slot[30];     코드 및 설명먼저 코드의 구조를 살펴보겠습니다   외부에서 아이템을 조합해달라고 요청이 들어오면 현재 인벤토리의 모든 아이템을 정리하여 충분한 아이템이 있는지 확인하고 있다면 결과 아이템을 지급하는 형태입니..

OnDrop이 실행되었을때 OnEndDrag가 실행되지 못하도록 하기

유니티 버전 - 2022.3.17f1     목차코드 의도문제 상황시도해본 방법들해결 과정결과마치며     코드 의도드래그가 종료되었을때 성공적으로 수행된다면 OnDrop을 이용하여 성공 사운드 출력 및 아이템 교환을 하고, 실패한다면 OnEndDrag를 이용하여 실패 사운드 출력 및 DragSlot을 초기화시켜 주고 싶은 상황입니다 /// /// 드래그가 UISlot이 아닌 곳에서 끝났을때 아무 작업도 수행하지 않기위해 DragSlot을 초기화시켜줌 /// public void OnEndDrag(PointerEventData eventData) { if (DragSlot.Instance.draggedSlot != null) { ..

씬 전환시 해당씬의 CinemachineConfiner로 교체하기

유니티 버전 - 2022.3.17f1     목차들어가며현 프로젝트 세팅코드     들어가며해당 코드를 이용하여 할 수 있는것은 씬이 전환 될때 전환된 씬의 Polygon Collider 2D를 가져와서 Cinemachine의 Cinemachine Confiner 2D의 Bounding Shape 2D를 설정해 주는 것입니다     현 프로젝트 세팅1. 해당 스크립트는 가상 카메라(CinemachineVirtualCamera)와 같은 오브젝트에 있습니다2. 2D 환경입니다3. 메인씬은 변하지 않고 필요한 씬이 Addtive 모드로 로드 / 언로드 됩니다     코드// 전체 코드// 기능과 무관한 부분은 생략 하였습니다public class CinemachineConfinerChanger : MonoBe..

스프라이트 아틀라스(Sprite Atlas)

유니티 버전 - 2022.3.17f1     목차프로젝트 세팅개별 옵션스프라이트 참조     프로젝트 세팅Edit -> Project Settings -> Editor -> Sprite Packer -> Mode 에서 빨간 네모 박스가 쳐진 항목을 선택하여 줍니다  그런다음 Project에서 아틀라스를 만들어 줍니다     개별 옵션Allow Rotation : Sprite Atlas를 패킹할때 스프라이트가 회전할 수 있는지 여부 (공간을 효과적으로 사용하나 예기치 못한 이미지 출력 가능성 존재) Tight Packing : 스프라이트의 아웃라인에 따라 패킹하는 것 (공간을 효과적으로 사용하지만 경계가 흐린 이미지는 이미지간 침범 가능성 존재)      스프라이트 참조아틀라스로 묶은 스프라이트들을 드래그..

카메라 최적화

유니티 버전 - 2022.3.17f1     Multi Camera 지양각각의 카메라가 렌더링을 수행할 때 culling 작업과 Layer Filtering을 수행하기 때문에 성능 이슈 발생 가능성이 높음대신 시네머신 사용 권장     Occlusion Culling 과 LODOcclustino Culling을 이용 할 수 있는 상황에서는 사용하기, Occlustino Culling이란 카메라에서 가려지는 것들은 렌더링 하지 않는 것, 아웃도어 상황에서는 오히려 연산 비용 증가 LOD - 어느 정도 멀리 떨어진 오브젝트는 렌더링 하지 않아서 성능적 이득을 보는 것     Skybox  하늘을 안봐도되는 탑다운 게임은 Skybox가 필요하지 않기에 삭제     참고자료 (유니티 공식 유튜브)더보기https..

오디오 에셋 최적화

유니티 버전 - 2022.3.17f1     목차Load TypeCompresstion Format     Load Type 옵션Decompress on loadCompressed into memoryStreaming 파일 크기256kb > 1MB사용 시기재생속도(반응속도) 가 빨라야 하는 오디오(총 소리, 피드백에 사용되는 오디오 등)양 옆의 경우를 제외한 대부분의 경우배경 음악메모리압축을 풀어서 메모리에 올림압축 상태의 오디오를 메모리에 올림오디오를 디스크에서 직접 스트리밍하여 필요한 부분만 로드       Compresstion Format매우 짧은 클립은 ADPCM 사용대부분의 경우 Vorbis 사용

IsPointerOverGameObject()란?

유니티 버전 - 2022.3.17f1     목차IsPointerOverGameObject()사용 예시주의할 점     IsPointerOverGameObject()마우스 입력을 받았을때 게임 오브젝트or씬 위에서 클릭이 일어났는지 UI위에서 클릭이 일어났는지 반환해주는 메서드입니다, 이를 이용하여 마우스 클릭으로 특정동작을 수행해야할 때 UI를 클릭했다면 동작을 수행하지 못하도록 할 수 있습니다     사용 예시 if (p_context.phase == InputActionPhase.Performed) { if (InGame.isUIOpened) return; if (EventSystem.current.IsPointerOverGameObject()) ..