반응형

안녕하세요.

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

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

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

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

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
반응형
반응형

안녕하세요.

오늘은 유니티로 개발중에 발생한 Screen.width가 폰 스펙과 다르게 나오는 문제에 대해 다루겠습니다.

제가 하려고 했던건 폰 width값을 버튼의 width값에 넣으려고 했는데, 유니티상이나 애뮬레이터 상에도 문제가 없었는데, 갤럭시 S8 기종에서는 다른 width값을 가지고 있었습니다.

분명히 S8기종 해상도는 2960 x 1440 으로 알고 있습니다.

가로모드로 해놓았기 때문에 2960이 width값으로 들어있어야하는데, 2220이 들어있었습니다.

또한 Screen.height값도 1440이 아니라 1080으로 들어가 있었습니다.

검색을 해봐도 해결이 되지 않았습니다.

그러던중 혹시 몰라서 폰 디스플레이 설정을 확인했습니다.

설정 - 디스플레이 - 화면해상도를 확인했습니다.

 

그런데 이와 같이 2220 x 1080으로 설정되어있어서 Screen.width와 Screen.height에서 각각 2220 / 1080으로 값이 들어가 있었습니다.

결론적으로 이런 방법으로는 해상도를 맞출 수 없을거같아서, 다른 방법을 다시 찾아야 할 것 같습니다.

반응형
반응형

해외 서비스를 하기 위해서는 Collation를 변경해야 스트링이 깨지는 현상을 방지할 수 있습니다.


데이터 베이스의 Collation 변경 쿼리는 다음과 같습니다.
1. 다른 사용자가 DB를 사용하고 있는데, 변경되면 안 되기 때문에 SINGLE USER로 변경합니다.
-- SINGLE USER MODE 변경 
ALTER DATABASE
DBNAME_DBF
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE

2. collate 변경합니다.
--  Thai_CI_AS로 변경
ALTER DATABASE
DBNAME_DBF
COLLATE
Thai_CI_AS

3. 다시 MULTI USER MODE로 원복합니다
-- MULTI USER MODE
ALTER DATABASE
DBNAME_DBF
SET MULTI_USER 


테이블의 컬럼(char, nvarchar, text형 데이터) COLLATE도 변경해야 데이터가 제대로 입력될 수 있습니다.
테이블 컬럼 변경 쿼리는 다음과 같습니다.
ALTER TABLE
DBTable_TBL
ALTER COLUMN
CharacterName varchar(50)
COLLATE
Thai_CI_AS

그리고 만약 위에 CharacterName가 인덱싱이 되어있다면, 인덱싱을 제거하고 collate작업을 한 후 다시 생성해줘야 합니다.


그리고 주의할 점은 만약에 내가 AAAA_DBF라는 데이터 베이스에서 BBBB_DBF라는 데이터베이스 CCCC_TBL테이블의 데이터를 조회했을 때,
AAAA_DBF데이터베이스 COLLATE과 BBBB_DBF 데이터베이스 COLLATE가 다르다면, CCCC_TBL테이블의 스트링이 깨져서 출력될 수 있습니다.
(BBBB_DBF와 CCCC_TBL테이블의 컬럼은 같은 Collation)
USE [AAAA_DBF]
SELECT * FROM BBBB_DBF.dbo.CCCC_TBL WHERE m_szName = 'พูริคอง';

USE [BBBB_DBF]
SELECT * FROM BBBB_DBF.dbo.CCCC_TBL WHERE m_szName = 'พูริคอง';

이 두가지 조회 쿼리의 결과가 달라질 수 있습니다.
저는 AAAA_DBF가 Korean_Wansung_CI_AS이고,  BBBB_DBF가 Thai_CI_AS일 때, 조회된 m_szName이 ????로 깨져 나왔습니다.
AAAA_DBF를 Thai_CI_AS로 변경해서 해결했습니다.

반응형
반응형
 

데이터들은 한 그룹으로 모아서 관리할때 배열을 만들거나 컬렉션을 만들어서 관리를 하게됩니다.

하지만 배열은 초기에 데이터크기를 정해서 사용해야하기때문에 유동성있게 데이터를 추가/삭제가 편리하게 구성되어있는 컬렉션을 사용할 수 있습니다.

컬렉션은 System.Collections.Generic 네임스페이스의 using하여 사용할수있습니다.

컬렉션 종류
Dictionary<TKey,TValue>키에 따라 구성된 키/값 쌍의 컬렉션을 나타냅니다.
List<T>인덱스로 액세스할 수 있는 개체 목록을 나타냅니다. 목록의 검색, 정렬 및 수정에 사용할 수 있는 메서드를 제공합니다.
Queue<T>FIFO(선입선출) 방식의 개체 컬렉션을 나타냅니다.
SortedList<TKey,TValue>연관된 IComparer<T> 구현을 기반으로 키에 따라 정렬된 키/값 쌍의 컬렉션을 나타냅니다.
Stack<T>LIFO(후입선출) 방식의 개체 컬렉션을 나타냅니다.
ArrayList필요에 따라 크기가 동적으로 증가하는 개체 배열을 나타냅니다.
Hashtable키의 해시 코드에 따라 구성된 키/값 쌍의 컬렉션을 나타냅니다.
QueueFIFO(선입선출) 방식의 개체 컬렉션을 나타냅니다.
StackLIFO(후입선출) 방식의 개체 컬렉션을 나타냅니다.
반응형

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

[C#] 스레드 동기화(Lock, Monitor)  (0) 2019.11.05
[C#] 스레드(Thread)  (0) 2019.11.04
C# 인터페이스(interface)  (0) 2019.10.30
[C#] 배열(Array)  (0) 2019.10.29
[C#] String.Format  (0) 2019.10.28
반응형
인터페이스는 클래스와 비슷하지만, 메서드, 이벤트, 인덱서, 속성을 클래스에서 가질 수 있는 기능들을 정의하지만, 구현은 하지않습니다.
 
구현을 인터페이스를 갖는 클래스에서 반드시 해야합니다.
이렇게 쓰는 이유는 인터페이스 하나만으로 내가 구현부를 알지못해도 사용이 가능하도록 하고, 
이런 기능들이 클래스에서 꼭 사용되야한다고 명시한다고 볼 수도 있습니다.
 
추상 base 클래스와 매우 유사하지만, 클래스는 다중상속을 지원하지 않지만 인터페이스는 다중상속을 지원합니다
또한 구조체는 다른 구조체나 클래스를 상속할 수 없지만 인터페이스는 지원합니다.
 
형식
public interfase 인터페이스명
{
int 메서드이름();
}
 
구현
인터페이스를 갖는 클래스의 경우 인터페이스에서 정의한 메서드등을 반드시 구현해야합니다.
public interface IAAAA
{
void print();
}
 
public class BBBB : IAAAA
{
public void print()
{
Console.WriteLine("print()");
}
}
 

 

인터페이스는 클래스와 비슷하지만, 메서드, 이벤트, 인덱서, 속성을 클래스에서 가질 수 있는 기능들을 정의하지만, 구현은 하지 않습니다.

구현을 인터페이스를 갖는 클래스에서 반드시 해야합니다.
이렇게 쓰는 이유는 인터페이스 하나만으로 내가 구현부를 알지 못해도 사용이 가능하도록 하고, 
이런 기능들이 클래스에서 꼭 사용되야한다고 명시한다고 볼 수도 있습니다.

추상 base 클래스와 매우 유사하지만, 클래스는 다중상속을 지원하지 않지만 인터페이스는 다중 상속을 지원합니다
또한 구조체는 다른 구조체나 클래스를 상속할 수 없지만 인터페이스는 지원합니다.

형식
public interfase 인터페이스명
{
int 메서드이름();
}

구현
인터페이스를 갖는 클래스의 경우 인터페이스에서 정의한 메서드 등을 반드시 구현해야 합니다.
public interface IAAAA
{
void print();
}

public class BBBB : IAAAA
{
public void print()
{
Console.WriteLine("print()");
}
}


인터페이스로 정의를 하면 인터페이스 맴버만 접근이 가능합니다.

public interface IAAAA
{
void print();
}

public class BBBB : IAAAA
{
public void print()
{
Console.WriteLine("print()");
}

public void print2()
{
Console.WriteLine("print()2");
}
}

static void Main(string[] args)
{
IAAAA B1 = new BBBB();
B1.print();
//B1.print2();
}

B1.print2();가 접근이 불가능합니다.

접근이 가능하려면 
IAAAA B1 = new BBBB(); 이 부분을 BBBB B1 = new BBBB(); 이렇게 수정하면 됩니다.

반응형

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

[C#] 스레드(Thread)  (0) 2019.11.04
[C#]컬렉션(Collections)  (0) 2019.10.31
[C#] 배열(Array)  (0) 2019.10.29
[C#] String.Format  (0) 2019.10.28
[C#] #region  (0) 2019.10.27
반응형

배열
형식이 동일한 변수를 여러개 저장이 가능하도록 모아놓은 데이터 집합입니다.

형식
type[] arrayName;

속성
- 1차원, 혹은 다차원 또는 가변으로 만들 수 있습니다.
- 차원 수와 각 차원 길이는 배열 인스턴스를 만들 때 설정되는데, 인스턴스 수명동안 변경이 불가능합니다.
- 숫자(int형) 배열 요소의 기본값은 0으로 설정되고, 참조 요소는 null로 설정됩니다.
- 가변 배열은 요소들이 참조형식이며, null로 초기화됩니다.
- 배열은 0으로 인덱싱되고, 요소들은 0~n-1로 인덱싱됩니다.
- 배열 형식은 Array 추상 기본 형식에서 파생된 참조 형식입니다. 이 형식은 IEnumerable 및 IEnumerable을 구현하므로 foreach반복을 사용할 수 있습니다.


1차원 배열

다음과 같이 선언할 수 있습니다.
int[] arrayName = new int[10]

배열 선언 시 배열 초기값을 설정은 다음과 같이 할 수 있습니다.
int[] arrayName = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

다음과 같이 초기화 하지 않고 배열을 선언하고 배열을 할당할 때 값을 설정할 수도 있습니다.
int[] arrayName;
arrayName = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

특정 배열요소에 접근할때에는 인덱스로 접근합니다.
예를들어, 위에 arrayName에 5값을 접근하려면 arrayName[4]로 접근할 수 있습니다.


다차원 배열

2차원 배열은 다음과 같이 선언할 수 있습니다.
int[,] arrayName = new int[5, 2];

3차원 배열은 다음과 같이 선언할 수 있습니다.
int[, ,] = arrayName = new int [5, 2, 4];

초기화는 다음과 같이 할 수 있습니다.
int[,] array2 = new int[,] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 }, { 9, 10 } }; 

int[,] array2a = new int[5,2] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 }, { 9, 10 } };

int[,] array2b =  { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 }, { 9, 10 } };

특정 배열요소로의 접근은 다음과 같이 할 수 있습니다.
array2[2, 1] = 9;
array2a[2, 1] = 9;
arraarray2b[2, 1] = 9;

가변 배열

가변 배열의 요소들은 차원과 크기가 다를 수 있습니다.

다음과 같이 선언해서 설정합니다.

int[][] arrayName = new int [2][];
arrayName[0] = new int[4];
arrayName[1] = new int[2];

초기값을 넣어서 값을 채울 수 있습니다.
int[][] arrayName = new int [2][];
arrayName[0] = new int[] { 1, 2, 3, 4 };
arrayName[1] = new int[] { 5, 6 };

다음과 같이 선언시에 초기화할 수도 있습니다.
int[][] arrayName = new int [][]
{
    new int[] { 1, 2, 3, 4 },
    new int[] { 5, 6 }
};

new int[][]를 다음과 같이 생략할 수 있습니다.
int[][] arrayName = 
{
    new int[] { 1, 2, 3, 4 },
    new int[] { 5, 6 }
};

배열 요소에 접근하려면 다음과 같이 하면됩니다.
arrayName[0][1] = 5;

서로 다른 크기의 세가지 2차원 배열을 만들 수 도있습니다.
int[][,] arrayName = new int[3][,]
{
    new int[,] { {1, 2}, {3, 4} },
    new int[,] { {5, 6}, {7, 8}, {9, 10} },
    new int[,] { {11, 12}, {13, 14}, {15, 16}, {17, 18} }
};
Console.WriteLine(arrayName[2][1, 0]);
출력:13

Length를 이용해서 가변 배열에 포함된 배열수를 알 수 있습니다.
Console.WriteLine(arrayName.Length);
이렇게 한다면 3이 출력됩니다.

Length를 이용해서 가변값을 다음과 같이 출력할 수 있습니다.

int[][] arrayName = new int[][]
{
    new int[] { 1, 2, 3, 4 },
    new int[] { 5, 6 }
};

for (int i = 0; i < arrayName.Length; i++)
{
    for ( int j = 0; j < arrayName[i].Length; j++ )
        Console.Write("{0} ", arrayName[i][j]);
        System.Console.WriteLine();
}


foreach 사용
foreach문을 사용하여 배열의 데이터를 가져올 수 있습니다.

다음과 같이 사용할 수 있습니다.
int[] arrayName = new int[]{1,2,3,4,5};

foreach (int i in arrayName)
    Console.Write("{0} ", i);

배열을 인수로 전달

배열을 함수 인수로 전달할 수 있습니다.
int[] arrayName = new int[]{1,2,3,4,5};
printArray(arrayName);

static void printArray(int[] arr)
{
    foreach(int i in arr)
    Console.Write("{0} ", i);
}

반응형

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

[C#]컬렉션(Collections)  (0) 2019.10.31
C# 인터페이스(interface)  (0) 2019.10.30
[C#] String.Format  (0) 2019.10.28
[C#] #region  (0) 2019.10.27
[C#] 익명 타입(Anonymous Types)  (0) 2019.10.23
반응형

문자열을 나타낼 때 String에 데이터를 넣고 사용할 수 있습니다.
다양한 형태로 사용하려면 String의 Format함수를 이용합니다.

다음과 같이 사용할 수 있습니다.
String str;
str = String.Format("{0}", 1);
Console.WriteLine(str);
출력 : 1

두 개의 항목을 스트링에 넣으려면 {1}을 추가하면 됩니다.
String str;
str = String.Format("{0}, {1}", 1, 7);
Console.WriteLine(str);
출력 : 1, 7

서식으로도 넣을 수 있습니다.
String str;
str = String.Format("{0:D5}", 7);
Console.WriteLine(str);
출력:00007
D5같이 해당 항목에 서식으로 넣을 수 있게됩니다.
다음과 같은 서식이 있습니다.
"C" 또는 "c" - 통화형식 언어가 우리나라로 지정되어있을 경우 '\'가 앞에 붙어서 표기됩니다.
"D" 또는 "d" - 정수형식 1234을 D로 했을 경우 1234, D5로 했을 경우 01234로 표기됩니다.
"E" 또는 "e" - 지수형식 12345.6789691226 E로 했을 경우 1.234568E+004, e로 했을 경우 1.234568e+004로 표기됩니다. 또한 E2는 1.23E+004로 표기됩니다.
"F" 또는 "f" - 고정소수점형식 1234.567를 F로 했을 경우 1234.56, 1234.56을 F4로 했을 경우 1234.5600로 표기됩니다.
"G" 또는 "g" - 모든 숫자 형식 12345.6789를 G로 지정하면 12345.6789로 표기되지만, G2하면 1.2E+04로 표기가 됩니다.
"N" 또는 "n" - 자릿수를 지정합니다. 1234.567을 N으로 지정하면 1,234.567로 표기되고, N4로 지정하면 1,234.5670으로 표기됩니다.
"P" 또는 "p" - 100으로 곱하고 백분율 기호와 함께 표시합니다. 1을 P로 지정하면 100%로 표기됩니다.
"R" 또는 "r" - 해당 숫자로 라운드트립할 수 있는 문자. BigInteger형식에만 권장됩니다. 
"X" 또는 "x" -  16진수 형식. 10을 X로 지정하면 A로 표기됩니다.

간격을 제어할 수 있습니다.
String str;
str = String.Format("{0,10} {1,5}", 10, 2);
Console.WriteLine(str);

반응형

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

C# 인터페이스(interface)  (0) 2019.10.30
[C#] 배열(Array)  (0) 2019.10.29
[C#] #region  (0) 2019.10.27
[C#] 익명 타입(Anonymous Types)  (0) 2019.10.23
[C#] Action, Func  (0) 2019.10.22
반응형
안녕하세요

오늘은 스크립트를 보기좋게 단락별로 구분할 수 있는 "#region"에 대해서 알아보도록 하겠습니다.

코드가 몇천줄만 넘어도 코드가 한눈에 들어오기가 어렵게되는데 이럴때 유용하게 사용할수 있습니다.

코드가 어떤코드인지 제목을 넣을수 있고 현재 작업중인 코드에 집중하기 위해 영역을 축소하거나 숨길수 있습니다.

형식
#region 제목
내용
#endregion

예제
#region class AAA
public class AAA
{
     int nNum;
}
#endregion

이렇게 간단하게 사용할 수 있습니다.
반응형

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

[C#] 배열(Array)  (0) 2019.10.29
[C#] String.Format  (0) 2019.10.28
[C#] 익명 타입(Anonymous Types)  (0) 2019.10.23
[C#] Action, Func  (0) 2019.10.22
[C#] 람다식(Lambda expressions)  (0) 2019.10.21
반응형

이 글과 관련된 글입니다.

[Unity] 해상도에 따른 UI 위치 변경

 

안녕하세요.

 

개발을 하다 보면 핸드폰마다 해상도가 달라서 곤란한 경우가 자주 있습니다.

 

지금 출시된 모든 휴대폰을 다 확인이 불가능하기 때문에 간단하게 해상도를 설정하는 방법에 대해 알아보도록 하겠습니다.

 

일단 현재 나와있는 폰들의 해상도를 알아보도록 하겠습니다.

 

구글에서 "휴대폰 해상도"라고 검색을 하면 휴대폰 해상도에 대한 정보들이 나와있는 것을 볼 수 있습니다.

 

그중에서 다음 사이트에 보면 잘 정리가 되어있습니다.

 

https://zetawiki.com/wiki/%EC%8A%A4%EB%A7%88%ED%8A%B8%ED%8F%B0_%ED%95%B4%EC%83%81%EB%8F%84,_%ED%99%94%EB%A9%B4%EB%B9%84%EC%9C%A8

 

스마트폰 해상도, 화면비율 - 제타위키

9:16 ★★★ 1440 × 2560(갤6, 갤7, 갤노4, 갤노5, G3, G4, G5, 픽셀XL)1080 × 1920(갤4, 갤5, 갤노3, 옵G프로, G2, 넥5, 아이폰6, 픽셀)

zetawiki.com

스마트폰은 16:9가 많이 있는 것을 확인해 볼 수 있어서 앱 개발 시 16:9를 기준으로 개발하는 것이 좋을 것 같습니다.

 

그러나 기타 해상도가 다른 휴대폰들은 화면에 UI가 이상한 곳으로 이동되는 현상이 발생할 수 있습니다.

 

유니티 에디터 상에서 해상 해상도를 설정하는 방법은 게임 탭에서 해당 해상도를 추가하는 방법입니다.

 

 

추가해서 해당 해상도로 설정을 하면 문제와 생긴 기기와 같은 화면을 볼 수 있습니다.

 

그리고, 기기 해상도를 완벽히 다 호환하기는 어렵지만 Canvas Object에서 "Canvas Scaler" Componect를 수정하면 됩니다.

 

 

잠시 설정에 대한 설명을 하면,

 

UI Scale Mode - 캔버스에 UI 요소들이 스케일링되는 방법을 결정하게 됩니다.

   Constant Pixel Size - 화면 크기에 관계없이 동일한 픽셀 크기를 유지합니다.

   Scale With Screen Size - 화면이 커질수록 UI 요소도 커집니다.

   Constant Physical Size - 화면 크기와 해상도에 관계없이 UI 요소가 동일한 물리적인 크기로 유지됩니다.

 

여기서 "Scale With Screen Size"를 설정해서 해상도에 맞춰서 기준 해상도를 Referance Resolution을 정한 후

"Match Widh Or Heght"로 해상도에 따라 스케일을 변경할 수 있습니다.

만약 위에 같이 X 2560, Y 1440으로 설정을 했다면 Match를 0.5로 했을 경우 그에 따라 전제 스케일이 변하게 되고,

만약 X가 변경되지 않게 하려면 Match를 0, Y이 변경이 되지 않게 하려면 Match를 1로 하면 된다.

 

세부 설정은 유니티 매뉴얼을 참조하시면 됩니다.

https://docs.unity3d.com/kr/current/Manual/script-CanvasScaler.html

 

캔버스 스케일러 - Unity 매뉴얼

캔버스 스케일러(Canvas Scaler) 컴포넌트는 캔버스 내 UI 요소의 전체적인 스케일과 픽셀 밀도를 제어하는 데 사용됩니다. 스케일은 글꼴 크기와 이미지 경계 등 캔버스 아래의 모든 요소에 영향을 미칩니다.

docs.unity3d.com

 

반응형
반응형

안녕하세요.

지연실행과 관련되어, Invoke, InvokeRepeating, CancelInvoke에 대해 알아보도록 하겠습니다.

 

1. Invoke

Unity 스크립트 작업중에 함수가 일정시간만큼 지연된 후 실행이 되게 하고자 할때 Invoke함수를 사용할 수 있습니다.

Invoke함수를 모른다면 코루틴(coroutine)을 사용해서 시간 지연을 준 후 실행되게 할수있지만 단순히 시간을 지연한 후 함수를 실행 시킨다면 Invoke로 쉽게 구현할 수 있습니다.

형식
Invoke("함수명", 지연시간(초));

예제

1
2
3
4
5
6
7
8
9
10
void Start()
{
    Debug.Log("Start() Time : " + Time.time);
    Invoke("FuncInvoke"5.0f);
}
 
void FuncInvoke()
{
    Debug.Log("FuncInvoke() Time : " + Time.time);
}
 
cs

다음과 같이 출력이 됩니다.

이렇게 한다면 시작 후 5초 후 FuncInvoke함수가 호출됩니다.

 

2. InvokeRepeating

Invoke함수는 지연시간 후 한번만 실행이되는데 여러번 반복실행을 위해서는 InvokeRepeating함수를 사용해서 지정한 주기로 반복할 수 있습니다.

형식
InvokeRepeating(함수명, 지연시간, 반복주기);
지연시간만큼 지연된후 반복주기 만큼 계속 반복합니다.

예제

1
2
3
4
5
6
7
8
9
10
void Start()
{
    Debug.Log("Start() Time : " + Time.time);
    InvokeRepeating("FuncInvoke"5.0f, 1.0f);
}
 
void FuncInvoke()
{
    Debug.Log("FuncInvoke() Time : " + Time.time);
}
 
cs

다음과 같이 출력됩니다.

5초 후 FuncInvoke함수가 호출되고, 1초마다 FuncInvoke가 계속 반복됩니다.

멈추기위해서는 CancelInvoke함수를 이용합니다.

 

3. CancelInvoke

실행중인 Invoke함수를 중지합니다

형식
CancelInvoke(함수명);

예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int m_nCount = 0;
 
void Start()
{
    Debug.Log("Start()");
    InvokeRepeating("FuncInvoke"5.0f, 1.0f);
}
 
void FuncInvoke()
{
    m_nCount++;
    Debug.Log("FuncInvoke()");
 
    if( m_nCount >= 5 )
        CancelInvoke("FuncInvoke");
}
 
cs

다음과 같이 출력됩니다.

InvokeRepeating로 인해 FuncInvoke가 5번 반복되면 CancelInvoke함수로 더 이상 반복되지 않도록 합니다.

반응형
반응형

보통 함수는 하나의 프레임내에서 명령이 실행되게 하는데, 여러 프레임에 걸쳐서 코드를 실행시키기 위한 함수가 코루틴(Coroutine)입니다.
쓰레드와 비슷하다고 느낄 수 있지만 비동기가 아니기 때문에 쓰레드는 아닙니다.
대체로 Update함수를 이용해서 구현할 수 있지만, 코루틴을 사용해야하는 이유는 작업을 나눠서 수행할 수 있고, 불필요한 작업들이
Update문에서 계속 실행되는 것을 방지할 수 있습니다.


형식
함수를 정의한 후 StartCoroutine(코루틴함수)로 실행을 합니다.
코루틴 함수는 IEnumerator의 반환형을 가집니다.

예제

 

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
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Test : MonoBehaviour
{
    GameObject goSprite;
    SpriteRenderer spriteRenderer;
    float m_fAlpha = 0f;
    void Start()
    {
        goSprite = GameObject.Find("Sprite");
        spriteRenderer = goSprite.GetComponent<SpriteRenderer>();
        spriteRenderer.color = new Color(0000);
        StartCoroutine ("Fade");
    }
 
    void Update()
    {
        
    }
    IEnumerator Fade()
    {
        
        for(int i = 0; i < 10; i++)
        {
            m_fAlpha += 0.1f;
            spriteRenderer.color = new Color(000, m_fAlpha );
            yield return new WaitForSeconds(1f);
        }
        
    }
}
 

Sprite Object의 알파수치를 변경하는 예제입니다.
IEnumerator Fade() 함수를 생성해주고, StartCoroutine을 통해 시작하도록 했습니다.
yield return new WaitForSeconds(1f); 이 코드는 1초를 대기하라는 의미입니다.

yield 키워드의 종류는 다음과 같습니다.
yield return null
yield return new WaitForSeconds(float second)  - 주어진 시간(초)동안, co-routine의 수행을 중단합니다.
yield return new WaitForFixedUpdate() - 다음 고정 프레임 업데이트 함수(fixed frame rate update)가 호출될 때까지 기다립니다.
yield return new WaitForEndOfFrame() - 화면에 컨텐츠를 보여주는 프레임 바로 직전에, 모든 카메라와 GUI가 렌더링을 완료하는 프레임의 마지막을 기다립니다.
yield return StartCoRoutine(string) - 다른 코루틴이 끝날 때까지 기다립니다.
yield return new WWW() - 웹 통신 작업이 끝날 때까지 기다립니다.
yield return new AsyncOperation - 비동기 작업이 끝날때까지 기다립니다.

코루틴이 진행중에도 StopCoroutine(함수명)을 입력한다면 정지시킬 수 있습니다.

방금 사용한 StartCoroutine ("Fade"); 이렇게 스트링으로 함수명을 넣을 수도 있지만,
직접 함수를 StartCoroutine (Fade());로 코드를 작성할 수 있습니다.

그리고 함수에 매개변수를 넣어서 표현도 가능합니다.

StartCoroutine (Fade(0.1f));

IEnumerator Fade(float fAlphaPlus)

    for(int i = 0; i < 10; i++)
    {
        m_fAlpha += fAlphaPlus;
        spriteRenderer.color = new Color(0, 0, 0, m_fAlpha );
        yield return new WaitForSeconds(1f);
    }  
}

반응형
반응형

명시적으로 데이터 타입을 정의할 필요 없이 읽기 전용 속성 집합을 단일 개체로 편리하게 캡슐화가 가능합니다.
타입은 컴파일러에 의해 생성되고, 소스 코드 수준에서 값을 변경할 수 없습니다.
속성을 초기화하는데 사용되는 식은 null, 익명 함수 또는 포인터 형식일 수 없습니다.

형식
var 변수명 = new { 속성 = 값, 속성 = 값,....}

예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var a = new { num1 = 50, strMessage = "HI" };
            //a.num1 = 20; 읽기전용이므로 할당이 불가능합니다.
            Console.WriteLine("a.num1 = " + a.num1);
            Console.WriteLine("a.strMessage = " + a.strMessage);
        }
    }
}
 
 

a란 변수를 만들어 num1, strMessage라는 속성을 가진 값을 만들 수 있습니다.

읽기전용이므로 "a.num1 = 20;"와 같이 값을 할당할 수 없습니다.

또한 다음과 같이 배열형식으로 넣을 수 있습니다.

var a = new[] { new { num1 = 50, strMessage = "Kim"}, new { num1 = 100, strMessage = "Lee"} }

 

예제

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var a = new[] { new { num1 = 50, strMessage = "Kim"},
                            new { num1 = 100, strMessage = "Lee"},
                            new { num1 = 150, strMessage = "Choi"},
                            new { num1 = 2500, strMessage = "Jung"},
                            new { num1 = 3050, strMessage = "Park"}
                            };
            foreach (var aaaa in a)
            {
                Console.WriteLine("a.num1 = " + aaaa.num1);
                Console.WriteLine("a.strMessage = " + aaaa.strMessage);
            }
        }
    }
}
 
 

LINQ 쿼리 식을 사용해서 데이터 조회도 가능합니다.

 

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 Program
    {
        static void Main(string[] args)
        {
            var a = new[] { new { num1 = 50, strMessage = "Kim"},
                            new { num1 = 100, strMessage = "Lee"},
                            new { num1 = 150, strMessage = "Choi"},
                            new { num1 = 2500, strMessage = "Jung"},
                            new { num1 = 3050, strMessage = "Park"}
                            };
            var list = a.Where(p => p.num1 > 1000).Select( p=> new { p.num1, p.strMessage } );
            foreach (var aaaa in list)
            {
                Console.WriteLine("a.num1 = " + aaaa.num1);
                Console.WriteLine("a.strMessage = " + aaaa.strMessage);
            }
        }
    }
}
 
반응형

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

[C#] String.Format  (0) 2019.10.28
[C#] #region  (0) 2019.10.27
[C#] Action, Func  (0) 2019.10.22
[C#] 람다식(Lambda expressions)  (0) 2019.10.21
[C#] 무명 메서드(anonymous method)  (0) 2019.10.20
반응형

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

 

허리디스크 환자의 일하고 싶은 책상 3탄 시작하겠습니다.

 

 

우선 제가 3탄부터 시작하는 이유는

 

(저같이 주머니 사정이 시원치 않은 사람들을 위해서)

 

전 거꾸로 지출을 많이 했지만ㅠㅠ

 

가성비 차원에서  

 

3탄부터 진행하는 게 좋지 않을까 하는 생각에서

 

거꾸로 진행해보겠습니다. ^^ 

 

 

 

http://thewall.kr/product/detail.html?product_no=2498&cate_no=248&display_group=1

 

[NISTUL] 모니터 거치대

SHIPPING TO : 가나(GHANA) SHIPPING TO : 가봉(GABON) SHIPPING TO : 가이아나(GUYANA) SHIPPING TO : 감비아(GAMBIA) SHIPPING TO : 과테말라(GUATEMALA) SHIPPING TO : 그레나다(GRENADA) SHIPPING TO : 그루지야(GEORGIA) SHIPPING TO : 그리스(GREECE) SHIPPING TO : 기니(GUINEA) SHIPPING TO : 기니비소

thewall.kr

 

 

저는 더월에서 모니터 거치대를 구매했습니다. 

 

더월은 허리 디스크 때문에 니스툴 의자 구매 후

 

또 스탠드업 책상 싸고 좋은 것 찾다가 스탠딩 책상 구매 

 

그리고 모니터 암 구매 순으로 하게 되었습니다. 

 

많은 개발자 혹은 장시간 책상에서 앉아서 일하는 사람이라면 

 

디스크 혹은 거북목에 시달릴 것이라고 생각합니다.

 

저도 그래서 최소한의 비용과 가성비를 고민 고민해서 샀고 

 

추천하고 싶어 글을 올립니다.

 

이제 각설하고 주문하면 아래의 박스가 옵니다.

 

 

[NISTUL] 모니터 거치대 언박싱

 

두근두근하지만 진정하고 박스를 열어봅니다.

 

[NISTUL] 모니터 거치대 

파손 방지 박스가 섬세하게 만들어져 있습니다. 

 

부품을 정돈합니다. (조립할때 당황하지 않으려면 꼭 필요합니다!)

 

[NISTUL] 모니터 거치대

 

부품을 조립하면서 설명서가 쓰레기임을 깨달았습니다.

 

모니터 거치대 부분과 책상에 고정하는 부분을 따로따로 보며 조립하는 게 팁입니다.

 

모니터가 삼성 모니터 XL2370과 회사에서 정리하면서 5000원에 구입한  DELL2007 FPB입니다.

 

삼성 모니터 XL2370은 받침대를 분리했지만 목을 빠지지 않아서 실패했고

 

(모니터 부실 뻔ㅠㅠ 빼는 방법 아시는 분?)

 

삼성모니터 XL2370

DELL2007 FPB은 모니터 거치대가 있어서 버튼을 눌러서 빼서 

DELL2007FPB
DELL2007FPB

 

이렇게 끼우면 끝

 

 

 

 

(이 글은 더월과 관계없고 순도 100% 자비로 구매 후 글을 작성하였습니다. ) 

 

 

 

 

반응형

'소비일기 > 얼리어답터' 카테고리의 다른 글

니스툴 스탠드업데스크 M35  (0) 2019.09.30
반응형

 

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

 

알기 쉬운 C#  Action, Func입니다.

 

델리게이트를 생성하기 위해 필요한 델리게이트 형태에 맞춰서 미리 선언해줘야하는데,
만약 무명 메소드로 잠깐 사용하거나 델리게이트 형태가 많은 경우 모두 선언해줘야하는 불편함이있습니다.
C#에서는 이런 불편함을 없애기위해 Func와 Action delegate가 미리 선언되어있습니다.

Action - 매개 변수를 0~16개 가질 수 있는 값을 반환하지 않는 메서드를 캡슐화
Func - 매개 변수를 0~16개를 가질 수 있는 값을 반환하는 메서드를 캡슐화


형태
Action
public delegate void Action<입력 매개변수> (매개변수);

Func
public delegate 반환형 Func<입력 매개변수,반환형> (매개변수);

 

예제
Action

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication1
{
 
    class Program
    {
        static void Main(string[] args)
        {
            Action output1 = () => Console.WriteLine("AAAA");
            output1();
 
            Action<int> output2 = (v) => Console.WriteLine(v);
            output2(2);
        }
    }
}
 
 

Func

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication1
{
    delegate void DelegateParameterTwo(int n1, int n2);
 
    class Program
    {
        static void Main(string[] args)
        {
            Func<int> value = () => 2+8;
            Console.WriteLine(value());
            Func<intintint> plus = (n1, n2) => n1 + n2;    
            Console.WriteLine(plus(27));
            Func<intintfloat> minus = (n1, n2) => n1 * n2 * 0.5f; 
            Console.WriteLine(minus(67));
        }
    }
}
 
 

 

반응형

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

[C#] #region  (0) 2019.10.27
[C#] 익명 타입(Anonymous Types)  (0) 2019.10.23
[C#] 람다식(Lambda expressions)  (0) 2019.10.21
[C#] 무명 메서드(anonymous method)  (0) 2019.10.20
[C#] 제네릭  (0) 2019.10.19
반응형

 

 

무명 메서드와 비슷하게 이름 없이 함수를 표현할 수 있습니다.

형식
(입력 파라메터) => { 실행문 } 

실행문이 한개일때는 중괄호 없이 표현합니다.

(입력 파라메터) => 실행문

입력 파라메터에는 0개부터 여러 개까지 다양하게 만들 수 있습니다.

보통 Delegate를 이용해서 사용합니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication1
{
    delegate void AAAA();
 
    class Program
    {
        static void Main(string[] args)
        {
            AAAA output = () => Console.WriteLine("AAAA");
            output();
        }
    }
}
 

파라메터에 여러 개를 넣을 수 있습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication1
{
    delegate void AAAA1();
    delegate void AAAA2(int nNum);
 
    class Program
    {
        static void Main(string[] args)
        {
            AAAA1 output1 = () => Console.WriteLine("AAAA");
            output1();
 
            AAAA2 output2 = (v) => Console.WriteLine(v);
            output2(2);
        }
    }
}
 
 

 

람다식에 여러 실행문을 넣을 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication1
{
    delegate void DelegateParameterTwo(int n1, int n2);
    
    class Program
    {
        static void Main(string[] args)
        {
            DelegateParameterTwo plus = (n1, n2) => { int n3 = n1 + n2; Console.WriteLine(n3); };
            plus(27);
 
            DelegateParameterTwo minus = (n1, n2) => { int n3 = n1 - n2; Console.WriteLine(n3); };
            minus(127);
        }
    }
}
 
 

 

반응형

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

[C#] 익명 타입(Anonymous Types)  (0) 2019.10.23
[C#] Action, Func  (0) 2019.10.22
[C#] 무명 메서드(anonymous method)  (0) 2019.10.20
[C#] 제네릭  (0) 2019.10.19
[C#] 인덱서(Indexer)  (0) 2019.10.18

+ Recent posts