반응형

C# 제네릭 (C# Generics)
클래스 또는 메서드(함수)를 선언하고 인스턴스화 할때까지 하나이상의 형식을 따르는 클래스나 메서드(함수)를 디자인할 수 있도록 형식 매개 변수 개념을 도입할 수 있습니다. 

 

보통 사칙연산등에서 변수타입에서 관련 없이 함수의 매개변수에 값을 넣어 다용도로 사용할 수 있게 만들기 위해 사용합니다.
C++에 템플릿하고 비슷한 역할을 수행합니다.

 

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication1
{
    class AAAA<T>
    {
        public void print(T value)
        {
            Console.WriteLine(value);
        }
        
    }
    class Program
    {
        static void Main(string[] args)
        {
            AAAA<int> aaaaInt = new AAAA<int>();
            aaaaInt.print(1);
            AAAA<string> aaaaString = new AAAA<string>();
            aaaaString.print("AAAAA");
        }
    }
}
 
 

위 예제는 클래스 함수에 템플릿을 사용한 예를 보여줍니다.
int형과 string형에 관련없이 해당 값을 출력할 수 있도록 구현되었습니다.

반응형

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

[C#] 람다식(Lambda expressions)  (0) 2019.10.21
[C#] 무명 메서드(anonymous method)  (0) 2019.10.20
[C#] 인덱서(Indexer)  (0) 2019.10.18
[C#] 이벤트(event) & 델리게이트(delegate)  (0) 2019.10.17
[C#] delegate  (0) 2019.10.16
반응형

C# 인덱서(Indexer)
C# 인덱서(Indexer)는 클래스나 구조체의 데이터를 배열처럼 인덱스로 접근이 가능하도록 구현을 할 수 있게 합니다.

정의 
this[]를 사용하여 속성처럼 get과 set으로 정의합니다.

 

예제

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;
 
namespace ConsoleApplication1
{
    class AAAA
    {
        private int[] num = new int[10];
        public int this[int nIndex]
        {
            get
            {
                if (nIndex < 0 || nIndex > 10)
                {
                    throw new IndexOutOfRangeException();
                }
                else
                {
                    return num[nIndex];
                }
            }
            set
            {
                if (nIndex < 0 || nIndex > 10)
                {
                    throw new IndexOutOfRangeException();
                }
                else
                {
                    num[nIndex] = value;
                }
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            AAAA aaaa = new AAAA();
            aaaa[0= 2;
            Console.WriteLine(aaaa[0]);
        }
    }
}
 
 

위와 같이 클래스에 배열변수를 인덱서를 이용해서 접근해서 get / set이 가능하도록 만들 수 있습니다.


C# 6(Visual Studio 2015)부터는 이 구문 대신


public int this[int nIndex] => num[nIndex];

이렇게 표현할 수 있습니다.

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
public int this[int nIndex]
{
    get
    {
        if (nIndex < 0 || nIndex > 10)
        {
            throw new IndexOutOfRangeException();
        }
        else
        {
            return num[nIndex];
        }
    }
    set
    {
        if (nIndex < 0 || nIndex > 10)
        {
            throw new IndexOutOfRangeException();
        }
        else
        {
            num[nIndex] = value;
        }
    }
}
 
s

 

C# 7.0(Visual Studio 2017)부터 get 및 set 접근자 모두 본문 멤버로 구현할 수 있습니다.

1
2
3
4
5
public T this[int nIndex]
{
    get => num[nIndex]; 
    set => num[nIndex] = value; 
}
 
반응형

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

[C#] 무명 메서드(anonymous method)  (0) 2019.10.20
[C#] 제네릭  (0) 2019.10.19
[C#] 이벤트(event) & 델리게이트(delegate)  (0) 2019.10.17
[C#] delegate  (0) 2019.10.16
[C#] Event  (0) 2019.10.15
반응형

델리게이트(delegate)의 문제
- 추가 연산(+=)을 하려고 했는데, 할당 연산(=)을 하는 경우 이전에 추가했던 함수 리스트들이 사라지는 문제
- 외부에서 접근제한이 없다면 함수와 같이 호출이 가능하게 된다.

위와 같은 문제를 해결하기 위해 event를 사용합니다.
이벤트(event)는 외부에서 추가나 차감 연산만 가능합니다.
이벤트(event)는 외부에서 직접 호출이 아닌 함수를 통한 호출을 해야합니다.

 

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication1
{
    delegate void Print(string strContent);
    class AAA
    {
        public event Print print;
 
        public void DelegatePrintAAA1(string strContent)
        {
            Console.WriteLine("AAA1" + strContent);
        }
        public void DelegatePrintAAA2(string strContent)
        {
            Console.WriteLine("AAA2" + strContent);
        }
        public void DelegatePrintAAA3(string strContent)
        {
            Console.WriteLine("AAA3" + strContent);
        }
 
        public void totalOutput()
        {
            if (this.print != null)
            {
                print("11111");
            }
        }
    }
    class Program
    {
        static void DelegatePrint(string strContent)
        {
            Console.WriteLine("normal" + strContent);
        }
 
        static void Main(string[] args)
        {
            AAA aaa = new AAA();
            aaa.print += aaa.DelegatePrintAAA1;
            aaa.print += aaa.DelegatePrintAAA2;
            //aaa.print = aaa.DelegatePrintAAA3; error 발생
            //aaa.print("111111"); error 발생
            aaa.totalOutput();
 
            aaa.print -= aaa.DelegatePrintAAA1;
            aaa.totalOutput();
        }
    }
}
 
 
 

이 예제에서 확인해봤을때 할당 연산이나 직접호출은 불가능합니다.

반응형

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

[C#] 제네릭  (0) 2019.10.19
[C#] 인덱서(Indexer)  (0) 2019.10.18
[C#] delegate  (0) 2019.10.16
[C#] Event  (0) 2019.10.15
[C#] yield  (0) 2019.10.14
반응형

특정 매개 변수와 반환 형식을 가진 함수에 대한 참조를 나타내는 형식을 말합니다.
delegate는 함수에 변수나 클래스를 인수로 전달하는 것과 같이 함수를 인수로 전달하는데 사용됩니다.
접근 가능한 클래스 또는 delegate형식과 일치하는 구조를 가진 모든 메서드는 대리자로 할당할 수 있습니다.
함수는 정적 함수거나 인스턴스 함수일 수 있습니다.

속성
- C++ 함수 포인터와 유사하지만 C++ 함수 포인터와 달리 어느 클래스 함수에서도 쉽게 할당 가능합니다.
- delegate는 함수 매개 변수로 전달이 가능합니다.
- delegate를 통해 콜백 함수를 정의할 수 있습니다.
- 여러 delegate를 연결 할 수 있습니다.

형식
public delegate 반환타입 함수명(매개 변수);
ex) public delegate void print(string strContent)


예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication1
{
 
    class Program
    {
        public delegate void Print(string strContent);
        static void DelegatePrint(string strContent)
        {
            Console.WriteLine(strContent);
        }
        
        static void Main(string[] args)
        {
            Print print = DelegatePrint;
 
            print("output1");
        }
    }
}
 
 



이렇게 간단하게 연결해서 사용할 수 있다.

1. 콜백함수
또한 매개변수로 전달하여 함수내에서 delegate를 호출할 수도 있습니다.
이렇게되면 동일한 함수안에 함수를 손쉽게 넣을 수 있게 됩니다.

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication1
{
 
    class Program
    {
        public delegate void Print(string strContent);
        static void DelegatePrint(string strContent)
        {
            Console.WriteLine(strContent);
        }
 
        static void Callback(Print callbackprint)
        {
            callbackprint("output2");
        }
        
        static void Main(string[] args)
        {
            Print print = DelegatePrint;
            // delegate를 매개변수로 넣습니다.
            Callback(print);
        }
    }
}
 
 



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
32
33
34
35
36
37
38
39
40
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication1
{
    class AAA
    {
        public void DelegatePrintAAA1(string strContent)
        {
            Console.WriteLine("AAA1" + strContent);
        }
        public void DelegatePrintAAA2(string strContent)
        {
            Console.WriteLine("AAA2" + strContent);
        }
    }
    class Program
    {
        public delegate void Print(string strContent);
        static void DelegatePrint(string strContent)
        {
            Console.WriteLine("normal" + strContent);
        }
        
        static void Main(string[] args)
        {
            AAA aaa = new AAA();
            Print print = new Print(DelegatePrint);
            print += aaa.DelegatePrintAAA1;
            print += aaa.DelegatePrintAAA2;
            print("++");
 
            print -= aaa.DelegatePrintAAA1;
            print -= aaa.DelegatePrintAAA2;
            print("--");
        }
    }
}
 
 

3. 범용성
제너릭 <T>를 이용해서 어떤 변수형에 상관없이 구현할 수 있다.

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication1
{
    delegate T calcDelegate<T>(T num1, T num2);
    
    class Program
    {
        static int addint(int num1, int num2)
        {
            return num1 + num2;
        }
 
        static float addfloat(float num1, float num2)
        {
            return num1 + num2;
        }
 
        public static void Calc<T>(T num1, T num2, calcDelegate<T> calc)
        {
            Console.WriteLine(calc(num1, num2));
        }
 
        static void Main(string[] args)
        {
            calcDelegate<int> addint1 = new calcDelegate<int>(addint);
            calcDelegate<float> addfloat2 = new calcDelegate<float>(addfloat);
 
            Calc(89, addint1);
            Calc(9.7f, 10.8f, addfloat2);
        }
    }
}
 
s
반응형

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

[C#] 인덱서(Indexer)  (0) 2019.10.18
[C#] 이벤트(event) & 델리게이트(delegate)  (0) 2019.10.17
[C#] Event  (0) 2019.10.15
[C#] yield  (0) 2019.10.14
[C#] 반복문  (0) 2019.10.13
반응형

이벤트는 어떠한 문제가 발생했다는 사실을 개체가 시스템의 모든 관련 구성 요소에 전달하는 방법입니다.
보통 클래스내에 발생하는 이벤트를 외부에 전달할 수 있습니다.
+= 연산자를 사용하여 이벤트를 추가할 수 있다.
-= 연산자를 사용하여 이벤트를 제거할 수 있다.

 

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;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication1
{
    class Output
    {
        public event EventHandler print;
        public void totalOutput()
        {
            if (this.print != null)
            {
                print(this, EventArgs.Empty);
            }
        }
    }
 
 
    class Program
    {
        static void Output1(object sender, EventArgs args)
        {
            Console.WriteLine("Output1");
        }
        static void Output2(object sender, EventArgs args)
        {
            Console.WriteLine("Output2");
        }
 
        static void Main(string[] args)
        {
            Output output = new Output();
            output.print += new EventHandler(Output1);
            output.print += new EventHandler(Output2);
            output.totalOutput();
        }
    }
}
 
 

지금은 간단하게 함수를 이벤트에 추가하게되면 이벤트를 호출 시 추가한 함수들이 같이 순차적으로 호출되게 됩니다.

 

그리고 추가와 삭제를 클래스 객체의 get이나 set처럼 add와 remove를 사용하여 추가 삭제가 가능합니다.

 

다음과 같이 사용할 수 있습니다.

 

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication1
{
    class Output
    {
        private EventHandler _print;
        public event EventHandler print
        {
            add
            {
                _print += value;
            }
            remove
            {
                _print -= value;
            }
        }
        public void totalOutput()
        {
            if (this._print != null)
            {
                _print(this, EventArgs.Empty);
            }
        }
    }
 
 
    class Program
    {
        static void Output1(object sender, EventArgs args)
        {
            Console.WriteLine("Output1");
        }
        static void Output2(object sender, EventArgs args)
        {
            Console.WriteLine("Output2");
        }
 
        static void Main(string[] args)
        {
            Output output = new Output();
            output.print += new EventHandler(Output1);
            output.print += new EventHandler(Output2);
            output.totalOutput();
        }
    }
}
 

이렇게 add와 remove를 사용할 수 있습니다.

private EventHandler _print;

public event EventHandler print

{

       add

       {

                _print += value;

       }

       remove

       {

              _print -= value;

       }

}

 

반응형

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

[C#] 이벤트(event) & 델리게이트(delegate)  (0) 2019.10.17
[C#] delegate  (0) 2019.10.16
[C#] yield  (0) 2019.10.14
[C#] 반복문  (0) 2019.10.13
[C#] 조건문  (0) 2019.10.12
반응형

yield는 반복기 함수(iterator method)에서 컬렉션 데이터를 하나씩 리턴하게 할 때 사용하게 됩니다.


yield에는 두 가지 형태의 yield문을 가지고 있습니다.
yield return <수식(expression)>;
yield break;

yield return을 사용하면 호출할 때마다 순차적으로 따로 반환할 수 있습니다.
yield break을 사용하면 바로 반복기를 종료할 수 있게 됩니다.


반복기 함수는 다음과 같은 형식을 가져야합니다.
- 반환 형식은 IEnumerable, IEnumerable, IEnumerator, 또는 IEnumerator여야 합니다.
- 선언에 ref 또는 out 매개 변수가 허용되지 않습니다.


기본 형식

IEnumerable<변수형> elements = MyIteratorMethod();   
foreach (변수형 element in elements)   
{   
    실행문
}   

예제
static void Main(string[] args)
{
foreach (int nNum in funsion())
    Console.WriteLine(nNum);
}

public static IEnumerable funsion()
{
yield return 1;
yield return 2;
yield return 3;
yield return 4;
}
이렇게 구현하면 순차적으로 값을 리턴합니다.
출력 값
1
2
3
4



static void Main(string[] args)
{
foreach (int nNum in multiplication(2))
    Console.WriteLine(nNum);
}

public static IEnumerable multiplication(int nNum)
{
for ( int i = 1; i <= 9; i++ )
yield return nNum * i;
}
반복기 함수에서 for문을 이용해서 리턴할 수 있습니다.
출력 값
2
4
6
8
10
12
14
16
18


static void Main(string[] args)
{
foreach (int nNum in multiplication(2))
Console.WriteLine(nNum);
}

public static IEnumerable multiplication(int nNum)
{
for (int i = 1; i <= 9; i++)
{
if (i == 5) yield break;
yield return nNum * i;
}
}

중간에 yield break를 만나면 종료됩니다.
출력 값
2
4
6
8

반응형

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

[C#] delegate  (0) 2019.10.16
[C#] Event  (0) 2019.10.15
[C#] 반복문  (0) 2019.10.13
[C#] 조건문  (0) 2019.10.12
[C#] 연산자  (0) 2019.10.10
반응형

오늘은 반복문에 대해 알아보도록 하겠습니다.

 

반복문은 같은 코드를 계속 반복해야 할 때 사용합니다.

 

예를 들면

int nNum = 0;

Console.WriteLine(nNum++); 

Console.WriteLine(nNum++); 

Console.WriteLine(nNum); 

이런 코드가 있다면

반복문인 for문으로 손쉽게

for(int nNum = 0; nNum <= 2; nNum++ ) 
{ 
    Console.WriteLine(nNum); 
}

만들어서 코드를 알아보기 쉽고 단순하게 만들 수 있습니다.

그리고 만약에 코드가 3개가 아니라 10000개 20000개를 반복할 경우에도 손쉽게 변경할 수 있어서 코드를 유지 보수할 때에도 유용할 수 있습니다.

 

1. do - while문 

일단 블록 안에 실행문을 실행 후 while의 조건식을 확인한 후 조건식 값이 true값을 가지면 다시 블록 안의 실행문을 실행합니다.

루프 실행 후 조건을 확인하기 때문에 한번 이상 실행이 되며, 실행 전에 조건을 확인하는 while과 비교가 됩니다.

중간에 break문을 만나면 어느 문에서 든 블록 문을 빠져나갑니다.

 

do

{

     실행문

} while(조건식);

 

예제

int nNum = 0;
do
{
    Console.WriteLine(nNum);
    nNum++;
} while (nNum < 2);

출력 값

0

1

 

2. while문

while에 지정된 조건식을 확인하여 조건식 값이 true값을 가지면 블록 문의 실행문을 반복해서 실행합니다.

중간에 break문을 만나면 어느 문에서 든 블록 문을 빠져나갑니다.

 

while(조건식)

{

    실행문

}

 

예제

int nNum = 0;
while (nNum < 2)
{
    Console.WriteLine(nNum);
    nNum++;

출력 값

0

1

 

3. for문

for문에 지정된 조건식을 확인하여 조건식 값이 true값을 가지면 블록 문을 반복해서 실행합니다.

중간에 break문을 만나게 되면 블록문을 빠져나갑니다.

 

for( 초기값; 조건식; 증감식)

{

    실행문

}

 

예제

for(int i = 0; i < 2; i++ )
{
    Console.WriteLine(i);
}

출력 값

0

1

 

4. foreach문

배열과 컬렉션을 순회하여 변수에 값을 대입하고, 소스 컬렉션이 비워있으면 종료가 됩니다.

중간에 break문을 만나게 되면 블록 문을 빠져나갑니다.

 

foreach(변수 in 배열, 컬렉션)

{

     실행문

}

 

예제

int[] arrNum = new int[] { 0, 1, 2 };

foreach (int nNum in arrNum)
{
    Console.WriteLine(nNum);
}

 

출력 값

0

1

2

반응형

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

[C#] Event  (0) 2019.10.15
[C#] yield  (0) 2019.10.14
[C#] 조건문  (0) 2019.10.12
[C#] 연산자  (0) 2019.10.10
[C#] 데이터 타입  (0) 2019.10.09
반응형

안녕하세요.

 

오늘은 조건문에 대해서 알아보도록 하겠습니다.

 

1. if문

조건문이 true인지 false인지를 확인하여, true이면 다음 구문(블럭문)을 실행합니다.

 

if(조건문)

{

       실행문

}

 

예제

int nNum = 2;
if (nNum == 2)
{
    Console.WriteLine("Num : 2");
}

출력값

Num : 2

 

2. if - else문

조건문이 true인지 false인지를 확인하여, true이면 if 블록 문을 실행하고, 아니면 else 블럭문을 실행합니다.

 

if(조건문)

{

       실행문

}

else

{

       실행문

}

 

예제

int nNum = 5; 
if (nNum == 2) 
{ 
    Console.WriteLine("Num : 2"); 
}

else

{

    Console.WriteLine("Num : " + nNum);    

}

출력 값

Num : 5

 

3. if - else if - else문

if 조건문이 true인지 false인지 확인하여 true이면 if 블록 문을 실행하고, 아니면 else if 조건식을 확인해여 true인지 false인이 확인하여 else if 블럭문을 실행하고, 아니면 else 블럭문을 실행합니다.

 

if(조건문)

{

       실행문

}

else if(조건문)

{

       실행문

}

else

{

       실행문

}

 

예제

int nNum = 5; 
if (nNum == 2) 
{ 
    Console.WriteLine("Num : 2"); 
}

else if (nNum == 5) 
{ 
    Console.WriteLine("Num : 5"); 
}

else

{

    Console.WriteLine("Num : " + nNum);    

}

 

출력 값

Num : 5

 

4. switch-case문

switch문에 조건값에 따라서 case문의 실행문을 실행합니다. 그리고 중간에 break문을 만나게 되면 switch문을 빠져나오게 됩니다. case문에 조건값과 같은 값이 없다면 default문의 실행문을 실행하게 됩니다.  

 

switch(조건값)

{

      case 조건값 1:

             실행문

             break;

      case 조건값 2:

              실행문

             break;

              :

              :

      default:

             실행문

             break;

}

 

예제

int nNum = 2;
switch(nNum)
{
    case 1:
        Console.WriteLine("Num : 1");
        break;
   case 2:
        Console.WriteLine("Num : 2");
         break;
    default:
        Console.WriteLine("default");
        break;
}

출력 값

Num : 2

 

주의점은 break;를 안 넣게 되면 다음 구문이 진행이 됩니다.

예를 들면

int nNum = 2; 
switch(nNum) 
{ 
    case 1: 
        Console.WriteLine("Num : 1"); 
        //break;  제거
   case 2: 
        Console.WriteLine("Num : 2"); 
         break; 
    default: 
        Console.WriteLine("default"); 
        break; 
}

 

출력이 

Num : 1

Num : 2가 출력이 됩니다.

반응형

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

[C#] yield  (0) 2019.10.14
[C#] 반복문  (0) 2019.10.13
[C#] 연산자  (0) 2019.10.10
[C#] 데이터 타입  (0) 2019.10.09
[C#] 직렬화(Serialization)  (2) 2019.07.16
반응형

오늘은 점프를 구현해보려고 합니다.

 

바로 실습하겠습니다.

 

일단 바닥을 생성합니다.

 

Hierarchy에서 오른쪽 클릭해서 3D Object - Plane 합니다.

다음은 점프할 객체를 생성합니다.

Cylinder를 이용하겠습니다.

3D Object - Cylinder

처음에는 약간 위로  떠있는 상태입니다.

그렇기 때문에 Cylinder의 초기 위치를 지정합니다.

다음은 Rigidbody를 추가합니다.

객체에 힘을 가해서 점프와 같이 보이게 하려고 합니다.

힘을 가다 보면 객체가 쓰러지는 현상이 발생할 수 있습니다.

이것을 방지하기 위해서 Rigidbody속성을 설정합니다.

constaints(제약) 설정을 보시면 Freeze Rotation에 x, z를 체크합니다.

x, z축으로 회전을 막는다는 의미입니다.

스크립트 추가

Cylinder에 스크립트를 추가합니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Player : MonoBehaviour
{
    public float m_fForce = 5.0f;
    void Start()
    {
 
        
    }
 
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            GetComponent<Rigidbody>().AddForce(Vector3.up * m_fForce, ForceMode.Impulse);
        }
    }
}
 
cs

 

Rigidbody의 AddForce를 이용해서 객체에 힘을 가합니다.

객체의 위쪽 방향으로 5만큼의 힘을 가합니다.

 

ForceMode.Impulse는 질량의 영향을 받으면서 힘을 가하는 옵션입니다.

 

옵션은 다음과 같습니다.

Force rigidbody에 지속적인 힘 추가, 질량 사용.
Acceleration rigidbody에 지속적인 가속 추가, 질량 무시.
Impulse rigidbody에 순간적으로 충격 추가, 질량 사용.
VelocityChange rigidbody에 순간속도 변경, 질량 무시.

 

스페이스키를 입력하면 객체가 점프하는 것을 볼 수 있습니다.

 

근데 스페이스키를 계속 입력하면 계속 점프를 하는 것이 확인됩니다.

점프 중에는 스페이스 입력을 받지 않게 하기 위해서는 다음과 같이 구현할 수 있습니다.

Plane 오브젝트에 태그를 변경해야 합니다.

 

일단 태그를 추가하겠습니다.

"Plane"라고 태그를 만듭니다.

Tag를 Plane로 변경합니다.

 

그리고 스크립트를 수정합니다.

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;
 
public class Player : MonoBehaviour
{
    public float m_fForce = 5.0f;
    bool m_bJumping = false;
 
    void Start()
    {    
 
    }
 
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            if(!m_bJumping)
            {
                GetComponent<Rigidbody>().AddForce(Vector3.up * m_fForce, ForceMode.Impulse);
                m_bJumping = true;
            }
        }
    }
 
    void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.CompareTag("Plane"))
        {
            m_bJumping = false;
        }
    }
}
 
cs

 

스페이스 키를 누를 때 점프 중이 아닐 때만 점프가 가능하도록 하고, AddForce함수가 호출되었을 때, 점프 중으로 m_bJumping 값을 true로 변경합니다.

 

OnCollisionEnter함수를 사용해 오브젝트가 바닥과 충돌했을 때를 나타냅니다.

OnCollisionEnter는 충돌했을 때 발생하는 함수입니다.

충돌한 오브젝트의 태그가 "Plane"일 때 m_bJumping 값을 false로 만들어서 점프가 가능하도록 합니다.

 

이렇게 구현하면 여러 번 점프가 불가능하도록 구현할 수 있습니다.

 

반응형
반응형

1. 산술 연산자

단항
++ (1씩 증가)
-- (1씩 감소)
+ (양수)
- (음수)

이진 연산자
+(더하기)
-(빼기)
* (곱하기)
/ (나누기)
% (나머지)


2. 부울 논리 연산자

단항
!(논리 부정) - 피연산자의 값이 false일 때 true, 값이 true일 때 false.

이진
&(논리 AND)
|(논리 OR)
^(논리 배타적 OR(XOR))
&&(조건부 논리 AND)
||(조건부 논리 OR)

예제
bool bCheck = false;
Console.WriteLine(!bCheck);
output:True

bool bCheck1 = false;
bool bCheck2 = true;

Console.WriteLine(bCheck1 & bCheck2);
Console.WriteLine(bCheck1 | bCheck2);
Console.WriteLine(bCheck1 ^ bCheck2);
Console.WriteLine(bCheck1 && bCheck2);
Console.WriteLine(bCheck1 || bCheck2);

output:
False
True
True
False
True


3. 비트 및 시프트 연산자

단항
~(비트보수) - 비트를 반대로 하여 피연산자의 비트 보수를 생성

이진
<<(왼쪽 시프트)
>>(오른쪽 시프트)
&(논리 AND)
|(논리 OR)
^(논리 배타적OR(XOR))

예제
uint num1 = 0x2A; // 101010
uint num2 = ~num1;
Console.WriteLine(Convert.ToString(num2, toBase: 2));
output:11111111111111111111111111010101

uint num1 = 0x2A; // 101010
uint num2 = num1 << 2;
Console.WriteLine(Convert.ToString(num2, toBase: 2));
output:10101000

uint num1 = 0x2A; // 101010
uint num2 = num1 >> 2;
Console.WriteLine(Convert.ToString(num2, toBase: 2));
output:1010

uint num1 = 0x2A; // 101010
uint num2 = num1 & 0x1B; // 101010 and 011011
Console.WriteLine(Convert.ToString(num2, toBase: 2));
output:1010

uint num1 = 0x2A; // 101010
uint num2 = num1 | 0x1B; // 101010 or 011011
Console.WriteLine(Convert.ToString(num2, toBase: 2));
output:111011

uint num1 = 0x2A; // 101010
uint num2 = num1 ^ 0x1B; // 101010 xor 011011
Console.WriteLine(Convert.ToString(num2, toBase: 2));
output:110001

4. 같음 연산자
==(같음)
!=(같지 않음)

예제
int num1 = 1;
int num2 = 2;
Console.WriteLine(num1==num2);
output:False

int num1 = 1;
int num2 = 2;
Console.WriteLine(num1!=num2);
output:True

5. 비교 연산자(관계형 연산자)
<(보다 작음)
>(보다 큼)
<=(작거나 같음)
>=(크거나 같음)

예제
int num1 = 1;
int num2 = 2;
Console.WriteLine(num1>num2);
output:False

6. ?: 연산자
구문의 다음과 같습니다
조건 ? A : B
조건이 true이면 A가 false이며 B가 결과값이 됩니다.

예제
int num1 = 1;
int num2 = (num1 == 1) ? 1 : 2;
Console.WriteLine(num2);
output : 1

7. ?? 및 ??= 연산자
??는 null이 아닌 경우 왼쪽 피연산자를 반환하고 그렇지 않다면, 오른쪽 연산자를 평가합니다.
??=는 왼쪽 피연산자가 null일 경우만 오른쪽 피연산자의 값을 왼쪽 피연산자에 대입합니다. 

예제

int? num1 = null;
int num2 = num1 ?? -1;
Console.WriteLine(num2);  
output: -1


List numbers = null;
(numbers ??= new List()).Add(5);
Console.WriteLine(string.Join(" ", numbers));  
output: 5

반응형

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

[C#] yield  (0) 2019.10.14
[C#] 반복문  (0) 2019.10.13
[C#] 조건문  (0) 2019.10.12
[C#] 데이터 타입  (0) 2019.10.09
[C#] 직렬화(Serialization)  (2) 2019.07.16
반응형

데이터 타입에 대해 알아보겠습니다.

 

1. 정수 형식

C# 형식 / 키워드 범위 크기 .NET 형식
sbyte -128 ~ 127 부호 있는 8비트 정수 System.SByte
byte 0 ~ 255 부호 없는 8비트 정수 System.Byte
short –32,768 ~ 32,767 부호 있는 16비트 정수 System.Int16
ushort 0 ~ 65,535 부호 없는 16비트 정수 System.UInt16
int –2,147,483,648 ~ 2,147,483,647 부호 있는 32비트 정수 System.Int32
uint 0 ~ 4,294,967,295 부호 없는 32비트 정수 System.UInt32
long –9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 부호 있는 64비트 정수 System.Int64
ulong 0 ~ 18,446,744,073,709,551,615 부호 없는 64비트 정수 System.UInt64

 

다음과 같이 사용할 수 있습니다.

int num = 1234;

 

정수 리터럴은 10진수, 16진수, 2진 리터럴로 다음과 같이 지정할 수 있습니다.

(리터럴 : 변하지 않는 데이터)

var decimalLiteral = 42;

var hexLiteral = 0x2A;

var binaryLiteral = 0b_0010_1010;

 

2. 부동 소수점 숫자 형식

C# 형식 / 키워드 근사 범위 전체 자릿수 .NET 형식
float ±1.5E−45 ~ ±3.4E38 ~6-9개 자릿수 System.Single
double ±5.0E−324 ~ ±1.7E308 ~15-17개 자릿수 System.Double
decimal ±1.0E-28 ~ ±7.9228E28 28-29개의 자릿수 System.Decimal

 

다음과 같이 사용할 수 있습니다.

double dbNum = 12.34;

 

부동 소수점 리터럴은 다음과 같이 지정할 수 있습니다.

d 또는 D 접미사는 리터럴을 double로 변환

f 또는 F 접미사는 리터럴을 float로 변환

m 또는 M 접미사는 리터럴 decimal로 변환

 

double dbNum = 12.34d;

float fNum = 12.34f;

decimal fNum = 12.34m;

 

3. char 형식

형식 범위 크기 .NET형식
char U+0000~U+FFFF 유니코드 16비트 문자 System.Char

 

4. enum 형식

열거형 데이터 타입으로 상수 집합으로 구성이 됩니다.

 

이렇게 정의 할 수 있습니다.

enum Day {Sun, Mon, Tue, Wed, Thu, Fri, Sat};

 

Sun가 0으로 시작되어, Mon에는 1, Tue에는 2와 같은 식으로 데이터가 정의됩니다.

 

그리고 이런 식으로 사용할 수 있습니다.

int x = (int)Day.Sat;

 

int형에 데이터를 넣기 이해서는 명시적 캐스트가 필요합니다.

 

 

5. bool 형식

부울 값인 true / false를 저정할 변수를 선언하는데 사용됩니다.

 

다음과 같이 사용할 수 있습니다.

bool bCheck = true;

 

 

6. Nullable 형식

기본적으로 값형식(int형 등)들은 null값을 가질 수 없습니다. 하지만 null값을 가지기 위해서는 nullable형식으로 만들면 됩니다.

 

값형식에 ?를 붙이거나, Nullable<int>로 null값을 가질 수 있는 데이터를 만들 수 있다. 

 

다음과 같이 사용합니다.

 

int? num1 = null

Nullable<int> num2= null;

 

반응형

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

[C#] yield  (0) 2019.10.14
[C#] 반복문  (0) 2019.10.13
[C#] 조건문  (0) 2019.10.12
[C#] 연산자  (0) 2019.10.10
[C#] 직렬화(Serialization)  (2) 2019.07.16
반응형

안녕하세요

 

오브젝트를 키보드로 이동하는 방법을 예제를 통해 알아보도록 하겠습니다.

 

새로운 프로젝트를 만듭니다.

 

그리고 바닥 오브젝트를 생성합니다.

 

Hierachy에서 오른쪽 클릭하여 3D Object - Plane로 생성합니다.

 

다음은 움직일 오브젝트를 생성합니다.

 

Hierachy에서 오른쪽 클릭하여 3D Object - Cube로 생성합니다.

 

그 후 Plane위에 Cube가 위치하도록 y축 값을 변경합니다.

 

다음과 같이 변경하였습니다.

그리고 Cube Object 스크립트를 추가합니다.

 
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;
 
public class Mover : MonoBehaviour
{
 
    float m_fSpeed = 5.0f;
    
    void Start()
    {
        
    }
 
    void Update()
    {
        float fHorizontal = Input.GetAxis("Horizontal");
        float fVertical = Input.GetAxis("Vertical");
 
        transform.Translate(Vector3.right * Time.deltaTime * m_fSpeed * fHorizontal, Space.World);
        transform.Translate(Vector3.up  * Time.deltaTime * m_fSpeed * fVertical, Space.World);
    }
}
 
 

 

Input.GetAxis("Horizontal");와 Input.GetAxis("Vertical"); 는 수평과 수직 입력값을 받아옵니다.

 

Input에 관한 키값은 Edit - Project Settings를 통해 설정할 수 있습니다.

 

기본적으로 Horizontal에는 방향키 왼쪽, 오른쪽 키와 'a'와 'd'키로 되어있고,

Vertical에는 방향키 아래, 위 키와 's'와 w 키로 되어있습니다.

 

왼쪽 키 혹은 a 키를 입력했을 경우에는 fHorizontal에 -1이 대입되고, 오른쪽 키 혹은 d키를 입력할 경우에는 fHorizontal에 1이 대입됩니다.

그리고, 아래키 혹은 s키를 입력할 경우에 fVertical에 -1이 대입되고, 위키 혹은 w키를 누를 경우 1이 대입됩니다.

 

 

다음 Translate함수를 통해 이동을 하게 되는데 다음과 같이 구현을 했습니다.

transform.Translate(Vector3.right * Time.deltaTime * m_fSpeed * fHorizontal, Space.World);

transform.Translate(Vector3.up  * Time.deltaTime * m_fSpeed * fVertical, Space.World);

입력값이 없으면 fHorizontal나 fVertical가 0이기 때문에 이동을 안하게 되고 입력값이 들어오면 값만큼 이동을 하게 됩니다.

 

 

위에 코드는 아래, 위, 왼쪽, 오른쪽으로 이동하도록 구현하였는데, 만약에 앞, 뒤, 왼쪽, 오른쪽으로 오브젝트를 이동하고자 한다면

transform.Translate(Vector3.up  * Time.deltaTime * m_fSpeed * fVertical, Space.World);

이 코드를 

transform.Translate(Vector3.forward  * Time.deltaTime * m_fSpeed * fVertical, Space.World);

이렇게 변경하면, 앞, 뒤로 이동하게 됩니다.

반응형
반응형

안녕하세요.

 

오늘은 유니티에서 마우스 클릭 시 객체가 이동하도록 구현해보겠습니다.

 

일단 기본적으로 바닥과 객체를 하나 생성하겠습니다.

 

바닥은 Quad로 생성하겠습니다.

 

 

그리고, 생성 후 바닥 같은 모양을 만들기 위해, 크기와 로테이션을 변경하겠습니다.

 

그리고 움직일 객체를 만들어보겠습니다.

 

Cube로 만들겠습니다.

 

Cube Object를 바닥 오브젝트와 적당한 거리로 이동시킵니다.

 

 

그리고 Cube Object에 스크립트를 추가합니다.

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
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Player : MonoBehaviour
{
    public float m_fSpeed = 5.0f;
    Vector3 m_vecTarget;
    void Start()
    {
        m_vecTarget = transform.position;
    }
 
    void Update()
    {
        if(Input.GetMouseButtonDown(0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            if(Physics.Raycast(ray, out hit, 10000f))
            {
                m_vecTarget = hit.point;
                m_vecTarget.y = transform.position.y;
            }
        }
        transform.position = Vector3.MoveTowards(transform.position, m_vecTarget, m_fSpeed * Time.deltaTime);
    }
}
 
 
cs

이렇게 추가하면 클릭할 때 마다 이동하는 것을 볼 수 있습니다.

 

Physics.Raycast(ray, out hit, 10000f)에 들어간 매개변수의 의미는

 

ray는 광선의 시작점과 방향

hit는 충돌체가 발생한 위치에 대한 정보가 함수에서 받아옵니다.

10000f는 광선이 충돌을 확인해야하는 최대 거리를 의미합니다.

 

반응형
반응형

안녕하세요.

 

처음 Toggle UI에 초기값을 스크립트를 통해 넣으려면 혼란스러운 점을 발견해서, 그거에 관련해서 넣는 방법에 대해 적으려고 합니다.

 

Toggle에 초기값을 에디터상에서 셋팅을 하려면 IsOn값을 변경하면 됩니다.

 

Is On상태에 대해 check 활성화 / 비활성화 상태가 됩니다.

 

스크립트에서도 마찬가지로 void Start()에서 초기값을 이런식으로 셋팅할 수 있습니다.

 

m_goToggle = GameObject.Find("Canvas/Toggle");
m_goToggle.GetComponent().isOn = true;

 

그리고 이벤트도 OnChangeToggle 함수를 연결했습니다.

 

public void OnChangeToggle(bool bActive)
{

       m_bToggle = !m_bToggle ;

}

 

이렇게 연결했을 경우 토글값이 계속 변경이 되어 확인해보니, 

 

에디터상에서 Is On 초기값과 스크립트 Start()함수에서 "m_goToggle.GetComponent().isOn = true"이 다를 경우 

 

"m_goToggle.GetComponent().isOn = true"구문에서, OnChangeToggle 함수가 호출되는 현상이 발생했습니다.

(On 초기값과 스크립트 Start()함수에서 "m_goToggle.GetComponent().isOn = true"이 같은 경우는 OnChangeToggle가

호출되지 않습니다.)

 

그래서, 이렇게 구현을 해야합니다.

 

public void OnChangeToggle(bool bActive) 
{ 

       m_bToggle = bActive ; 

}

 

혹시 이것도 문제가 발생한다면, 

 

public void OnChangeToggle(bool bActive) 
{ 

       m_bToggle = m_goToggle.GetComponent().isOn; 

}

 

이렇게 구현해보면 됩니다.

반응형
반응형

안녕하세요.

 

유니티로 개발을 하다보면, 유니터 에디터는 PC에서 구동되니까 모바일 환경에서의 문제를

 

유니터 에디터상에서 확인할 수 없는 상황이 있습니다.

 

폰으로 계속 연결하기도 좀 번거로운 경우가 많기 때문에 같은 PC환경이면서 모바일 환경이 지원되는 애뮬레이터를 사용하게 되는 경우가 많습니다. 

 

오늘은 제가 사용하는 안드로이드 에뮬레이터 미뮤(Memu)에 연결하여 adb logcat을 확인하는 방법에 대해 알아보겠습니다.

 

일단 미뮤(Memu)가 설치된 경로로 이동합니다.

 

미뮤(Memu) 바로가기 아이콘에 오른쪽 클릭 후 속성을 누르면 확인할 수 있습니다.

 

 

여기서 경로 표시줄에 "cmd"라고 쓰고 엔터를 누르면 명령 프롬프트를 실행할 수 있습니다.

 

 

미뮤(Memu)를 실행시킵니다.

 

그리고 명령 프롬프트창에서 미뮤와 연결을 시킵니다.

 

"adb connect 127.0.0.1:21503" 를 입력합니다.

 

 

성공메세지를 확인합니다.

 

그리고 adb logcat명령어를 사용합니다.

 

"adb logcat"이라고 적으면 미뮤(Memu)을 로그 데이터를 확인할 수 있습니다.

 

adb의 옵션에 대한 설명은 안드로이드 개발자 페이지에 자세히 나와있습니다.

 

https://developer.android.com/studio/command-line/logcat.html?hl=ko#filteringOutput

 

logcat 명령줄 도구  |  Android Developers

Logcat은 기기에서 오류와 메시지(앱에서 Log 클래스로 작성)가 표시될 때 스택 추적을 비롯하여 시스템 메시지의 로그를 덤프하는 명령줄 도구입니다.

developer.android.com

기본적으로 유니티로 만들 프로젝트의 로그를 확인하려면,

 

"adb logcat -s Unity" 를 입력합니다.

 

그러면 "Unity"가 포함된 로그만 출력이 되게 됩니다.

 

대소문자 구분을 합니다.

 

사용시 주의해야합니다.

 

 

반응형

+ Recent posts