@Sun,

First, You should setup meta format in Unity Editor'setup
1.Open Editor setup
사용자 삽입 이미지
2. Change or Check "Version control mode" and "Asset Serialization mode" ("Visible Meta file", "Force Text")
사용자 삽입 이미지
3. Now close Unity3D and open the "Explorer" and Go your source's path. 
4. Remove not necessary folder and files (You need just 2 folders "Assets" and "ProjectSettings" (I just compress it. however, you can move these folders to other media)
사용자 삽입 이미지
* Please let me know what you block something.


2017/10/13 05:10 2017/10/13 05:10
TAG , ,
We had to meet Drawcall problem in Mobile game developing using unity 3D.
You should solve it by 2 combination way.

1. Make shard material.
2. Combine mesh.

I writing down about "Combine mesh"

1. Make next script as CombineChild on Unity3D

using UnityEngine;
using System.Collections;

[RequireComponent(typeof(MeshFilter))]
[RequireComponent(typeof(MeshRenderer))]
public class CombineChild : MonoBehaviour
{
void Start()
{
Matrix4x4 thisTransform = transform.worldToLocalMatrix; 
MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter>();
CombineInstance[] combine = new CombineInstance[meshFilters.Length];
int i = 0;
while (i < meshFilters.Length)
{
combine[i].mesh = meshFilters[i].sharedMesh;
combine[i].transform = thisTransform * meshFilters[i].transform.localToWorldMatrix;
meshFilters[i].gameObject.SetActive(false);
i++;
}
transform.GetComponent<MeshFilter>().mesh = new Mesh();
transform.GetComponent<MeshFilter>().mesh.CombineMeshes(combine); //, true, true, true);

transform.GetComponent<MeshFilter>().mesh.RecalculateNormals();
transform.gameObject.SetActive(true);
}
}


2. and Please attach to parent gameobject.

Cheers
2017/10/10 02:42 2017/10/10 02:42

first time, Update the code in iTween.cs file

void CallBack(string callbackType){
if (tweenArguments.Contains(callbackType) && !tweenArguments.Contains("ischild")) {
//establish target:
GameObject target;
if (tweenArguments.Contains(callbackType+"target")) {
target=(GameObject)tweenArguments[callbackType+"target"];
}else{
target=gameObject; 
}

/// Start of update
if (tweenArguments[callbackType] is Action<object>)
{
((Action<object>)tweenArguments[callbackType]).Invoke((object)tweenArguments[callbackType + "params"]);
}
else
/// End of update


//throw an error if a string wasn't passed for callback:
if (tweenArguments[callbackType].GetType() == typeof(System.String)) {
target.SendMessage((string)tweenArguments[callbackType],(object)tweenArguments[callbackType+"params"],SendMessageOptions.DontRequireReceiver);
}else{
Debug.LogError("iTween Error: Callback method references must be passed as a String!");
Destroy (this);
}
}
}

Now, You could use the Action<T> delegate in iTween.


iTween.ValueTo(gameObject,
iTween.Hash(
"from", 1f,
"to", 0f,
"time", 1f,
"onupdate", (System.Action<object>)(x => { missedInfo.color = new Color(1f, 0f, 0f, (float)x); }),
"oncomplete", (System.Action<object>)(x => missedInfo.gameObject.SetActive(true))
)
);

 

 

2017/10/06 07:32 2017/10/06 07:32
I am curious why they made UI System complex.
anyway, If you get any event from Event system(on UI), you can choice 2 options.

1. Using EventTrigger 
=> In my thinking, It's so terrible idea.It needs so many manual tasks. So I skip it. 

2. Using EventSystem
=> It's simple. However, I am finding another solution. Because it's not automation by runtime script.

a. add using...
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using UnityEngine.EventSystems;


b. inherit from interfaces
public class BehaviorButton : MonoBehaviour, IPointerEnterHandler {

}


c. add Method
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using UnityEngine.EventSystems;

public class BehaviorButton : MonoBehaviour, IPointerEnterHandler {
    public void OnPointerEnter(PointerEventData eventData) 
    {
 
    }
}


You can find it on unity's manual. (https://docs.unity3d.com/Manual/SupportedEvents.html)

IPointerEnterHandler - OnPointerEnter - Called when a pointer enters the object
IPointerExitHandler - OnPointerExit - Called when a pointer exits the object

IPointerDownHandler - OnPointerDown - Called when a pointer is pressed on the object
IPointerUpHandler - OnPointerUp - Called when a pointer is released (called on the original the pressed object)

IPointerClickHandler - OnPointerClick - Called when a pointer is pressed and released on the same object

IInitializePotentialDragHandler - OnInitializePotentialDrag - Called when a drag target is found, can be used to initialise values
IBeginDragHandler - OnBeginDrag - Called on the drag object when dragging is about to begin
IDragHandler - OnDrag - Called on the drag object when a drag is happening
IEndDragHandler - OnEndDrag - Called on the drag object when a drag finishes
IDropHandler - OnDrop - Called on the object where a drag finishes

IScrollHandler - OnScroll - Called when a mouse wheel scrolls

IUpdateSelectedHandler - OnUpdateSelected - Called on the selected object each tick

ISelectHandler - OnSelect - Called when the object becomes the selected object
IDeselectHandler - OnDeselect - Called on the selected object becomes deselected

IMoveHandler - OnMove - Called when a move event occurs (left, right, up, down, ect)

ISubmitHandler - OnSubmit - Called when the submit button is pressed
ICancelHandler - OnCancel - Called when the cancel button is pressed

* 영어 울렁증 가지고 계신분들께 죄송 -_-;; 
* 영어 연습겸 블로그에 영어로 작성중입니다.

2017/09/25 08:06 2017/09/25 08:06
* Prepare: Windows

1. Download Java JDK : http://www.oracle.com/technetwork/java ··· 151.html2. Install JDK
3. Open control panel
4. Open system path & Variable (Environment variable)
   a. search & run control panel.
   b. click System.
   c. click Advanced System setting.
5. create new system variable.
   a. JAVA_HOME: {Java JDK Path} (for example: D:\Program Files (x86)\Java\jdk1.8.0_25)
   b. CLASS_PATH: %JAVA_HOME%\lib
   c. PATH (just add new value): %JAVA_HOME%\bin
6. Download & Install Android Studio : https://developer.android.com/studio/index.html
7. Open Unity3d and Open Preferences
8. Click External Tool tab
9. Setup JDK / Android and NDK

Done

   

2017/09/13 17:28 2017/09/13 17:28
I wrote down install log of gitlab on the Mac.

1. Install docker : 
2. make "/srv" folder on root.
3. update permission it and add shared folder on docker's reference.
사용자 삽입 이미지
사용자 삽입 이미지


4. pull gitlab image from docker hub : docker pull gitlab/gitlab-ce
5. start gitlab
sudo docker run --detach \
--hostname vrainiac.ddns.net \
--publish 443:443 --publish 80:80 --publish 22:22 \
--name gitlab \
--restart always \
--volume /srv/gitlab/config:/etc/gitlab \
--volume /srv/gitlab/logs:/var/log/gitlab \
--volume /srv/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce:latest

* perhaps you could saw this message on the log : ruby_block("directory resource: /var/opt/gitlab/git-data/repositories")

6. stop gitlab : docker stop gitlab
7. update permission
sudo chmod 0777 /srv/gitlab/data
sudo chmod 2770 /srv/gitlab/data/git-data/repositories
8. start gitlab : docker start gitlab

Fin!
2017/09/12 12:27 2017/09/12 12:27
~ 설치 로그남깁니다.

Install step by step.


1. Install dotnet core 1.1
2. install VSCode
* Link : https://www.microsoft.com/net/core#windowscmd

3. Open VS Code and "Open folder" any

4. Open Console in VS Code (CTRL+`)

5. "dnvm upgrade" in console

6. "npm install -g yo grunt-cli generator-aspnet bower" in console

7. "yo aspnet" in colsole and select "WEB API" and type your want "project name"

8. re-open project folder with "Open folder"

9. add next 2 lines into dependenciestaginproject.json file
"Microsoft.AspNetCore.StaticFiles": "1.1.0",
"Microsoft.AspNetCore.WebSockets.Server": "0.1.0"
10. Add next 2 lines into Configure in Startup.cs file
app.UseDefaultFiles();
app.UseStaticFiles();
11. Open Explorer tab and click a "wwwroot" folder

12. make new folder as "app"

13. make new file as "index.html" on wwwroot
<!DOCTYPE html>
    <html>
        <head>
            <title>Hello Angular</title>
            <meta charset="UTF-8">
            <meta name="viewport" content="width=device-width, initial-scale=1">
            <style>
                body {color:#369;font-family: Arial,Helvetica,sans-serif;}
            </style>

            <!-- Polyfills for older browsers -->
            <script src="https://unpkg.com/core-js/client/shim.min.js"></script>
            <script src="https://unpkg.com/zone.js@0.7.4?main=browser"></script>
            <script src="https://unpkg.com/reflect-metadata@0.1.8"></script>
            <script src="https://unpkg.com/systemjs@0.19.39/dist/system.src.js"></script>
            <script> window.autoBootstrap = true; </script>
            <script src="https://cdn.rawgit.com/angular/angular.io/b3c65a9/public/docs/_examples/_boilerplate/systemjs.config.web.js"></script>
            <script> System.import('Script').catch(function(err){ console.error(err); });</script>
        </head>

        <body>
            <my-app>Loading AppComponent content here ...</my-app>
        </body>
</html>


14. make new file as "app.component.ts" on wwwroot/app
import { Component } from '@angular/core';

@Component({
    selector: 'my-app',
    template: `<h1>Hello {{name}}</h1>`
})
export class AppComponent { name = 'Angular'; }


2017/01/23 18:26 2017/01/23 18:26
슈팅게임으로 만들었어요.

소스 다운로드
강의자료

요즘 집필중이라서 정신이 하나도 없습니다. 
부실한 자료지만 참고하시기 바랍니다.


2017/01/04 15:30 2017/01/04 15:30

많은 인디 개발자 또는 프로개발자 조차도 모바일 UX를 지키지 않고 그냥 개발하고 있어 안타깝더군요.

PC 마우스 UX의 경우는

- Hover In / Out
- Click
- Double Click 

이렇게 이벤트를 먹이지만, 

모바일의 경우는 
- Pressed 
- Unpressed 로

- Press 됐을때 버튼을 확대하고
- 만약 사용자가 버튼 영역을 벗어나서 손을 떼면 원상복귀되면서 명령이 취소됩니다.
- 만약 사용자가 버튼 영역을 벗어나지 않고 손을 떼면 원상복귀되면서 명령이 실행됩니다.

일전에 작성했던 이벤트 통합하기로 구현하였으니 참고하시고 다음 소스를 보시면 이해가 쉬우실거 같네요.

참고 링크 : http://www.wolfpack.pe.kr/909


먼저 버튼을 2개 만들어 놓으시고 이벤트 통합용 스크립트는 다음과 같습니다.

using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;

public class UIManager_Intro : MonoBehaviour {

    const float workTerm = 0.2f;

    public static UIManager_Intro instance;
    public void Awake()
    {
        UIManager_Intro.instance = this;
     }

     private void SetScaleUp(GameObject _obj, bool isPressed)
     {
         if (isPressed)
         {
             iTween.ScaleTo(_obj, new Vector3(1.1f, 1.1f, 1.1f), workTerm);
         }
         else
         { 
             iTween.ScaleTo(_obj, new Vector3(1f, 1f, 1f), workTerm);
         }
     }

     private bool DetectHoverSameObject(GameObject _obj)
     {
         RaycastHit hit;
         Ray ray = NGUITools.FindCameraForLayer(_obj.layer).ScreenPointToRay(Input.mousePosition);
         if (Physics.Raycast(ray, out hit, Mathf.Infinity))
         {
             return (hit.collider.gameObject == _obj);
         }
         return false;
     }

     public void Button1_OnPress(GameObject _obj, bool isPressed)
     {
         SetScaleUp(_obj, isPressed);
         if (!isPressed && DetectHoverSameObject(_obj)) StartCoroutine(LoadingScene("usingAnchor"));
    }
 
    public void Button2_OnPress(GameObject _obj, bool isPressed)
     {
         SetScaleUp(_obj, isPressed);
         if (!isPressed && DetectHoverSameObject(_obj)) StartCoroutine(LoadingScene("inputField"));
     }

     IEnumerator LoadingScene(string _sceneName)
     {
         yield return new WaitForSeconds(workTerm);
         SceneManager.LoadScene(_sceneName);
     }
}


버튼1에만 우선 적용합니다. 스크립트는 다음과 같습니다. 
using UnityEngine;
using System.Collections;

public class Behavior_Button1 : MonoBehaviour {

    void Start () {
        UIEventListener.Get(gameObject).onPress += UIManager_Intro.instance.Button1_OnPress;
    }
}



결과 1. 마우스를 클릭하여 Press 시뮬레이팅
사용자 삽입 이미지
결과2. 취소 (드레그하여 다른곳에서 손 뗌)
사용자 삽입 이미지
결과 3. 명령실행 (원상복귀후 다른씬으로 이동)
사용자 삽입 이미지


2016/09/22 09:23 2016/09/22 09:23

Z사 인터뷰 후기

Developer 2016/04/23 15:08
아마 1달 좀 넘은 시간에, 취업은 개뿔... 걍 영어공부나 더 하자 하던때에...
Linkedin에서 Z사 리쿠르트가 이메일이 왔습니다.

- 유니티3D 네트워크 포지션 있는데 지원할 생각이 있나?

그날 개인 프로젝트가 막혀서 머리가 다 터져 나가던 상황이라...
개인 프로젝트 하고 있는데 문제만났어. 이거 끝나면 Resume 보내줄께 하고 답장하고는...



다음날인가에 업댓한 Resume 보냈고, 해당 팀의 정보를 포함에서 전화 인터뷰까지 몇 번의 이메일을 주고 받았습니다.
* Resume와 함께 예전에 교재로 만들어 놓은 해당팀에서 하는 일을 Working Mockup 만들어 놓은 것도 같이 보냈습니다.





첫 전화인터뷰에서는 간략한 Job Description을 들었고, 몇가지 질문이 있었는데,

- 어디사냐?
- 헤드쿼터는 SF에 있는데 이동 가능하냐? 
- 현재 채용중인 포지션은 유니티 네트워크 엔지니어인데 플랫폼 개발 경험있냐?
- 유니티 플러그인은 얼마나 만들어 봤냐?

등등등을 물어본 걸로 기억납니다. 그리고 "다음주까지 연락 주겠다."하고 전화를 끊었습니다.
이후에 XX팀과 OO팀에 줬는데 OO팀에서 너 한테 관심있다. 2차 전화면접 준비하자라는 답을 받았고,

2차 전화 면접을 기대하며 온라인 협업 코드창을 열고 헤드셋 구해서 전화를 기다렸지만, 비러먹을 Verizon 이 안터져 다시 1주일 뒤로 연기되었습니다.

2차 전화 면접에서는 
- 백그라운드 설명해봐라
- 우리팀 일이 하드한데 괜찮냐?
- 버전관리 해봤어?
- 유니티에서 Restful할때 어떻게 하지?
- 리얼타임 서버는 어때?
등등등을 물어 봤고 예정된 시간을 넘겨서 전화로 정신없이 대답하고 드디어 대망의 Onsite 면접을 받았습니다.
(눈물 날거 같더군요... T_T 한국에서 와 달라는 회사는 많았어도 이렇게 대차게 몇 백장의 Resume를 공중에 날려버린게 처음인지라... T_T)

뭐 암튼, 공짜 티켓 캄사히 받아 들고 LAX에서 샌프란으로 슈웅 날라 갔습니다. 아침 7시 뱅기라 4시에 일어난건 덤...

* 고픈 배를 채우는 땅콩과 건과류.. 맛이 꽤 있는 편입니다.
사용자 삽입 이미지

* 버스 정류장 내리는걸 놓쳐서.. 걷고 걸은 끝에 저 멀리서 보이는 Z사! 
사용자 삽입 이미지

* 10시정도에 도착해서는 세상을 게임으로 연결하고자 했던 비전을 바라보며... 맘속으로 "그럼 잘좀 해봐요!!!"
사용자 삽입 이미지

* 그렇게 시간 보내고 나서 Presentation 자료 데모를 위해 30분 일찍 아름다운 HR 담당자와 함께 인터뷰장으로 이동... 세상에나!!!!!
사용자 삽입 이미지
감격해서 쓰러질뻔 했습니다. 문을 열자 마자 격렬히 환영하는 글씨를 보고는 눈물이 글썽글썽... (저건 제가 나올때까지도 화이트 보드 테스트 보면서도 남겨뒀어요.)
드디어 4명의 인터뷰와 1:1로 제 Presentation 10분 정도 하고 알고리즘, 방법론, 관리, 설계 등등등의 화이트보드 테스트를 받았습니다.

* 구체적인건 회사 보안으로 소송 걸릴 수 있다고 지인분께서 말씀해주셔서 밝힐 수는 없고 잘 알려진 문제중

- Test코드 작성
- 자료구조 설계
- Sort 구현
- LinkedList 구현
- Auto Build System 설계
- Unity3D Plugin 개발
- 네트워크 Fault Debugging 등을 테스트 받았습니다.

가장 인상적이었던건 간단한 게임을 설계하고 자료구조 만든뒤에 판정하고 AI구현하는걸 아주 빠르게 토의하면서 만들었습니다.
(4시간이 좀 넘는 시간동안 다 태웠다고 표현할 수 밖에 없을 정도로 제가 알고 있는 지식과 경험을 다 토해 냈습니다.)

온사이트 면접 기회가 별로 없었던 제가 잘은 모르겠지만, 이 친구들 평가하는 걸 유심히 보니...

- 문제를 주고 풀어 보라 해요. OO한번 만들어보자.
- 옆에서 서서 피면접자가 문제를 푸는 과정을 관찰합니다.
- 피면접자가 이리 저리 물어보면 대답해줍니다. 
- 문제 풀이가 막히면 직접적인 힌트도 줍니다.
- 한마디로 코딩을 할 줄 알면 문제푸는건 일도 아니게 됩니다.

물론 제가 최종 오퍼받은게 아니기 때문에 너무 단정지어 이야기할 수 있지만, 정말 옆에서 문제 푸는 걸 도와줍니다. 
하지만, 그걸 주도하는 사람은 어디까지나 피면접자이고 인터뷰어는 절대 주도하지 않으면서 옆에서 앉아 있거나 옆에 서서 미소 짓고 있을 뿐입니다.
(어떤 회사는 코드 한줄 쓸때마다 마구마구 깹니다. 왜 소문자로 시작하냐? 부터 시작해서.. ㄷㄷㄷ 뽁는 회사도 있고, 어떤회사는 정답이 있고 그 정답을 체크하는 회사도 있습니다. 가령 XXX프레임워크를 사용할때 Life Cycle이 뭐냐? 등의 기초 지식을 물어보는 회사도 있습니다.)


문제푸는 방법은 개발을 조금 해보신분들이라면 다들 공감하시겠지만, 어떠한 알고리즘 문제라도 기초 지식이 있으면 숫자나 그림으로 시뮬레이션 하면 금방 답이 나옵니다.
예를 들어, 2의 승수인지 확인하는 알고리즘을 만들라가 문제라면

Test Data를 먼저 화이트 보드에 씁니다.

2^0 = 1
2^1 = 2
2^2 = 4
2^3 = 8
2^4 = 16

이렇게 그냥 써놓고는 나서 한발짝 떨어져서 보면 패턴이 보입니다. 이경우는 정확하게 Log를 사용하면 해결가능한 문제입니다.
물론 그걸 맞다 틀리다 하는 사람은 인터뷰어겠지만요.

하지만, 더 중요한건 이 문제를 풀어가는 방법과 생각하는걸 옆에서 관찰하더군요.
(정답을 맞추는건 중요하지 않았어요.)

다 했다고 하면, 그제서야 앞으로 나와서 검산하고 맞다, 틀리다하고 물어봅니다.
물론 저는 반골기질이 있어서,

- Array Sort하라고 해서 왜? C#은 Array.Sort() 있어 그거 쓰면 되잖아?
- LinkedList 만들라 해서, MS가 LinkedList 느리다고 비춘데 그걸 왜써야해?
와 같은... 쿨럭... (물론 그리고 나서 그런데 니가 원하는건 손으로 직접 하길 원하는 거지?라고 물어보고 얌전히 썼습니다. T_T)

알고리즘 테스트같이 실무적인 내용이 끝나면 반드시 2가지를 물어봅니다.
- Big-O 는 어떻게되지?
- 질문있어? <<< 이게 흘리면 나 안들어가겠다는 의미로 보시면 됩니다.

질문있어라는 말속에 숨어 있는 의미는 얼마나 네가 이회사와 인터뷰어에 대해 공부하고 왔는지 확인하는 겁니다.
(온사이트 면접이전에 HR에서 인터뷰어의 이름 미리 줍니다)

마치고 나오면서 정말 죽어도 여한이 없을 정도로 다 쏟아 놓고 나왔습니다.
너무 깔끔했고 떨어져도 "와~ 정말 좋은 경험했다. 저런 회사는 클래스가 달라도 너무 다르구나!" 이런 생각이 들 정도였습니다. 


사무실에서 나와서 건너편 Starbucks 에서 커피 한잔 시켜놓고 Thankyou Letter 써서 보내며 일정을 마무리하고 나니 시간이 얼마 안남은 관계로 지하철 플랫폼으로 이동...

* LA로 가는 길에 찍은 풍경들... 사무실 나와서 제일 처음 본 풍경
사용자 삽입 이미지
* 전기 버스도 있어요!
사용자 삽입 이미지

* 시티홀이 우어~~~ 참고로 여기에서는 갈매기가 닭둘기를 대신합니다. 오리보다 조금 큰 넘들이 뒤뚱뒤뚱 거리면서 날아 가지도 않아요...
사용자 삽입 이미지

* 지하철 플랫폼에서 요금 계산할 줄몰라 한참 혜매다가 결국 현지 샌프란 아저씨의 도움을 받아 겨우 계산하고 티켓팅 한뒤에 열차까지 안내 받는 호사를 누렸습니다 T_T
(샌프란 사람들 알라뷰!!!)
사용자 삽입 이미지
* 샌프란 지하철을 BART라고 하더군요. 자리는 앞으로 또는 뒤로 앉도록 되어 있습니다. 뒤로 앉았더니 평소 몸이 기억하던 중력과 달라서 살짝 기분이 이상하더군요.
(지금 저는 진행방향과 반대방향을 찍은 겁니다.)
사용자 삽입 이미지

좋은 소식 있었으면 좋겠습니다만, 기분 좋은 인터뷰와 다르게 결과는 신만이 아시겠죠?
(God willing...)


* 기본 알고리즘은 여기 참고하세요.
http://bigocheatsheet.com/
2016/04/23 15:08 2016/04/23 15:08