금요일까지 면접결과 안날아와서..
질문답변 틀리고 어버버 버렸던 면접복기에 이불좀 차고 시무룩좀 하고

다시 만들던 1인 게임개발 하고있었다.
메인게임 기능은 다 만들었고 상점구매기능까지 완성했다. 
이 후 난이도 조절이랑 메타퀘스트 사양에서 잘 돌아가게 하기위한 게임디자인을 하고있었다.
늘 그렇듯 메타퀘스트.. 사양이 아무리 좋아도 패스쓰루 기능쓰면 배터리소모랑 프레임드랍이 심해서
오브젝트 많이 못올린다.

전에 회사를 다니던 때에도 1인게임 개발은 언제나 가슴속에 두고있었으니까.
사람은 희망에 죽고 사는 동물이니까 이렇게라도 해야 멘탈이 잡힌다.

토요일에 기술과제를 받았다.
금요일까지 일하시다가 쉬는날인데도 토요일에 보내주신거겠지.
고생이 많으시구나. 

우리가 모델링툴에서 자주 사용하는 미러링기능을 만드는건데.

2017~18년 대학교때 그래픽스 과제할 때 했던걸 이제와서 다시 붙잡으려고하니까 기억도 안나서 사실 좀 겁난다.
수학 너무 어렵고 머리빠지고 실전투입이 바로 되는 천상계아니면 취업 안되는 현실을 아니까.
그래픽스 프로그래머보다 클라로 간건데 ㅠ
근데 어쩌겠는가.. 어떻게든 해야지.. 해봤는데 실력 안되는거니 겸허히 받아들이고.

 

곰곰히 생각해보다.

 

그냥 오브젝트 복사해서 만들고 스케일만 -1 곱해서 반전시키면
별도 무거운 연산없이 되는거 아닌가..? 라는 잔머리를 굴렸지만
문제내는 사람의 의도는 그게 아니니까 ㅜ 

크게 정리.

각 축에따라서 버텍스에 해당하는 값에다가
2차원에서는 그 축을 제외한 좌표값에만 음수를 곱하면되지만
3차원에서는  폴리곤을 그린 후 법선벡터까지 올바르게 넣어야 겉면이 표시된다..

그림판과 마우스로 그리느라 힘들었다.


1.메쉬필터에서 메쉬정보(버텍스,노말) 가져오기.
2.각 축에 대해 버텍스에 음수 곱해서 좌표 반전.

3.버텍스 노말에도 동일하게 음수 곱하여 바라보는 방향 반전시키기.

4.음수를 곱하여 메쉬의 법선벡터가 반전됨으로 인해 메쉬의 표면이 안쪽을 향하게 되어 표면이 뒤집힘.
5.각 폴리곤 tris의 정점의 두번째,세번째의 위치를 스와핑해서 면을 뒤집어 표면을 뒤집기.

6. 5번의 과정을 반복하여 나온 결과물들을 생성한 미러 메쉬에 할당.

7.위치에 -1를 곱해서 좌표값 반전.

8.축에 해당하는 축에 -1 를 곱해서 회전값 반전. w축에도 하지않으면 반전안됨.

9.스케일 조정 ..etc 

여러개의 오브젝트 미러링기능 확장하기.

원본,미러링 오브젝트의
메쉬필터와 렌더러를 어떻게 관리하는게 효율적일지 고민을 좀 오래했다.
1:1 매핑이 문제인데. 딕셔너리는 키값하나에 하나에 밸류밖에 안되니 결국 인덱스
기반으로 여러개 만들어서 여러번 돌려야하니
그냥 클래스로 묶어서 foreach 돌리기로 결정.



코드도 20줄 내외로 변경했고 너무 간편하게 구현했다

깃허브에 올려야지

'Unity 3D > Technical' 카테고리의 다른 글

Text Mesh Pro 한글폰트 제작방법  (0) 2023.01.02

열심히 구글링했던 기억이 났다.

요약. 파이어베이스에서 사용하는 ContinueWithOnMainThread 는 유니티에서 사용하는

메인스레드와 다른 스레드를 사용하기 때문에 모노비헤이비어에서 제공하는 함수를 못 쓸 때가있다.

아래처럼 사용하는게 제일 안정적이었다.

FirebaseApp.CheckAndFixDependenciesAsync().ContinueWithOnMainThread(task =>
 {
     FirebaseApp app = FirebaseApp.DefaultInstance;

     // Initialize Database
     reference = FirebaseDatabase.DefaultInstance.RootReference;

     // Call the method to load JSON data
     LoadJsonFromFirebase();
 });

참고링크.

https://forum.unity.com/threads/instantiate-not-working-in-coroutine-firebase.1320300/

 

작성사유.
전에 분명 했던것인데 까먹어서 이번에 30분넘게 또 찾는시간이 걸려서 올린다.
나는 유니티에서 webp를 사용할일이 있어서 깃허브에있는 패키지를 사용해야했다. (압도적 감사!)



준비물.

Git이 설치된 상태.

1.프로젝트 폴더 package / manifest.json 파일을 연다.

그대로 복붙해서 사용한다.

이거 사실 구글치면 다 나오는데 굳이 또 쓰는 이유.

정보를 줬으면 폰트 정보 읽는 범위정도는 마우스로 긁게는 해줘야 할 것 아니냐...?

할때마다 구글크롬 개발자모드켜서 자바스크립트 기능 끄는거 매우 귀찮아서 씀

32-126,

,44032-55203 

,12593-12643 

,8200-9900 

허구헌 날 에어링크 안될 때 튜토리얼 찾아보는거 귀찮아서 빼 먹은 설정이 있는지 확인하기 위한 간단한 체크리스트.

  • [ ] 유니티의 open xr 패키지를 설치했는가?
  • [ ] 오큘러스 앱의 설정에 runtime openXR을 체크했는가?
  • [ ] 오큘러스 앱과 퀘스트가 초록색 불로 연결됨 이라고 뜨는가?
  • [ ] 유니티 프로젝트 세팅에 openxr 설정을 체크했는가?
  • [ ] 오큘러스 앱 설정 → 시스템 → 링크에서 에어링크사용 토글을 체크했는가?
  • [ ] 오큘러스를 pc와 연결했을때 HMD에 뜨는 usb디버깅 체크를 했는가?
  • [ ] 개발자 모드가 설정 되어 있는가?
  • [ ] 에셋스토어에서 oculus intrgration을 설치 했는가?

 

'Unity 3D > VR' 카테고리의 다른 글

VR에서 canvas UI를 OverRay처럼 사용하는 방법.  (0) 2022.12.30
VR 탈착 감지코드  (0) 2022.12.25

환경. 오큘러스 인테그레이션을 설치.

용도.VR에서는 Canvas overay를 사용하지 못한다.
그래서 VR개발할때는 월드카메라를 기본으로 사용하는데. 
그러면 다른 가까운 3D 오브젝트에 캔버스가 묻혀버리는 일이 발생해서 글자가 안보인다.

2021 이전에는 카메라의 DepthOnly 를 사용해서 만들지만

이후 버전에서는 CameraStack을 사용하기때문에 사용방법이 달라져서
다른 분 들은 나 처럼 시간허비 하지 말라고 적는다.

1.하이어라키는 다음과같이 구성한다.
CenterEye가 VR에서 사용하는 카메라인데 
카메라를 복붙을하던 새로만들어도 좋다.
다음과같이 준비해 주고 


먼저 UI카메라의 설정을 오버레이로 설정한다.
그리고  보여주고싶은 컬링마스크를 지정한다. 

캔버스의 레이어를 카메라의 컬링마스크와 똑같이 해준다.

그럼 UI카메라에는 다른 3D 오브젝트를 제외한 UI패널만 나타나게 되고.



메인카메라의 Stack에 오버레이 UI카메라를 등록해주면.
저 UI카메라와 겹쳐서 보인다.


도움이 되었다면 댓글과 광고 한번씩만 눌러주시면 감사 하겠습니다.

'Unity 3D > VR' 카테고리의 다른 글

유니티 오큘러스 에어링크 안될 때 체크리스트.  (0) 2023.01.01
VR 탈착 감지코드  (0) 2022.12.25

openVR과 oculus integration 에셋 설치 된 상태에서

 void Start()
    {
        OVRManager.HMDMounted += mounted;
        OVRManager.HMDUnmounted += UnMounted;
    }

    public void mounted()
    {
        Debug.Log("mounted!");
    }
    public void UnMounted()
    {
        Debug.Log("Bye!");
    }

 

스팀VR의 경우는 이렇다.

public class HeadsetDetection : MonoBehaviour
        {       
        public SteamVR_Action_Boolean headsetOnHead = SteamVR_Input.GetBooleanAction("HeadsetOnHead");
                public bool IsHeadsetOnHead;
                public Action OnHeadsetOnHead, OnHeadsetOffHead;
            void Update()
                {
             if (headsetOnHead != null)
                    {
                        if (headsetOnHead.GetStateDown(SteamVR_Input_Sources.Head))
                        {
                            Debug.Log("Headset placed on head");
            
                            IsHeadsetOnHead = true;
            
                            if (OnHeadsetOnHead != null)
                            {
                                OnHeadsetOnHead();
            
                            }
                        }
                        else if (headsetOnHead.GetStateUp(SteamVR_Input_Sources.Head))
                        {
                            Debug.Log("Headset removed");
            
                            IsHeadsetOnHead = false;
                            if (OnHeadsetOffHead != null)
                            {
                                OnHeadsetOffHead();
                            }
                        }
                    }
            }
    }

최근 시나리오가 있거나 알파테스트중 앞의 부분을 건너뛰고싶을때 만들었던 스크립트다.
수 많은 if문과 switch문을 보는게 너무 극혐이라 단 4줄이면 되도록 만들었다!

이 코드를 붙인 오브젝트를 프리팹으로 만들어서 키보드 0~9를 눌렀을 때 
원하는 함수를 매핑하거나 다른 함수의 인스턴스로 불러와서 호출하면 정말 편하다.



using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using System;

public class SkipHelper : MonoBehaviour
{

//키보드 누르면 등록된 이벤트를 발생시켜 건너 뛰게 하기 위해 만든 스크립트 
    [SerializeField]
    public UnityEvent[] Events;

    void Update()
    {
        if (Input.inputString.Length == 0)
        {
            return;
        }
        else
        {
            Events[Int32.Parse(Input.inputString)].Invoke();
        }
        
    }
}

 

도움이 되었다면 광고나 댓글 한번씩 부탁드립니다~

+ Recent posts