336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


리니지II 레볼루션 전직 클래스

 


[ 휴먼 ]

 

기본 직업

전직

설명

워리어

팰러딘

높은 방어력과 방어 스킬로 무장한 탱커

 

워로드

적을 지속적으로 약화시키며 싸우는 딜러

로그

트레져 헌터

적을 기절시킨 연속 공격을 쏟는 딜러

 

호크아이

광역 피해와 슬로우스킬을 가진 원거리 딜러

메이지

소서러

지속적인 화염 피해를 입히는 딜러

 

비숍

힐과 기절 스킬로 아군을 돕는 힐러

 

 


 


1. 팰러딘(검방패 전용)

- 스킬 1 : 슬램

  => 무기를 크게 휘둘러 피해를 입히고, 적을 넉다운 시킨다.

- 스킬 2 : 벤젼스

  => 고함을 질러 주변의 적들을 공격하고, 도발하여 자신을 공격하게 한다. 피격자는 공격력이 감소한다.

- 스킬 3 : 마제스티

  => 잠시동안 모든 공격에 대하여 어그로 증가와 함께 방어력이 증가.

 

 



 

 

2. 워로드(, 이도류 전용)

- 스킬 1 : 저지먼트

  => 무기를 크게 휘둘러 피해를 입히고, 적을 넉다운 시킨다.

- 스킬 2 : 썬더 스톰

  => 지면을 강하게 내려쳐 주변에 있는 적들에게 피해를 주고, 기절시킨다.

- 스킬 3 : 메이저러티 스위프

  => 공격 한번에 타격되는 적의 수와 공격속도가 증가.

 

 



 

 

3. 트레져 헌터(단검 전용)

- 스킬 1 : 샌드 클라우드

  => 전방에 흙먼지를 뿌려 적들에게 피해를 준다. 피격자는 시야가 방해되어 명중률이 감소한다.

- 스킬 2 : 백스탭

  => 적의 뒤로 순간이동하여 근처의 적들에게 피해를 주고 기절시킨다.

- 스킬 3 : 헤이스트

  => 잠시동안 공격속도가 대폭 증가한다.

 

 

 


 

4. 호크아이( 전용)

- 스킬 1 : 멀티플

  => 전방에 방사형으로 적들을 관통하는 화살을 뿌려 범위 안에 있는 적들에게 피해를 주고, 적다운 시킨다.

- 스킬 2 : 애로우 레인

  => 전방 5미터의 위치에 반경 4미터의 범위만큼 화살비를 뿌려 지속피해를 준다.

- 스킬 3 : 스나이프

  => 공격력과 명중률을 끌어올린다. 스나이프 상태에서는 거리의 적을 상대할 있다.

- 스킬 4 : 호크아이

  => 호크아이 상태에서는 크리티컬이 증가한다.

 


 

 

 

5. 소서러(지팡이 전용)

- 스킬 1 : 볼케이노

  => 전방에 강력한 불기둥을 생성하여 범위 적들에게 피해를 준다.

- 스킬 2 : 몰튼 보울

  => 전방으로 적들을 관통하고 최대 거리에서 폭발하는 거대한 화염 구체를 발사한다.

- 부스트 마나

  => 잠시동안 파티원들의 마나 잠재력을 일깨워준다. 영향을 받은 유저는 최대 MP 증가한다.

 

 

 

 

6. 비숍(지팡이 전용)

- 스킬 1 : 디바인 퍼니쉬먼트

  =>전방에 신성한 폭발을 일으켜 범위 적들에게 피해를 주고, 넉다운 시킨다.

- 스킬 2 : 메이저

  => 자신과 주변 파티원들을 신성한 힘으로 치유하여 HP 회복시킨다.

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


모바일 게임 리니지2 레볼루션


리니지2 레볼루션에는 4개의 종족이 있습니다.


휴면, 엘프, 다크엘프, 드워프.


머가 좋을가요? 그건 사실 개성에 맞게 하면 될것 같습니다.


휴먼 전직 보기


엘프 전직 보기


드워프


다크엘프 전직 보기



휴먼 : 벨런스형




엘프 : 회피, 마법형



다크엘프 : 치명타, 공격형



드워프 : 체력, 방어형



336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


1. 초기화면


 




2. 로그인화면







3-1. 로비화면


아래 그림처럼 [능력치], [아군], [스킬], [도감] 네개의 메뉴가 존재합니다.


재화는 마석과 골드라는 두가지 타입이 존재합니다.


광고를 통하여 획득할 수 있는 무료마석도 존재합니다.





3-2. 아군메뉴


스테이지를 완료하다보면 확률적으로 적군을 획득할 수 있습니다.


이 적군들은 로비에서만 배치/해제가 가능하며 각 캐릭터마다 다른 스킬/능력치가 부여됩니다.


불필요한 캐릭터는 일정 재화를 받고 판매할 수 있습니다.


전투 참여는 최대 원거리 3마리, 근거리 2마리로 제한되어 있습니다.


 




3-3. 스킬메뉴


메인영웅의 스킬들이 존재하며 사용자가 직접 눌러서 사용해야합니다.


해당 스킬들을 업그레이드 시키기 위해서는 일정의 스텟들이 필요합니다.


예를 들어 [힐]을 업그레이드 하기 위해서는 최초 체력회복 스텟 5가 필요합니다.






3-4. 도감메뉴


도감에는 어떤 캐릭터들이 존재하며, 해당 캐릭터를 어디에서 획득할 수 있는지,


그리고 해당 캐릭터의 상세 능력치 정보를 볼 수 있습니다.






4. 설정


우측 상단에 보이는 아이콘을 선택하면 설정창을 볼 수 있습니다.


설정에서는 배경음과 효과음을 On/Off 할 수 있는 기능이 있습니다.






5. 스테이지 화면


현재 챕터 개념으로 하나가 존재하고, 해당 챕터에는 총 100개의 스테이지가 존재합니다.





 

6. 전투화면


현재 적군은 스테이지 마다 한마리만 나타납니다.


메인영웅을 제외한 캐릭터들은 일정한 패턴에 의해 스킬을 발동 합니다.



336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

- NGUI 버전 : 3.9.8 -


NGUI 토글버튼 제어



전 포스팅에서 NGUI 토글버튼을 사용해서 메뉴를 만들었는데, 


메뉴를 선택하고 밖으로 나갔다가 다시 들어왔을 때


이전에 선택한 것으로 되어있습니다.


다시 말해서 초기화 과정이 필요합니다.


코드 몇줄만 추가하면 되는 작업입니다.


< ToggleHandler.cs 코드 >


using UnityEngine;
using System.Collections;

public class ToggleHandler : MonoBehaviour {

    // 어떤 버튼이 활성화 되었는지 표시하기 위함.
    public UILabel m_lblMessage;

    // 토글을 제어하기 위해 선언함.
    public UIToggle[] m_arrToggles;

    void Update()
    {
        // 키로 제어하는것 추가.
        if(Input.GetKeyDown(KeyCode.Alpha1))
        {
            m_arrToggles[0].value = true;
        }

        if (Input.GetKeyDown(KeyCode.Alpha2))
        {
            m_arrToggles[1].value = true;
        }

        if (Input.GetKeyDown(KeyCode.Alpha3))
        {
            m_arrToggles[2].value = true;
        }
    }

    // 토글 버튼이 바뀔 때 발생하는 이벤트
    public void OnChangeToggle()
    {
        // 현재 상태가 변한 토글버튼을 가져옵니다.
        UIToggle current = UIToggle.current;
        // 우리는 활성화 된 경우만 처리할 예정이므로,
        // 활성화 된것(value가 true)이 아닌경우(false인 경우) return합니다.
        if (current.value == false) return;
        // 확인을 위해 메시지를 뿌립니다.
        m_lblMessage.text = current.name;
    }
}



인스펙터를 보시면 Arr Toggels가 보이실 것입니다.


여기에서 메뉴가 세개이므로 3으로 세팅하고, 


ToggleA, B, C를 끌어서 연결시키겠습니다.




실행을 하고 


1, 2, 3을 누르면 선택이 되실 것입니다.




나중에 완성된 게임을 가지고 포스팅을 할 예정인데


그때 NGUI 토글도 필요하니 잘 기억해두시기 바랍니다.

'게임 프로그래밍 > NGUI' 카테고리의 다른 글

[NGUI] 토글버튼(Toggle)  (0) 2016.07.02
[NGUI] 버튼과 레이블  (0) 2016.06.07
[NGUI]스프라이트(SPRITE)  (0) 2016.05.26
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


FTP 파일 업로드 하기


< 테스트 파일 >

PUploader.zip



사실 테스트 코드 자체는 C# 프로젝트로 하였습니다.


그러나 유니티에서도 동일하게 사용 되므로, 


유니티 카테고리로 설정했습니다.(유니티 확인 완료)


에셋번들을 만들고, FTP로 파일을 업로드(Upload) 해야 하는데, 


매번 직접 해주어야 하니 불편하더라구요.


그래서 시간 조금 투자해서 FTP 파일 업로드를 테스트 했습니다.


* 정말 적은 시간으로 만든거라.. 버그가 많습니다.  코드만 참조하시길.



제 FTP 폴더입니다. 


UploadTest라는 폴더에다가 테스트 하려고 합니다.




테스트 프로그램입니다.


주소, 아이디, 비번, 그리고 폴더경로(이 하위에 애들이 FTP로 업로드 됩니다)를


설정하고 업로드를 누르면 올라갑니다.


실제 유니티에서 할 때에는 주소, 아이디 등을 코드에 박고 하세요.


테스트 프로그램이라서 이렇게 작성한 것입니다.




폴더를 선택하고 업로드를 누르면


정상적으로 올라간 리스트가 나타납니다.




콘솔 창에서도 결과를 볼 수 있습니다.




실제 FTP를 확인해 보면, 


제가 올린 폴더와 파일들이 올라가 있습니다.


테스트 성공.




주요 코드만 올리겠습니다.


즉, 실제 유니티에서 사용할 것만.


< FTP UPLOAD 코드 >


// 폴더 정보 가져오기.
                DirectoryInfo info = new DirectoryInfo(folder);
                // 우리는 루트 폴더를 제외하고 하므로, 전체 경로에서 루트 경로를 제거합니다.
                string folderName = info.FullName.Replace(_strPath, "");

                Console.WriteLine("TargetPath : " + URL + folderName);
                // FTP 주소 + 폴더 경로를해서 폴더를 만들겠습니다.
                FtpWebRequest request = (FtpWebRequest)WebRequest.Create(URL + folderName);

                // 비번 아이디를 치고, 여러 설정을 해줍니다.
                // 자신에게 맞게 설정하시면 됩니다.
                request.Credentials = new NetworkCredential(ID, PW);
                request.UsePassive = true;
                request.UseBinary = true;
                request.KeepAlive = false;
                // 폴더를 마들 것이므로, MakeDirectory로 해줍니다.
                request.Method = WebRequestMethods.Ftp.MakeDirectory;
                // 파일을 업로드 할 때에는 다음 메소드를 선택합니다.
                //request.Method = WebRequestMethods.Ftp.UploadFile;

                try
                {
                    // 이제 디렉토리를 만든다고 FTP로 요청을 합니다.
                    FtpWebResponse res = (FtpWebResponse)request.GetResponse();
                    // 요청이 실패하면 CATCH로 넘어갑니다.
                    // 요청이 완료 되었으므로, 리스트에 추가 합니다.
                    m_lUploadList.Add(URL + folderName);
                }
                catch (WebException ex)
                {
                    // 예외처리.
                    FtpWebResponse response = (FtpWebResponse)ex.Response;

                    switch (response.StatusCode)
                    {
                        case FtpStatusCode.ActionNotTakenFileUnavailable:
                            {
                                Console.WriteLine("CreateFolders ] Probably the folder already exist : " + folderName);
                            }
                            break;
                    }
                }


현재 코드는 예외처리 들이 하나도 안되어 있는 거네요.


실제 유니티(에셋번들 자동화)에서 사용할 때에는 


많은 예외처리가 필요할 수 있습니다.


도움되셨길 바랍니다.


336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

모바일 게임 세븐나이츠

* 쿠폰은 하단에 있습니다.

( 계정 당 1회 사용. 700 루비)


제가 해본 게임중 가장 이쁜(?) 게임입니다.


전 사실 몇년전에 하다가 그만 했었는데, 


요즘에 다시 받아보니 그래픽이 엄청 화려해 졌더라구요.


특히 스킬, 연출, 원화가 정말 멋지게 바뀌었습니다.


그림만 붙였으니, 간단히 감상만 하시길 바랍니다.




이번에 새로 해서 찍은 사진들이라 좀 허접하네요.


세븐나이츠 쿠폰 구하기 정말 힘들었습니다.


사용하신분은 중복사용 방지 위해 


댓글 부탁드립니다.


입력방법 : 메뉴->쿠폰->세븐나이츠 쿠폰입력


메뉴는 로비에서 우측 상단에 있습니다.


 쿠폰번호 :  5E4CF00985B54AE8 


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

[게임] 리니지II 레볼루션(종족)  (0) 2016.12.14
[게임] 커스텀  (0) 2016.09.18
모바일 게임 카카오 원(ONE)[쿠폰포함]  (0) 2016.06.14
[게임] 로스트 킹덤(Part II)  (0) 2016.06.02
[게임] 로스트 킹덤(Part I)  (0) 2016.06.02
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


유니티 버전 : 4.6.9


유니티 3d 4.x (Unity3d 4) 에셋번들 만들기 및 사용


이전에 유니티 5.x 에서 에셋번들을 만들었는데, 


유니티 4.x 에서 만드는 것도 포스팅합니다.



우선 씬에 다음처럼 큐브 하나를 만들겠습니다.


참고로 저는 미리 프리팹화 시켜서 Cube가 파란색입니다. (무시하세요)




리고 에셋번들을 만들 폴더를 Bundle이라는 이름으로 만들겠습니다.


그 하위로 A, B, C 폴더를 만들고


각 폴더안에 좀전에 만든 Cube를 프리팹 화 시키겠습니다.


정리하면 다음과 같습니다.


Bundle - A - Cube.prefab

           - B - Cube1.prefab

           - C - Cube2.prefab




에셋번들로 만들 항목들이 정해졌으니, 


이제 에디터를 하나 만들어 에셋번들로 만들겠습니다.


참고 : Creating Asset Bundlesin Unity 4


우선 편의를 위해 Editor 폴더를 만들고, 


BundleBuilder 라는 클래스를 하나 만들겠습니다.




자세한 코드 내용은 주석으로 설명하였습니다.


< BundleBuilder.cs 코드 >


using UnityEngine;
using System.Collections;
using UnityEditor;
using System.IO;

public class BundleBuilder : MonoBehaviour {

    [MenuItem("Assets/Build AssetBundle")]
    static void ExportResource()
    {
        // 저장할 에셋번들 이름.
        // 경로가 없을 경우 최상위(Assets상위)에 저장된다.
        // 현재 저장경로는 Assets/myAssetBundle 이다.
        string path = Application.dataPath + "/myAssetBundle";
        Object[] selection = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets);

        // 현재 선택된 항목
        // 게임오브젝트만 해당.
        // 만약 씬에 있는 항목이라면, activeObject대신 activeTransform 사용권장.
        if(Selection.activeObject != null)
            Debug.Log("Current : " + Selection.activeObject.name);
        // 선택된 모든(하위 포함) 항목들
        foreach (Object sel in selection)
        {            
            Debug.Log("Path ; " + sel.ToString() + ", path :"+ AssetDatabase.GetAssetPath(sel));
        }

        // Selection.activeObject가 들어간 곳이, mainAsset이 된다.
        // 세번째 인자는 에셋번들을 저장할 경로(파일명 포함)
        // 현재 테스트로 Android 플랫폼으로 하도록 한다.
        BuildPipeline.BuildAssetBundle(Selection.activeObject, selection, path,
                                       BuildAssetBundleOptions.CollectDependencies
                                     | BuildAssetBundleOptions.CompleteAssets, BuildTarget.Android);
    }
}



코드를 작성하였다면, 저장을 해주세요.


그러면 다음처럼 메뉴가 생겼을 것입니다.


아까 만든 Bundle폴더를 선택하고, 


Build AssetBundle메뉴를 선택하겠습니다.




그러면 이렇게 에셋번들 만들기를 시작합니다.




이제 프로젝트 루트 폴더(Assets)를 가보면, 


우리가 만든 myAssetBundle이라는 파일이 생겼을 것입니다.


* 확장자는 없어도 되고, 마음대로 넣으셔도 됩니다.




이제 실제 에셋번들을 로드하도록 하겠습니다.


저는 Loader라는 클래스를 만들겠습니다.


< Loader.cs 코드 >


using UnityEngine;
using System.Collections;

public class Loader : MonoBehaviour {

	// Update is called once per frame
	void Update () {
        if (Input.GetKeyDown(KeyCode.A))
        {
            StartCoroutine(Load());
        }
	}

    IEnumerator Load()
    {
        // 불러올 파일 경로.
        // pc의 경우 file:/// 로 시작하셔야 합니다.
        string path = "file:///" + Application.dataPath + "/myAssetBundle";
        // 캐시에 있을 경우 그대로 로드하고, 그렇지않은 경우 해당 경로에서 다운로드하여 캐시저장.
        WWW ww = WWW.LoadFromCacheOrDownload(path, 0);
        // 받을 때까지 대기합니다.
        yield return ww;
        // 에러가 있을 수 있으므로, 체크합니다.
        if (string.IsNullOrEmpty(ww.error) == false)
        {
            Debug.LogError("Error!! : " + ww.error);
        }
        // 이제 에셋번들을 가져오겠습니다.        
        AssetBundle bundle = ww.assetBundle;
        // 우리가 만든 어셋번들에는 Cube, Cube1, Cube2가 있습니다.
        // 세개 다 로드하겠습니다.
        if (bundle != null)
        {
            // 우리는 폴더을 선택하여 에셋번들을 만들었으므로, 
            // Selection.activeObject가 없습니다.
            // 즉, bundle.mainAsset이 없습니다.
            // 하위에 있는 프리팹을 이름으로 로드해야 합니다.
            // bundle.mainAsset <= null.
            GameObject gObj = bundle.Load("Cube", typeof(GameObject)) as GameObject;

            if (gObj == null)
            {
                Debug.LogError("gObjA not found");            
            }

            Instantiate(gObj);

            gObj = bundle.Load("Cube1", typeof(GameObject)) as GameObject;

            if (gObj == null)
            {
                Debug.LogError("gObjB not found");
            }

            Instantiate(gObj);

            gObj = bundle.Load("Cube2", typeof(GameObject)) as GameObject;

            if (gObj == null)
            {
                Debug.LogError("gObjC not found");
            }

            Instantiate(gObj);
            // 모두 사용했다면, unload하겠습니다.
            // 실제 매니저를 만드실 때에는 실시간으로load, unload를 해도 되겠지만, 
            // 그럴필요는 없습니다.
            // 해당 에셋번들을 들고 있어도 무관합니다.(압축되어있는 상태이므로)
            // unload를 false로 하면 에셋번들 내에 활성화 되어있는 오브젝트는 
            // unload되지 않습니다.
            // 만약 true로 하면, 활성화 되어있어도 unload되어버립니다.
            // 이럴 경우 missing이 날 수 있습니다.
            bundle.Unload(false);
        }
        else
        {
            Debug.Log("null");
        }
    }
}


코드 작성이 완료되었으면, 게임오브젝트에 


스크립트를 추가해주세요.


그리고 실행을 시켜줍니다.


우리는 A키를 누르면 로드하도록 되어있습니다.


A를 눌러보면 다음처럼 로드되는것을 확인할 수 있습니다.


< 결과화면 >



유니티4 에셋번들 만들 때 보면 


BuildPipeline.PushAssetDependencies() 와 Pop이 있는데


다른 에셋번들 사이에서 의존성을 유지시킬 때 사용합니다.


참고 : BuildPipeline.PushAssetDependencies


궁금한 점은 댓글 달아주세요.




336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


유니티3D 광고 붙이기(TEST 버전)


유니티에서 제공하는 광고를 붙여보려 합니다.


우선 실제 스토어에 등록된 것이 없으니 테스트용으로 하겠습니다.


그리고, Android가 테스트가 편하니 Android용 Ads를 달도록 하겠습니다.



우선 unity3d.com에 접속을 합니다.


그리고 상단에 서비스 메뉴가 있는데, 그쪽으로 들어갑니다.




그리고나서 하단에 보시면


UNITY ADS쪽에 자세히 보기가 있습니다.


클릭합니다.




이제 하단에 보이는 


지금 수익화 시작을 눌러줍니다.




그리고 아래 나오는 버튼을 눌러 


유니티에 로그인을 해 줍니다.




로그인이 완료되면 다음과 같은 화면을 보실 수 있습니다.


광고를 보여줄 게임이 필요하므로, 


새 게임 추가를 누르도록 하겠습니다.




Android로 테스트를 한다고 했습니다.


안드로이드 아이콘을 눌러 줍니다.


그럼 2단계가 나오는데, 현재 서비스 하고 있는 게임이 아니므로


하단에 "여기"를 눌러줍니다.




그럼 출시되지 않은것으로 나옵니다.


대충 이름을 써주고, 게임추가를 눌러줍니다.




3단계(마지막 단계)가 보입니다.


테스트용이므로, 아래처럼 선택하겠습니다.


* 실제 게임에서는 해당 게임에 맞도록 하셔야 합니다.




이제 광고를 보여줄 수 있는 게임이 추가되었습니다.


광고 설정을 위하여 추가한 게임이름을 눌러줍니다.




광고 설정을 위해 수익화 설정 메뉴를 눌러주고, 


고급 설정 보기 를 눌러줍니다.




그러면 기본적으로 세팅된 두개의 광고 리스트가 보입니다.


첫번째 광고는 보상이 없는, 즉 사용자가 스킵할 수 있는 광고 입니다.


저는 광고를 보고 보상을 주려고 합니다.


그러므로, 두번째 Rewarded광고를 사용할 것입니다.


그리고 아이디 가 있는데, 보여줄 광고에 필요하니 기억해야 합니다.


이제 설정을 눌러줍니다.




해당 광고의 상세페이지 입니다.


현재는 바꿀것이 없습니다. 차 후 변경할 일이 있으면 여기에서 하시면 됩니다.


그냥 저장을 눌러줍니다.




이제 광고 설정을 끝이 났습니다.


실제 유니티에서 광고를 달아보도록 하겠습니다.


유니티를 실행 하시고, 에셋스토어를 들어갑니다.


그리고 unityad라고 치시면 Unity Ads 에셋이 보입니다.


눌러서 다운받고, 패키지를 불러들입니다.




패키지를 잘 로드했다면, 다음처럼 Plugin에 Android와 iOS가 생겼을 것입니다.


이게 보이시면 잘 되신겁니다.




그리고 광고 보기 테스트를 위해 


다음처럼 화면을 구성하겠습니다.


가운데 검정색 네모는 광고보기 버튼입니다.


참고로 저는 NGUI로 테스트 하고 있습니다. 


참고 : [NGUI] 버튼과 레이블




광고를 보기위해 초기화와 보여주기 기능이 필요합니다.


저는 UIMan이라는 클래스를 만들도록 하겠습니다.


작성 후 게임오브젝트에 링크시켜주시기 바랍니다.


< UIMan.cs 코드 >


using UnityEngine;
using System.Collections;

// 광고 사용하기.
using UnityEngine.Advertisements;

public class UIMan : MonoBehaviour {

    // 광고 옵션값
    ShowOptions m_cShowOptions = new ShowOptions();
    // 광고보기 버튼.(광고 준비가 안될 때에 비활성 시키려고 들고있음)
    public GameObject m_gObjEventButton;
    // 보상 테스트
    int m_nGold = 0;
    // 현재 광고상태    
    ShowResult m_eResult = ShowResult.Failed;
    // 혹시 버튼 클릭했는데, 콜백이 안넘어 오는지 체크위함.
    bool m_bClicked = false;
    // 광고 클릭 카운트
    int m_nClickCount = 0;

    void Awake()
    {
        // 광고 최초 초기화 해준다.
        // Initialize(광고 번호, 테스트 모드인가)
        Advertisement.Initialize("120256", true);
        // 광고 완료할 때 처리할 콜백함수를 넣어준다.
        // System.Action 형태
        m_cShowOptions.resultCallback = OnAdsShowResultCallBack;
    }

	// Update is called once per frame
	void Update () {
        // 광고가 사용가능 한지 여부를 체크한다.
        // Adverisement.IsReady(광고 아이디)
        // 아까 생성한 곳 보면 광고 아이디가 있습니다.
        // 여러 광고중 하고자 하는 아이디를 넣어주면 됩니다.
        if (Advertisement.IsReady("rewardedVideoZone"))
        {
            m_gObjEventButton.SetActive(true);
        }
        else
        {
            m_gObjEventButton.SetActive(false);
        }
	}

    // 광고 버튼 클릭을 눌렀을 때 발동.
    public void OnClickButton()
    {
        m_bClicked = true;
        m_nClickCount++;
        // 해당 아이디의 광고를 보여준다.
        Advertisement.Show("rewardedVideoZone", m_cShowOptions);
    }
    // 광고 보기 완료 후 호출되는 콜백함수
    void OnAdsShowResultCallBack(ShowResult _result)
    {
        m_eResult = _result;
        // 정상적으로 완료 될 때에만 처리하도록 하겠습니다.
        if (_result == ShowResult.Finished)
            m_nGold += 50;

        // 정상적으로 CallBack이 들어왔다면, 클릭여부 false.
        m_bClicked = false;
    }

    void OnGUI()
    {        
        // 현재 보상받은거.
        GUI.Label(new Rect(10, 50, 500, 30), "Gold : " + m_nGold.ToString());
        // 콜백 결과
        GUI.Label(new Rect(10, 100, 500, 30), "Result : " + m_eResult.ToString());
        // 광고 클릭 카운트와, 클릭상태 여부 표시.
        GUI.Label(new Rect(150, 100, 500, 30), "ClickCount : "+ m_nClickCount.ToString() 
                + ", Clicked : "+ m_bClicked.ToString());
    }
}


모두 완료가 되었습니다.


Android 단말기에 넣고 테스트를 하겠습니다.


< 최초 실행화면 >



< 광고 보기 버튼 클릭 >



< 광고 보고 난 후 결과 > 


저도 실제 광고를 달아보지 않아서, 실제 달때에는 어떻게 다른지 아직은 모르겠네요.


실제 광고를 달고 나서 다른 점이 있을 경우


다시 포스팅 하도록 하겠습니다.


도움되셨길 바랍니다.

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


- NGUI 버전 : 3.9.8 -


NGUI 토글버튼 기초


게임을 구현하다 보면, 토글 버튼이라던가 라디오버튼이 필요할 때가 있습니다.


이를 위해 NGUI에서는 UIToggle이라는 컴포넌트를 제공합니다.


이 기능에 대해 간단하게 알아보고, 다음 포스팅에서 


제어할 수 있게 구현하도록 하겠습니다.



* 포스팅에 사용되는 이미지는 유료라서 공유가 힘듭니다. 양해바랍니다.


우선 아래 그림처럼 배치를 하도록 합니다.  


ToggleA(Gray)는 빈 게임오브젝트 이며, 자식으로 버튼들이 들어갑니다.


NGUI에서 기본 뼈대 만드는 법과, Button 만드는 법은 다음을 참고하세요.


[NGUI] 스프라이트(SPRITE)


[NGUI] 버튼과 레이블




이제 ToggleA(Gray)게임 오브젝트에 


UIToggle과 UIToggleComponents를 추가합니다.


(나머지도 동일하게 추가합니다)


Box Collider넣고 Size 설정하는거 잊지 마시기 바랍니다.


그리고 아래 설명에 나온것처럼 세팅을 해 줍니다.




실제 기능은 완료가 되었습니다. 아주 간단하죠.


이제 확인을 해보고 위해서 레이블 하나를 추가하겠습니다.


[NGUI] 버튼과 레이블 참고




ToggleHandler라는 스크립트를 하나 만들고, 


다음 처럼 코딩하겠습니다. (설명은 주석으로 하겠습니다)



< ToggleHandler.cs 코드 >


using UnityEngine;
using System.Collections;

public class ToggleHandler : MonoBehaviour {

    // 어떤 버튼이 활성화 되었는지 표시하기 위함.
    public UILabel m_lblMessage;

	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
	
	}

    // 토글 버튼이 바뀔 때 발생하는 이벤트
    public void OnChangeToggle()
    {
        // 현재 상태가 변한 토글버튼을 가져옵니다.
        UIToggle current = UIToggle.current;
        // 우리는 활성화 된 경우만 처리할 예정이므로,
        // 활성화 된것(value가 true)이 아닌경우(false인 경우) return합니다.
        if (current.value == false) return;
        // 확인을 위해 메시지를 뿌립니다.
        m_lblMessage.text = current.name;
    }
}



코드 작성이 완료되었으면, 


ToggleHandler.cs를 UI Root 게임 오브젝트에 넣어줍니다.




메시지를 봐야하므로, Message를 연결시켜줍니다.




마지막 단계만 남았습니다.


ToggleA(Gray)를 선택하보면, 아까 넣어둔 UIToggle이 보입니다.


거기에 보면 On Value Change라는게 보이는데, 


상태가 변하면 발생하는 이벤트 입니다.


우리가 만든 함수를 거기에 등록하도록 하겠습니다.




이제 실행을 하고 버튼을 눌러보면, 다음과 같은 결과를 볼 수 있습니다.



< 결과 >



기본 기능은 간단하지만, 


제어를 하려면 수작업이 좀 필요합니다.


다음 포스팅에는 제어하는 방법에 대해 설명하도록 하겠습니다.


궁금한 사항은 댓글달아주세요.



'게임 프로그래밍 > NGUI' 카테고리의 다른 글

[NGUI] 토글버튼(Toggle) 제어  (0) 2016.07.13
[NGUI] 버튼과 레이블  (0) 2016.06.07
[NGUI]스프라이트(SPRITE)  (0) 2016.05.26
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

C# CSV 파일 읽기(CSV Reader)



원래 XML을 사용하려고 했는데, 


읽는 속도가 CSV가 빠를것 같아서 간단히 구현을 하려합니다.


다음과 같은 데이터로 테스트를 하겠습니다.


ID앞에 #을 붙인 이유는 첫 라인이 키라는것을 명시하기 위함입니다.


* 파싱할 때 첫 라인을 키로 잡아도 됩니다.




만든 테이블을 CSV로 저장을 하였다면, 


인코딩을 UTF8로 바꿔주셔야 합니다.


그래야 모든 언어에서 오류없이 작동합니다.


자동 저장은 http://slway000.tistory.com/17 를 참고하세요.


우선 수작업으로 하기 위해, 메모장으로 열어서 다음처럼


인코딩을 UTF-8로 바꿔줍니다.




다음은 C#으로 작성한 코드 입니다. 


(테스트 코드를 만들고 나중에 유니티에 적용할 예정입니다.)


파일을 읽어들여 한라인씩 읽어서 


키와 값들을 구분시켜 처리하도록 합니다.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace CSVParse
{
    class Program
    {
        static void Main(string[] args)
        {
            string strFile= "testcsv.csv";

            using (FileStream fs = new FileStream(strFile, FileMode.Open))
            {
                using (StreamReader sr = new StreamReader(fs, Encoding.UTF8, false))
                {
                    string strLineValue = null;
                    string[] keys = null;
                    string[] values = null;

                    while ((strLineValue = sr.ReadLine()) != null)
                    {
                        // Must not be empty.
                        if (string.IsNullOrEmpty(strLineValue)) return;

                        if (strLineValue.Substring(0, 1).Equals("#"))
                        {
                            keys = strLineValue.Split(',');

                            keys[0] = keys[0].Replace("#", "");

                            Console.Write("Key : ");
                            // Output
                            for (int nIndex = 0; nIndex < keys.Length; nIndex++)
                            {
                                Console.Write(keys[nIndex]);
                                if (nIndex != keys.Length - 1)
                                    Console.Write(", ");
                            }

                            Console.WriteLine();

                            continue;
                        }

                        values = strLineValue.Split(',');

                        Console.Write("Value : ");
                        // Output
                        for (int nIndex = 0; nIndex < values.Length; nIndex++)
                        {
                            Console.Write(values[nIndex]);
                            if (nIndex != values.Length - 1)
                                Console.Write(", ");
                        }

                        Console.WriteLine();
                    }
                }                
            }            
        }
    }
}



결과화면입니다.




아주 간단한 예제이기 떄문에 실제 데이터 파싱할 경우


예외처리가 필요할 수 있습니다. 



+ Recent posts