반응형

와썹맨-부산국밥특집편

와썹맨은 와썹 ㅋㅋㅋ이라며 나온 부산 국밥집 편

"와~!! 무슨 맛일까?? 와~!!" 하며 국밥충인 내가 침 흘리며 꼭 가보리라 다짐했다.

와썹맨 돼지국밥편 댓글

부산행 기차에서 타서 댓글로 정보를 얻고 기차에서 내리자마자 달려갔습니다. 

 

할매국밥

 

버스에서 내리자마자 잘 못 내렸나 하며 두리번거렸습니다. 

범일동 구름다리

새벽 6시 기차 타고 왔기 때문에 친구랑 주린 배를 잡고 

"여기가 어딘가?"

범일동 구름다리- 친구 영화촬영장소

 

하지만 삼거리에서 방향감각을 잘 잡고 버스가 온 방향과 반대방향으로 내려가서 찾은 할매국밥

위드렌터카를 찾아서 내려갔습니다. 골목 안에있기 떄문에 좀 어렵습니다.

 

한 9시 30분쯤 조금 지났을 무렵이라 1 빠보다는 5 빠 정도??

 

할매 메뉴판

매장의 자리는 많았습니다. 오전 10시 오픈인데 조금 일찍 도착했는데 기다리지 않고 자리에 착석했습니다. 매장은 한때 유행했던 옥색이었는데 뭔가 잘 어울렸습니다. 저와 친구가 주문했던 음식은 순대국밥을 주문했습니다.

할매국밥 주방사진
순대국밥 5500원

 

와썹맨을 따라와썹~! ㅋㅋ 개발남도 먹어봐썹~!

국밥 한 그릇 5500원. 요즘 국밥 한그릇 5500 원하는 집 거의 없다고 본다. 하지만 방송을 타서 전국적으로 유명세를 탔음에도 불구하고 가격 안 올리고 착한 가격을 고수하는 이 집 대단하다는 생각을 했다.

맛은 표현하자면 사람들은 맑은 국물이라고 하시던데 전 백숙의 느낌을 받았습니다. 음 돼지국밥에서 국물에서는 전혀 비린맛을 느끼지 못했습니다. 고기도 진짜 신선하고( 와~! 할 정도로 신선함) 신선했습니다. 제가 먹어 본 국밥 안에 고기는 진짜 1등을 할 정도로 맛있었습니다. 

그런데 

돼지국밥에서 마늘향이 강하다 보니 백숙 맛이 나서 전.... 개인적으로 비추였습니다.

왜냐하면 순대 맛에서 비린맛이 나더라고요.(친구도 비린맛을 느꼈다고 합니다.) 전 남겼습니다. 

친구야 맛있썹??

제가 오픈 시간에 와서 너무 일찍 와서 덜 데운 건지...(실제로 뜨겁지는 않았습니다. 따뜻한 정도??)

전 블로그 리뷰는 광고가 섞여있어 구글 댓글과 유튜브 와썹맨 댓글을 믿었는데...

기대에 부응하는 맛은 아니였습니다. 

제 생각은 사람이 많아져서 1> 맛이 변했다. 2> 내 취향이 아니다. 3> 내 껄 덜 데웠다. 4>너무 일찍 왔다.

다들 맛있다고 하는데 나만 이상 해썹. 섭섭해썹 ㅋㅋ국밥충은 울어썹..

암튼 별점은 하지 않겠습니다.

전 다시 안 가려고요. 그럼 감사합니다.

개발남이 추천하는 부산 맛집이 궁금하시다면?? 아래 클릭해주세요.↓

https://scvtwo.tistory.com/6

 

[부산맛집]“한 밥상 하실래예?” - 풍원장 시골밥상

[부산맛집]“한 밥상 하실래예?” - 풍원장 시골밥상 작년 가을 부산을 갔다가 그냥 오기 아쉬워 갔던 풍원장 시골밥상집 리뷰하겠습니다. <<풍원장 시골밥상>>은 기장군에 위치한 한정식 전문점입니..

scvtwo.tistory.com

 

반응형
반응형

.

안녕하세요.

[Unity] 유니티 구글 플레이 게임 서비스 연동 ( 로그인 하기 ) 를 이어서 구글 플레이 게임 서비스 업적과 리더보드 연동해보겠습니다.

 

[Unity] 구글 플레이 게임 서비스 연동 ( 로그인 하기 )

안녕하세요. 이 글은 이전에 작성한 [Unity] 유니티 구글 플레이 게임 서비스(GPGS) 연동 후 앱 등록을 진행한 것을 기반으로 합니다. [Unity] 유니티 구글 플레이 게임 서비스(GPGS) 연동 후 앱등록 안녕하세요...

scvtwo.tistory.com

1. 업적

구글 플레이 콘솔로 접속합니다.

https://play.google.com/apps/publish/?hl=ko

 

Redirecting...

 

play.google.com

업적 추가 버튼을 누릅니다.

업적을 추가합니다.

업적 이름을 적고 아이콘을 넣습니다.

단계별 업적은 여러 단계가 있는 업적을 추가하려면 설정합니다.

초기 상태는 초기에 업적을 공개할지 안할지 정합니다.

점수는 이게임에서 추가할 업적 점수입니다.

목록 순서는 사용자에게 보는 업적 순서입니다.

 

설정이 다 끝났으면, 저장을 합니다.

그럼 다음과 같이 저장됩니다.

 

 

2. 리더보드

리더보드를 추가해보겠습니다.

리더보드 이름을 적고 저장합니다.

리소스 받기를 눌러서 소스를 복사합니다.

3. API & 서비스

동의해줍니다.

 

Credentials(사용자 인증정보)에서 키이미지를 클릭합니다.

이전 포스팅에서 이미 추가했으므로 확인만하고 다음 단계로 넘어갑니다.

 

4. 유니티 셋팅

추가할 유니티 프로젝트를 실행합니다.

Window - Google Play Games - Setup-Android setup... 를 실행합니다.

이전에 복사한 리더보드 코드를 추가합니다.

그 후 Setup 버튼을 누릅니다.

 

업적 추가, 리더보드 보기, 업적보기 버튼을 추가합니다.

 

코드를 추가합니다.

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
    // 리더보드에 점수등록 후 보기
    public void OnShowLeaderBoard()
    {
        text.text = "ShowLeaderBoard";
        // 1000점을 등록
        Social.ReportScore(1000, GPGSIds.leaderboard_leaderboardtest, (bool bSuccess) =>
        {
            if (bSuccess)
            {
                Debug.Log("ReportLeaderBoard Success");
                text.text = "ReportLeaderBoard Success";
            }
            else
            {
                Debug.Log("ReportLeaderBoard Fall");
                text.text = "ReportLeaderBoard Fail";
            }
        }
        );
        Social.ShowLeaderboardUI();
    }
 
    // 업적보기
    public void OnShowAchievement()
    {
        text.text = "ShowAchievement";
        Social.ShowAchievementsUI();
    }
 
    // 업적추가
    public void OnAddAchievement()
    {
        text.text = "AddAchievement";
 
        Social.ReportProgress(GPGSIds.achievement_achievements1, 100.0f, (bool bSuccess) =>
        {
            if (bSuccess)
            {
                Debug.Log("AddAchievement Success");
                text.text = "AddAchievement Success";
            }
            else
            {
                Debug.Log("AddAchievement Fall");
                text.text = "AddAchievement Fail";
            }
        }
        );
    }
cs

전체코드는 다음과 같습니다.

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
101
102
103
104
105
106
107
108
109
110
111
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// Text UI 사용
using UnityEngine.UI;
// 구글 플레이 연동
using GooglePlayGames;
using GooglePlayGames.BasicApi;
 
public class GooglePlayManager : MonoBehaviour
{
    bool bWait = false;
    public Text text;
 
    void Awake()
    {
        PlayGamesPlatform.InitializeInstance(new PlayGamesClientConfiguration.Builder().Build());
        PlayGamesPlatform.DebugLogEnabled = true;
        PlayGamesPlatform.Activate();
 
        text.text = "no Login";
    }
    // Start is called before the first frame update
    void Start()
    {
        
    }
 
    // Update is called once per frame
    void Update()
    {
        
    }
 
    public void OnLogin()
    {
        if (!Social.localUser.authenticated)
        {
            Social.localUser.Authenticate((bool bSuccess) =>
            {
                if (bSuccess)
                {
                    Debug.Log("Success : " + Social.localUser.userName);
                    text.text = Social.localUser.userName;
                }
                else
                {
                    Debug.Log("Fall");
                    text.text = "Fail";
                }
            });
        }
    }
 
    public void OnLogOut()
    {
        ((PlayGamesPlatform)Social.Active).SignOut();
        text.text = "Logout";
    }
 
    // 리더보드에 점수등록 후 보기
    public void OnShowLeaderBoard()
    {
        text.text = "ShowLeaderBoard";
        // 1000점을 등록
        Social.ReportScore(1000, GPGSIds.leaderboard_leaderboardtest, (bool bSuccess) =>
        {
            if (bSuccess)
            {
                Debug.Log("ReportLeaderBoard Success");
                text.text = "ReportLeaderBoard Success";
            }
            else
            {
                Debug.Log("ReportLeaderBoard Fall");
                text.text = "ReportLeaderBoard Fail";
            }
        }
        );
        Social.ShowLeaderboardUI();
    }
 
    // 업적보기
    public void OnShowAchievement()
    {
        text.text = "ShowAchievement";
        Social.ShowAchievementsUI();
    }
 
    // 업적추가
    public void OnAddAchievement()
    {
        text.text = "AddAchievement";
 
        Social.ReportProgress(GPGSIds.achievement_achievements1, 100.0f, (bool bSuccess) =>
        {
            if (bSuccess)
            {
                Debug.Log("AddAchievement Success");
                text.text = "AddAchievement Success";
            }
            else
            {
                Debug.Log("AddAchievement Fall");
                text.text = "AddAchievement Fail";
            }
        }
        );
    }
}
 
cs

버튼에 메서드를 연결합니다.

 

Show LeaderBoard버튼을 눌렀을 때

Add Achievements 버튼을 누른 후, Show Achievements을 눌렀을 때.

 

그리고 apk로 폰이나 애뮬레이터에서 테스트할 때에는 꼭 테스터를 추가해야 합니다.

테스트가 끝난 후

게임출시가 가능합니다.

 

 

이전 "구글플레이 게임서비스연동(로그인하기)"편이 궁금하시다면 클릭하세요~!

 

[Unity] 구글 플레이 게임 서비스 연동 ( 로그인 하기 )

안녕하세요. 이 글은 이전에 작성한 [Unity] 유니티 구글 플레이 게임 서비스(GPGS) 연동 후 앱 등록을 진행한 것을 기반으로 합니다. 구글 플레이에서 다운로드한 게임을 보면 등록된 구글 계정으로 로그인해서..

scvtwo.tistory.com

읽어주셔서 감사합니다~! 수정할 부분이나 질문은 댓글 달아주세요!

 

반응형
반응형

 

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

1. 지스타2019 (브롤,배그 빼고)에서 가장 기억에 남았던 게임 하나만 골라서 리뷰하겠습니다.

(협찬, 광고아닙니다.)

2019 지스타에서 4d게임

가장 기억에 남는 게임은 유령 잡는 VR 게임입니다. PNI COMPANY의 VR 기기도 만들고 게임도 만드는 회사입니다. 게임 이름은 모르겠고 영상을 보시고 게임을 보시죠.

지스타 2019 PNI COMPANY VR게임

차세대 게임의 모습은 VR 게임이라고 생각합니다. 그래서 증강현실을 이용한 "포캣몬고"도 VR까지 가는 길목에 있는 게임이라고 생각하고 있습니다. 그리고 사용자들은 실제 게임에 열광했죠. 이 게임은 그렇게 재미있는 스펙터클한 게임은 아닙니다. 그냥 컴퓨터 조이스틱으로 하면 재미없을 게임이라고 생각합니다. 하지만 VR의자와 안경을 끼고 하면 실제감이 있었고 재미있었습니다.  유치한 유령을 잡는 게임이 재미있는 이유가 단순하지 않습니다. VR에서의 요소와 페달을 밟을 때의 느낌 발 앞에 박스가 치이는 느낌을 잘 버무렸습니다. (하지만 스틱이 유령을 잡을 때 확실하게 잡는 느낌이 부족했습니다. 약간 2% 부족한 느낌) 

그렇기 때문에 전 이게임이 가장 재미있고 우리나라의 게임 시장의 미래를 엿볼 수 있는 게임이었다고 생각합니다.  이게임은 부스가 가방을 나눠주지도 않고 기타의 것을 나눠주는 회사는 아니였습니다. (나눠주는 것을 욕하는 것이 아닙니다. 게임만으로 승부하는 부스라는 뜻입니다.) 체험만으로도 줄은 길었습니다. (마! 이게 게임의 힘이다!ㅋㅋ) 그날 게임 체험을 하고 내려오면서 진짜 재미있다고 했더니 자랑스러운 듯 웃는 개발자 혹은 스텝의 모습이 부러웠습니다.  

자세히 알아보니 역시 직원수 72명의 강소기업에 제주도에 있는 회사더라고요. 이 회사 주시하고 있겠습니다.ㅋ 앞으로 승승장구하시길 바랍니다.

http://pnisys.com/

 

VR SIMULATOR , 3D ANIMATION (모두모두쇼, 리틀스톤즈, 꼬마농부 라비)

피엔아이컴퍼니는 VR SIMULATOR 제작업체이며 3D ANIMATION (모두모두쇼, 리틀스톤즈, 꼬마농부 라비)을 방영하고 있습니다.

www.pnicompany.com

 

2. 지스타는 가방 맛집?

지스타2019 가방

ㅋㅋㅋ지스타에서는 배그, 브롤에서 너나 할 것 없이 가방을 나눠줬습니다. 아마도 팬에 대한 팬서비스라고 생각하는데요. 지스타 끝나고 부산을 돌아다니는 내내 브롤 가방을 들고 다녔는데요. 길 다니다 보니 초등학생들이 부러워하는 느낌에 주고 싶었지만 조카를 주기 위해 애써 외면했네요 ㅋ ㅠㅠ. 

가방 말고도 많은 선물을 나눠줬는데요.

구글에서 받은것
지스타 2019 브롤에서 받은것

 

3. 줄 서서 먹는 부산 맛집 추천

저는 서울에서 살고 있습니다. 부산 지 스타를 할 때마다 내려오는데 올 때마다 맛집 기행을 하고 있습니다.

줄 서서 먹는 꼭 가봐야 할 맛집 추천드리겠습니다.

본전돼지국밥-8000원

 

 돼지국밥집|

본점 돼지국밥 

다른 곳도 다 가봤지만 깔끔하고 비리지 않은데 깊은 맛입니다.

진짜 일주일 내내 국밥을 먹을 정도로 국밥을 좋아합니다.        

주소: 부산광역시 동구 초량동 중앙대로 214번 길 3-8

영업시간: 월-일 오전 8:30-오후 9:30에 영업 종료

연락처: 051-441-2946

 

밀면집|

초량 밀면 

음,,, 무슨 맛이라고 하기 어렵습니다. 진짜 오묘하고 맛있습니다. 그리고 음.. 꼭 물밀면과 만두 모두 시키는 게 꿀 팁니다. 만두는 간장에 꼭 찍어 먹기!!  ㅋㅋ 진짜 여행 다니다가 피곤할 때 먹으면 굿굿입니다. 묻지도 따지지도 말고 드셔 보세요.  

주소: 부산광역시 동구 초량동 중앙대로 225

영업시간: 월-일 오전 10:00-오후 10:00에 영업 종료

연락처: 051-462-1575

 

 

한정식집|

풍원장 시골밥상

 풍원장 시골밥상은 한정식 전문점입니다. 뚜벅이에겐 엄청나게 뜬금없는 위치라서 (부산역에서 굉장히 먼 곳에 있기 때문에 동선 잘 짜셔야 합니다!) 저도 가보고 싶었지만 이번에는 못 갔습니다. 

주소: 부산광역시 동구 초량동 중앙대로 225

영업시간: 월-일 오전 10:00-오후 11:00에 영업 종료

연락처: 02-6226-2722

 

 

작년의 자세한 리뷰가 궁금하시 다면 >>https://scvtwo.tistory.com/6?category=877672

 

[부산맛집]“한 밥상 하실래예?” - 풍원장 시골밥상

[부산맛집]“한 밥상 하실래예?” - 풍원장 시골밥상 작년 가을 부산을 갔다가 그냥 오기 아쉬워 갔던 풍원장 시골밥상집 리뷰하겠습니다. <<풍원장 시골밥상>>은 기장군에 위치한 한정식 전문점입니..

scvtwo.tistory.com

읽어주셔서 감사합니다.

지스타 2019 후기 1편을 보고 싶으시다면

https://scvtwo.tistory.com/74?category=878956

 

[게임이슈] 2019 지스타 + 꿀팁 1편(입장료,일정, 시간)

안녕하세요. 개발남입니다. 19년도 지스타를 다녀왔습니다. 우선 지스타는 전시명 국제게임전시회 지스타 2019(Game Show & Trade, All-Round) 일정 및 관람시간 [BTC] 2019. 11. 14(목) ~ 11. 17(일), 4일간 11..

scvtwo.tistory.com

읽어주셔서 감사합니다.

반응형
반응형

안녕하세요. 

구글 플레이 콘솔에서 게임 서비스 - GOOGLE PLAY 게임 서비스 설정을 누르면

다음과 같이 "예기치 않은 오류가 발생했습니다. 나중에 다시 시도해 주세요.(4800000)"가 발생을 하는 경우가 발생합니다.

일단 저는 특별히 앱을 올린 이후로 작업한 내용도 없고, 처음 GOOGLE PLAY 게임 서비스를 설정한 게 없어서 어떻게 해야 하는지 막막했습니다.

검색을 해보니.. 24시간을 기다려야 한다.

혹은 구글 서버 문제라서 기다려야 한다는 말 뿐이었습니다.

하지만.. 빨리 해보고 싶은 마음에 여러 가지 시도를 해봤습니다.

1. 재로그인

안되었습니다... 여전히 같은 에러가 발생합니다.

2. 재부팅 후 시도

안되었습니다... 실패.

 

여러 시도를 해보다가 해결책을 찾았습니다.

다른 이름으로 시도했더니 가능했습니다.

저는 "Google Play Test"라고 게임 이름을 만들었습니다.

여기서 "Google"에서 문제가 생긴 거 같습니다.

Google을 빼고 GPlay Test를 했더니 문제가 없었습니다.

혹시 같은 에러가 발생하신다면 참고하기 바랍니다.

반응형
반응형

 

 

안녕하세요.

이 글은 이전에 작성한  [Unity] 유니티 구글 플레이 게임 서비스(GPGS) 연동 후 앱 등록을 진행한 것을 기반으로 합니다.

 

[Unity] 유니티 구글 플레이 게임 서비스(GPGS) 연동 후 앱등록

안녕하세요. 구글 플레이 게임 서비스(GPGS) 연동 후 구글 플레이에 등록하는 과정에 대해 알아보도록 하겠습니다. 다음 과정을 거쳐서 GPGS 연동 후 앱등록 해보도록 하겠습니다. 1. Google Play Games plugin fo..

scvtwo.tistory.com

구글 플레이에서 다운로드한 게임을 보면 등록된 구글 계정으로 로그인해서 랭킹을 확인하거나 업적을 달성하는 것을 볼 수 있습니다..

일단 구글 계정을 로그인해야 랭킹이나 업적을 동기화시킬 수 있기 때문에, 로그인부터 알아보겠습니다.

구글 플레이 콘솔 사이트에 접속합니다.

https://play.google.com/apps/publish/?hl=ko

 

Redirecting...

 

play.google.com

그리고 개발자 구글 계정으로 로그인합니다.

 

1. 구글 플레이 게임 서비스 설정

게임 서비스를 누른 후 GOOGLE PLAY 게임 서비스 설정을 누릅니다.

 

게임 이름과 게임 종류를 설정한 후 계속을 누릅니다.

 

그리고 설명과 고해상도 아이콘, 그래픽 이미지를 넣고 다음을 누릅니다.

 

2. OAuth 2.0 클라이언트 ID 생성

구글 플레이 게임 서비스를 인증하려면 게임에 OAuth 2.0 클라이언트 ID가 필요합니다.

연결된 앱을 누른 후 ANDROID 버튼을 누릅니다.

 

패키지 이름을 설정한 후 "저장하고 계속" 버튼을 누릅니다.

다음 "지금 앱 승인" 버튼 클릭.

 

그리고 시작 키를 눌러서 명령 프로토콜(cmd)을 실행시킵니다.

 

여기서 jre 설치된 폴더 경로로 이동합니다.

"cd C:\Program Files\Java\jre1.8.0_231\bin" 를 입력합니다. jre버전에 따라 폴더명으로 들어갑니다.

 

그리고 "keytool -list -keystore D:\unity\QuitTest\user.keystore(해당 앱의 keystore 경로)"를 입력합니다.

그리고 SHA1 키를 복사합니다.

 

그리고 서명 인증서 지문 부분에 붙여 넣고 확인을 누릅니다.

연결이 완료되었습니다.

클라이언트 ID 항목을 복사해놓습니다. 

그 후 목록으로 돌아가기 버튼을 누릅니다.

 

등록할 게임의 유니티 프로젝트를 실행시킵니다.

그리고 Window-Google Play Games-Setup-Android setup... 을 누릅니다.

 

빨간 부분에 아까 복사한 클라이언트 ID를 넣습니다.

그리고 다시 구글 플레이 콘솔 페이지로 돌아갑니다.

 

 

리더보드 이름을 입력하고 저장 버튼을 입력합니다.

 

리소스 받기 버튼을 입력합니다.

코드를 모두 복사합니다.

 

그리고 유니티로 돌아갑니다.

코드를 복사한 후 Setup 버튼을 누릅니다.

 

 

이제 유니티에 실제로 적용을 해보겠습니다.

간단하게 로그인 / 로그아웃 버튼을 만들어서 연동되는 것을 확인하겠습니다.

그리고 구글 로그인을 담당하는 스크립트를 작성해보겠습니다.

 

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
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// Text UI 사용
using UnityEngine.UI;
// 구글 플레이 연동
using GooglePlayGames;
using GooglePlayGames.BasicApi;
 
public class GooglePlayManager : MonoBehaviour
{
    bool bWait = false;
    public Text text;
 
    void Awake()
    {
        PlayGamesPlatform.InitializeInstance(new PlayGamesClientConfiguration.Builder().Build());
        PlayGamesPlatform.DebugLogEnabled = true;
        PlayGamesPlatform.Activate();
 
        text.text = "no Login";
    }
    void Start()
    {
        
    }
    void Update()
    {
        
    }
 
    public void OnLogin()
    {
        if (!Social.localUser.authenticated)
        {
            Social.localUser.Authenticate((bool bSuccess) =>
            {
                if (bSuccess)
                {
                    Debug.Log("Success : " + Social.localUser.userName);
                    text.text = Social.localUser.userName;
                }
                else
                {
                    Debug.Log("Fall");
                    text.text = "Fail";
                }
            });
        }
    }
 
    public void OnLogOut()
    {
        ((PlayGamesPlatform)Social.Active).SignOut();
        text.text = "Logout";
    }
}
 
cs

 

로그인 버튼을 눌렀을 때

로그아웃 버튼을 눌렀을 때

 

그리고 apk로 폰이나 애뮬레이터에서 테스트할 때에는 꼭 테스터를 추가해야 합니다.

테스트가 끝난 후

게임 출시가 가능합니다.

 

로그인에는 지금 의미가 없으므로 리더보드 작성 후 출시해보도록 하겠습니다.

 

 

출시 후 문제

연결 중까지만 뜨고, 로그인이 되지 않는 문제가 발생했습니다.

해결 방법

여러 사이트를 검색하면서 알게 되었습니다.

플레이 콘솔의 해당 업플로 들어가서, 출시 관리 - 앱 서명으로 들어갑니다.

그 후 앱 서명 인증서 지문을 복사합니다.

게임 세브 정보로 들어가서 GplayTest로 들어갑니다.

 

그러면 API 및 서비스로 들어가게 되는데, 수정을 누릅니다.

 

이전에 복사한 앱 서명 인증서 지문을 넣습니다.

그리고 저장합니다.

그 후 앱을 실행해서, 로그인이 가능한지 확인합니다.

 

그 외 문제가 있다면, 제가 참조한 사이트를 확인해보시는것도 좋을 것 같습니다.

https://github.com/playgameservices/play-games-plugin-for-unity/issues/1800#issuecomment-310877125

 

[SOLVED] Can't authenticate users, sign in fails · Issue #1800 · playgameservices/play-games-plugin-for-unity

I can't figure it out. I have a feeling that something is happening on services end, but then there's also some weird behavior on my end. Like it works when I just built new apk, it allows ...

github.com

 

 

 

다음"[Unity] 유니티 구글 플레이 게임 서비스 연동 ( 업적과 리더보드 )"편으로 이어집니다.

 

 

[Unity] 구글 플레이 게임 서비스 연동 ( 업적과 리더보드 )

. 안녕하세요. [Unity] 구글 플레이 게임 서비스 연동 ( 로그인 하기 ) 를 이어서 구글 플레이 게임 서비스 업적과 리더보드 연동해보겠습니다. 1. 업적 구글 플레이 콘솔로 접속합니다. https://play.google.com..

scvtwo.tistory.com

 

읽어주셔서 감사합니다~! 수정할 부분이나 질문은 댓글 달아주세요!

 

반응형
반응형

 

지스타 2019 외부전경

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

지스타 2019 배너

19년도 지스타를 다녀왔습니다. 

우선 지스타는 

전시명 국제게임전시회 지스타 2019(Game Show & Trade, All-Round)
일정 및 관람시간

[BTC] 2019. 11. 14(목) ~ 11. 17(일), 4일간

11. 14(목)  12:00 ~ 18:00

11. 15(금)  10:00 ~ 18:00

11. 16(토)  09:00 ~ 18:00

11. 17(일)  10:00 ~ 18:00

[BTB] 2019. 11. 14(목) ~ 11. 16(토), 3일간

컨퍼런스 프로그램 시간표

https://www.gstar.or.kr/conference/conf_prog_info.do

장소 BEXCO (부산광역시)
규모 약 55,300 sqm
주최 한국게임산업협회
주관 지스타조직위원회, 부산정보산업진흥원
후원 문화체육관광부
개최도시 부산광역시
BTC 참관 입장료 어른- 10,000원/ 청소년-5,000원

 

이렇게 큰 행사로 매년 하고 있는 국내 게임 관련 전시 중 가장 큰 전시회입니다. 

 

지스타 2019 외부전경

우선 총평은....

게임 개발자라서 회사에서 다녀오는 것을 장려해서 매년 참석하고 있습니다.

16,17,18,19년도의 모두 참석했던 사람으로서 말하자면 올해는 배그와 브롤이 다했다고 봅니다.

볼 게 없다고는 말하긴 어렵고 새로 대두되는 게임 시장을 반영하기도 어려웠습니다. 

그럼 한 문장으로 현재 가장 강력하게 우리나라 게임 시장에 지분 있는 회사의 쇼랄까요?

따라서 많은 분들이 배그와 브롤의 팬분들이 많으셔서 많이 가실 것이라고 봅니다. 저도 브롤 팬이기에 가서 토너먼트를 하고 이기면 도장을 주고 도장을 다 찍으면 룰렛?을 돌려 상품을 주는 방식으로 부스를 채웠습니다. 브롤의 부스는 팬미팅 같은 체험존의 방식으로 채웠습니다.

2019년 지스타 브롤스타즈 토너먼트 도장판

스티커 세트를 위해 2019년 짬짬이 브롤을 열심히 했던 이유인가...ㅋㅋㅋ

2019년 지스타 브롤스타즈 부스

(1번 사진은  18비트 모형 (왜 브롤만 3d인가 ㅋㅋㅋ)

2번 사진은 토너먼트 중인 사람들입니다. 열기가 상당히 뜨거웠습니다.

3번 사진 코스튬도 한 브롤 ㅋㅋ 구현 가능한 사람 캐릭터는 모형 아니고 코스튬이라궄ㅋㅋ )

2019 지스타 배틀그라운드 PUBG BOOTH

 

역시 배틀그라운드 부스는 가운데에 크고 led 전광판에 크고 화려하게 관객을 압도했습니다. 부스 안에는 줄 서고 있는 사람들이 인산인해를 이루고 있었습니다. (여기서는 사진을 못 찍은 이유가 너무 많이 사람들이 줄을 서있어서 사람이 담겨서 사진을 쓸 수 없겠더라고요)

배틀그라운드의 주제가 어떻게 탄생했고, 성장했으며, 유저들의 사랑을 받아서 오늘날에 이르렀는지, 그리고 앞으로의 지향점 등을 소개하는 기획이었고, 게임을 넘어 하나의 문화 콘텐츠로 자리 잡은 배그를 주제로 한 국내 컨템퍼러리 아티스트들의 작품이 전시되어있었습니다.

게다가 팬이라면 놓치기 힘든 굿즈샵도 있었습니다.(저는 힘들게 유혹을 떨쳐버렸습니다.)

B2C 부스에선 해시태그 SNS 인증, 랜덤 OX퀴즈, 펍지 공식 커뮤니티 가입 등 스탬프 미션 이벤트를 마련해 미션 완수 시 파밍 존에서 갓챠 머신에 참여 가능한 코인을 지급해서 코인으로 PVC 가방, 진통제 젤리, 물티슈를 비롯 배달의 민족, 레드불과 제휴한 스페셜 쿠폰? 경품과 교환할 수 있었습니다.

 

 

 

 

 

 

2019 지스타 중소기업관

솔직히 지스타가 브롤과 PUGE가 다했다고 하는 게 중소기업관에 2018년 출전했던 게임 그대로 들고 나왔다는 데에 있다고 봅니다. 전시관도 아주 후미지고  출입문에서도 보이지 않는 곳에서 전시가 되어 있었습니다. 사진으로 화려하지만 2019년 흥행한 인디게임의 전시가 되지 않은 점이 좀 뼈아프다고 봐야 합니다. 여기에 중소기업이 잘못되었다기보다는 이 중소기업도 다 지원보다 돈 내고했다고 봐야 한다.(약소 업체는 꿈도 못 꿉니다.) 이런 중기업도 나오고 소기업도 나오는 게 더 좋지 않았을까?? 넥슨이 빠져서 좀 신작도 덜 보이고 과열된 느낌도 덜하고 대기업만 판을 쳤지만 브롤 팬과 배그 팬에게는 아쉽지 않을 좋은 전시회가 될 지스타였습니다.

 

지스타 꿀팁>>

 

2019 지스타 약도

1. 표는 온라인으로 예매하자~!

위의 사진처럼 제1전시회장과 매표소 거리는 거짓말 살짝 보태서 10분 거리 정도 됩니다. 저는 지하철 타고 갔는데 컨벤션홀과 오디토리움 사이에서 들어갔습니다.  한 10분 헤매서 매표 구역을 찾았고 걸어서 10분 거리에 매표소에서 엄청 줄 서서 기다려야 합니다. (전 오전 중에 가서 덜 기다리고 들어갔습니다. 이것도 꿀팁이 되겠네요.)

2019 지스타 매표소

 

2. 짐은 기차역에 맡기기.

요즘에 개인 작업으로 앱 만들고 있기 때문에 노트북을 가져갔습니다. 제 노트북은 가성비를 모두 고려했기 때문에 (ㅋㅋㅋ변명을 하자면) 무겁습니다. 따라서 부산역에서 맡기고 관람하였습니다.  (비용은 2000~3000원입니다. 고생에 비해서 완전 혜자입니다.)

부산역 물품보관함

3. 구글 플레이 스탬프 랠리 참여하여 카드 1만 원권 도전하기!!

구글 플레이 부스에서는 뽑기(3번째 사진:돌려서 뽑기를 진행하고 있습니다. 전 250 point를 받았습니다.)와 각종 게임존(구글 플레이 포인트 럭키존, 쿵야 캐치마인드존, 창구 프로그램존, 야외부스 등)에서 미션 클리어 후, 핸드폰의 스탬프(첫번째사진:스마트폰 QR로 불러오는 판)를 모아 1만원 상당의 구글플레이 기프트 카드로 교환할 수 있습니다. 이건 진짜 강추하는 게 입장료 1만 원이 빠지기 때문에 부산사람인데 브롤 배그 팬이라면 이것 때문에 입장료가 무료가 되니 진짜 가보시길 추천드립니다.)

2019 지스타 구글부스와 스탬프

 

4. 부산 왔으니 맛집 가보자!!

 

부산에 이색적인 음식점 많습니다.  돼지국밥, 밀면, 등 기차표값이 들었다면 게임 말고도 다른 경험도 많이 쌓아간다면 좋은 경험이 될 것이라고 생각합니다. 

 

읽어주셔서 감사합니다.

 

https://scvtwo.tistory.com/78

 

[게임이슈] 2019 지스타 후기 2편( 부산 식도락 여행)

안녕하세요. 개발남입니다. 1. 지스타2019 (브롤,배그 빼고)에서 가장 기억에 남았던 게임 하나만 골라서 리뷰하겠습니다. (협찬, 광고아닙니다.) 가장 기억에 남는 게임은 유령 잡는 VR 게임입니다. PNI COMPAN..

scvtwo.tistory.com

 

 

반응형
반응형

 

안녕하세요.

APK를 Google Play에 올릴 때, 다음과 같은 메세지가 발생하는 경우를 볼 수 있습니다.

오늘은 해당 에러를 수정하는 방법에 대해 적어보겠습니다.

 

경고

이 버전을 출시하기 전에 다음 경고를 확인하세요. 이 페이지의 경고를 해결하면 기존 사용자가 최신 버전의 앱으로 업그레이드할 수 있습니다.

이렇게 메세지가 뜨고 경고 메세지 보기를 누르면 다음과 같은 메세지가 나옵니다.

최적화되지 않은 APK

경고:

이 APK로 인해 미사용 코드 및 리소스가 사용자에게 전송됩니다. Android App Bundle을 사용하면 앱 크기를 줄일 수 있습니다. 기기 설정에 따라 앱을 최적화하지 않으면 다운로드하여 사용자 기기에 설치되는 앱 용량이 필요 이상으로 커집니다. 크기가 큰 앱은 설치 성공률이 낮으며 사용자 기기의 저장용량을 많이 차지합니다.

해결 방법:

Android App Bundle을 사용하여 앱을 기기 설정에 맞게 자동으로 최적화하거나 여러 개의 APK로 직접 관리하세요.

 

빌드 셋팅을 다음과 같이 Build App Budle(Google Play)를 체크합니다. 

유니티 버전이 낮으면 안나올 수 있습니다. 업그레이드 해주세요.

제가 테스트한 버전은 2019.2.9f1입니다.

 

aab 확장자 파일로 생성됩니다.

여기서는 아직 용량이 줄지 않습니다.

aab를 Google Play Console로 들어가서 올립니다.

그러면 이전 apk파일보다 용량이 반정도 줄어들고, 아까 발생한 경고 문고도 사라진 것을 확인할 수 있습니다.

 

이상입니다.

반응형
반응형

 

안녕하세요.

앱등록할 떄, 다음과 같은 오류에 대해 수정하는 법에 대해 공유 드립니다.

"이 버전을 출시하기 전에 다음 오류를 확인하세요."

오류 메세지를 보면 다음과 같이 나옵니다.

이 출시 버전은 Google Play 64비트 요구 사항을 준수하지 않습니다.

다음 APK 또는 APP Bundle은 64비트 기기에서 사용할 수 있으나 현재 다음 32비트 네이티브 코드만 있습니다. 

앱에 64비트 및 32비트 네이티브 코드를 포함하세요. Android App Bundle 게시 형식을 사용하여 각 기기 아키텍쳐가 필요한 네이티브 코드만 수신하도록 자동으로 확인하세요. 그래야 앱 전체 크기를 줄일 수 있습니다.

이런 에러가 발생합니다.

다음과 같이 해결합니다.

64버전을 지원하려면 ARM64를 체크해야합니다.

일단, Scripting Backend에 Mono를 IL2CPP로 변경하고, ARM64를 체크합니다.

그리고 다시 빌드합니다.

만약 unable to locate android ndk 문제 오류가 난다면 다음 글을 확인하세요.

https://scvtwo.tistory.com/70?category=877671

 

[Unity] unable to locate android ndk 문제

안녕하세요. 유니티 빌드 중에 "unable to locate android ndk" 메세지박스가 출력되는 경우 해결 방법에 대해 알아보도록 하겠습니다. 일단 검색해봤을 때, Android SDK & NDK Tools을 설치했습니다. 근데 여전..

scvtwo.tistory.com

 

반응형
반응형

이미 버전 코드가 1인 APK가 있으므로 다른 버전 코드를 사용해야 합니다.

다음과 같이 버전이 같은 APK를 넣으면 업로드 실패가 뜹니다.

이렇게 해결합니다.

버전을 변경하고, 다시 빌드를 합니다.

반응형
반응형

 

안녕하세요.

유니티 빌드 중에 "unable to locate android ndk" 메세지박스가 출력되는 경우 

해결 방법에 대해 알아보도록 하겠습니다.

일단 검색해봤을 때, 

Android SDK & NDK Tools을 설치했습니다.

근데 여전히 같은 현상이 발생했습니다.

그래도 또 검색하다보니, Edit-Preferences에서 NDK를 다운로드 받습니다.

링크는 다음과 같습니다.

ndk를 저장한 후 C:\에 넣습니다.

https://dl.google.com/android/repository/android-ndk-r16b-windows-x86_64.zip

불러오는 중입니다...

그리고 경로를 변경합니다.

그리고 다시 빌드를 합니다.

반응형
반응형

안녕하세요.

구글 플레이 게임 서비스(GPGS) 연동 후 구글 플레이에 등록하는 과정에 대해 알아보도록 하겠습니다.

다음 과정을 거쳐서 GPGS 연동 후 앱등록 해보도록 하겠습니다.

1. Google Play Games plugin for Unity 

 

https://developers.google.com/games/services/integration

 

Game Engine Integrations  |  Play Games Services  |  Google Developers

Several plugins and extensions offer support for Google Play games services. If you are developing your game with a third-party game engine, you may be interested in using one of these plugins or extensions to integrate Google Play games services features.

developers.google.com

여기에 접속하여, Google Play Games plugin for Unity 를 눌러 GitHub에 접속합니다.

https://github.com/playgameservices/play-games-plugin-for-unity

 

playgameservices/play-games-plugin-for-unity

Google Play Games plugin for Unity. Contribute to playgameservices/play-games-plugin-for-unity development by creating an account on GitHub.

github.com

 

current-build로 들어갑니다.

GooglePlayGamesPlugin-0.10.06.unitypackage를 다운로드받습니다.

그리고 사용할 프로젝트에 import 합니다.

GooglePlayGamesPlugin-0.10.06.unitypackage 파일을 끌어서 해당 프로젝트에 넣으면 됩니다.

 

2. Build Settings

그 후 File-Build Settings에 Build Settings창을 엽니다.

Android로 변경합니다.

Switch Platform을 한 후 Player Settings...버튼을 누릅니다.

그리고 다음과 같이 Company Name을 지정하고. Keystore Manager...버튼을 누릅니다.

 

Create New - Anywhere 한 후 KeyStore를 저장합니다.

 

 

패스워드를 입력하고, Alias는 아무거나 입력합니다.

그리고 AddKey 버튼을 누릅니다.

이제 다시 빌드 셋팅으로 돌아가서 빌드 버튼을 눌러 apk를 만듭니다.

만약 씬이 추가가 안되어있다면 "Add Opn Scenes"를 누릅니다.

 

3. 앱등록

Google Play Console에 접속하여 로그인 합니다.

https://developer.android.com/distribute/console?hl=ko

 

Google Play  |  Android Developers

Google Play Console로 앱과 게임을 게시하고 Google Play에서 비즈니스를 성장시키세요. 앱의 품질을 개선하고, 사용자층과 소통하고, 수익을 창출하기 위한 여러 기능을 활용할 수 있습니다.

developer.android.com

GOOGLE PLAY에 ANDROID 앱을 출시 버튼을 누릅니다.

 

제목을 입력하고 만들기 버튼을 누릅니다.

그러면 다음과 같은 화면이 나오는데, 체크 항목을 모두 기입해야합니다.

 

3-1 스토어 등록정보

일단 별로 표시된 항목들은 모두 기입해야합니다.

 

콘텐츠 등급은 apk올린 후 합니다.

3-2 앱 버전

apk를 등록합니다.

 

저장을 누르면 검토 버튼이 활성화되는데, 검토버튼을 누릅니다..

3-3 콘텐츠 등급

저장하고 등급계산을 합니다.

 

3-4 가격 및 배포

 

그 후 임시저장 버튼을 누릅니다.

3-5 가격 및 배포

 

광고가 있다면 "예, 광고가 포함되어 있습니다"를 체크합니다.

저는 광고가 없어서 "아니요"를 했습니다.

앱버전탭으로 이동합니다.

그 후 프로덕션 출시 시작을 합니다.

반응형
반응형

 

 

안녕하세요.

갤럭시 A80이 드디어 국내 출시가 되었습니다.

오늘 11월 8일 사전예약을 시작합니다.

https://shop.tworld.co.kr/exhibition/view?exhibitionId=P00000097

 

Galaxy A80 Coming Soon! | T월드 다이렉트

오직 SKT에서만

shop.tworld.co.kr

출고가는 599,500원입니다.

해외구매 시에는 55만 정도에 구매할 수 있지만, 삼성 페이나 AS를 생각하면 국내 구매가 더 나을 것 같습니다.

색상은 팬텀 블랙, 엔젤 골드로 출시됩니다.

1. 스펙

프로세스 퀄컴 스냅드래곤 730G
메모리 8GB LPDDR4X SDRAM, 128GB(내장메모리)
디스플레이 6.7인치 20:9 비율 2400 x 1080 New Infinity Display
네트워크 4G, LTE-A Cat.11
WiFi 802.11 a/b/g/n/ac
블루투스 블루투스v5.0
카메라 트리플 카메라, 4,800만화소+800만화소+TOF 3D
배터리 내장형 Li-Ion 3700 mAh, 최대25W 충전지원
운영체제 안드로이드 9 (Pie)
Samsung One UI 1.1
규격 76.5 x 165.2 x 9.3 mm, 220 g
색상 팬텀 블랙, 엔젤 골드
단자 USB 2.0 Type-C x 1
기타 Dolby Atmos 기술 탑재, FM 라디오 지원

 

2. 장점

전면 카메라가 사라짐으로 인해, 정말 베젤이 없는 휴대폰입니다. 
또한 후면카메라를 전면 카메라로 써서, 셀카 시에도 더 좋은 화질로 찍을 수 있습니다.

3. 단점

다른 휴대폰에 비해 무겁습니다. (A70 : 183g, A80 : 220g, A90 : 206g)
이어폰 단자가 없습니다.
안면 인식센서가 옮겨있어서, 잠금해제가 불편합니다.
4G까지만 지원합니다.
SD카드 슬롯이 없습니다.
방수/방진 기능이 없습니다.

반응형
반응형

안녕하세요.

스레드에서 동시에 같은 메서드에 접근하거나 같은 변수값을 변경할 때, 실행 결과가 잘못될 경우가 있습니다.

이럴때는 쓰레드가 동시에 같은 메서드에 접근을 못하게 하거나 같은 변수에 접근을 못하게 막아야합니다.

이렇게 순차적으로 접근시키고, 동시접근을 막아주는게 동기화라고 할 수 있습니다.

다음 코드는 동기화를 하지 않았을 때 문제가 발생합니다.

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
 
namespace ConsoleApplication1
{
    class Program
    {
        static int Count = 0;
 
        static void print()
        {
            for (int i = 0; i < 5; i++)
            {
                Count++;
                Console.WriteLine(Count);
                Thread.Sleep(1000);
            }    
        }
        static void Main(string[] args)
        {
            Thread thread1 = new Thread(new ThreadStart(print));
            Thread thread2 = new Thread(new ThreadStart(print));
            Thread thread3 = new Thread(new ThreadStart(print));
            Thread thread4 = new Thread(new ThreadStart(print));
 
            thread1.Start();
            thread2.Start();
            thread3.Start();
            thread4.Start();
 
            thread1.Join();
            thread2.Join();
            thread3.Join();
            thread4.Join();
 
        }
    }
}
cs

4개의 쓰레드를 생성해서 Count 변수에 1씩 5번 더해줘서 총 20을 더하게 됩니다.
근데 출력된 값을 보면 1~20으로 순차적으로 찍히는게 아니라, 다음과 같이 찍히는 경우도 존재합니다.

제대로 연산이 안될 경우가 있으면, 계속 버그가 만들어지게 되므로, 우리는 항상 규칙적으로 코드가 실행되야 합니다.

그래서 동기화를 사용해서 한 쓰레드가 메모리에 접근중이면 다른 쓰레드가 해당 메모리에 접근하지 못하도록 막습니다.

동기화에는 다음과 같은 클래스를 사용합니다.

1. Lock

상호 배제 잠금을 획득하여, 명령문 브록을 실행 후, 잠금을 해제합니다.
잠금을 보유하는 스레드에서 잠금을 다시 해제할 수 있으며, 
다른 스레드에서는 잠금을 획득이 차단되고, 잠금이 해제될때까지 대기하게 됩니다.

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
 
namespace ConsoleApplication1
{
    class Program
    {
        static int Count = 0;
 
        static System.Object lockThis = new System.Object();
 
        static void print()
        {
            lock (lockThis)
            {
                for (int i = 0; i < 5; i++)
                {
                    Count++;
 
                    Console.WriteLine(Count);
                }
            }
        }
        static void Main(string[] args)
        {
            Thread thread1 = new Thread(new ThreadStart(print));
            Thread thread2 = new Thread(new ThreadStart(print));
            Thread thread3 = new Thread(new ThreadStart(print));
            Thread thread4 = new Thread(new ThreadStart(print));
 
            thread1.Start();
            thread2.Start();
            thread3.Start();
            thread4.Start();
 
            thread1.Join();
            thread2.Join();
            thread3.Join();
            thread4.Join();
 
        }
    }
}
cs

2. Monitor

Lock과 같이 해당 블록을 잠금 후 실행하고, 잠금을 해제합니다.

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;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
 
namespace ConsoleApplication1
{
    class Program
    {
        static int Count = 0;
        static Object monitorLock = new System.Object();
 
        static void print()
        {
            Monitor.Enter(monitorLock);
            try
            {
                for (int i = 0; i < 5; i++)
                {
                    Count++;
                    Console.WriteLine(Count);
                    Thread.Sleep(1000);
                }
            }
            finally
            {
                Monitor.Exit(monitorLock);
            }
        }
        static void Main(string[] args)
        {
            Thread thread1 = new Thread(new ThreadStart(print));
            Thread thread2 = new Thread(new ThreadStart(print));
            Thread thread3 = new Thread(new ThreadStart(print));
            Thread thread4 = new Thread(new ThreadStart(print));
 
            thread1.Start();
            thread2.Start();
            thread3.Start();
            thread4.Start();
 
            thread1.Join();
            thread2.Join();
            thread3.Join();
            thread4.Join();
 
        }
    }
}
cs

Monitor 클래스 중에는 Wait()와 Pulse() 메서드가 있습니다.
쓰레드를 Wait() 메서드로 잠시 대기상태로 만들어 준 후 Pulse()로 활성화 시킬 수 있습니다.
보통 메모리 상에 데이터를 가질때까지 대기하고 데이터를 가지게 되면 활성화 시켜서 작업을 진행할 수 있도록 할 수 있습니다.
다음은 Count 필드 값을 순차적으로 증가 시킨 후 다른 스레드에서 감소합니다.

반응형

'개발공부 > C#' 카테고리의 다른 글

[C#] 스레드(Thread)  (0) 2019.11.04
[C#]컬렉션(Collections)  (0) 2019.10.31
C# 인터페이스(interface)  (0) 2019.10.30
[C#] 배열(Array)  (0) 2019.10.29
[C#] String.Format  (0) 2019.10.28
반응형

스레드는 프로세스 내에서 실행되는 흐름의 단위를 말합니다.
프로세스 내에는 여러 개의 스레드가 존재할 수 있습니다.

그리고 여러개의 스레드로 여러 작업 들을 실행할 수 있습니다.
예를 들면, 어떠한 연산을 동시에 실행되게 할 수 있습니다.

동시에 연산을 진행하게 되면 다른 연산 결과를 얻을 수 있으므로 제대로 된 설계를 하여 스레드를 사용해야 합니다. 스레드는 프로세스 내에서 실행되는 흐름의 단위를 말합니다.
프로세스 내에는 여러 개의 스레드가 존재할 수 있습니다.

그리고 여러개의 스레드로 여러 작업 들을 실행할 수 있습니다.
예를 들면, 어떠한 연산을 동시에 실행되게 할 수 있습니다.

동시에 연산을 진행하게 되면 다른 연산 결과를 얻을 수 있으므로 제대로 된 설계를 하여 스레드를 사용해야 합니다.

바로 예제 코드 작성을 하여, 설명드리겠습니다.

다음과 같이 코드를 작성하면 쓰레드가 만들 수 있습니다.

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;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void print()
        {
            for (int i = 0; i < 5; i++)
            {
                Console.WriteLine("out : {0}", i);
                Thread.Sleep(1000);
            }
        }
        static void Main(string[] args)
        {
            Thread thread = new Thread(new ThreadStart(print));
 
            thread.Start();
            
        }
    }
}
cs

using System.Threading를 사용하여 Thread클래스를 생성할 수 있습니다.

new Thread(new ThreadStart(print))로 스레드로 생성할 메서드를 델리게이트를 만들어서 스레드를 생성합니다.

thread.Start();로 시작합니다.

순차적으로 out : 0 ~ out : 5까지 출력되는것을 확인할 수 있습니다.

Main에서 print함수를 같이 실행 시켜봅니다.

1
2
3
4
5
6
7
8
static void Main(string[] args)
{
    Thread thread = new Thread(new ThreadStart(print));
 
    thread.Start();
 
    print();    // 이부분만 추가합니다.
}
cs

이렇게 한다면 새로 만든 print메서드를 사용하는  thread와 메인 스레드 두개가 동시에 진행되면서,
out : 0 ~ out : 5가 2개씩 찍히는 것을 확인할 수 있습니다.

쓰레드 실행 중에 종료를 하면 어떻게 할까요??

바로 Abort함수를 이용합니다.

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void print()
        {
            for (int i = 0; i < 5; i++)
            {
                Console.WriteLine("out : {0}", i);
                Thread.Sleep(1000);
            }
        }
        static void Main(string[] args)
        {
            Thread thread = new Thread(new ThreadStart(print));
 
            thread.Start();
 
            Thread.Sleep(3000);
            thread.Abort();
            thread.Join();    // 종료대기
        }
    }
}
cs

이렇게 코드를 작성하면 3초 후 종료가 되어서 print메서드의 출력을 모두 할 수 없습니다.

Abort()를 호출하면, ThreadAbortException를 throw 하여 종료가 됩니다.

근데 Abort()는 지금 같이 간단한 코드에서는 문제가 생기지 않지만, 

바로 종료가 된다는 보장도 없으며, Join함수로 인해 종료 대기가 된다는 보장도 없습니다.

웬만하면 Abort()를 이용해서 종료하지 않는 편이 좋습니다.

다음과 같이 작성하면 throw 할 때 상태를 확인할 수 있습니다.

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void print()
        {
            try
            {
                for (int i = 0; i < 5; i++)
                {
                    Console.WriteLine("out : {0}", i);
                    Thread.Sleep(1000);
                }
            }
            catch (ThreadAbortException e )
            {
                Console.WriteLine(e);
            }
            finally
            {
                Console.WriteLine("About Complete");
            }
        }
        static void Main(string[] args)
        {
            Thread thread = new Thread(new ThreadStart(print));
 
            thread.Start();
 
            Thread.Sleep(3000);
            thread.Abort();
            thread.Join();    // 종료대기
        }
    }
}
cs
반응형

'개발공부 > C#' 카테고리의 다른 글

[C#] 스레드 동기화(Lock, Monitor)  (0) 2019.11.05
[C#]컬렉션(Collections)  (0) 2019.10.31
C# 인터페이스(interface)  (0) 2019.10.30
[C#] 배열(Array)  (0) 2019.10.29
[C#] String.Format  (0) 2019.10.28
반응형

안녕하세요.

코딩하다 보면 플랫폼별로 실행되는 코드를 분류해야 하는 경우가 있습니다.

예를 들면, 안드로이드 폰에서는 뒤로 가기가 있지만, 아이폰에서는 뒤로 가기가 없습니다.

그러므로 안드로이드 폰에서만 실행되는 코드를 작성해야합니다.

그럴 경우에 다음과 같이 작성할 수 있습니다.

if (Application.platform == RuntimePlatform.Android)
            실행코드;

현재 플랫폼을 확인해서 그에 맞는 코드를 작성합니다.

Application.platform은 플랫폼별로 다음과 같은 값을 가지고 있습니다.

RuntimePlatform변수 설명
OSXEditor Mac OS X 유니티 에디터 플레이어
OSXPlayer Mac OS X 플레이어
WindowsPlayer Windows 플레이어
OSXWebPlayer Mac OS X 플레이어
OSXDashboardPlayer Mac OS X Dashboard widget
WindowsWebPlayer Windows 플레이어
WindowsEditor Windows 유니티 에디터
IPhonePlayer iPhone 플레이어
XBOX360 XBOX360 플레이어
PS3 Play Station 3 플레이어
Android 안드로이드 장치 플레이어
LinuxPlayer 리눅스 플레이어
WebGLPlayer WebGL 플레이어
WSAPlayerX86 CPU 아키텍쳐가 x86 윈도우스토어 앱플레이어
WSAPlayerX64 CPU 아키텍쳐가 x64 윈도우스토어 앱플레이어
WSAPlayerARM CPU 아키텍쳐가 ARM 윈도우스토어 앱플레이어
TizenPlayer 리눅스상에서 동작하는 플레이어를 나타냅니다.
PSP2 PS Vita 플레이어
PS4 Playstation 4 플레이어
XboxOne Xbox One 플레이어
SamsungTVPlayer Samsung Smart TV 플레이어
WiiU Windows플레이어
tvOS iPhone 플레이어
   

 

안드로이드 폰에서 뒤로가기를 눌렀을 때는 다음과 같이 코드를 작성합니다.

1
2
3
4
5
6
7
void Update()
{
    if (Application.platform == RuntimePlatform.Android && Input.GetKeyDown(KeyCode.Escape))
    {
        Application.Quit();
    }
}
 
cs
반응형

+ Recent posts