2017년 4월 25일 화요일

FBX Animation 및 Key Event를 사용하기

최근 작업 중에 3D 캐릭터의 애니메이션 재생이 필요했는데,
상황이 닥치면 하려고 신경쓰고 있지 않다가,
가이드가 살짝 필요한 상황이 되어서 간단히 남겨본다.

----------------------------------------------------------------------------------------

Unity 는 FBX 파일의 애니메이션 재생이 가능하다.
하지만, FBX 파일 그대로는 ReadOnly 라서 이것을 따로 복제해서 사용해야 한다.

시간이 없어서 일단 글만 먼저 정리!

[FBX 에서 애니메이션 파일을 가져오기]

1. 캐릭터 모델 데이터와 애니메이션 FBX 를 준비한다. (맥스, 마야, 블렌더 등등)

2. 1을 Unity Asset 폴더에 넣는다.

3. Unity 내 Project 탭에서 애니메이션 FBX 를 클릭해서 드롭다운 메뉴를 연다.
Animation 아이콘이 보이면 이것을 Control + D 해서 복제 한다.

4. Hierarchy 에 사용할 3D 캐릭터 모델을 배치

5. 해당 모델에 Animator 를 세팅

6. Animator 에서 움직일 Animation 을 3에서 복제한 Animation 파일로 지정한다.
(FBX 파일 내에 있는 것 말고 복제해서 밖에 생긴 것을 지정)

7. Unity 내에서 WIndow > Animation 탭을 연다.

8. Animation 탭이 열린 상태로 Hierarchy 의 모델 데이터를 클릭하면, 현재 적용된 Animation 을 확인할 수 있고 유니티 내에서 수정도 가능하다.

9. 끝


[Animation Frame에 Key Event 넣기]

FBX 파일 그대로 사용하기는 불가능 (Read Only)하기 때문에 먼저 애니메이션 파일을 복제해두어야 한다. (위 부분 FBX에서 애니메이션 파일을 가져오기를 먼저 한다.)

1. 적당한 C# 스크립트를 하나 만든다.
Ex) AnimationEventManager.cs
public void KeyEventReceiver(GameObject _obj)
        {
            Instantiate(_obj, this.transform, false);
        }

2. 만든 스크립트를 사용할 모델의 게임오브젝트에 add 한다.
(Animator가 붙어있는 gameObject)

3. Unity > Window > Animation 탭에서 Key Event 를 붙이고 싶은 Animation 을 선택한다.

4. Add Key Event 를 선택

5. 만들어진 Key를 클릭해서 Inspector 를 보면 호출할 함수를 풀다운 메뉴에서 선택할 수 있다. (만일 안되면 아까 그 키를 오른 클릭해서 Edit Key Event 선택)
여기에서 아까 만든 스크립트의 KeyEventReceiver() 를 선택한다.

6. 같은 화면의 GameObject 패러미터에 해당 이벤트 동작 시마다 생성할 프리팹을 끌어다 놓는다.

7. 끝.


참고 페이지 : https://docs.unity3d.com/Manual/animeditor-AnimationEvents.html

2017년 4월 24일 월요일

일본의 샘플 코드에 자주 보이는 Hoge 의 의미. (메타구문변수명)

일본쪽 개발서나 개발 블로그를 참고하는 경우가 많은데,
이쪽 분들은 일본어를 로마자로 적어서 변수명 따위에 사용하는 경우가 많다.

대표적인 것이 name 이라는 변수가 있으면 namae 로 적는다던가.
(오타가 아닌 것... 일본어 名前 = 이름 = name 이다)

대부분 알아보는데 크게 문제는 없는데,
대충 무슨 뜻인지는 알겠는데, 사전에도 없는 이상한(?)게 있어서 오늘은 큰맘 먹고 알아보았다.

바로 "HOGE" 넌 뭐냐..

일단 일본어 사전을 검색해봤다.
비슷한게 안 나오네...
이외나 의외 아니면 그 외 아무거나 이런 뜻인줄 알았는데...

근처 일본인에게 도움을 청했다.

HOGE 가 뭡니까?!
대충 이런 느낌으로 쓰고 있는데요. 라며 샘플 코드 전달.

void Hoge()
{
    StartCoroutine(HogeProcess());
}

난 프로그래머가 아니라 잘 모르지만 알아볼게~ 라시던 분이 의외로 금방 답변을 해주셨다.

--------------------

「ほげほげ」の由来は、「hogehoge」というメタ構文変数です。メタ構文変数とは、サンプルプログラムなどで意味のない名前が必要な場合に利用される、「意味のない名前」のことです。

入力する文字列は何でもいいのだけれど、入力しなければエラーになっていまう…という場合に用いられたのが「hoge」もしくは「hogehoge」です。

"ほげほげ"의 유래는 "hogehoge"라는 메타 구문 변수입니다. 메타 구문 변수는 샘플 프로그램 등으로 의미가없는 이름이 필요한 경우에 사용되는 "의미없는 이름"입니다.

입력 문자열은 무엇이든 좋은 것이지만, 입력하지 않으면 에러가 되어버리는... 경우에 사용 된 것이 "hoge"또는 "hogehoge"입니다.

---------------------

흠흠 그렇군.
이제 뭔지 알았으니 조금 더 찾아봤다.

---------------------

プログラミング言語では識別子(変数関数などの名前のこと)を自由に定義できるが、サンプルプログラムなどでまったく意味の無い変数に適当な名前がなく困ってしまうことがある。しかしどんな名前でも構わないからといって「wikipe」などとつけると、そのプログラムを見た他の人はその変数に何の意味があるのかと悩むことになる。そのようなときに、「abcd」や「hoge」(ほげ)をはじめとするメタ構文変数を利用する。メタ構文変数はプログラマの間でサンプル用の意味が無い変数名であることが認知されているので無用な混乱が避けられるほか、書く側も苦労して名前をひねりだす必要がなくなる。

프로그래밍 언어에서 식별자 (변수 나 함수 등의 이름에 대한 것)을 자유롭게 정의 할 수 있지만, 샘플 프로그램 등에서 전혀 의미없는 변수에 적당한 이름이 없어서 곤란 해 버릴 수있다. 그러나 어떤 이름이라도 상관 없다해서 "wikipe"라고 쓰면 그 프로그램을 본 다른 사람은 그 변수에 무슨 의미가 있는지 고민하게된다. 그런 때, "abcd" 또는 "hoge"(호게)를 비롯한 메타 구문 변수를 이용한다. 메타 구문 변수는 프로그래머 사이에서 샘플에 대한 의미가없는 변수 이름 인 것으로 알려져 있기 때문에 불필요한 혼란을 피할 수 있으며, 쓰는 사람도 고생해서 이름을 쥐어짤 필요가 없어진다.

출처  위키피디아

------------------

역시 별거는 아니었는데, 알고나니 묵은 체증이 풀린 느낌이라 좋다. :D

근데 좀 배신감(?)이 드는 것은...
오히려 Hoge 가 무슨 의미인가 고민하게 되었던 내 입장에선 조금 억울하네... (하하하)

2017년 4월 5일 수요일

Unity 엔진에서 Mesh 만들기 기본

이번에 좀 복잡한걸 (사람 얼굴 ㅠㅠ) 직접 그려야 하는 일이 발생하여,
귀찮음에 울면서 했다.

사실 Mesh 생성 방법 자체는 간단하다.

1. MeshFilter 를 생성
2. MeshRenderer 를 생성
3. MeshFilter 에서 Mesh 를 _mesh 등으로 가져온 뒤
4. 정점을 찍고,
5. uv 를 설정하고,
6. 삼각형을 그려준다. 이 때 그리는 순서에 따라서 앞뒤가 바뀌니까 주의.
만일 그린게 어디갔는지 보이지 않으면, 카메라를 돌려보자 반대로 그려져있을 수 있다.

1까지는 그럭저럭 금방했는데,
2와 3은 노가다로 열심히 맞춰서 만들었다.. -_-;
삼각형을 잘 그려야 한다. <-

아래는 삼각형을 그리는 예제.
void Start(){


        gameObject.AddComponent<MeshFilter>();
        gameObject.AddComponent<MeshRenderer>();
        _mesh = GetComponent<MeshFilter>().mesh;

        // 그릴 값을 입력.
        mesh.vertices = new Vector3[] { new Vector3(0, 0, 0), new Vector3(0, 1, 0), new Vector3(1, 1, 0) };
        mesh.uv = new Vector2[] { new Vector2(0, 0), new Vector2(0, 1), new Vector2(1, 1) };
        mesh.triangles = new int[] { 0, 1, 2 };

}

새 공유기 ASUS RT-AC68U 속도 테스트



유선 속도 측정. 매우 만족스럽다.
무선은 좀 더 테스트 한 후에 업데이트 하는 것으로...

과거에 쓰던 RT-AC56R 에 비해서 대충 160% 성능 향상이 있는 것 같다.



현재 이런 상태로 설치되어 있다.
안테나를 포함해서 백스테이지 같은 느낌으로 뭔가 미묘하게 잘 어울린다.
(...)

사실은 68 말고 88 시리즈로 해서 건담 발판으로 쓰고 싶었다.


2017년 4월 4일 화요일

마스크 오브젝트 쉐이더 간단하게 만들기

역시 일단 먼저 해봐야 해.

Unity 엔진 내에서 Shader 를 하나 만들고 아래의 코드를 입력한다.
그리고 Material 도 새로 만들어 조금전에 만든 Shader를 선택
(아래 코드는 Kpaper/MaskObj )

마스킹 오브젝트를 이용해서 AR 컨텐츠를 만드는데 사용하면 된다.

참 쉽죠?


Shader "Kpaper/MaskObj" {
 SubShader{
  // regular geometry 이후에 마스크를 render 한다.

  Tags{ "Queue" = "Background" }

  // RGBA 채널을 그리지 않는다, Depth buffer 로만 사용

  ColorMask 0
  ZWrite On

  // 패스에서는 아무것도 하지 않는다.

  Pass{
 }
 }
}