2017. 10. 16. 16:15

안녕하세요. 게임개발자 놀이터 입니다.


네이버 플러그 분석 포스팅입니다.


분석 내용은 Plug Unity 을 보고 만들었습니다.


감사합니다.




본 내용은 사진 한장으로 설명이 가능합니다.



감사합니다.

Posted by 시리시안
2017. 10. 16. 12:16

안녕하세요. 게임개발자 놀이터 입니다.


오늘은 NaverPlug SDK Unity 이용한 Android / IOS 연동 방법 에 대해 포스팅 하려합니다~


그럼 바로 들어갑니다!





NaverPlug SDK Unity 이용한 Android / IOS 연동 방법

 

IOS 11 대응 하기 위해 2.52버전으로 다운로드 받습니다.

https://github.com/naver/cafe-sdk-unity

 



 

압축을 해제 , lib 안에 있는 Unitypackage 프로젝트 폴더에 풀어줍니다.

 

 


 

테스트를 위해 Sample 폴더에있는 NCSDK_Sample.Scene 열어봅니다.

 

 

빌드 해봅시다.

 

Anroid 경우, 아무 문제 없이 바로 빌드가 됩니다.

 

하지만IOS 경우빌드 세팅해야 부분이 있습니다.

 

 

IOS

l 세로 모드 설정

세로 모드로 진행하는 게임을 개발할 때는 NCSDK/Plugins/iOS 폴더에 있는 NCSDKUnityManager.mm 파일에서 NCSDKManager.setOrientationIsLandscape 속성을 NO 설정합니다.

 


 

1.  NCSDK/Plugins/IOS/NaverCafeSDK.bundle IOS에서 include 되도록 설정해줍니다.

 



 

(Two Column Layout 사용하고 있다면, 왼쪽 폴더 경로상에서 Bundle 선택하면 인스펙터에 정보가 나오지않습니다. 오른쪽 파일 창에서 클릭 해줘야 합니다. )

 

2.  NCSDK/Plugins/IOS/ NaverAuth/ NaverAuth.bundle 마찬가지로 IOS에서 include 되도록 설정 해줍니다.

 


 

3.  IOS 빌드해서 XCODE 열어 봅니다.

 


 

4.  빌드를 하면 엄청난 에러를 있습니다. 이제부터 에러들은 해결하기 위해 설정을 할것입니다.

 


 

5.  Build Settings Other Linker Flags –ObjC 추가합니다.

 


 

6.  Build Phases Link Binary With Libraries 다음 라이브러리를 추가합니다. 추가한 라이브러리의 Status Required 설정합니다.

MobileCoreServices.framework

SystemConfiguration.framework

MediaPlayer.framework

AVFoundation.framework

CoreMedia.framework

AssetsLibrary.framework

Security.framework

ImageIO.framework

QuartzCore.framework

Webkit.framework

ReplayKit.framework(라이브러리의 Status Optional 설정합니다)

 



 

7.  다시 한번 빌드하면 정상적으로 빌드가 되는 것을 확인 하실 있습니다.

 


Posted by 시리시안
2017. 9. 7. 11:30

 

안녕하세요. 게임개발자 놀이터입니다.


오늘은 유니티에서 지원하는 협업도구인 Unity Collaboration에 대해서 적어보려고 합니다.


https://unity3d.com/kr/unity/features/collaborate


Unity 2017이 되면서 Unity 5.3에서부터 베타로 사용가능했던 Unity Collaboration가 베타가 종료되면서 사용이 가능해졌다고 합니다.


설정 방법은 


먼저 유니티 Window 메뉴에서 Services를 들어갑니다.



그후, 서비스 창에서 Off로 되어있는 Collaboration을 On으로 바꿔줍니다.





스위치 버튼을 눌러서 작동해주시면 됩니다.




그럼 우측 상단에 있는 Collab 버튼을 누르고 메세지를 적은 다음에 Publish Now! 버튼을 눌러주면 완료입니다!




팀원 초대 및 확인을 위해


https://developer.cloud.unity3d.com/projects/


에 접속하여 유니티 계정으로 로그인 합니다.


그럼 Collaborate를 ON 시킬 프로젝트가 있을겁니다.




클릭하여 접속합니다.





MultiPlayer나 Cloud Build 같은 다른 여러 기능들이 다 비활성화 되어있지만, 지금은 사용하는게 아니기 때문에, 상단에 있는 Users 창을 눌러서 이동합니다.




팀원의 이메일 주소를 윗 빈칸에 적고 Add를 누르면 팀원이 추가됩니다.

팀원을 추가를 하면 권한을 설정할 수 있습니다.

User은 프로젝트를 수정은 할 수 없고 테스트 플레이 정도만 가능한 권한이고

Manger은 프로젝트 수정 및 대부분의 수정이 가능한 권한

Owner은 프로젝트 전체를 수정할 수 있는 권한입니다.



이제 프로젝트에 팀원으로 추가한 팀원의 Unity를 실행하면 왼쪽 메뉴에서 On Disk가 아닌 On The Cloud를 눌러보면 프로젝트가 켜지면서 동시에 다운로드를 받습니다.


다운로드 후 프로젝트를 수정했다면 Collab에 들어가서 처음 업로드할때처럼 업로드하면 수정한 부분에 대해서만 업로드가 됩니다.


그럼 다른 팀원은 Collab을 눌러 Update Now! 버튼을 누르면 수정된 부분에 대해서만 업데이트를 진행합니다.




현재 유니티 Collaboration는 프로모션 기간입니다. ( 2017년 10월 5일까지)




프로모션 기간중엔 제한 없이 이용할 수 있지만 프로모션 기간이 끝나면, 무료사용자는 최대 3명의 팀원과 1기가의 클라우드 저장공간과 업로드 및 빌드 공유만 가능하고 매월 9달러 (최대 3명, 추가로 1명당 7달러)를 결제하면 25기가 저장공간과, 자동 빌드 기능을 받을 수 있다고 합니다.


유니티 프로 및 플러스 버전 사용자는 이미 유니티 팀 서비스를 받고 있어서 바로 위와 같은 효과를 받을수 있다고 합니다.


읽어주셔서 감사합니다.


Posted by 시리시안
2016. 2. 29. 16:11
XML만들기는 다음 포스팅을 확인해주세요


이미 만들어진 XML은 다음과 같은 코드로 불러올수있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
using UnityEngine;
using System.Collections;
using System.Xml;
using System.Xml.Serialization;
using System.IO;
using System.Text;
using System.Collections.Generic;
/**
@date 2016/02/29
@author 조원우(jjgaa2@naver.com)
@brief App에서 관리해야하는 모든 텍스트를, 처음에 XMl파일을 읽어와 알맞은 텍스트를 반환합니다.
*/
public class TextManager : MonoBehaviour
{
 
    void Awake()
    {
        LoadingText();
    }
 
    List<LocalWord> AllText = new List<LocalWord>();    ///< 이곳에 모든 Text가 쌓입니다.
    /**
@brief 변수 AllText에 xml로 만들어진 데이터를 불러와 짚어 넣습니다.
*/
    void LoadingText()
    {
        TextAsset textAsset = (TextAsset)Resources.Load("Texts");
        XmlDocument xmldoc = new XmlDocument();
        xmldoc.LoadXml(textAsset.text);
        //xml생성
        XmlNodeList Index_Table = xmldoc.GetElementsByTagName("index");
        XmlNodeList menu_Table = xmldoc.GetElementsByTagName("menu");
        XmlNodeList kor_Table = xmldoc.GetElementsByTagName("kor");
        XmlNodeList eng_Table = xmldoc.GetElementsByTagName("eng");
        XmlNodeList chi_Table = xmldoc.GetElementsByTagName("chi");
        for (int i = 0; i < Index_Table.Count; i++)
        {
            LocalWord mWord = new LocalWord();
            mWord.Index = System.Convert.ToInt32(Index_Table[i].InnerText);
            mWord.kor = kor_Table[i].InnerText;
            mWord.eng = eng_Table[i].InnerText;
            mWord.chi = chi_Table[i].InnerText;
            AllText.Add(mWord);
        }
    }
 
    public enum Enum_Language { kor, eng, chi };
    public Enum_Language Language = Enum_Language.kor;
 
    public string GetLocalizingText(int Index)
    {
        if (AllText[Index].Index == Index)
        {
            switch (Language)
            {
                case Enum_Language.kor:
                    return AllText[Index].kor;
                case Enum_Language.eng:
                    return AllText[Index].eng;
                case Enum_Language.chi:
                    return AllText[Index].chi;
            }
        }
        for (int i = 0; i < AllText.Count; i++)
        {
            if (AllText[i].Index == Index)
            {
                switch (Language)
                {
                    case Enum_Language.kor:
                        return AllText[Index].kor;
                    case Enum_Language.eng:
                        return AllText[Index].eng;
                    case Enum_Language.chi:
                        return AllText[Index].chi;
                }
            }
        }
 
        Debug.Log("[Error] 반환된 Text가 없습니다.");
        return "[Error] 반환된 Text가 없습니다.";
    }
 
}
 
/**
@date 2016/02/29
@author 조원우(jjgaa2@naver.com)
@brief 텍스트 데이터 클래스.    
*/
public class LocalWord
{
    public int Index;
    public string kor;
    public string eng;
    public string chi;
}
 
 
cs

.



Posted by 시리시안
2016. 2. 28. 23:41



가장 먼저 상단에 

using UnityEngine.SceneManagement;

을 추가 해줍니다.



유니티는 더이상 Application.LoadLevel 을 사용하지 않습니다.


대신 밑의 코드를 참고하세요




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using UnityEngine;
using UnityEngine.SceneManagement;
using System.Collections;
 
/**
@class SceneExample.cpp
@Date 2016/02/28
@author 조원우(jjgaa2@naver.com)
@brief 씬 매니저 사용
*/
public class SceneExample: MonoBehaviour {
 
    public void NextScene()
    {
        SceneManager.LoadScene("SceneName");
    }
 
}
 
 
cs


Posted by 시리시안
2016. 2. 25. 14:20

코루틴의 특성


1. 특정 작업을 단계적으로 발생하게 한다.

2. 시간이 흐름에 따라 발생하는 루틴을 작성할 수 있다.

3. 다른 연산이 완료될때까지 기다리는 루틴을 작성할 수 있다.

예를 들어, 컷 씬 시퀀스를 조직하거나 또는 단순히 적이 죽는 애니메이션을 기다린 다음, 재생성을 할 수도 있다.


만약 단지 몇 초 동안 특정 연산을 지연시키기를 원한다면, Invoke를 사용하는 것을 고려해보자..


우선, 확실하게 알고 넘어가자, 코루틴은 쓰레드가 아니다. 코루틴은 비동기가 아니다


헷갈릴수 있는데, 쓰레드는 프로그램에서 다른 쓰레드와 함께 비동기로 실행된다.

멀티프로세서 기계에서, 쓰레드는 실제 다른 쓰레드와 함께 동시에 코드가 실행될 수 있다.


그래서 코루틴이 무엇인가?


코루틴은 쓰레드가 아니다. ,  코루틴은 한번에 하나의 코루틴이 싱행되고, 게임의 메인쓰레드에 맞춰서 실행된다. 사실 함수를 호출하는것처럼 게임의 핵심 기능을 호출하는것과 같다,


따라서 코루틴은 쓰레드가 아니며 비동기도 아니기 때문에 사용할때 절대 동기화나 특정 값을 잠금하는것에 대한 걱정이 필요없다.

당신이 yield를 실행하여 완전히 통제 할 수 있기 때문이다.


따라서 코루틴이란, 부분적으로, 그리고 특정한 상황이 맞아 떨어졌을 때 실행되는 함수로써, 그 작업이 완료가 되기전까지, 미래의 어느시점에 재개 될 수 있는 함수이다.




위에 표를 보면 yield로 끈어준 코루틴들이 각각의 알맞는 상황에 호출된다.


밑에 간단한 코루틴을 보자


1
2
3
4
5
6
7
8
IEnumerator TestCoroutine()
{
      while(true)
      {
           Debug.Log(Time.time);
           yield return null;
      }
}
cs



이 코루틴은 영원히 작동하는 루프를 가지고 있다. 이 코루틴은 현재 시간으로 로그를 남기고, 그 다음 yield한다. 다시 재개될 때, 다시 루프를 돌아서 로그를 남기고, 한번 더 yield될 것이다.


루프안에 있는 코드는 정확하게 Update 함수와 같다. 단지 순서에따라 업데이트 다음에 실행될 뿐이다.


StartCoroutine(TestCoroutine())를 호출할 때, 코드는 첫번째 yield를 만날때까지 즉시 실행되며,

유니티 프로세스가 이 객체에 대해서 코루틴을 처리할 때, 다시 재개된다.


위에 있는 도표에 맞춰 코루틴안에서 호울하는 yield에 따라 다음 호출되는 지점이 달라진단느 것을 알 수 있다.


null - Update구문의 수행이 완료될 때까지 대기한다.


WaitForEndOfFrame - 현재 프레임의 렌더링 작업이 끝날 때까지 대기한다.


WaitForFixedUpdate - FixedUpdate구문의 수행이 완료될 때까지 대기한다.


WaitForSeconds - 지정한 초만큼 대기한다.


WWW - 웹에서 데이터의 전송이 완료될 때까지 대기한다.

(WaitForSeconds or null처럼 재시작한다.)


Another coroutine - 새로운 코루틴은 yielder가 재시작되기 전에 완료 될 것이다.



또한 yield break; 명령어를 실행할 수 있다. 이는 즉시 코루틴을 멈춘다.



요약


코루틴은 시간에 따라 혹은 외부의 처리가 완료되었을 때, 연산이 일어나는 순서를 정하는 정말 멋진 방법이다.


코루틴은 쓰레드가 아니다. 그리고 비동기가 아니다(동시에 일어나지 않는다.)


코루틴이 실행되고 있을 때, 다른 어떤 것들도 실행되지 않는다.


코루틴은 yield 문의 조건을 만족시켰을 때, 재개될 것이다.



Posted by 시리시안
2016. 2. 25. 11:38

함수 

Component GetComponentInChildren<type>() 

설명

게임오브젝트에서 type 타입의 컴포넌트나 depth-frist 찾기를 해서 얻은 그것의 자녀들 중 가장 빠른 자식을 돌려준다.


오직 활성 컴포넌트만 검사한다. 


1
2
3
4
5
6
7
8
9
10
using UnityEngine;
using System.Collections;
 
public class example : MonoBehaviour {
    public ScriptName mScript;
    void Start() {
        mScript = gameObject.GetComponentInChildren<ScriptName>();
        mScript.DoSomething();
    }
}
cs


Posted by 시리시안
2016. 2. 23. 15:10

절대좌표 연산을 사용하면서 부드러운 회전을 구현하려면 정말 귀찮다.

시작 Quaternion, 목표 Quaternion, Deltatime을 고려해 속도를 구해서 업데이트마다 카운트하면서 더해준다..

하지만 메서드 한방으로 이걸 전부할수있다면?

Quaternion.Slerp(현재 각도, 도착 각도, 속도);


위 메서드의 반환값을 transform.rotation에 대입해주면 된다.

각도에는 모두 Quaternion을 사용한다.



또한 Mathf.Slerp 로 같은 원래로 float도 가능하다.

Vector3도있으니 참고하자.

Posted by 시리시안
2016. 2. 22. 11:37

Recttransfrom이 가지고있는 SizeDelta 를 = new Vector2로 바꾸시면 됩니다.



rectTransform.sizeDelta = new Vector2( yourWidth, yourHeight);


Posted by 시리시안
2016. 2. 22. 10:38


상단에 Edit -> Project Setting -> Quality 에 들어가서


Rendering에 Texture Quality를 확인합시다.


FullRes로 해주면 깨짐 현상이 없어집니다.


(디폴트 세팅을 판타스틱으로 바꿔주시는게 마음편합니다.)

Posted by 시리시안