반응형

Toogle UI를 이용해서 ON/OFF UI를 제작해보겠습니다.

 

일단 Hierarchy에서 오른쪽 클릭하여 Toogle UI를 생성합니다.

 

 

Hierarchy에서 Toogle이 가지고 있는 하위 오브젝트를 보면 Background(배경 이미지), Checkmark(체크 이미지), Lavel(텍스트)로 구성되어있는 것을 확인할 수 있습니다.

일단 텍스트는 필요 없기 때문에 Label은 제거합니다.

 

그리고 Toggle 오브젝트를 클릭해서 Inspector창을 확인해보면, 다음과 같이 구성되어있습니다.

Is On은 토글의 초기 상태를 켬 / 끔을 선택합니다.

 

Toggle Transition을 보시면 Fade / None이 있는데 이건 스르륵 사라지거나 생성되는 효과를 줄 건지를 정하는 건데 많은 차이가 없는 것 같습니다.

 

Graphic에 있는 이미지가 체크 해제를 하면 사라질 이미지 오브젝트를 지정합니다.

 

단순하게 해당 이미지 오브젝트를 사라지게 하는 것 같습니다. 하위에 있는 자식 오브젝트까지 사라지지 않습니다.

 

체크를 해제하면 checkmark 오브젝트의 이미지를 사라지게 합니다.

 

그래서 이것을 이용해 체크되었을 때는 ON이미지를 표시하고 체크 해제되면 ON이미지를 없애도록 구현하려고 합니다.

 

체크 해제 시에는 OFF가 표시되어야 하므로 바탕 이미지는 Background에 OFF이미지를 등록합니다.

 

Checkmark오브젝트에 Source Image를 On이미지를 넣습니다.

 

 

그리고 이미지 사이즈에 맞춰서 Width와 Height도 조절합니다.

 

제가 추가한 이미지 사이즈는 Width가 197, Height가 103이기 때문에 맞춰서 넣어줍니다.

 

그리고 Background 오브젝트에 OFF이미지를 넣어줍니다.

 

마찬가지로 이미지 사이즈에 따라서 Width, Height를 넣습니다.

 

이제 실행해봅니다.

 

클릭할 때마다 ON이 생기고 사라지는 것을 볼 수 있습니다.

 

Toogle이 바뀔 때마다 이벤트 처리는 Toogle 오브젝트의 Inspector창을 보시면 On Value Changed에서 함수를 넣어주면 됩니다.

 

그리고 참고로 토글 내 영역 외에도 더 넓게 클릭 시 영향을 받게 하고 싶다면 Toogle하위에 오브젝트를 생성하면 됩니다.

 

이렇게 하면 GameObject 영역을 클릭해도 영향을 받습니다.

 

하위 자식 오브젝트의 영향을 다 받는 것으로 보입니다.

 

소리 끄기 영역을 클릭하거나 ON/OFF영역을 클릭하면 ON이미지가 사라지거나 생성됩니다.

 

 

반응형
반응형

안녕하세요.

 

힘들게 만든 게임에서 수익을 얻으려면 게임 내에 광고를 붙여야 합니다.

 

그래야 보람도 있고, 살림살이도 나아지고.. 다음 게임도 제작할 수 있기 때문이죠...

 

그래서 오늘은 유니티에서 구글 애드몹 광고를 넣는 법에 대한 내용을 적어보겠습니다.

 

안드로이드에서만 연동할 것이기 때문에 IOS는 다른 사이트로 검색해보시는 것이 좋을 것 같습니다.

 

진행하겠습니다.

 

일단 아래 과정으로 진행할 예정입니다.

 

1. 구글 애드몹 가입

2. 앱 등록

3. unity plugin 다운 후 프로젝트에 임포트(Import)

4. 테스트 프로젝트에 코드 작성

 

 

 

1. 구글 애드몹 가입

아래 사이트에 접속합니다.

https://www.google.co.kr/admob/

 

Google AdMob - 모바일 앱 수익 창출, 분석, 조정

Google을 활용한 앱 홍보 애드워즈 유니버설 앱 캠페인을 사용하여 검색, Google Play, YouTube, Gmail, Google 디스플레이 네트워크에서 앱을 홍보하세요. ₩100,000달러를 지출하면 ₩100,000달러의 광고 크레딧이 제공됩니다. > 자세히 알아보기

www.google.co.kr

그리고 기존 구글 계정이 있다면, 구글 계정으로 로그인하고, 없다면 새롭게 회원가입을 해서 로그인합니다.

 

 

가입하기를 누르면 다음과 같이 나옵니다.

 

여기서 저는 대한민국, 서울, 대한민국 원으로 기입하고 약간 동의 체크를 했습니다.

 

계정 생성이 완료되면 다음 페이지가 나오게 되는데, 저는 무슨 내용이 오는지 궁금해서 다 "예"로 체크했습니다.

"아니요"하셔도 상관없을 것 같습니다.

이제 가입은 완료되었습니다.

 

 

2. 앱 등록

 

이제 다음과 같은 페이지가 뜨는데, 시작하기를 누릅니다.

 

다음엔 앱을 게시했는지 확인하는 페이지가 뜨는데, 저는 아직 앱을 올리지 않았기 때문에 "아니요"를 눌렀습니다.

 

"예"일 경우 등록된 앱을 검색해서 찾아줍니다.

 

앱 이름을 입력하고 유니트 프로젝트를 작성할 때 사용해야 하기 때문에 기억해둡니다. 메모장 같은데 적어두는 것을 추천합니다)

 

다음과 같이 기입 후 추가 버튼을 눌러서 다음 페이지로 넘어갑니다.

 

앱이 AdMob에 추가되었습니다.

앱 ID는 나중에 사용해야 하기 때문에 앱 ID를 메모장 같은데 복사해놓고 "다음 단계:광고 단위 만들기"를 누릅니다.

 

 

그람 광고 단위를 설정할 수 있는 페이지가 나오는데, 저는 전면 광고를 선택합니다.

 

 

광고 단위 이름을 입력 후 "광고 단위 만들기" 버튼을 누릅니다.

 

 

앱 ID와 단위 ID를 메모장에 넣고, 완료 버튼을 누릅니다.

 

 

등록이 완료되었습니다.

 

그 후 실제 광고 게재 설정을 위해서는 다음과 같은 설정이 필요합니다.

 

다음은 결제 세부정보를 입력하고 제출을 누릅니다.

 

스크린샷을 깜빡하고 못 찍었네요..

 

완료하면 다음과 같은 페이지가 뜹니다.

 

 

 

3. unity plugin 다운 후 프로젝트에 임포트(Import)

 

다음 사이트에 접속해서 플러그인을 다운로드합니다.

 

https://developers.google.com/admob/unity/start

 

시작하기  |  Unity  |  Google Developers

Unity에서 앱을 제작 중인 AdMob 게시자를 위한 모바일 광고 SDK입니다.

developers.google.com

 

버전이 계속 업데이트되기 때문에 다른 페이지가 보일 수도 있지만, 2019년 10월 3일 기준으로 다음과 같은 페이지에서 

unitypackage를 다운로드합니다.

 

임포트 할 프로젝트를 열어둔 후 임포트를 합니다.

임포트 후 유니티 빌드 세팅을 Android로 설정합니다.

 

이렇게 뜬다면 "Enable"을 누릅니다.

 

이 화면이 뜨지 않고 Plaform이 이미 바꾸었다면,

 

Unity 편집기에서 Assets(애셋) > Play Services Resolver(Play 서비스 리졸버) > Android Resolver(Android 리졸버) > Resolve(해결)를 선택합니다.

 

이후 Google AdMob설정을 합니다.

 Assets(애셋) > Google Mobile Ads > Settings

Inspector창을 보면 Google AdMob을 Enabled 체크하고 AppID를 넣습니다.

 

 

 

 

4. 테스트 프로젝트에 코드 작성

유니티에서 테스트할 버튼 UI를 만들어줍니다.

버튼을 이용해서 광고를 보여줄 예정입니다.

빈 게임 오브젝트를 만든 후 스크립트를 생성해서 넣습니다.

 

스크립트를 작성합니다.

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
100
using System;
using UnityEngine;
using GoogleMobileAds.Api;
 
public class GoogleAdsManager : MonoBehaviour
{
    private BannerView bannerView;
    private InterstitialAd interstitial;
 
    // Start is called before the first frame update
    void Start()
    {
#if UNITY_ANDROID
        string appId = "ca-app-pub-3940256099942544~3347511713";
#elif UNITY_IPHONE
        string appId = "ca-app-pub-3940256099942544~1458002511";
#else
        string appId = "unexpected_platform";
#endif
        MobileAds.Initialize(appId);
 
        RequestInterstitial();
 
    }
 
    // Update is called once per frame
    void Update()
    {
        
    }
 
 
    private void RequestInterstitial()
    {
#if UNITY_ANDROID
        string adUnitId = "ca-app-pub-3940256099942544/1033173712";
#elif UNITY_IPHONE
        string adUnitId = "ca-app-pub-3940256099942544/4411468910";
#else
        string adUnitId = "unexpected_platform";
#endif
 
        // Initialize an InterstitialAd.
        this.interstitial = new InterstitialAd(adUnitId);
        // Called when an ad request has successfully loaded.
        this.interstitial.OnAdLoaded += HandleOnAdLoaded;
        // Called when an ad request failed to load.
        this.interstitial.OnAdFailedToLoad += HandleOnAdFailedToLoad;
        // Called when an ad is shown.
        this.interstitial.OnAdOpening += HandleOnAdOpened;
        // Called when the ad is closed.
        this.interstitial.OnAdClosed += HandleOnAdClosed;
        // Called when the ad click caused the user to leave the application.
        this.interstitial.OnAdLeavingApplication += HandleOnAdLeavingApplication;
        // Create an empty ad request.
        AdRequest request = new AdRequest.Builder().Build();
        // Load the interstitial with the request.
        this.interstitial.LoadAd(request);
 
        
 
    }
    public void HandleOnAdLoaded(object sender, EventArgs args)
    {
        MonoBehaviour.print("HandleAdLoaded event received");
    }
 
    public void HandleOnAdFailedToLoad(object sender, AdFailedToLoadEventArgs args)
    {
        MonoBehaviour.print("HandleFailedToReceiveAd event received with message: "
                            + args.Message);
    }
 
    public void HandleOnAdOpened(object sender, EventArgs args)
    {
        MonoBehaviour.print("HandleAdOpened event received");
    }
 
    public void HandleOnAdClosed(object sender, EventArgs args)
    {
        MonoBehaviour.print("HandleAdClosed event received");
        RequestInterstitial();
    }
 
    public void HandleOnAdLeavingApplication(object sender, EventArgs args)
    {
        MonoBehaviour.print("HandleAdLeavingApplication event received");
    }
    public void AdsShow()
    {
        if (this.interstitial.IsLoaded())
        {
            this.interstitial.Show();
        }
        else
        {
            RequestInterstitial();
        }
    }
}
 
cs

 

AdsShow() 함수를 버튼 클릭 시 연결합니다.

 

앱 ID와 광고 단위 아이디는 테스트용 아이디를 사용했습니다.

실제 광고를 보려면 아까 발급받은 아이디를 사용하면 됩니다.

1시간 정도면 적용이 된다고 하는데, 그 이상이 걸릴 수 있을 것 같습니다.

1시간이 지났는데도, 테스트 광고는 뜨는데, 실제 광고가 안 뜨는 경우 Google Mobile Ads SDK Developers 그룹에 문의를 한 블로그가 있어서 링크를 했습니다.

https://hoonihoon.tistory.com/category/Admob

 

'Admob' 카테고리의 글 목록

앱, IT, 블로그, 생활상식, 등 도움이 되는 모든 것을 공유 합니다.

hoonihoon.tistory.com

댓글에서 확인해보면 플레이 스토어에 올리면 해결이 된다고합니다.

반응형
반응형

오래 책상에 앉아서 일하다 보니까

 

허리에 무리가 가고 버틸 수 없어서 스탠드업 책상에 관심을 가지기 시작했습니다.

 

여러 모델이 많았는데, 크기도 크고 업 / 다운을 자유롭게 할 수 있는 니스툴 스탠드업 데스크 M35 모델을 구매하게 되었습니다.

 

http://thewall.kr/product/detail.html?product_no=1517&cate_no=248&recommend_type=l#none

 

서서일하는 니스툴 스탠드업데스크 M35

SHIPPING TO : 가나(GHANA) SHIPPING TO : 가봉(GABON) SHIPPING TO : 가이아나(GUYANA) SHIPPING TO : 감비아(GAMBIA) SHIPPING TO : 과테말라(GUATEMALA) SHIPPING TO : 그레나다(GRENADA) SHIPPING TO : 그루지야(GEORGIA) SHIPPING TO : 그리스(GREECE) SHIPPING TO : 기니(GUINEA) SHIPPING TO : 기니비소

thewall.kr

 

배송 후 다음날에 바로 왔습니다.

 

무게가 너무 무거워 택배기사님이 들고 올라오시는데 많이 힘드셨을 것 같습니다.

 

허리가 안 좋아서 구입하신 분들이 많으실 텐데 구입하게 되면 꼭 다른 사람과 같이 드시길 바랍니다.

 

많이 많이 무겁습니다.

 

일단 박스를 열면 스티로폼으로 쌓여있습니다.

박스를 열면 제품과 설명서가 들어있고, 움직이지 않도록 잘 포장이 되어있습니다.

 

설치는 설명서를 보면 쉽게 할 수 있습니다.

 

키보드 자판 놓는 부분만 조립하면 됩니다.

 

양측에 있는 손잡이를 같이 잡아서 업 / 다운을 할 수 있습니다.

 

 

키보드와 마우스를 넣어도 아래 공간이 많이 넓어 보입니다.

 

모니터와 노트북을 올려놓았을 때도 공간이 넉넉한 것을 볼 수 있습니다.

 

 

조금 더 써봐야 알겠지만, 생각보다 커서 올리고 내릴 때 많이 어려울까 걱정되었는데, 올리고 내리는 것도 쉽고,

공간이 넉넉해서 좋은 것 같습니다.

반응형
반응형

안녕하세요

 

구글에는 검색 등록을 했는데, 네이버 검색 등록은 아직 하지 않아 등록하면서 포스팅하려고 합니다.

 

일단, 등록을 위해서 네이버 웹마스터 도구 사이트에 접속을 합니다.

 

https://webmastertool.naver.com/

 

네이버 웹마스터도구

웹마스터도구에서 내 사이트의 검색 반영 정보와 웹 표준 가이드를 확인하세요

webmastertool.naver.com

그리고 네이버 계정으로 로그인합니다.

 

계정이 없으시거나 이것만을 위해 사용하시려면 계정을 다시 만드시면 됩니다.

 

로그인하면 다음과 같은 화면이 뜹니다.

 

 

여기서 추가하려는 사이트 주소를 넣고 추가 버튼을 누릅니다.

 

그러면 다음과 같은 화면이 뜹니다.

 

HTML 태그가 수월할 것 같아서 HTML 태그로 추가하겠습니다.

 

메타테그를 복사합니다.

 

그리고 tistory 관리자 페이지로 갑니다.

 

관리자 페이지 왼쪽 메뉴를 보시면 스킨 편집이라고 있습니다.

 

그 메뉴를 선택합니다.

 

 

스킨 편집을 누르면 다음과 같은 화면이 출력되는데 html 편집 버튼을 누릅니다.

 

 

그리고 아까 복사해놓은 HTML 태그를 코드에 넣습니다.

 

그리고 적용 버튼을 누릅니다.

 

다시 네이버 웹마스터 도구 웹페이지로 돌아갑니다.

 

자동 등록 방지 글자를 입력 후 확인 버튼을 누릅니다.

 

등록된 것이 보입니다.

 

근데 이게 끝이 아닙니다.

 

다음 과정은 rss제출을 해야 합니다.

 

등록한 웹페이지를 누르면 다음과 같은 화면이 뜹니다.

 

 

여기서 요청 - RSS제출을 누릅니다.

 

에디트 박스에 등록한 사이트에 /rss를 붙여서 넣어준 후 확인 버튼을 누릅니다.

 

 

등록된 것을 확인할 수 있습니다.

 

그리고 다음으로는 사이트맵을 등록해야 합니다.

 

요청 - 사이트맵 제출입니다.

 

일단 사이트 맵을 만들어야 합니다.

 

http://www.check-domains.com/sitemap/index.php

 

XML Sitemap Generator - Free Unlimited Pages.

XML Sitemap Generator - Free Unlimited Pages

www.check-domains.com

이 사이트에 접속합니다.

 

 

설정을 한 후 Create Sitemap을 입력합니다.

 

그럼 포스팅한 개수에 따라 다른데 저는 개수가 많이 없어서 10분 정도밖에 안 걸릴 거 같습니다.

 

끝나면 XML sitemap항목에서 사이트맵 다운로드를 합니다.

 

이제 티스토리에 다운로드한 sitemap을 등록해야 합니다.

 

글쓰기 첨부파일로 올려야 합니다.

 

근데 중요한 점은 새 에디터가 아니라 예전 에디터를 이용해서 올려야 합니다.

 

안 그러면 k.kakaocdn.net으로 시작하는 거처럼 나와서 등록할 수 없습니다.

 

이렇게 설정합니다.

 

관리자 페이지에 설정 - 새로운 글쓰기를 사용하지 않습니다 로 설정합니다.

 

 

그리고 글쓰기를 눌러 사이트맵을 첨부해서 글을 올립니다.

 

게시글을 열어서 다음과 같이 링크 주소 복사를 합니다.

 

 

그리고 사이트맵 제출에서 Ctrl + v 해서 붙여 넣습니다.

 

https://scvtwo.tistory.com/를 제거하고, 

attachment/cfile4.uf@dhfkjsdfhisdhfisudhfi.xml를 넣은 후 확인을 누릅니다.

 

 

이상입니다.

반응형
반응형

안녕하세요.

 

앱을 제작 후 혼자만 한다면 상관없지만, 대부분의 사람들은 다른 사람들이 내가 개발한 앱을 했으면 좋겠다고 생각할 것입니다.

 

그러기 위해서는 안드로이드 앱은 구글 플레이에 앱을 등록해야 합니다.

 

일단 앱을 등록하려면 Google Play 개발자 계정 등록부터 해야 합니다.

 

오늘은 구글 플레이에 앱을 올릴 수 있도록 개발자 등록하는 과정을 소개하려고 합니다.

 

 

Google Play Console로 접속합니다.

https://play.google.com/apps/publish/signup/#

 

Redirecting...

 

play.google.com

 

일단 구글 계정이 필요합니다.

 

기존에 사용하는 계정이나 새로운 계정을 다시 생성해서 로그인해야 합니다.

 

 

18세 이상임을 확인한 후 25달러를 결제할 신용카드를 준비한 후

 

"결제 페이지로 이동" 버튼을 누릅니다.

 

그럼 결제 페이지가 뜨고,

 

카드 정보를 입력합니다.

 

이때 스크린샷을 안 찍고 결제를 눌러버려서 이미지가 없네요;;

 

개발자 프로필에 대해 입력합니다.

 

개발자 이름, 이메일 주소, 웹사이트, 전화번호를 입력합니다

 

개발자 계정 ID는 부여되어있습니다.

 

저는 전화번호 입력을 어떻게 해야 하는지 혼란스러웠습니다.

 

010-5555-2222라면 +82-10-5555-2222로 입력합니다.

 

입력을 완료하면 다음과 같은 페이지가 뜹니다.

 

 

정말 쉽게 개발자 등록이 완료되었습니다.

 

이제 어엿한 구글 Goolgle Play 개발자가 되었습니다.

반응형
반응형

 

안녕하세요.

 

오늘은 안드로이드에서의 백버튼을 눌렀을 경우 게임이 종료와 홈버튼을 눌러서 프로그램이 비활성화 되었을 경우에 대해서 알아보겠습니다.

 

유니티 종료 함수

Application.Quit() 함수를 이용하여 종료를 합니다.

 

사용은 다음과 같이 합니다.

1
2
3
4
5
6
7
8
void Update()
{
    if (Input.GetKeyDown(KeyCode.Escape))
    { 
        Application.Quit();
    }
}
 
 
cs

 

참고로 Input.GetKeyDown(KeyCode.Escape) 이건 에디터상에서는 ESC키를 입력했을 때이며, 안드로이드폰에서 실행했을 경우에는 백버튼을 눌렀을 경우 발생이 됩니다.

 

비활성화 시 처리

OnApplicationPause 함수에서 처리를 합니다.

다음과 같이 OnApplicationPause에서 정지시 이벤트를 구현합니다.

1
2
3
4
void OnApplicationPause(bool pauseStatus)
{
    m_bPause = pauseStatus;
}
 
cs

 

 

응용

종료 함수를 넣고, 간단하게 text ui값이 1초마다 1씩 증가하는데, 비활성되었을 경우 잠시 중지되고, 활성화되면 다시 증가하도록 구현해보겠습니다.

구성은 이렇게 했습니다.

Text와 Button을 생성하고 빈 GameObject를 생성합니다.

용도는 Text는 숫자가 증가하는 값을 넣을것이고, Button은 직접 기기로 테스트가 불가능하므로 버튼에서 OnApplicationPause를 호출하도록 하겠습니다. 그리고 빈 GameObject에 스크립트를 넣겠습니다.

버튼 변경 내용
GameObject 스크립트추가

 

이렇게 하고 스크립트에 다음 코드를 넣습니다.

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
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class GameManger : MonoBehaviour
{
    GameObject m_goText;
    float m_fCount = 0;
    bool m_bPause = false;
    void Start()
    {
        m_goText = GameObject.Find("Canvas/Text");
        m_goText.GetComponent<Text>().text = "1";
    }
    void Update()
    {
        if (!m_bPause)
        {
            m_fCount += Time.deltaTime;
            m_goText.GetComponent<Text>().text = "";
            m_goText.GetComponent<Text>().text += (int)m_fCount;
        }
        // 백버튼을 눌렀을 경우 게임 종료
        if (Input.GetKeyDown(KeyCode.Escape))
        {
            Application.Quit();
        }
    }
    // 임의로 버튼에 OnApplicationPause호출
    public void SetPause()
    {
        OnApplicationPause(!m_bPause);
    }
    // 백버튼 눌렀을 때 발생하는 함수
    void OnApplicationPause(bool pauseStatus)
    {
        m_bPause = pauseStatus;
    }
}
 
 
cs

 

이렇게 하면 버튼을 눌렀을 경우 카운터를 잠시 중지하고, 다시 누르면 진행되는 것을 볼 수 있습니다.

 

반응형
반응형

안녕하세요.

 

오늘은 게임에서 화면을 드래그해서 UI를 볼 수 있는 UI Scroll View를 구현해보겠습니다.

 

1. UI를 만들겠습니다.

보통 게임상에서는 버튼을 스크롤하는 경우가 많기 때문에, 여러개의 버튼을 생성해서 스크롤 할 수 있도록 만들려고합니다.

3가지 오브젝트를 만듭니다.

바탕이 될 이미지 오브젝트, 스크롤할 빈 GameObject, 스크롤할 버튼들을 만듭니다.

- Hierarchy에서 오른쪽 클릭 후 UI - Image에서 이미지 오브젝트를 생성합니다.

 

- 그리고 Canvas에서 빈오브젝트를 생성합니다.

- 같은 방식으로 버튼들을 여러개 생성합니다.(UI - Button)

 

저는 4개정도를 생성해보겠습니다.

 

그러면 Hierarchy에 다음과 같이 오브젝트가 생성되어있는 것을 볼 수 있습니다.

 

2. 이제 위치와 사이즈를 조정하겠습니다.

이미지 오브젝트의 구석에 위치 시키고 사이즈를 화면에 맞춥니다.

그리고 빈 게임오브젝트를 선택해서 크기를 늘려줍니다.

주의할 점은 배경으로 사용할 이미지보다는 사이즈를 크게 만들어야합니다.

저같은 경우는 지금 배경으로 사용할 이미지의 Width와 Height의 크기가 각각 926, 521이기 때문에 이것보다 더 크게 만들어야 합니다.

 

이렇게 사이즈를 키우겠습니다.

 

Width와 Height값은 각각 1271.2, 757.6으로 설정했습니다.

 

그리고 이제 버튼의 위치를 조정합니다.

 

위 / 아래와 좌 / 우 스크롤을 확인하기 위해 다음과 같이 조정합니다.

 

 

3. 이제 오브젝트의 구성을 합니다.

Button들의 GameObject하위에 넣고 GameObject는 Image하위에 넣습니다.

4. 이미지 오브젝트를 선택 후 Add Componect하여, Scroll Rect를 추가합니다.

5. GameObject를 Image의 Scroll Rect에 Content에 넣습니다.

 

이제 실행해봅니다.

 

화면을 드래그 하면 UI를 이동시킬 수 있습니다.

 

6. 이미지 오브젝트를 선택 후 Add Componect하여, mask를 추가하면 화면에 보이지 않는 이미지 오브젝트 영역밖에 있는 버튼들은 안보이도록 할 수 있습니다.

 

Scroll Rect에 대한 자세한 내용은 유니티 메뉴얼을 참조하시면 될 것 같습니다.

https://docs.unity3d.com/kr/current/Manual/script-ScrollRect.html

 

스크롤 사각 영역 - Unity 매뉴얼

공간을 많이 차지하는 콘텐츠를 작은 영역에 표시해야 할 때 스크롤 사각 영역을 활용할 수 있습니다. 스크롤 사각 영역(Scroll Rect)은 콘텐츠를 스크롤하는 기능을 제공합니다.

docs.unity3d.com

감사합니다.

반응형
반응형

안녕하세요.

 

간단하게 캐릭터의 HP를 유니티 슬라이더로 제작하려고 합니다.

 

일단 전에 만들었던 방식으로 Slider를 생성합니다.

 

 

1. Hierarchy에서 오른쪽 클릭해서 UI - Slider로 슬라이더 오브젝트를 생성

 

2. Background, Fill Area, Handle Slide Area 설정

Silder에는 Background, Fill Area, Handle Slide Area로 구성되어있는데,

Handle Slide Area는 슬라이더 조절이 필요하지 않기 때문에 이건 비활성화(disable)합니다.

 

 

 

3. 배경색과 채워졌을 때 색을 설정합니다.

(1) 배경색 변경(Canvas-Silder-Background)

 

(2) 채워졌을 때 색 변경(Canvas-Silder-Fill Area-Fill)

4. 값이 다 채워졌을 경우를 위해 Cavas - Slider - Fill Area에 Right수치 변경

값을 맥스값으로 설정했을 경우에도 다 채워 지지 않은걸 볼 수 있습니다.

 

 

이 경우에는 Cavas - Slider - Fill Area에 Right수치를 5로 변경하면 다 채워지는 것을 볼 수 있습니다.

 

 

5. 슬라이더 값이 0일 때 처리

슬라이더 값이 채워질때 사용하는 소스 이미지 모양이 네모난 모양입니다.

그로 인해서, 0일 경우에도 이미지가 남아있는 것을 볼 수 있습니다.

 

이것을 해결하기 위해서는 슬라이더가 아닌 직접 만드는 방식을 사용할 수 있습니다.

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

하지만 여기서는 순수 Slider만 사용할 것이기 때문에, 0일 경우 Fill Area를 비활성화시키고, 0 이상일 경우 활성화하는 방식을 사용하겠습니다.

 

스크립트를 추가하겠습니다.

 

Slider에서 Add Component 클릭하여 스크립트를 추가합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;  // Silder class 사용하기 위해 추가합니다.
 
public class TestSlider : MonoBehaviour
{
    Slider slHP;
    float fSliderBarTime;
    void Start()
    {
       slHP = GetComponent<Slider>();
    }
 
 
    void Update()
    {
        if (slHP.value <= 0)
            transform.Find("Fill Area").gameObject.SetActive(false);
        else
            transform.Find("Fill Area").gameObject.SetActive(true);
    }
}
 
cs

 

Slider에서 값을 임의로 바꿔서 제대로 실행되는 지 확인합니다.

 

반응형
반응형

 

게임 중에 제한된 시간내에 미션을 수행해야 하는 게임이 많은데요.

 

이때 사용할 유니티 슬라이더 타이머 UI를 만들어보겠습니다.

 

1. Hierarchy에서 오른쪽 클릭해서 UI - Slider로 오브젝트를 생성합니다.

 

 

2. Silder에는 Background, Fill Area, Handle Slide Area로 구성되어있다.

우리는 타이머용 슬라이더 UI가 필요하기 때문에 "Handle Slide Area" 는 비활성화 합니다.

 

3. 채워졌을 때 색과 배경색을 설정합니다.

   (1) 채워졌을 때 설정 (Canvas-Silder-Fill Area-Fill)

 

   (2) 배경색 변경(Canvas-Silder-Background)

4. 색이 제대로 적용되었는지 확인합니다.

Value값을 변경해봅니다.

확인 후 수치 변화를 수월하게 확인을 위해 Max Value값 수치를 100으로 변경합니다.

5. Slider에서 Add Component 클릭하여 스크립트를 추가합니다.

 

6. 스크립트에 코드를 입력합니다.

 

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
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;   // Silder class 사용하기 위해 추가합니다.
 
public class SliderTimer : MonoBehaviour
{
    Slider slTimer;
    float fSliderBarTime;
    void Start()
    {
        slTimer = GetComponent<Slider>();
    }
 
    void Update()
    {
        if (slTimer.value > 0.0f)
        {
            // 시간이 변경한 만큼 slider Value 변경을 합니다.
            slTimer.value -= Time.deltaTime;
        }
        else
        {
            Debug.Log("Time is Zero.");
        }
    }
}
 
cs

7. 실행을 해서 슬라이더가 줄어드는 것을 확인합니다.

반응형
반응형

 

 

 

 

CBT 때 이벤트를 해서 참가했던 GameXCoin Server가 어제(7/25) 정식 오픈하였습니다.

 

GameXCoin Server는 게임을 하면서 암호화폐를 얻을 수 있는 서버입니다.

 

암호 화폐를 얻어서 거래소에서 판매하게 되면 실제 돈을 얻을 수 있습니다.

 

CBT 때 이벤트 해서 받기로 한 암호화폐도 있고, 어떻게 변했나 궁금하기도 해서 접속을 했습니다.

 

일단 버프팡으로 버프를 받고, 렌탈팡을 이용해서 장비를 대여받았습니다.

 

그리고 일단 Flyff for GameXCoin 카페(https://cafe.naver.com/flyff4gxc)에 접속해서

 

무슨 이벤트가 있는지 확인했습니다.

 

 

https://cafe.naver.com/flyff4gxc/248

이벤트 2는 운이니까 접어두고, 이벤트 1부터 해보려고 했는데.....

 

경험치 이벤트를 하지 않는 시간이라서 그런 건지 너무 경험치가 적게 올랐습니다.

 

일단 캐릭터를 15 레벨을 만들어야 출석체크 이벤트에 참가할 수 있기 때문에 빨리 캐릭터 3개를 15 레벨까지 만들려고 했으나... 1개 만드는데 1시간 30분 정도 걸려서... 일단 한 개만 만들고 포기했습니다.

 

세 개 만들고 하루에 세 시간씩 14일 접속하면 33,000 FLY * 3이니까 99,000 FLY를 한 계정에서 얻을 수 있습니다.

 

8월 30일까지니까 천천히 올려야겠습니다.

 

이번 정식 오픈과 CBT 때의 차이는, 

 

1. 경험치 이벤트에 너무 야박합니다.

 

2. 본섭과 마찬가지로 캐시샵이 이용 가능합니다.

 

3. 코인샵이 예전과 다르게 비싼 것만 잔득있습니다.

15 레벨까지 올리는데, 100 FLY도 못 모았는데.. 

노가다로는 아이템 구매가 어려울 것 같습니다.

 

4. 프리프 홈페이지에 보니, 랜탈 팡을 1~59 캐릭터만 이용할 수 있다고 합니다.

 

5. 그리고 퀘스트를 통한 FLY획득이 변화가 되어서, FLY획득이 확 줄어든 거 같습니다.

 

 

 

 

 

 

반응형

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

프리프 캐릭터 / 직업  (0) 2019.07.10
프리프 레벨 올리기 lv1~15편  (0) 2019.07.09
프리프 시작하기  (0) 2019.07.09
반응형

 

 

안녕하세요!! 개발남입니다. 

 

오늘은 매직같은 가성비 미친 피자 맛집을 소개하려고 합니다. 

 

ㅋㅋㅋ 매직같은 가성비

 

두구두구두구!!!

 

피자마루입니다. (협찬아님니다.)

 

피자 스쿨을 시작으로 그렇게 저렴이 피자가 유행을 타기 시작했었죠.

 

거기에 불경기까지 계속되면서 여러 저렴이 피자들이 생겨났는데 요.

 

그중에서 제일 맛있는 피자집은

 

개인적으로 피자마루입니다. 

 

거기서도 존맛탱 메뉴~!!!!

 

 

페퍼로니 - 피자마루 홈페이지 사진입니다.

"페페로니 피자"입니다.

전체중량(g) 조각기준 중량(g) 열량(Kcal/1회) 당류(g/1회) 단백질(g/1회) 포화지방(g/1회) 나트륨(mg/1회)
683 2/8 170.8 498.88 7.43 25.42 8.16 1073.56

 

매장마다 차이가 있는데 제가 주문하는 곳은

 

치즈가 이렇게 흘러내립니다.

 

토마토소스 넉넉하게 치즈 많이 주셔서 왕 혜자스런 피자입니다. 

 

추천 이유는 제가 카스를 좋아하는데 

 

짭조름한 피자와 찰떡궁합입니다.

 

-페페로니 가격 : 7900원

 

-치즈 크러스트 페페로니 가격 : 9900원

 

저는 주로 맥주를 먹기 때문에 콜라 대신 피클을 부탁하고 (당골이라서 많이 주심)

http://www.pizzamaru.co.kr/main.aspx

반응형
반응형

 

 

안녕하세요~!! 개발남입니다!!

 

며칠 전 여자 친구한테 학창 시절 알라딘을 하며 

 

 

밤을 새워 깼다는 이야기를 하다가

 

여자 친구를 보여주려고 알라딘 게임을 찾다가 발견했습니다. 

 

4,342의 게임이 올라와있고요.

 

학창 시절 페르시아 왕자와 알라딘을 하며 시간 가는 줄 몰랐는데...

 

https://archive.org/details/softwarelibrary_msdos_games

 

Software Library: MS-DOS Games : Free Software : Free Download, Borrow and Streaming : Internet Archive

Developed by MECC Released 1990 Also For Apple II, Macintosh, Windows, Windows 3.x Published by MECC Pacing Real-Time Genre Educational, Simulation Setting Western Gameplay Managerial / Business Simulation Educational Geography, History Perspective Bird's-

archive.org

 

위 사이트를 들어가 원하는 게임을 클릭하면 실행할 수 있습니다.

 

 

그럼 즐게임하세요~!!

반응형
반응형

 

 

안녕하세요. 개발남입니다.

 

티스토리를 사용하다보니 다른 블로거들은 프로그래밍 코드를 예쁘게 삽입하는것을 보고,

 

html태그를 제작하려고 찾아보니, 간단하게 추가하는 방법이 있어서 소개드리려고합니다.

 

Color Scripter를 이용하는 방법입니다.

정말로 간단하게 추가할 수 있습니다.

https://colorscripter.com/

 

Color Scripter

Simple & Flexible Syntax HighLighter

colorscripter.com

이 사이트에 들어가면 다음과 같은 화면이 뜹니다.

 

여기에서 소스 코드를 붙여넣습니다.

자동으로 언어를 인식됩니다. 그 후 스타일패키지, 배경 등을 이용해서 원하는 스타일로 만들어줍니다.

 

그리고 우측(오른쪽)하단에 HTML로 복사 버튼을 누릅니다.

 

 

 

 

여기서 Ctrl+c버튼을 눌러서 복사를 합니다.

 

그리고 티스토리에서 글쓸때, 기본모드 -> HTML로 변경해준 후 위치에 맞춰서 태그를 붙여넣어줍니다.

 

다음은 HTML로 추가한 상태입니다.

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
using System
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; // 파일 입출력 스트림을 위해 추가 
using System.Runtime.Serialization.Formatters.Binary; // 바이너리 포맷을 위해 추가 
using System.Runtime.Serialization; // IFormatter 인터페이스 사용을 위해 추가 
 
[Serializable] 
public class DataObject 
    public int num1; 
    public int num2; 
 
namespace ConsoleTest 
    class Program 
    { 
        static void Main(string[] args) 
        { 
            DataObject data1 = new DataObject(); 
            data1.num1 = 1
            data1.num2 = 2
 
 
            IFormatter formatter = new BinaryFormatter(); 
 
            Stream streamFileWrite = new FileStream("tttt.txt", FileMode.Create, FileAccess.Write, FileShare.None); 
            formatter.Serialize(streamFileWrite, data1); 
            streamFileWrite.Close(); 
 
            Stream streamFileRead = new FileStream("tttt.txt", FileMode.Open, FileAccess.Read, FileShare.None); 
            DataObject data2 = (DataObject)formatter.Deserialize(streamFileRead); 
            streamFileRead.Close(); 
 
            Console.WriteLine("num1 : " + data2.num1); 
            Console.WriteLine("num2 : " + data2.num2); 
 
            } 
        } 
cs

 

 

 

 

반응형
반응형

 

 

유니티를 이용하여 게임을 제작 시 유저의 데이터(점수, 위치)등을 저장해야 하는 경우가 있습니다.

 

그러기 위해서 Json이라는 형식을 이용하면 텍스트로 이루어져 있기 때문에 이해하기도 쉽고, 직렬화 / 역직렬화를 통해  

게임 내 데이터와 Json데이터의 상호 변환이 쉽게 가능합니다.

 

현재 제가 쓰는 2018.3.9 버전에서는 기본적으로 지원하기 때문에 따로 using 할 필요가 없습니다.

 

그럼 바로 실습을 해보겠습니다.

 

JsonTest라는 프로젝트를 하나 만들었습니다.

 

빈 오브젝트를 만듭니다.

 

Add Component를 눌러서 Script를 추가합니다.

스크립트를 더블클릭 합니다.

 

 

 

1. 코드를 확인합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 
 
public class JsonTest : MonoBehaviour 
    // Start is called before the first frame update 
    void Start() 
    { 
         
    } 
 
    // Update is called once per frame 
    void Update() 
    { 
         
    } 
}
cs

이제 여기서 작업을 하겠습니다.

 

 

 

2. 클래스를 추가합니다. 

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
using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 
 
[System.Serializable] 
public class Data 
    public int m_nLevel; 
    public Vector3 m_vecPositon; 
 
    public void printData() 
    { 
        Debug.Log("Level : " + m_nLevel); 
        Debug.Log("Position : " + m_vecPositon); 
    } 
 
public class JsonTest : MonoBehaviour 
    // Start is called before the first frame update 
    void Start() 
    { 
         
    } 
 
    // Update is called once per frame 
    void Update() 
    { 
         
    } 
cs

 

 

 

 

3. 클래스 오브젝트를 생성하고, 데이터를 삽입합니다.

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
using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 
 
[System.Serializable] 
public class Data 
    public int m_nLevel; 
    public Vector3 m_vecPositon; 
 
    public void printData() 
    { 
        Debug.Log("Level : " + m_nLevel); 
        Debug.Log("Position : " + m_vecPositon); 
    } 
 
public class JsonTest : MonoBehaviour 
    // Start is called before the first frame update 
    void Start() 
    { 
        Data data = new Data(); 
        data.m_nLevel = 12
        data.m_vecPositon = new Vector3(3.4f, 5.6f, 7.8f); 
 
    } 
 
    // Update is called once per frame 
    void Update() 
    { 
         
    } 
}
cs

 

 

 

 

4. 오브젝트 데이터를 Json형식으로 스트링에 넣습니다.

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
using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 
 
[System.Serializable] 
public class Data 
    public int m_nLevel; 
    public Vector3 m_vecPositon; 
 
    public void printData() 
    { 
        Debug.Log("Level : " + m_nLevel); 
        Debug.Log("Position : " + m_vecPositon); 
    } 
 
public class JsonTest : MonoBehaviour 
    // Start is called before the first frame update 
    void Start() 
    { 
        Data data = new Data(); 
        data.m_nLevel = 12
        data.m_vecPositon = new Vector3(3.4f, 5.6f, 7.8f); 
 
        string str = JsonUtility.ToJson(data); 
        
        Debug.Log("ToJson : " + str); 
    } 
 
    // Update is called once per frame 
    void Update() 
    { 
         
    } 
}
cs

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

 

JsonUtility.ToJson함수를 이용하여 오브젝트를 json형식으로 변환합니다.

다음과 같이 실행됩니다.

 

 

 

5. json형식의 데이터를 다시 오브젝트 형으로 변환합니다.

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
using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 
 
[System.Serializable] 
public class Data 
    public int m_nLevel; 
    public Vector3 m_vecPositon; 
 
    public void printData() 
    { 
        Debug.Log("Level : " + m_nLevel); 
        Debug.Log("Position : " + m_vecPositon); 
    } 
 
public class JsonTest : MonoBehaviour 
    // Start is called before the first frame update 
    void Start() 
    { 
        Data data = new Data(); 
        data.m_nLevel = 12
        data.m_vecPositon = new Vector3(3.4f, 5.6f, 7.8f); 
 
        string str = JsonUtility.ToJson(data); 
 
        Debug.Log("ToJson : " + str); 
 
       Data data2 = JsonUtility.FromJson<Data>(str);
        data2.printData(); 
    } 
 
    // Update is called once per frame 
    void Update() 
    { 
         
    } 
 
 
cs

 

 

 

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

 

JsonUtility.FromJson 함수로 오브젝트로 값을 넣습니다.

 

실행되면 결과는 다음과 같습니다.

 

 

 

 

6. json파일로 저장하기

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
using System.Collections; 
using System.Collections.Generic; 
using System.IO; 
using UnityEngine; 
 
[System.Serializable] 
public class Data 
    public int m_nLevel; 
    public Vector3 m_vecPositon; 
 
    public void printData() 
    { 
        Debug.Log("Level : " + m_nLevel); 
        Debug.Log("Position : " + m_vecPositon); 
    } 
 
public class JsonTest : MonoBehaviour 
    // Start is called before the first frame update 
    void Start() 
    { 
        Data data = new Data(); 
        data.m_nLevel = 12
        data.m_vecPositon = new Vector3(3.4f, 5.6f, 7.8f); 
 
        string str = JsonUtility.ToJson(data); 
 
        Debug.Log("ToJson : " + str); 
 
       Data data2 = JsonUtility.FromJson<Data>(str);
        data2.printData(); 
 
        // file save 
 
        Data data3 = new Data(); 
        data3.m_nLevel = 99
        data3.m_vecPositon = new Vector3(8.1f, 9.2f, 7.2f); 
 
        
        File.WriteAllText(Application.dataPath + "/TestJson.json", JsonUtility.ToJson(data3)); 
    } 
 
    // Update is called once per frame 
    void Update() 
    { 
         
    } 
}
cs

 

Application.dataPath는 지금 작업 폴더를 말합니다.

실행을 하면 TestJson.json 파일이 생성됩니다.

 

 

 

 

 

7. 저장한 json파일 로드

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
using System.Collections; 
using System.Collections.Generic; 
using System.IO; 
using UnityEngine; 
 
[System.Serializable] 
public class Data 
    public int m_nLevel; 
    public Vector3 m_vecPositon; 
 
    public void printData() 
    { 
        Debug.Log("Level : " + m_nLevel); 
        Debug.Log("Position : " + m_vecPositon); 
    } 
 
public class JsonTest : MonoBehaviour 
    // Start is called before the first frame update 
    void Start() 
    { 
        Data data = new Data(); 
        data.m_nLevel = 12
        data.m_vecPositon = new Vector3(3.4f, 5.6f, 7.8f); 
 
        string str = JsonUtility.ToJson(data); 
 
        Debug.Log("ToJson : " + str); 
 
       Data data2 = JsonUtility.FromJson<Data>(str);
        data2.printData(); 
 
        // file save 
 
        Data data3 = new Data(); 
        data3.m_nLevel = 99
        data3.m_vecPositon = new Vector3(8.1f, 9.2f, 7.2f); 
 
        File.WriteAllText(Application.dataPath + "/TestJson.json", JsonUtility.ToJson(data3)); 
 
        // file load 
 
        string str2 = File.ReadAllText(Application.dataPath + "/TestJson.json"); 
 
       Data data4 = JsonUtility.FromJson<Data>(str2);
        data4.printData(); 
    } 
 
    // Update is called once per frame 
    void Update() 
    { 
         
    } 
}
cs

저장한 파일을 로드합니다.

그 후 콘솔에서 출력합니다.

 

반응형
반응형

 

설 때 쯤인가 스트레스가 정점에 달해서 

 



어느 블로그에 홈플러스 초콜릿 케이크가 포스팅이 되어있더라고요.

맛과 가성비가 좋다며 

영업당해서 홈플러스를 가서 초코케익을 업어왔습니다.

(필자는 버터그림 덕후이고 따라서 파리바케트를 가면 버터크림만 먹습니다. )

 

가격:

생긴건 제 손바닥 만하고 가격은 8900원 가격은 착합니다. 



거의 한국인은 파빠기준으로 생각하게 되지 않습니까?

 



파빠는 조금 더 크고 가격은 17000원

음.....

 

 





제일 중요한 맛:

맛이 없어요. 초코맛보다는 뭔가 버터처럼 질 나쁜 초코 겉도는 맛

결론 : 이왕쌀찔거 비싼 거 먹자. 

제점수는 4점 (★★☆☆)

 

웬만하면 돈없음 돈 모아서 빠바 초콜릿 케이크 먹자.

 

번외>>

 

 

콜드 브루 티라미수>>

 

가격:4900원

 

맛: 맛은 있는데 좀 달다

 

크기: 크다.

 

 

총평: 크기가 가격에 비해 혜자스럽다.

 

그러나 너무 달다 덜 달았다면 존맛일 듯 

 

너무 달아서 비추 차라리 스벅 티라미수 먹자(크기도 크고 맛도 있다.)

 

 

 

반응형

+ Recent posts