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

ㅇ.ㅇ

,

원래는 카메라에 가까울수록 (z) 나중에 렌더링 되어 가장 앞에 오게 되지만

다른 기준으로 바꿀 수 있다.


예를 들어 y가 높을 수록 먼저 렌더링 되게 한다면

상하좌우로 움직일 수 있는 2D게임을 만든다고 했을 때


플레이어가 장애물 앞에 있을 때(y가 낮을 때)는 플레이가 보이고

플레이어가 장애물 뒤에 있을 때(y가 높을 때)는 플레이어가 안보이게 만들 수 있다


원래라면 직접 소팅오더를 바꿔가며 구현해야 했던 것을 쉽게 할 수 있다는 것


하지만 그 앞과 위의 기준은 스프라이트의 가운데를 기준으로 하기 때문에 큰 장애물이라면 조금 애매하기는 하다 (피벗 바꿔도 소용없음)


방법은


Edit->Project Setting->Graphics->Transparency Sort ModeCoustom Axis로 바꾸고

바로 밑에 있는 Transparency Sort Axis 를 입맛에 맞게 조정하면 된다.



블로그 이미지

stuban

ㅇ.ㅇ

,

우선 범위지정 for 문은 이런걸 말한다.

1
2
3
4
5
6
int arr[] = {1,2,3,4,5};
 
for(int a : arr)
{
    cout << a << endl;
}
cs


c++ 11부터 추가되었고 배열이나 stl 의 요소들을 돌아볼때(?) 쓴다.

(참고로 동적할당된 배열은 끝을 알 수 없기 때문에 그냥 돌릴 수 없음)


https://msdn.microsoft.com/ko-kr/library/jj203382.aspx?f=255&MSPPError=-2147217396



내가 만든 클래스(혹은 구조체든 뭐든)이 범위기반 for문을 쓰려면 어떻게 해야할까?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Test
{
public:
    int arr[10];
...
}
 
 
void main()
{
    Test test;
    for(int a : test.arr)
    {
        cout << a << endl;
    }
}

cs


이런 식으로 쓰면 되겠지만


배열이름까지 쓰는게 번거롭다면?

만약 내가 만든 클래스안에 있는 배열이 private라면?


배열이 동적할당된 배열이라면

내가 만든 클래스안에 있는 배열의 목적은 처음부터 끝까지 도는게 아니라면?



 msdn은 답을 알고 있다.

범위 기반 for 에 대한 이러한 사실을 명심하십시오:

  • 배열을 자동으로 인식 합니다.

  • .begin() 및 .end() 을 가진 컨테이너를 인식하십시오.

  • 기타 항목을 위해 begin() 및 end() 인수 종속성 조회 사용하기.


예제가 안나와서 조금 헤매기는 했지만


간단히 예제를 만들어 보면


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Test
{
    int arr[10= { 1,2,3,4,5,6,7,8,9,0 };
    int min = 3;
    int max = 7;
public:
    int* begin() { return &arr[min]; }
    int* end() { return &arr[max]; }
};
 
void main()
{
    Test test;
    for (int a : test)
    {
        cout << a << endl;
    }
}
cs

이런식으로 처음과 끝 주소값을 반환하는 begin 과 end 함수를 만들어 주면 된다.


블로그 이미지

stuban

ㅇ.ㅇ

,
1
2



1
2
//배열을 리스트로
List<int> testList = testArr.ToList();
 
...
 
//리스트를 배열로
int[] testArray = testList.ToArr();
cs

역시 똑똑한 사람들이 만들어둔 물건에는 이런 간단하지만 직접만들라면 귀찮은 기능들이 기본으로 주어져서 참 좋은거 같다 !

블로그 이미지

stuban

ㅇ.ㅇ

,