디시인사이드 갤러리

마이너 갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

[💬] GDPR에 대해 알아보자 (Feat 애드몹)

로망바드갤로그로 이동합니다. 2024.02.02 14:47:52
조회 2073 추천 31 댓글 12
														


0aa8d535f19c28a8699fe8b115ef046c33f8410b92


얘들아 안녕, 다들 개발 잘 하고 있어?



저번 달에 GDPR 구현하다가 막혀서 여기다 글을 올렸었는데, 다행히 이젠 해결한 것 같아.


그 당시 해결하면 팁 남겨달라던 친구의 댓글이 기억나서 다시 돌아왔어.



사실 GDPR은 나온지가 진짜 오래 되었어.


심지어 구글 애드몹 기준으로도 ‘24년 1월 16일까지 대응 필수!’라며 경고를 엄청 띄워왔었기에 대부분 대응을 완료 했을 거라고 생각해.


그래도 이제 개발하는 친구들은 모를 수도 있을테니 도움이 되었으면 하는 마음에 남겨봐.



그럼 시작해보자.





GDPR이 뭐임?


정확한 명칭은 유럽 개인정보 보호법이라는데, 간단히 이야기하면


“유럽 유저들의 개인 정보를 가져다 쓰려면 직접 허락을 받아라’”


라고 할 수 있어. 애플의 ATT와 비슷한데, 조건이 안 맞으면 광고를 아예 못 튼다는 부분에서 조금 더 빡센 느낌이야.


더 상세한 내용이 궁금한 친구들은 구글에 GDPR로 검색하면 자료가 쏟아지니까 확인해보자.


사실 인디 게임 개발자인 우리가 알아야 될 것은 하나인 것 같아.


“유럽(+ 영국)에서 광고로 돈 벌려면 GDPR 동의 팝업을 추가해야 함.”






GDPR 대응 안하면 어떻게 되는데?


중요한 건 GDPR의 대상이 그 이름처럼 유럽(+영국) 한정이라는거야.


즉, 아직 글로벌 서비스를 계획하고 있지 않다면 신경 쓸 필요가 없어.


하지만 서비스의 대상에 유럽(+영국)가 포함된다면, GDPR 동의를 받지 않은 유저들에겐 광고를 아예 띄울 수 없어.


다만 이미 서비스 중인 게임 기준, 따로 GDPR을 구현하지 않더라도 어떻게든 애드몹이 온몸 비틀기로 GDPR 동의를 띄우는 것 같아.


다만 제대로 된 팝업은 아닌 것으로 보이고, 그래서인지 동의율이 낮아.


거기다 애드몹이 이런 식의 땜빵을 꾸준히 해준다는 보장도 없으니, 아직 대응을 안했거나 신규 개발 중이라면 GDPR 처리를 해 두는걸 권장해.






그렇다면 어떻게 대응하는가?


앞에서 말했듯이 애드몹에서 최근에 필수로 변경해서 그렇지, GDPR 자체는 몇 년도 전에 있었어.


때문에 GDPR을 처리할 수 있는 방법은 다양해.


애드몹처럼 광고 플랫폼이 제공하는 기능을 사용해도 되고, 아예 GDPR을 별도로 처리해주는 서비스도 있다고 들었어.


근데 난 애드몹으로 처리했으니, 애드몹 기준으로 설명할게.


애드몹에서 GDPR을 처리하려면, 크게 2가지가 필요해.


바로 팝업과 구현이야.







팝업 추가하기



1dec9e36ebd518986abce8954784756a8826

먼저 애드몹의 ‘개인 정보 보호 및 메시지’ 메뉴로 들어가서, 유럽 규정의 ‘관리’로 들어가.



1def9e36ebd518986abce8954188776fde

그럼 이렇게 메시지 만들기를 선택할 수 있고



viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73ce985fa11d028315015801132de093a7d99d0d3d8d8ab678125f0be8f1c04391a7cdb3e4df3da32aa90f2603cd1d4b6a3be0ceed39045cdb4873a

이후에 나오는 페이지에서 GDPR 페이지 설정을 마무리하면 돼.



여기서 신경 써야 할 것은 3가지인 것 같아.


1, 2 - 둘 다 유저에게 미동의 버튼을 얼마나 적극적으로 보여주느냐를 결정하는 기능이야.

개발자 입장에선 동의율이 높은 게 좋으니 둘 다 사용안함으로 두는 게 유리할 거야.


3 - 해당 팝업을 몇 가지 언어로 지원하는지를 결정하는 부분이야.

기본은 영어로 되어있고, 다양한 언어를 지원하길래 나는 31개 추가언어를 모두 활성화했어.


여기까지 세팅하고 ‘게시’ 버튼 누르면 팝업에 대한 세팅은 끝이야.






팝업 구현하기


저것만 추가하고 끝나면 참 좋은데... 안타깝게도 코드 딴에서 직접 저 팝업을 호출해줘야 하더라.


애드몹에서 직접 설명하고 있고, 코드가 복잡하지 않으니 직접 확인해보면 될 거야.


https://developers.google.com/admob/unity/privacy?hl=ko


하면서 내가 겪었던 문제를 몇 가지 공유하면 다음과 같아.


- 싱글 스레드 에러가 발생하면 아래 코드를 추가해 줘야 함.

  MobileAds.RaiseAdEventsOnUnityMainThread = true;


- 테스트를 위해 핸드폰의 Hashed ID가 필요한데, 테스트 빌드를 로그캣에 물려서 돌려보면 로그에 찍힘.


이렇게 코드까지 추가해주면 기본적인 작업은 끝이야.






추가 처리 (선택)


앞선 2개만 처리하면 돌리는 것은 문제가 없어. 그러니 대부분의 경우엔 이 정도에서 구현을 마쳐도 괜찮을거야.


하지만 내 경우는 상세한 정보를 필요했는데, 이런 것들이야.


- 이 유저가 GDPR의 대상인지 아닌지

- 지금 애드몹이 광고를 안주는게 유저가 GDPR 동의를 안 해서 그런 건지, 그냥 광고 슬롯이 빈 건지

- 개인화 광고 여부


특히 ‘주모 키우기’에선 광고 슬롯이 비어 있는 게 유저 잘못은 아니라고 생각해서 리워드 보상을 주고 있었단 말야.


하지만 GDPR에 비동의한 유저도 광고 슬롯은 똑같이 비어있는 것으로 확인되었고, 때문에 GDPR의 동의 상태 확인이 무척 중요해졌지.


저번에 문의 글을 남긴 이유도 이 부분의 방법을 찾지 못해서 그런거였어.


하지만 열심히 뒤지다보니 다 방법이 있긴 하더라.


여기서부터는 링크로 대체할게.



애드몹에서 GDPR 동의 수준 확인하는 법

https://stackoverflow.com/questions/69307205/mandatory-consent-for-admob-user-messaging-platform


유니티에서 자바 클래스 호출해서 확인하는 법

https://groups.google.com/g/google-admob-ads-sdk/c/uIQkJX6_XtM/m/KIFmbfXVAQAJ


애드몹의 파트너 플랫폼 별 ID 확인 (앱로빈 - 1301, 유니티애즈 - 3234)

https://support.google.com/admob/answer/9681920?hl=en // 이 페이지의 Where will the Google ATPs be published? 메뉴에서 받음



여기 글들을 잘 읽어보면 대응이 가능하긴 한데... 솔직히 나도 엄청 헤맸다보니 사람에 따라선 부족할 수 있다 싶어.


그러니 내가 구현한 코드도 함께 남겨둘게. 이해가 어려운 친구들은 참고해 봐.



private void Start()

{
MobileAds.RaiseAdEventsOnUnityMainThread = true; // 애드몹 관련 처리는 메인 스레드에서만 처리하도록 처리

#if !UNITY_EDITOR // 에디터에선 GDPR 동의 홀드
Debug.Log("GDPR 동의 프로세스 스타트");
#if DEBUGBUILD // 테스트 빌드에서만 테스트모드 활성화
Debug.Log("테스트 버전 - 초기화 체크 개시!");
ConsentInformation.Reset(); // 테스트를 위해 기존 GDPR 정보 초기화
var debugSettings = new ConsentDebugSettings
{
DebugGeography = DebugGeography.EEA, // 일시적으로 유럽인척
#if UNITY_IOS
TestDeviceHashedIds = new List<string> {"여기에 아이폰 해시 ID"}
#else
TestDeviceHashedIds = new List<string> {"여기에 안드로이드 해시 ID"}
#endif
};
ConsentRequestParameters request = new ConsentRequestParameters {ConsentDebugSettings = debugSettings};
ConsentInformation.Update(request, OnConsentInfoUpdated);
#else // 릴리즈 & 디스트리뷰트에선 GDPR 테스트 모드 끄기
Debug.Log("릴리즈 버전 - 체크 개시!");
ConsentRequestParameters request = new ConsentRequestParameters();
ConsentInformation.Update(request, OnConsentInfoUpdated);
#endif
#else
// 구글 애즈 초기화
Debug.Log("애드몹 초기화 시도!");
MobileAds.Initialize(initStatus =>
{
StartAdSet();
});
#endif
}

void OnConsentInfoUpdated(FormError consentError)
{
Debug.Log("GDPR 동의 상태 콜백 확인");
if (consentError != null)
{
Debug.Log("동의 상태 확인 실패: " + consentError);
return;
}
Debug.Log("GDPR 동의 상태 확인 완료!");
ConsentForm.LoadAndShowConsentFormIfRequired((FormError formError) =>
{
Debug.Log("양식 로드 시도");
if (formError != null)
{
Debug.Log("동의 획득 실패: " + consentError);
return;
}

if (CurrentGdpr.IsGDPR()) // GDPR을 검사하는 국가에서만 체크
{
isNoAd = !CurrentGdpr.CanAdShow();
if (CurrentGdpr.IsPartnerConsent("1301")) // 앱로빈 확인
{
AppLovin.SetHasUserConsent(true);
Debug.Log("앱로빈 GDPR 켜짐");
}
if (CurrentGdpr.IsPartnerConsent("3234")) // 유니티애즈 확인
{
UnityAds.SetConsentMetaData("gdpr.consent", true);
Debug.Log("유니티애즈 GDPR 켜짐");
}
}
else
isNoAd = false;

Debug.Log("GDPR 적용 여부: " + CurrentGdpr.IsGDPR());
Debug.Log("동의 성공. 현재 광고 재생 가능? " + !isNoAd);
Debug.Log("개인화된 광고 가능? " + CurrentGdpr.CanShowPersonalizedAds());
if (ConsentInformation.CanRequestAds())
{
// 구글 애즈 초기화
Debug.Log("애드몹 초기화 시도!");
MobileAds.Initialize(initStatus =>
{
StartAdSet();
});
}
else
Debug.Log("광고 요청 불가 상태...");
});

}


여기까지가 GDPR 세팅 및 팝업 호출 & 애드몹 초기화고




public static class CurrentGdpr

{
private static bool _isGdprOn;
private static string _purposeConsent, _vendorConsent, _vendorLi, _purposeLi, _partnerConsent;
static CurrentGdpr()
{
SetData();
}
public static void SetData()
{
int gdprNum;

#if UNITY_EDITOR // 에디터에서는 자바 호출이 에러나서 에외처리
gdprNum = 1;
_purposeConsent = "0000000000";
_vendorConsent = "0000000000";
_vendorLi = "";
_purposeLi = "";
_partnerConsent = "";
#elif UNITY_ANDROID
AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaClass preferenceManagerClass = new AndroidJavaClass("android.preference.PreferenceManager");
AndroidJavaObject sharedPreferences =
preferenceManagerClass.CallStatic<AndroidJavaObject>("getDefaultSharedPreferences", currentActivity);

gdprNum = sharedPreferences.Call<int>("getInt", "IABTCF_gdprApplies", 0);
_purposeConsent = sharedPreferences.Call<string>("getString", "IABTCF_PurposeConsents", "");
_vendorConsent = sharedPreferences.Call<string>("getString", "IABTCF_VendorConsents", "");
_vendorLi = sharedPreferences.Call<string>("getString", "IABTCF_VendorLegitimateInterests", "");
_purposeLi = sharedPreferences.Call<string>("getString", "IABTCF_PurposeLegitimateInterests", "");
_partnerConsent = sharedPreferences.Call<string>("getString", "IABTCF_AddtlConsent", "");
#elif UNITY_IOS
gdprNum = PlayerPrefs.GetInt("IABTCF_gdprApplies", 0);
_purposeConsent = PlayerPrefs.GetString("IABTCF_PurposeConsents", "");
_vendorConsent = PlayerPrefs.GetString("IABTCF_VendorConsents", "");
_vendorLi = PlayerPrefs.GetString("IABTCF_VendorLegitimateInterests", "");
_purposeLi = PlayerPrefs.GetString("IABTCF_PurposeLegitimateInterests", "");
_partnerConsent = PlayerPrefs.GetString("IABTCF_AddtlConsent", "");
#endif
// 0 이면 아예 GDPR 대상이 아님. 1이어야 GDPR
if (gdprNum == 1)
_isGdprOn = true;
else
_isGdprOn = false;
Debug.Log("GDPR을 띄우는가? " + _isGdprOn);
Debug.Log("광고에 필요한 권한 동의: " + _purposeConsent);
Debug.Log("광고에 필요한 적법관심(?) 동의: " + _vendorConsent);
Debug.Log("구글에 동의처리가 되어있는가?: " + _vendorLi);
Debug.Log("구글에 적법관심(?) 처리 여부: " + _purposeConsent);
Debug.Log("파트너 네트워크 여부: " + _partnerConsent);
}

// GDPR을 띄워야 할 유저인지(= 유럽 + 영국) 리턴
public static bool IsGDPR()
{
return _isGdprOn;
}

// 광고가 보여지는지 여부 리턴
public static bool CanAdShow()
{
int googleId = 755;
bool hasGoogleVendorConsent = HasAttribute(_vendorConsent, googleId);
bool hasGoogleVendorLi = HasAttribute(_vendorLi, googleId);

// 광고 가능 - 비개인화 광고
// return HasConsentFor(new List<int> { 1 }, _purposeConsent, hasGoogleVendorConsent)
// && HasConsentOrLegitimateInterestFor(new List<int> { 2, 7, 9, 10 },
// _purposeConsent, _purposeLi, hasGoogleVendorConsent, hasGoogleVendorLi);
// 광고 가능 - 제한적인 광고 - 1에 대한 권한이 없어도 됨 ㅇㅇ
return HasConsentOrLegitimateInterestFor(new List<int> { 2, 7, 9, 10 },
_purposeConsent, _purposeLi, hasGoogleVendorConsent, hasGoogleVendorLi);
}

// 개인화 광고가 보여지는지 여부 리턴
public static bool CanShowPersonalizedAds()
{
int googleId = 755;
bool hasGoogleVendorConsent = HasAttribute(_vendorConsent, googleId);
bool hasGoogleVendorLi = HasAttribute(_vendorLi, googleId);

return HasConsentFor(new List<int> { 1, 3, 4 }, _purposeConsent, hasGoogleVendorConsent)
&& HasConsentOrLegitimateInterestFor(new List<int> { 2, 7, 9, 10 },
_purposeConsent, _purposeLi, hasGoogleVendorConsent, hasGoogleVendorLi);
}

public static bool IsPartnerConsent(string partnerID) // 파트너 권한 있는지 확인
{
return _partnerConsent.Contains(partnerID);
}
// 이진 문자열의 "index" 위치에 "1"이 있는지 확인합니다(1 기반).
private static bool HasAttribute(string input, int index)
{
return input.Length >= index && input[index - 1] == '1';
}
// 목적 목록에 대한 동의가 주어졌는지 확인합니다.
private static bool HasConsentFor(List<int> purposes, string purposeConsent, bool hasVendorConsent)
{
return purposes.All(p => HasAttribute(purposeConsent, p)) && hasVendorConsent;
}
// 목적 목록에 대한 공급자의 동의 또는 정당한 이익이 있는지 확인합니다.
private static bool HasConsentOrLegitimateInterestFor(List<int> purposes, string purposeConsent, string purposeLI, bool hasVendorConsent, bool hasVendorLI)
{
return purposes.All(p =>
(HasAttribute(purposeLI, p) && hasVendorLI) ||
(HasAttribute(purposeConsent, p) && hasVendorConsent));
}
}


이건 GDPR에 대한 세부 속성을 확인하는 코드야.


위의 링크에 있는 코드들을 C#으로 변경하고, 최신 상황에 맞춰 수정한거야.









자, 대충 여기까지야.


나 또한 구현에 시간이 걸리다보니 애드몹이 말한 제한시간을 넘겨서 GDPR을 추가하게 되었어.


그러다보니 본의 아니게 애드몹 기본 제공 GDPR을 몇 일간 사용하게 되었었는데, 차이는 다음과 같아.



7fe98077b7861f825e8d5d5aef5dd9c5d3b5ce912f48066a4349ce90d3d72b

7fe98074b5801f825e8d5d5aef5dd9c5265ede21dc506695556397e651f49dad


위쪽이 애드몹에서 제공하는 기본 구현일 때, 아래쪽이 지금 상황이야. 1주일 남짓인데 그 사이에 레이아웃이 바뀌었네. 흠?;


데이터가 적어 객관성은 떨어지지만, 일단 구현을 처리한 쪽이 동의율이 높긴 한 것 같아.


위에서 따로 이야기는 안했지만, GDPR 동의를 끈 유저들이 광고 시청을 시도할 때는 '옵션에서 GDPR을 켜!' 라고 안내도 하고 있어.






어때, 조금 도움이 되었을까?


처음 게임을 출시할 때 GDPR 같은 것은 신경 안써도 되었었는데, 어째 점점 챙겨야 될 게 많아지는 느낌이네.


1주일 넘게 서비스하면서 문제를 발견하진 못했지만, 맨 땅에 헤딩하면서 찾은 정보다 보니 틀린 내용도 있을 수 있어.


혹시 잘 아는 친구들은 수정사항을 댓글로 남겨주면 맞춰서 반영할게.


자 그럼 다들 개발 열심히 해!



자동등록방지

추천 비추천

31

고정닉 7

0

댓글 영역

전체 댓글 0
등록순정렬 기준선택
본문 보기
자동등록방지

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 말머리 제목 글쓴이 작성일 조회 추천
2868 설문 힘들게 성공한 만큼 절대 논란 안 만들 것 같은 스타는? 운영자 24/06/10 - -
2869 AD 딥 블루 호라이즌 사전예약 6.14-7.4 운영자 24/06/14 - -
161634 공지 취.업관련 이야기 금지 [10] 파베르Dev갤로그로 이동합니다. 24.06.05 696 7
159490 공지 인디 게임 개발 갤러리 규칙 - 질문 전 필독!! [25] 에뚜갤로그로 이동합니다. 24.05.10 1022 3
52873 공지 게임제작 초심자를 위한 글 모음 [9] Goranic갤로그로 이동합니다. 20.07.02 64839 52
123789 공지 뉴비 개임개발 하려는데 뭐부터 해야하나요 복사본 [14] 흉황갤로그로 이동합니다. 23.04.11 12644 22
162386 💬 팀원이 저작권 찡찡이인데 방법 있냐 ㅇㅇ(119.206) 07:09 10 0
162385 💬 기막힌 게임아이디어 생각났다 [1] ㅇㅇ(27.1) 06:02 61 0
162384 💬 대표나 디렉터는 아트 플머 기획을 전부 이해하고 하는 건가? [4] 호시타갤로그로 이동합니다. 02:47 141 0
162383 💬 기획자가 필요해!!! [7] Ms.YoonHee갤로그로 이동합니다. 00:39 277 0
162382 💬 게임서버 ㅇㅇ(122.252) 00:35 85 0
162381 🐣질문 게임 홍보 영상 명칭을 뭐라고 해야하나요? [2] earystudio갤로그로 이동합니다. 00:17 150 0
162380 💬 공포게임 만드는 중 [6] ㅇㅇ(175.119) 06.14 213 6
162379 💬 아무리 노력해봐도 야겜은 도저히 못 만들겠다 [7] ㅇㅇ(123.111) 06.14 275 1
162378 💬 습작 만든 거 친구들한테 플레이 시켜봤는데 [8] ㅇㅇ갤로그로 이동합니다. 06.14 297 0
162377 💬 구글플레이 개인 계정에 법인 계좌 연결해도 괜찮아? [1] ㅇㅇ(14.32) 06.14 89 0
162376 💬 유데미 게임서버 강의는 없나요?? [1] ㅇㅇ(14.34) 06.14 148 0
162375 💬 오타 쉽지 않네... [11] 로코복실한갤로그로 이동합니다. 06.14 192 0
162374 🐣질문 형들 SD캐릭터 외주 비용 얼마나될까? [2] ㅇㅇ(180.64) 06.14 251 0
162373 🐣질문 겜관위에 등급을 받지 않은 게임을 방송하면 불법임? [5] ㅇㅇ(175.213) 06.14 220 0
162371 🐣질문 visual studio 2019는 C++만 지원되나요? [2] ㅇㅇ(183.101) 06.14 106 0
162370 💬 AI 발전하면 다 끝나는일 [12] ㅇㅇ(121.128) 06.14 479 4
162369 📢홍보 공포게임 릴리와 꿈속의 살인 스팀에 출시! [8] 노마리갤로그로 이동합니다. 06.14 493 12
162368 💬 오늘 일이 너무 하기 싫어서 한 거 [6] MAYONEZU갤로그로 이동합니다. 06.14 297 4
162367 💬 스팀게임은 광고 뭘로해????? [8] ㅇㅇ(180.231) 06.14 214 0
162366 💬 자연스럽게 오브젝트 미는 방법 [6] MaskF갤로그로 이동합니다. 06.14 223 1
162364 💬 실전 압축 아트 외주 주는 법 [13] 김메가갤로그로 이동합니다. 06.14 683 16
162363 🐣질문 Bic 같은 거 1인 개발자. 참여 이유가 뭐임? [8] ㅇㅇ갤로그로 이동합니다. 06.14 342 0
162258 뉴스 우리 동네가 게임 속에? 사실적 한국 재현 열풍 게임메카갤로그로 이동합니다. 06.13 147 1
162362 💬 오늘자 인갤에 언급된 떡밥들 소감 [10] ㅇㅇ(183.98) 06.14 399 5
162361 💬 프로그래머의 종착역은 기획자 [2] ㅇㅇ(121.169) 06.14 252 1
162360 💬 아트란것은 각이 안잡혀야 멋있는것인가! [5] ㅇㅇ(125.132) 06.14 185 1
162359 💬 dort grim aat consep kulzone [2] dualSkewer갤로그로 이동합니다. 06.14 134 0
162357 🐣질문 gms2 steam판 쓰는 사람 있음? [8] ㅇㅇ(183.96) 06.14 74 0
162356 💬 캐릭터의 이동을 일시적으로 제한하는 방법이 있을까? ㅇㅇ(223.38) 06.14 84 0
162355 💬 밑에 있는 글이 스팀 라이트유저인 이유 [8] MAYONEZU갤로그로 이동합니다. 06.14 288 3
162353 🐣질문 간단한 실시간 카드 게임 만들라고 한다면 [2] 빙화천선갤로그로 이동합니다. 06.14 148 0
162352 🐣질문 어제 번역하겠다고 깝치던 누비 [3] ㅇㅇ(222.112) 06.14 202 0
162351 💬 조금만 니즈가 특이해도 맞는 애셋을 찾을수가 없음 [8] ㅇㅇ(125.132) 06.14 203 0
162350 💬 게임개발이 웹보다 난이도 극상임? [5] ㅇㅇ(58.72) 06.14 311 0
162349 💬 그림 실력 늘리는 제일 효율 좋은 방법 [6] ㅇㅇ갤로그로 이동합니다. 06.14 223 1
162348 🐣질문 유니티 회전축 질문있음 [13] ㅇㅇ(59.12) 06.14 163 0
162347 💬 상업적으로 분석해주는 사이트같은거 없음?? [4] ㅇㅇ(14.47) 06.14 142 0
162346 🐣질문 언리얼 visual studio 자동완성 왜 됬다가 안 됬다가 그럴까? [5] ㅇㅇ(121.140) 06.14 115 0
162345 💬 여기서 개발자 구인해서 팀 만들어진 사람 있음? [6] ㅇㅇ(59.9) 06.14 228 0
162344 💬 넥페 데모도 그냥 받기만 하고 안하는놈들 개많네 [2] 강화인간갤로그로 이동합니다. 06.14 163 0
162343 💬 유니티 개발자의 기본소양 [6] 문캐슬갤로그로 이동합니다. 06.14 342 1
162341 💬 나정도면 스팀 라이트유저 맞지? [12] 파베르Dev갤로그로 이동합니다. 06.14 377 0
162340 💬 아트 글마다 꼭 있는 어그로 아이피 있던데 [10] ㅇㅇ(182.217) 06.14 392 10
162339 💬 라이트유저는 우리생각보다 훨씬더 라이트하더라 [7] ㅇㅇ(183.99) 06.14 265 0
162337 💬 난 기획이 젤 어려운거같음 [2] ㅇㅇ갤로그로 이동합니다. 06.14 172 0
162336 💬 그래픽은 재미를 못붙이는게 가장 크지. [1] ㅇㅇ(103.249) 06.14 209 0
162334 📢홍보 게임 개발자 必! 금일 국내 자체 등급 분류 교육 진행합니다. [5] 스토브인디갤로그로 이동합니다. 06.14 218 3
162333 💬 아트 막막하면 도트하라니까 [6] ㅇㅇ(221.146) 06.14 307 3
162332 💬 아트가 진짜 부럽다 ㅇㅇ [4] ㅇㅇ갤로그로 이동합니다. 06.14 292 0
162330 💬 초보자는 공포게임 만드는거 밖에 답이없나? [24] 정글갤로그로 이동합니다. 06.14 407 1
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2