Get it on Google Play


Wm뮤 :: '2020/10 글 목록 (2 Page)

블로그 이미지
가끔 그림그리거나 3D모델링하거나
취미로 로봇만드는
퇴직한 전자과 게임프로그래머
2020.3.48f1 , 2022.3.6f1 주로 사용
모카쨩
@Ahzkwid

Recent Comment

Archive


TTS

2020. 10. 19. 15:05 Unity

 

 

    void DownloadTTS(string folderPath, string text, string fileName)
    {
        if (System.IO.Directory.Exists(folderPath) == false)
        {
            Debug.Log($"System.IO.Directory.CreateDirectory(folderPath), folderPath: {folderPath}");
            System.IO.Directory.CreateDirectory(folderPath);
        }
        var filePath = $"{folderPath}/{fileName}.mp3"; 
        if (CheckFile(filePath) == false)
        {
            StartCoroutine(DownloadFile("http://" + $@"translate.google.com/translate_tts?ie=UTF-8&textlen=32&client=tw-ob&q={text.Substring(0, Mathf.Min(200, text.Length))}&tl=en-gb", filePath));
        }
    }

Web에서 긁어오는 타입

200자 제한

일본어는 ja다

 

 

 

 

 

원샷타입


IEnumerator TextToSpeech(string text)
{
    Debug.Log($"TextToSpeech({text})");
    if (string.IsNullOrWhiteSpace(text))
    {
        Debug.Log($"빈문자열이라 정지");
        yield break;
    }
    var co = LoadAudioClipMP3($@"http://translate.google.com/translate_tts?ie=UTF-8&textlen=32&client=tw-ob&q={text.Substring(0, Mathf.Min(200, text.Length))}&tl=en-gb");
    StartCoroutine(co);
    yield return new WaitUntil(() => co?.Current as AudioClip != null);

    var audio = (AudioClip)co.Current;
    var obj = new GameObject("WebTTS-" + text);
    var audioSource = obj.AddComponent<AudioSource>();
    audioSource.PlayOneShot(audio);
    Debug.Log($"오디오 길이 {audio.length}초");
    Destroy(obj, audio.length + 1); //오디오 시간에 1초를 추가(여유분)

    yield return null;
}
static IEnumerator LoadAudioClipMP3(string downloadLink)
{
    Debug.Log($"LoadAudioClipMP3({downloadLink})");
    UnityWebRequest unityWebRequest = UnityWebRequestMultimedia.GetAudioClip(downloadLink, AudioType.MPEG);

    var operation = unityWebRequest.SendWebRequest();

    yield return new WaitUntil(() => operation.isDone);

    if (unityWebRequest.isNetworkError)
    {
        Debug.LogError(unityWebRequest.error);
    }
    else
    {
        Debug.Log("LoadAudioClipSuccess");
    }
    var clip = DownloadHandlerAudioClip.GetContent(unityWebRequest);
    clip.name = downloadLink;
    yield return clip;
}

 

 

 

 

 

위에서 딕셔너리 추가버전

Dictionary<string, AudioClip> ttsDict = new Dictionary<string, AudioClip>();

AudioSource lastTTS;
IEnumerator TextToSpeech(string text)
{
    Debug.Log($"TextToSpeech({text})");
    if (string.IsNullOrWhiteSpace(text))
    {
        Debug.Log($"빈문자열이라 정지");
        yield break;
    }

    AudioClip audio;

    if (ttsDict.ContainsKey(text))
    {
        Debug.Log($"딕셔너리에서 가져옴({text})");
        audio = ttsDict[text];
    }
    else
    {
        var co = LoadAudioClipMP3($@"http://translate.google.com/translate_tts?ie=UTF-8&textlen=32&client=tw-ob&q={text.Substring(0, Mathf.Min(200, text.Length))}&tl=ja");
        StartCoroutine(co);
        yield return new WaitUntil(() => co?.Current as AudioClip != null);

        audio = (AudioClip)co.Current;
        ttsDict.Add(text, audio);
    }
    var obj = new GameObject("WebTTS-" + text);
    var audioSource = obj.AddComponent<AudioSource>();
    if (lastTTS!=null)
    {
        Destroy(lastTTS);
    }
    lastTTS = audioSource;
    audioSource.PlayOneShot(audio);
    //audioSource.pitch = 1.2f;
    Debug.Log($"오디오 길이 {audio.length}초");
    Destroy(obj, audio.length + 1); //오디오 시간에 1초를 추가(여유분)

    yield return null;
}
static IEnumerator LoadAudioClipMP3(string downloadLink)
{
    Debug.Log($"LoadAudioClipMP3({downloadLink})");
    UnityWebRequest unityWebRequest = UnityWebRequestMultimedia.GetAudioClip(downloadLink, AudioType.MPEG);

    var operation = unityWebRequest.SendWebRequest();

    yield return new WaitUntil(() => operation.isDone);

    if (unityWebRequest.isNetworkError)
    {
        Debug.LogError(unityWebRequest.error);
    }
    else
    {
        Debug.Log("LoadAudioClipSuccess");
    }
    var clip = DownloadHandlerAudioClip.GetContent(unityWebRequest);
    clip.name = downloadLink;
    yield return clip;
}

 

 

 

 

 

 

 

 

 

 

'Unity' 카테고리의 다른 글

유니티 내비게이션 navigation  (0) 2020.10.25
유니티 Mask  (0) 2020.09.24
유니티 IDE(비주얼스튜디오) 바꾸기  (0) 2020.08.19
posted by 모카쨩
2020. 10. 19. 13:47 블렌더

이 강좌는 어느정도 블렌더 지식이 있다는 가정하에 만들어졌습니다

 

플레인을 만듦

 

 

언랩ㄱㄱ

 

 

(*중요) 빈 이미지 파일을 만들어줌

 

 

멀티레졸루션을 다음같이 설정함, 플레인 크기에 따라 섭디비전수치를 조정

 

스컬프팅 ㄱㄱ

저땐 몰랐는데 브러쉬에서 symmetry탭에서 미러를 풀어야 제대로 됨여

 

화면과 같이 설정후 베이크를 함

가능하면 스컬프팅 모드에서 하는게 좋음

 

아무 매터리얼이나 만듦

 

아무 텍스처나 만듦

 

 

 

타입에서 'Image or Movie' 선택

이미지나 동영상 만들때 쓴다는 이야기, 자세한건 모름여

 

아까 베이크해둔 노말맵을 불러옴

 

이미지 샘플링에서 노말맵 선택

 

맵핑에서 UV선택

 

디퓨즈의 컬러를 해제하고 노말을 체크

 

↑렌더링 된 모습

평면임에도 불구하고 굴곡진듯한 착시를 일으킴

'다만 정말로 굴곡진건가?' 라고 의심을 가지고 살펴보면 평면티가 살짝 남

 

이럴때에는 스무스 쉐이딩을 적용시키고

레졸루션의 프리뷰 값을 살짝(절반정도) 남겨준 상태에서 베이크하면 리얼해져서 구별하지 못 하게 됨

 

대신 이렇게 하면 프리뷰 값만큼 쓸데없는 버텍스가 늘어나버리므로 비추천

가능하면 이럴일이 발생하지 않도록 처음부터 세심하게 만들것

 

결론*-노말맵은 만능이 아니라 약간의 폴리곤 값은 있어야함

 

 

 

응용하기에 따라 색상,그림자,광원값을 1텍스처에 전부 저장하는 방식도 가능함

혹은 단순하게 레졸루션을 무진장 높여서 노말맵 만들고 그걸 로우폴리에 적용해서 곡면처럼 보이게 한다던지 쓰기나름

 

어째선지 경계면이 지글지글 깨지는 현상이 나타남여

컷팅을 잘 하던지 안티앨리어싱을 주던지 해야할듯

 

 

 

 

2.8

더보기

 

 

 

 마테리얼에서 텍스처 설정하는법이 바뀌었다

왜인지 Untitled텍스처는 안되니 다른텍스처로 하자

 

 

 

 

 

 

 

텍스처 베이킹 할때

 

노말맵 베이킹 할때, 주의점은 노말맵을 베이킹하면 메인텍스처에 씌워진다

 

 

 

 

 

 

 

 

옵션값에 따른 렌더링 결과

 대상은 스피어를 큐브에 씌울때

 

 

Extrusion : 0

Max Ray Distance : 0

 

무제한으로 처리해서 전부 다 나온다

 

Extrusion : 0

Max Ray Distance : 1

 

표면부터 시작해서 1미터만큼 측정하기 때문에 바깥으로 튀어나온 안쪽은 베이킹하지 않는다

 

Extrusion : 1

Max Ray Distance : 0

1미터 앞에서 시작하지만 거리가 무제한이라서 전부 다 잘나온다

 

Extrusion : 1

Max Ray Distance : 1

 

1미터 앞에서 시작해서 1미터만큼 베이킹해서 표면부터는 베이킹 안된다

 

Extrusion : 1

Max Ray Distance : 2 

1미터 앞에서 시작해서 2미터만큼 베이킹해서 전부 다 되어야 하는데 왜인지 안쪽으로는 0.5만큼만 베이킹 되었다

 

 

 

Extrusion : 1

Max Ray Distance : 4

1미터 앞에서 시작해서 2미터만큼 베이킹해서 전부 다 되었다

 

 

 

 

정확한 추측은 안 되지만 2.0이 제일 결과가 좋았다

 

'블렌더' 카테고리의 다른 글

블렌더 애니메이션  (0) 2021.03.15
블렌더 오류 모음  (0) 2021.03.15
블렌더 관련자료  (0) 2020.10.19
posted by 모카쨩
2020. 10. 19. 13:12 블렌더

 

 

 

일반단축키

 

변형

 

edit 모드에서 필수적으로 알아야할 단축키 3개

Ctrl + E

W

Ctrl + F

이 3개는 작업할때 거의 필수인 기능들을 거의 담고 있으므로 알고 있어야함

 

 

시점조작

Shift + 마우스 휠 버튼 : 시점 이동

Shift + 마우스 휠 : 시점 상하 이동

Ctrl  + 마우스 휠 : 시점 좌우 이동

Ctrl + 마우스 휠 버튼 : 시점 확대 축소

마우스 휠 버튼 : 시점 회전

Ctrl  + Shift +  마우스 휠 : 시점 시계 회전

Ctrl  + 4 : 시점 반시계 회전

Ctrl  + 6 : 시점 시계 회전

 

 

 

그리고 이걸

이렇게 수정해두면 편하다

 

 

 

일반

Ctrl + TAP : 채색모드

 

edit 모드

선택

Alt + 오른클릭 : 지정된 선분이나 버텍스의 관련된 부분을 일괄선택

T : 좌현 슬라이더 열기

N : 우현 슬라이더 열기

Z : 토글 와이어 뷰

Alt + Z : 토글 텍스처 뷰 

V : 버텍스 분리

G : 버텍스 이동

A : 전체선택 & 선택해제

S : 스케일 조정

C : 브러쉬형 버텍스 선택

B : 버텍스를 드래그하여 선택

E : 버텍스를 복사후 원본과 연결

H : 버텍스 숨기기 (일부 버텍스를 보이지 않게함 지워지는건 아님, 내부 제작시 유용)

Ctrl + H : 숨김해제

Shift + H : 선택하지 않은 버텍스를 숨김

W -> Merge : 버텍스 병합

W -> Laplacian Smooth : 라플레시안 기법으로 면을 부드럽게함

K : 나이프(은근 유용)

J : 버텍스 2개를 연결하여 자름, 나이프로 안되는거 자를때 유용

P -> selection : 버텍스를 분리하여 오브젝트화

Ctrl + R : 면 분할 (루프 컷,분할 위치 수치로 지정 가능)

Ctrl + E -> UnSubdivide : 자동 로우폴리Ctrl + E -> Subdivide : 분할 (자동 하이폴리, 선모드에서 유용)

Ctrl + E -> Edge Split: 엣지 분리
Ctrl + E -> Bridge Edge Loops : 두 선을 연결함, F에 비해 정확도가 높음
Ctrl + F -> Intersect (Boolean) : 선택한 부분을 다른 부분과 병합함

Ctrl + I : 버텍스 선택 반전

Shft + Alt + S : 선택한 버택스들을 구형으로 (원이나 구를 하이폴리화할때 유용)Shft + S : 커서 위치 설정

Shift + Art + Ctrl + C : 중심점 설정 (피벗포인트 설정)

Space -> Select Random: 랜덤하게 버텍스를 선택함, 불규칙한 표면이나 도형을 만들때 좋음

 

object 모드

Ctrl + J : 오브젝트 병합

Art + 오른클릭 : 정교한 선택(오브젝트가 겹쳐있을시)

Art + D : 연결복제(원본속성을 따름)

 

그룹ctrl + G : 그룹 지정

Shift + G : 그룹 선택 

 

텍스처

edit 모드

Ctrl + E : 텍스처 매핑(UV)에서 잘리는 부분선택(Mark seam)

 

 

 

Path

object 모드

Art + C : 패스를 메쉬로 변환

edit 모드

Ctrl + L : Select Linked 해당 패스에 연결된 점들을 모두 선택

 

 

기타

Ctrl + Shift + MouseWheel : 뷰를 현재보고있는 방향 기준으로 회전한다

Shift + F : WASD로 카메라 조종(건물내부 제작시 유용)

Ctrl + Alt + Q : 토글 쿼터뷰(그냥 유용)

 

 

그외의 단축키는 이곳에서 확인 가능하다

waldobronchart.github.io/ShortcutMapper/#Blender

 


 

 

 

모디파이어 설명

array

배열기능으로 직선배열할때 유용하게 사용가능하나 본체인 오브젝트가 축에 정렬되어있어야함

 

bevel

모서리를 다듬는 기능

별로 쓸일은 없는데 모서리가 둥근 사각형같은걸 만들때에는 매우 유용했음

 

boolean

메쉬끼리 연산하여 지우거나 붙이거나 할수있음 

포토샵으로 치면 벡터 속성 정의하는거라고 보면 된다

여러 부품들을 이용된 물건을 만들때 매우 용이

표면의 쉐이딩값(플랫인지 스무스인지)까지 적용됨

 

DisPlace

노말이나 지형제작의 핵심기능

이미지를 불러와서 메쉬의 변형을 일으킨다(사용전Multiresolution이나 Subdivision Suface적용추천)

흰색은 튀어나온 부분이며 검은색은 파인부분으로 인식한다

텍스처 탭에서 상세한 설정이 가능하며 UV에 매핑되도록 할수도 있다

Midlevel을 조절하여 파이게 할건지 튀어나오게 할건지(음각,양각)

Strength로 세기를 조절할수 있다 (음수 가능)

벡터이미지가 유용할것으로 예측됨

 

shrinkwrap

스티커? 같은 기능으로 자동스냅 비슷함

특정 메쉬의 표면에 달라붙게 하는것이 가능

다만 경우에 따라 메쉬를 회전시켜 적용해야 하는등 불완전

그러나 백그라운드 띄우고 작업할때 유용

 

screw

구린 회전체 기능

그런데 컵이나 도자기 같은걸 만들때에는 유용함

선분을 회전시켜 쓰면 좋음

 

mirror

핵심기능으로서 특정 이미지를 반전시켜 복사하고 서로 연결되게 하거나 되지 않게 할수도 있다

Triangulate를 사용할경우 미러전에 Triangulate을 상위로 쓰면 좋음

 

subdivision suface

핵심기능으로서 로우폴리를 하이폴리로 만들어준다.

반대로 로우폴리에서 작업함에도 불구하고 하이폴리 미리보기도 가능

인체만들때 대부분 이렇게 하고 쓰는듯

 

edge split

특정 엣지를 잘라내는 기능, 섭디비전에서 모서리를 날카롭게 할때나 가끔 쓰인다

혹은 로우폴리에서 쉐이딩을 명확히 표시하기 위해 사용

 

Decimate

하이폴리를 로우 폴리로 바꾸어 주는 기능

각도에 따라 거의 평평한 메쉬를 아예 평면으로 합쳐주거나

최소한도의 삼각형으로 바꿔주거나 해줌

리메쉬보다야 성능이 좋지만 그래도 좀 잉여, 그냥 손으로 로우폴리 만드는게 나은듯

대신 조각난 평면 메쉬를 합칠땐 유용

 

remesh

하이 폴리를 로우 폴리로 만들어 주는거긴 한데...

성능이 매우 구려서 비상용으로 사용함

원리는 벡셀방식(마인크래프트 같은... 좀 다르지만)으로 변환하여 픽셀수를 낮춘후 재계산 하는 방식인듯

 

hook

특정 버텍스를 연결할때 사용

매우 쓸데 없어 보이지만 물리 시뮬레이션 할때 가방끈같이 따로 제작해서 붙여야 하는부분에 사용

 

 


 

외부강좌들

 

Z브러시 노말맵

http://uvmax.tistory.com/110

 

플랜나무

http://hwanggoon.tistory.com/73

 

월드머신

http://www.slideshare.net/devcatpublications/ndc2011-8253034

//사용하기에 따라 초대형급의 맵크기를 낼수있음

비상업적 이용에 한해서 무료, 풀버전은 20만원

 

쉐이프 키

http://cgi.tutsplus.com/tutorials/create-a-facial-animation-setup-in-blender-part-1--cg-32251

 

물리엔진(파티클 포함)

http://www.youtube.com/watch?v=wJFE2pb0Ri4

 

잔디만들기(헤어파티클)

http://www.youtube.com/watch?v=UogSf4ZO8sg

 

인체리깅

http://www.youtube.com/watch?v=cGvalWG8HBU

 

다른모델러가 정리한 자료들

http://realandideal.tistory.com/190

 

블렌더를 이용한 탄막

http://www.youtube.com/watch?v=l8GtYuY9Jhs

 

 

커텐만들기

https://www.youtube.com/watch?v=Zf47lrrKUC0 

 

 

 

 


 

자잘한 팁

 

버텍스 일괄정렬시 S버튼으로 한개축만을 선택해서 스케일을 0으로 하면 됨

 

플랫 머리카락 만들때 E로 면뽑아서 잘라서 변형하면 편함

꼭지점 부분은 E후에 merge

 

리깅할때 쿼터뷰를 쓰면 편함, 리깅에만 적용되는게 아니지만

 

system 항목에서 region overlap하면 툴패널 반투명화됨 역효과가 날수도 있음

 

두지점의 중간에 위치하게 하고 싶다면 두 지점을 연결하여 직선으로 만들고 스냅, 특정 퍼센티지 지점을 원하면 섭디비젼

 

 


물리엔진관련

Cloth

천옷물리효과

pinning을 사용하여 고정가능함

 

 

 

 


리깅

 

Pose 항목

Ctrl +Shift + C : Constraint 생성(자동매핑 됨)

 

Edit항목

 

Ctrl + R : 축회전

Ctrl + M : 미러

Shift + A : 새로운 본 생성

Shift + D : 복제

Art + P -> Clear Parents : 상속된 모든 페런츠를 해제함, IK작성시 유용

Ctrl + P -> Keep Offset : 커넥트와는 조금 다른 연결인듯(불확실, 각도 지정용인듯), 2개의 대상 지정후 적용(IK본을 나중에 선택), IK작성시 유용

 

Bone항목

 

핸들로 쓸 bone은 bone항목에서 deform해제

 

트위스트 관절은 Deform의 Cuved Bones에서 Segemnts수치를 올리고

Ease In과 Ease O의 수치를 0으로 맞춘다

1일 경우는 척추관절로도 이용가능, 단 로우폴리에 척추관절 적용시 퀄리디 다운 가능성 높음

 

 

Bone Constraint항목

 

Limit Scale를 1로 설정하여 변형방지를 할수 있다. 단 Convert에서 Local Space필수

이것은 Limit Scale에만 유효한게 아니므로 중요함

 

Limit Rotation로 관절 유효범위 설정가능

유니티의 메카님에서 Muscles와 동일한 기능이나, 호환되지는 않는 모양

 

 

기타

 

오토웨이트는 만능...이 아니라 오히려 똥, 안 쓰는거보다 못함

필요한 경우라면 1초만에 리깅을 해야할때?(강좌용으로라던지)정도일듯

 

툴탭의 Options에서 Armature Options에서 X-Axis Mirror를 이용하여 좌우 대칭형 본작성에 용이할수 있다고 함

 

트위스트 본을 유니티에 적용시키려 해보았으니 실패

맥스에 제너릭 한정으로 애니메이션 베이크시 가능하다는 소문이 있음

(추측)fbx익스포트시 only Deform bones가 트위스트 본과 관계 가능성(결과:휴머노이드에서 적용시 실패)

 

본 미러시 : Shift + S후 Cursor to Center -> pivot point는 3D cursor -> Shift + D -> Ctrl + M 후 X

->이름 설정되어있을시(Space 후 Flip Names입력),아닐경우(Space 후 AutoName by Axisd입력)

핸들이 있다면 IK의 Pole Angle을 180도 회전(일부 한정)

웨이트 페인트를 나중에 해야함 그래야 Weight Paint의 Options에서 X Mirror적용가능(가능한 Left부터 채색)

실수로 먼저 칠했다면 Topology Mirror 체크후 브러쉬의 Weight를 0으로 맞춘다음 빈곳에 클릭하면 자동화 됨

대신 한번만 칠하면 될걸 다시하는셈이므로 지양하는 것이 좋음(모두 칠하는데 5분밖에 안걸리지만)

 

쿼터뷰의 록을 풀어놓고 웨이트하면 편하다

 


애니메이션

Dope Sheet 에서 action editor로 동작구분

 

텍스처를 만들듯이 +를 눌러 액션을 만든다

액션은 애니메이션 동작을 담고 있다

 

액션별로 +하여 만드는게 유용

 

버텍스애니메이션도 있는데 유니티에서 쓰려면 쉐이프키를 쓸것

 

 

 

 

기타

 

[나 ]로 특정프레임을 기점으로 프레임 선택가능

 

 

 


렌더링

 

Render에서 Shading의 Alpha 를 Transparent로 변경하여 배경을 투명으로 바꿀수 있음

게임용 스프라이트 만들때 유용

 

매터리얼은 가급적 기본설정으로 하되 Diffuse 컬러를 흰색(기본설정색은 아주 약간 회색이 섞임)으로 변경해준다

 

Material에서 Transparency 체크 후 Alpha를 0으로 하고

Texture의 Influence에서 Diffuse의 Alpha를 체크하면 텍스처를 투명하게 적용가능(유니티 자동전환 됨)

 

시뮬레이션 결과를 저장하려면 modifier에서 apply하고 obj로 내보내야한다고 함(미확인)

 

 

 

 

 

 

 

 

 


외부 플러그인

 

SCI-FI용 랜덤플로우

https://twitter.com/blenderguppy/status/1722141006081278298

 

배경용 우주선

https://twitter.com/80Level/status/1724334740071690728

 

 

 

 

'블렌더' 카테고리의 다른 글

블렌더 애니메이션  (0) 2021.03.15
블렌더 오류 모음  (0) 2021.03.15
간단히 따라해보는 노말맵 만들기(범프)  (0) 2020.10.19
posted by 모카쨩
2020. 10. 19. 11:18 공학기술

 

 

 

 

 

버튼

'공학기술' 카테고리의 다른 글

발진기  (0) 2020.10.28
HDclone 사용법  (0) 2020.09.03
윈도우 이전작업  (0) 2020.09.03
posted by 모카쨩
2020. 10. 15. 11:48 FireBase

console.firebase.google.com/

 

 

 

 

 

 

 

만약 애널리틱스를 사용하고 싶다면

더보기

 

 

몰론 애널리틱스 계정을 미리 만들어놔야 가능하다

 

 

생성이 끝나면 프로젝트를 열어서

 

앱등록한뒤 json을 받아서 넣어준다

 

겁나귀찮네

 

 

 

 

SDK도 다운받아야쥐

만약 SDK안받고 그냥 넘겼으면 여기서 다운로드 받는다

firebase.google.com/docs/unity/setup?authuser=0

 

 

용량이 1.8기가나 된다.

내 LTE데이터에 명복을 액션빔!

 

 

우리는 틀딱프로그램 유지보수하는게 아니니까

dotnet4/FirebaseAuth.unitypackage를 넣는다

 

위에서 애널리틱스 활성화를 했다면 yes를 누른다

 

yes를 눌렀을경우

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'FireBase' 카테고리의 다른 글

파이어 베이스 인증서 다운로드 받는법  (0) 2021.10.05
파이어 베이스 인증  (0) 2021.10.03
파이어베이스 DB 사용법  (0) 2021.10.03
posted by 모카쨩
2020. 10. 13. 00:08 사용설명서

 

posted by 모카쨩
2020. 10. 5. 11:00 Unity/C#

 

gui색을 노란색으로 바꿈

GUILayout도 적용됨

GUI.backgroundColor = Color.yellow;
{
    GUILayout.Box(nameof(gameclass.name), GUILayout.Width(50), GUILayout.Height(50));
}
GUI.backgroundColor = Color.white;

 

 

가로전환

GUILayout.BeginHorizontal();
{
}
GUILayout.EndHorizontal();

 

스크롤뷰(슬라이더)

Vector2 scrollPosition=Vector2.zero;
void OnGUI()
{
    //scrollPosition=GUILayout.BeginScrollView(scrollPosition, GUILayout.ExpandWidth(true), GUILayout.ExpandHeight(true));
    scrollPosition=GUILayout.BeginScrollView(scrollPosition);
    { 
    }
    GUILayout.EndScrollView();
}

 

스크롤뷰(슬라이더) v2 (미완성)

Vector2 scrollPosition=Vector2.zero;
void OnGUI()
{
    scrollPosition = GUI.BeginScrollView(new Rect(0, 0, position.width, position.height), scrollPosition, new Rect(0, 0, width:500, height:800));
    {
    }
    GUI.EndScrollView();
}

 

 

 

 

 

마우스 대면 바뀌는 주석

        if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition))
            GUILayout.Label("Mouse over!");
        else
            GUILayout.Label("Mouse somewhere else");

 

버튼

if(GUILayout.Button("버튼"))
{

}

 

 

 

왼쪽으로 밀린 박스


    var Texture2D = new Texture2D(1, 1);//삭제가 안되어 메모리릭을 유발하므로 전역에 생성해 두어야함


{ 
    BoxBG.SetPixels(0,0,1,1, new Color[]{ Color.gray});
    BoxBG.Apply();

    var guiStyle = new GUIStyle();
    guiStyle.alignment = TextAnchor.UpperLeft;
    guiStyle.richText = true;
    guiStyle.normal.background = BoxBG;

    GUILayout.Box("내용",guiStyle);
}

 

 

 

인스펙터 변동사항이 있는지 검사한다

겸 드롭다운 샘플

EditorGUI.BeginChangeCheck();
{
    index = EditorGUILayout.Popup("Index", index, new string[] { "1", "2" });
}
if (EditorGUI.EndChangeCheck())
{
    Debug.Log("index값이 변경됨");
}

 

 

들여쓰기

EditorGUILayout계열만 적용됨

GUILayout은 안됨

EditorGUI.indentLevel++;
{


}
EditorGUI.indentLevel--;

 

 

 

스크립트오브젝트저장

//더티플래그

EditorUtility.SetDirty(scriptableObject);
var filePath = AssetDatabase.GetAssetPath(scriptableObject);
Debug.Log($"scriptableObject 저장됨, filePath: {filePath}");
//AssetDatabase.SaveAssets(); //이건 딱히 안 넣어도 되는듯

 

 

 

패스 에디터

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

#if UNITY_EDITOR
using UnityEditor;
[CustomEditor(typeof(PayloadRace))]
public class PayloadRaceEditor : Editor
{
    private Vector3 position = Vector3.zero;

    void OnSceneGUI()
    {
        var payloadRace = (PayloadRace)target;
        var tracksParent = payloadRace.tracksParent;
        if (tracksParent)
        {
            var childs = new List<Transform>();
            for (int i = 0; i < tracksParent.childCount; i++)
            {
                childs.Add(tracksParent.GetChild(i));
            }
            foreach (var child in childs)
            {
                if (Vector3.Distance(payloadRace.transform.position, child.position) < 1)
                {
                    //너무 가까우면 최상위 조작이 불가하므로
                    continue;
                }
                var newPosition = UnityEditor.Handles.PositionHandle(child.position, child.rotation);
                if (newPosition != child.position)
                {
                    UnityEditor.Undo.RecordObject(child, "Move Transform");
                    child.position = newPosition;
                }
            }
        }
    }
}
#endif
public class PayloadRace : MonoBehaviour
{
    public int team = 0;
    public GameObject payload;
    public Transform tracksParent;
#if UNITY_EDITOR_WIN
    void OnDrawGizmos()
    {
        var color = Color.red;
        if (team == 0)
        {
            color = Color.blue;
        }
        Gizmos.color = color;
        {
            Gizmos.DrawWireSphere(transform.position,5);
        }
        Gizmos.color = Color.white;

        if (tracksParent)
        {
            var childs = new List<Transform>();
            for (int i = 0; i < tracksParent.childCount; i++)
            {
                childs.Add(tracksParent.GetChild(i));
            }
            foreach (var child in childs)
            {
                Gizmos.DrawSphere(child.position,0.1f);
                if (Vector3.Distance(transform.position, child.position)<1)
                {
                    continue;
                }
            }
            for (int i = 0; i < childs.Count-1; i++)
            {
                Gizmos.DrawLine(childs[i].position, childs[i + 1].position);
            }
        }
    }
#endif
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

'Unity > C#' 카테고리의 다른 글

그래디언트효과  (0) 2020.10.20
failed to connect to localhost port 80: Connection  (0) 2020.09.01
c# MD5  (0) 2020.08.25
posted by 모카쨩
2020. 10. 1. 13:01 게임/VRChat

 

 

동기화 가능한 타입들

string, int, float[] (Continuous 50개, Manual 1000개 이상)

 

동기화 불가능한 타입들

datetime , vector[]

 

 

Manual Sync 일경우

 

 

 

 

배열 초기화 샘플

 

더보기

 

 

벡터배열초기화(동기불가)

 

 

For문 예제

Body는 루프 내부를 말하고

Exit는 루프가 끝났을때를 말한다.

 

 

 

 

 

 

 

 

 

Convert To int

int로 바꿔줌 Convert하위에 있음

 

 

String Format

String 하위에 있음, 지정된 형에 따라 숫자를 치환함

상단의 문자는 00:00:00.000같은 식으로 표현됨

근데 이경우 10진법으로 나오니까

시간형식으로 하려면

 

{0:00}:{1:00}:{2:00.000}

이렇게 넣고

arg0에는 x/(60*60)

arg1에는 (x/60)%60

arg2에는 x%60

나누기는 Division

나머지는 Remainder

 

인트형 섞어서 넣어줘야 하는 이유가 나눗셈이 이상하게 작동해서 float나눗셈은 반올림됨

 

 

나누기, 숫자형 하위에 있음

 

나머지, 숫자형 하위에 존재함

 

 

 

오너를 가져옴

두 함수는 Networking하위에 있음

 

 

 

자신이 해당 물건의 오너인지 확인함

로컬플레이어는 Networking하위, Is Owner는 VRCPlayer 하위에 있다

 

 

조합해서 자기 자신이 오너가 아니면 오너를 가져옴

 

 

 

 

 

Component.GetComponentsInChildren

includeInactive가 true라면 비활성화 컴포넌트들도 전부 가져온다

여담으로 저거 왜인지는 몰라도 잘 작동 안함

 

 

 

 

 

 

 

 

 

껐다 켜지면 위치가 리셋되는 오브젝트

리셋타이머 기본값이 10이기 때문에 처음에는 발생하지 않지만

Disable 될때 값이 초기화 되면서 켜질때 위치가 3초동안 리셋된다.

그리고 그 값이 오브젝트싱크를 통해 동기화 되면서 다같이 동기화 되는것

 

 

 

 

다른 UdonVehaviour로 보내는 예제

 

 

 

 

PlayerMods 예제

Networking.Get LocalPlayer

VRCPlayerApi.SetJumpImpulse

VRCPlayerApi.SetRunSpeed

VRCPlayerApi.SetWalkSpeed

VRCPlayerApi.SetStrafeSpeed

VRCPlayerApi.SetVoiceDistanceNear

VRCPlayerApi.SetVoiceDistanceFar

 

 

 

 

 

 

누르면 파티클이 실행됨

 

 

 

더보기

 

 

 

 

VectorSync

 

 

 

 

 

 

 

 

 

 

'게임 > VRChat' 카테고리의 다른 글

VRChat 월드계열 API 모음  (0) 2021.04.10
VRChat 아바타 3.0  (1) 2021.03.25
VRChat 오류 모음  (0) 2021.03.16
posted by 모카쨩

  • total
  • today
  • yesterday

Recent Post

저사양 유저용 블로그 진입