블로그 이미지

stuban

ㅇ.ㅇ

,

https://play.google.com/store/apps/details?id=com.SuperBang.RoadRobotRev

2019년 3월 쯤 부터 시작해서

2019년 9월 22 23일에 출시함



길따라 로봇 프로젝트를 시작한 이유는

군대가기 전에 뭔가 이루고 싶어서였습니다.


마침 학교 앱게임 프로젝트와 겹쳐서 매우 힘겨웠지만

매우 보람차고 재미있는 경험이었습니다

( 특히 프로젝트가 2개니깐 2배로 실력이 느는 느낌? )





BIC 2019에 로드로봇을 제출 했는데


당시 이 상태로 제출을 했습니다.


솔직히 별로 좋은 상태는 아니였지만

정말 무슨 일인지 BIC 전시작에 선정되었지요


(하지만 비슷한 시기에 제출한 GIGDC는 떨어짐...)



bic 선정도 됬겠다.

적어도 망신은 당하기 싫어서

그리고 BIC 특수를 누리기 위해


BIC 전 주 출시를 목표로

매일 카페에 살며 개발을 했습니다.


커피를 별로 안좋아해서

주로 더블 베리 스파클링 이나 아이스 초코 같은 비싼 음료를 시켜 먹느라

돈이 좀 많이 깨졌는데 ...


그래도 6000원 짜리 한잔 사서

10시부터 새벽 1시 까지 있는데다가


골드 멤버쉽 찍어서 나름 이득이라고 생각하네요

(혜택이 크지는 않지만 그래도 포인트가 쌓이니깐 뭔가 보람참)


그리고 확실히 카페에 있으니깐 집중효과는 확실했습니다.





BIC 전주에 출시를 목표로 했건만

생각보다 일정 맞추기 힘들었습니다


특히 창작마당은 서버가 들어가는데

내가 관련 지식이 부족했기 때문에

그 부분이 제일 막혔습니다


막 한 1주일이면 만들 수 있을 것 같은 부분이

1달이 꼬박 걸라고 그랬죠



그리고 그래픽도 문제였습니다.

아트 스킬도 매우 부족한 상태에서


꼴에 1인개발 한답시고 모든 에셋을 다 손수 제작하는데

시간도 없고 퀄리티도 안나오는거 같고 미칠 것 같았습니다.



그래도 그나마 UI쪽은 나름 해결책을 마련했는데...


바로 돌려막기였습니다 ㅋㅋ


만약에 이런 스프라이트가 있다?


버튼으로도 쓰고


팝업창 으로도 씀


그리고 색깔을 바꿔서 다른 느낌으로도 사용하고


이 화면은 저 스프라이트가 11개나 쓰였습니다 ㅋㅋㅋ



그리고 창작마당 메인의 상단부분도

얼핏 보면 통짜 같지만


2개의 스프라이트를 7개 겹쳐서 만들었습니다.



이게 다 쉐이더랑 그라디언트 덕분이었습니다


일단 쉐이더는


요렇게 3개 정도 만들어서 썼는데


-스프라이트 색깔을 아예 하나로 바꿔주는 쉐이더

-스프라이트를 흑백으로 바꿔서 그 위에 색을 입히는 쉐이더

-스프라이트 색깔 추가하는 방법을 곱하기에서 스크린으로 바꾸는 쉐이더


그리고 그라디언트는

요런식으로 되어서 그라데이션을 만들 수 있습니다


basemesheffect라는 걸 사용하는 것 같은데

아직 이해가 덜되서 나중에 블로그에 정리할 생각






그래서 BIC 전주에 출시를 했느냐?

당근 못했죠 ㅋㅋㅋ


결국 미완성인 채로 BIC전시가 시작되었습니다


당시에 일단 게임다 만들고 BIC준비를 할 생각이었기 때문에

현수막이나 홍보물, 굿즈 같은건 하나도 만들어 두지 않은 상황


결국 BIC 가기 2일 전에 급하게 스티커만 주문했습니다


스티커는 이런 디자인이었고


1000장이 최소단위라고 해서 

6cm * 6cm 사이즈로 1000장을 주문했습니다


그리고 가격을 4만 5천원을 부르던데

시간이 별로 없어서 시세를 잘 알아보지 못한 관계로

그냥 질러버렸는데


나중에 BIC에 참가한 다른 팀 선배는 2만원인가 주고 뽑았다고 하더랍니다 ㅋㅋ


그리고 

스티커는 이~만~큼 남았습니다 ㅠ


퀄리티도 마음에 안드는데 바가지도 오질라게 뒤집어쓰니 기분이 드럽더웠습니다




BIC는 생각보다 엄청엄청 좋았습니다


버스, 호텔 다 지원해주고

비즈매칭한 사람만 주는 거였지만 간식도 줘서


좀 거지근성만 보인다면 땡전 한푼 없이 다녀올 수 있을 정도였습니다



1번째 날

 

컨퍼런스 데이라고 강연을 듣는 날이었는데

사람이 많아서 그런지 덥고

강연이 조금 지루했습니다...


그리고 당일 오프닝 파티도 진행됬는데

수영장을 개조한 것 같은 파티장에서 열렸습니다


분위기 짱!



2번째 날은 


비즈니스 데이라고 해서 퍼블리셔나 광고사 같은 데서 게임을 보러 오는 날이었습니다


사람이 적기도 하고 내 부스가 허전하기는 하지만

그래도 내 부스에는 사람이 좀 적게 와서 조금 슬펐습니다 ㅠ 


그래도 명함은 많이 받음



3번째 ~ 4번째날


이때는 모니터에 스마트폰 미러링도 하고 해서

전날보다 부스가 아주 조금 있어보이게 되었습니다


덕분에 여서 그런지 그냥 게임 마니아가 많이 와서 그런지는 모르겠지만

다행히도 내 게임에 관심을 가지시는 분들이 많았습니다


난 내 게임이 어려워서 다들 포기할 줄 알았는데

(실제로 비즈니스데이때는 많은 사람들이 포기함)


진짜 거의 끝까지 하시는 분들도 많이 계셨습니다

이분들께 감사드리고 덕분에 많은 힘이 되었습니다


그리고 뜻밖에 문제점도 발견했는데

색맹인 사람이 게임을 플레이하면서

명령블록의 색깔이 구분가지 않는다는 피드백을 주신것 입니다.


이 게임에서 명령블록의 색깔은 중요하기 때문에

이건 좀 중대한 문제 였습니다


그래서 당일 호텔에서 부랴부랴 색약자 배려모드를 추가하였습니다.




BIC가 끝나고 2주가 지나서야 게임을 출시했습니다


22일날 출시했는데


출시하고 보니깐 맵 연결이 다 끊겨서

게임을 시작하면 아무것도 안나오는 사태가 발생하였습니다..


이유는 출시하기 직전에 맵 순서를 검토했는데

그 과정에서 맵 파일 이름을 마구 바꿔댔고

그러다가 연결이 끊겨 버린거,,,


완전 대 참사가 일어나서

임시 방편으로 앱 게시를 취소하고


23일날 다시 출시하였습니다.



그리고 23일


여러 커뮤니티에 홍보글을 돌렸는데




아주 고맙게도 3일이 지난 지금 60명에 가까운 사람들이 다운받아주셨습니다






이제 남은건



아직은 한글만 지원하기 때문에

빠른 시일내에 영어로 변역을 해서 글로벌 출시를 해야함

(영어판 출시 완료)


'내가 만든거' 카테고리의 다른 글

데빌리쉬 리그  (0) 2024.02.18
등산 시뮬레이터  (0) 2018.06.23
맵 에디터 !!!!  (0) 2018.05.11
유니티 스와이프  (0) 2018.02.20
유니티 사운드 매니저  (2) 2017.08.22
블로그 이미지

stuban

ㅇ.ㅇ

,
1
2
3
4
5
6
7
8
DELIMITER $$
create procedure NewUser (_id int, _name varchar(20))
begin
 
insert into user(id,name) values (_id , _name);
 
end$$
DELIMITER ;
cs

1 , 8 : DELIMITER로 처음과 끝을 감싸야 한다. (이유는 이전 글 참고)

2 : 프로시저 정의 (인자를 받지 않을 수도 있다)

3 , 7 : 시작과 끝

 

1
call test.NewUser(123,'bang');
cs

호출은 call 을 사용한다.(여기서 test는 프로시저가 있는 db이름)

'프로그래밍 > SQL' 카테고리의 다른 글

sql 함수 만들기  (0) 2019.08.07
mysql Limit  (0) 2017.10.22
sql의 주석  (0) 2017.10.19
유니티와 mysql 연동하기  (0) 2017.10.19
mysql 자동증가값(auto_increment) 가지고 오기  (0) 2017.10.13
블로그 이미지

stuban

ㅇ.ㅇ

,
1
2
3
4
5
6
7
8
9
10
11
delimiter $$
create function SignUp (_id int)
returns varchar(20)    
begin
 
declare rtn_val varchar(20);
select name from user where id = _id into rtn_val;
return rtn_val;
 
end$$
delimiter ;
cs

 

1 , 11DELIMITER 로 처음과 끝을 감싸야 한다 DELIMITER 뒤에 있는 $$는 다른 문자로 바꿀 수 있다. (대신 10번째 줄에 있는 $$도 바꿔야함)

DELIMITER의 역할은 쿼리의 끝은 ; 가 아니라 $$ 라는 것을 알려줘서 중간에 명령이 실행되는 것을 막는다.

2 : 함수 정의 , 입력값

3 : 리턴값

4 : 함수 시작

6 : 변수 정의

7 : into 문으로 변수에 값을 넣을 수 있음

8 : 리턴

9 : $$ 으로 진짜 쿼리가 끝이라는 것을 알려준다

11 : 쿼리의 끝을 $$ 이 아니라 ; 이라고 돌려놓음

 

1
select test.SignUp(122);
cs

실행은 select 문으로 할 수 있다. (여기서 test는 함수가 있는 db이름)

'프로그래밍 > SQL' 카테고리의 다른 글

sql 프로시저 만들기  (0) 2019.08.07
mysql Limit  (0) 2017.10.22
sql의 주석  (0) 2017.10.19
유니티와 mysql 연동하기  (0) 2017.10.19
mysql 자동증가값(auto_increment) 가지고 오기  (0) 2017.10.13
블로그 이미지

stuban

ㅇ.ㅇ

,
1
2
3
4
5
6
7
8
9
10
11
12
13
SystemLanguage lang = Application.systemLanguage;
 
switch(lang)
{
    case SystemLanguage.Korean:    
        break;    
 
    case SystemLanguage.English:
        break;
 
    case SystemLanguage.Japanese:
        break;
}
cs

SystemLanguage 열거형과 Application클래스는 UnityEngine 네임스페이스안에 들어있음

 

블로그 이미지

stuban

ㅇ.ㅇ

,


유니티에서 스프라이트를 쓸때

색깔을 바꾸면 뭔가 칙칙하게 바뀌는 듯한 느낌이 든다


기본 스프라이트에서 왼쪽이 흰색 , 오른쪽이 파란색을 넣었을 때


이유는 기본 스프라이트 쉐이더가 색깔을 적용할때

곱해서 처리하기 때문이다


쉐이더에서 색을 저장할때 fixed4라는 자료형을 쓰는데

R,G,B,A값을 저장하는 역활을 한다


그러니깐  

(0,0,0,0) 이 투명한 검은색

(1,1,1,1)이 불투명한 흰색

이 되는 것이다.


만약 (0.5,0.5,0.5,1)(회색)과 (0.5,0.5,0.5,1)을 합칠때


더한다면 (1,1,1,2)이 되어서 하얀색이 되고 (2는 1로 취급)

곱한다면 (0.25,0.25,0.25,1)이 되어서 어두운 회색이 된다


따라서 곱하기를 쓰는 유니티 기본 스프라이트에

색을 넣으면 더 칙칙해지는 것이다


그런데 그냥 + 를 쓰면

색이 1을 넘어갔을때 짤리게 된다


그래서 스크린이라는 방식이 있는데

result = 1-(1-A)*(1-B);

원래 색상들을 1에서 빼서 곱하고

그 값을 또 1에서 빼는 것



그래서 만드는 방법은


1.

https://unity3d.com/kr/get-unity/download/archive?_ga=1.66259950.1501402159.1471086308


유니티 다운로드 아카이브에서 내장 셰이더를 다운로드한다.

기왕이면 버전에 맞게 다운로드 하면 된다.


그러면 셰이더들이 잔뜩 들어있는 압축파일을 받게 되는데


ctrl + f 로 Sprites-Diffuse.shader 를 찾는다


Diffuse 를 쓰는 이유는 Default 쉐이더는 너무 간소화되서 어떻게 수정하는지 모르기 때문에......



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
// Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt)
 
Shader "Sprites/Diffuse"
{
    Properties
    {
        [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
        _Color ("Tint", Color) = (1,1,1,1)
        [MaterialToggle] PixelSnap ("Pixel snap", Float) = 0
        [HideInInspector] _RendererColor ("RendererColor", Color) = (1,1,1,1)
        [HideInInspector] _Flip ("Flip", Vector) = (1,1,1,1)
        [PerRendererData] _AlphaTex ("External Alpha", 2D) = "white" {}
        [PerRendererData] _EnableExternalAlpha ("Enable External Alpha", Float) = 0
    }
 
    SubShader
    {
        Tags
        {
            "Queue"="Transparent"
            "IgnoreProjector"="True"
            "RenderType"="Transparent"
            "PreviewType"="Plane"
            "CanUseSpriteAtlas"="True"
        }
 
        Cull Off
        Lighting Off
        ZWrite Off
        Blend One OneMinusSrcAlpha
 
        CGPROGRAM
        #pragma surface surf Lambert vertex:vert nofog nolightmap nodynlightmap keepalpha noinstancing
        #pragma multi_compile_local _ PIXELSNAP_ON
        #pragma multi_compile _ ETC1_EXTERNAL_ALPHA
        #include "UnitySprites.cginc"
 
        struct Input
        {
            float2 uv_MainTex;
            fixed4 color;
        };
 
        void vert (inout appdata_full v, out Input o)
        {
            v.vertex = UnityFlipSprite(v.vertex, _Flip);
 
            #if defined(PIXELSNAP_ON)
            v.vertex = UnityPixelSnap (v.vertex);
            #endif
 
            UNITY_INITIALIZE_OUTPUT(Input, o);
            o.color = v.color * _Color * _RendererColor;
        }
 
        void surf (Input IN, inout SurfaceOutput o)
        {
            fixed4 c = SampleSpriteTexture (IN.uv_MainTex) * IN.color;
            o.Albedo = c.rgb * c.a;
            o.Alpha = c.a;
        }
        ENDCG
    }
 
Fallback "Transparent/VertexLit"
}
 
cs

아무튼Sprites-Diffuse.shader는 요로케 생겼는데 여기서 수정할 부분은 


2. 

이름 바꾸기


이미 유니티에는 Diffuse 쉐이더가 들어있기 때문에

쉐이더의 이름을 바꿔줘야한다


저 "/" 는 폴더같은 느낌으로 머터리얼에서 쉐이더를 고르기 편하게 해준다.


2. 

surf함수 수정

1
2
3
4
5
6
7
8
void surf (Input IN, inout SurfaceOutput o)
{
    fixed4 c = 1 - ((1 - SampleSpriteTexture(IN.uv_MainTex)) * (1 - IN.color));
    c.a = SampleSpriteTexture(IN.uv_MainTex).a * IN.color.a;
 
    o.Emission = c.rgb * c.a;
    o.Alpha = c.a;
}
cs

surf함수를 이렇게 바꾸면 된다.


여기서 스크린이아니라 + 를 쓰고 싶으면 3번 줄을 

fixed4 c = SampleSpriteTexture(IN.uv_MainTex) + IN.color;

로 바꾸면 된다.



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
// Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt)
 
Shader "Sprites/Screen"
{
    Properties
    {
        [PerRendererData] _MainTex("Sprite Texture", 2D) = "white" {}
        _Color ("Tint", Color) = (1,1,1,1)
        [MaterialToggle] PixelSnap ("Pixel snap", Float) = 0
        [HideInInspector] _RendererColor ("RendererColor", Color) = (1,1,1,1)
        [HideInInspector] _Flip ("Flip", Vector) = (1,1,1,1)
        [PerRendererData] _AlphaTex ("External Alpha", 2D) = "white" {}
        [PerRendererData] _EnableExternalAlpha ("Enable External Alpha", Float) = 0
    }
 
    SubShader
    {
        Tags
        {
            "Queue"="Transparent"
            "IgnoreProjector"="True"
            "RenderType"="Transparent"
            "PreviewType"="Plane"
            "CanUseSpriteAtlas"="True"
        }
 
        Cull Off
        Lighting Off
        ZWrite Off
        Blend One OneMinusSrcAlpha
 
        CGPROGRAM
        #pragma surface surf Lambert vertex:vert nofog nolightmap nodynlightmap keepalpha noinstancing
        #pragma multi_compile_local _ PIXELSNAP_ON
        #pragma multi_compile _ ETC1_EXTERNAL_ALPHA
        #include "UnitySprites.cginc"
 
        struct Input
        {
            float2 uv_MainTex;
            fixed4 color;
        };
 
        void vert (inout appdata_full v, out Input o)
        {
            v.vertex = UnityFlipSprite(v.vertex, _Flip);
 
            #if defined(PIXELSNAP_ON)
            v.vertex = UnityPixelSnap (v.vertex);
            #endif
 
            UNITY_INITIALIZE_OUTPUT(Input, o);
            o.color = v.color * _Color * _RendererColor;
        }
 
        void surf (Input IN, inout SurfaceOutput o)
        {
            fixed4 c = 1 - ((1 - SampleSpriteTexture(IN.uv_MainTex)) * (1 - IN.color));
            c.a = SampleSpriteTexture(IN.uv_MainTex).a * IN.color.a;
 
            o.Emission = c.rgb * c.a;
            o.Alpha = c.a;
        }
        ENDCG
    }
 
Fallback "Transparent/VertexLit"
}
 
cs

완성본!




기본 흰색 , 기본 파란색 , 스크린 파란색

블로그 이미지

stuban

ㅇ.ㅇ

,
1
dir + hit.normal * (-2 * Vector2.Dot(dir, hit.normal));
cs


dir은 물체가 향하는 방향

노말은 레이캐스트나 OnCollisionEnter 같은걸 사용해서 구할 수 있음

블로그 이미지

stuban

ㅇ.ㅇ

,

나는 주로 유니티에서 간단하게 움직이는  스크립트를 짤 때

Lerp 함수를 자주 이용한다.

 

근데 문제는 이동에 뭔가 색다른 효과를 주고 싶을 때

처음에는 느리다가 점점빨라지거나

갑자기 뒤로갔다가 반동으로 튀어나가거나

 

그런 동작을 추가하려면 뭔가 복잡한 처리를 해야한다는 것 이었다

 

근데 AnimationCurve 클래스를 최근에 알게 되었다

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public AnimationCurve curve;//인스펙터에서 조정하면 됨
 
 
IEnumerator Close()
{
    float progress = 0;
    while (true)
    {
        progress += Time.DeltaTime;
          
        cutOff = Mathf.Lerp(01, curve.Evaluate(progress));//여기 가 중요한 부분
        if (progress > 1) yield break;
 
        yield return 0;
    }
}
cs

 

인스펙터에는 이런식으로 뜬다

 

클릭하면 나오는 창에서 잘 조정하면 된다

밑에있는 톱니바퀴를 누르면

지금 편집하고 있던 커브를 프리셋으로 등록할 수도 있다.

블로그 이미지

stuban

ㅇ.ㅇ

,