이미지 루프 렌더(Image Loop Render) - ex)런게임 배경, 비행 슈팅 게임 배경
오늘 "프렌즈런"이라고 카카오프렌즈를 이용한
NextFloor 의 신작 게임이 오픈했다.
이러한 게임을 런게임 류라고 하는데
런게임 들의 배경들은 엄청 긴데 끊임 없이 나온다.
(단순한 비행 슈팅 게임도 그러하다. 드래곤 플라이트 같은 게임...)
잘보면 단순히 반복이 될 뿐이지만
기본적 개념은 하나의 이미지를 가지고 컨트롤 할 수 있다.
아래의 영상은 작년(2015년 10월 22일)
WinApi로 이미지 공부를 하던 중에
깔짝대면서 만든 런게임(연습)이다.
지금의 프렌즈런이 나오기 반년도 더 전부터
카카오프렌즈를 좋아해서 런게임이 나왔으면 하고 생각 했던거였다.
[영상 - 무지의 대모험(?)]
위 영상의 중요 포인트는 2가지다.
하나의 배경이미지가 끊임 없이 이어지는 것과
렉트 충돌을 이용하여 판정 처리를 하는 것이다.
렉트 충돌은 포스팅의 주 내용이 아니기에
간략하게만 설명하자면
2개의 사각형이 같은 면적을 차지하는 부분이
조금이라도 있으면 true, false 값을 주어 상태 처리를 하는 것이다.
이글의 주요 쟁점은 이미지 루프이니 렉트 충돌은 나중에 기회가 되면 더 적어보겠다.(게임만들 땐 엄청 사용된다.)
본인은 위와 같은 이미지를 돌렸는데
이런 배경이미지의 중요점은
절반씩 잘라서 좌우를 바꾸어 이어 붙여도
어색함이 없어야 한다는 것이다.
그래서 본인는 포샵으로 원본을 잘라
미리 좌우를 바꾸고
어색한 가운데 부분을 뭉그트려 지워 처리했다.
(이런건 아트팀이 알아서해주시는데
공부하시는 분들은 포샵을 못하면 알아만 두자.)
배경 이미지는 대개 BitBlt 로 그려준다. (배경에는 보통 투명도가 없으니까...)
상세 인자값은 아래와 같다.
BitBlt( //DC간의 영역끼리 서로 고속복사를 해주는 함수(WinApi 제공)
hdc, //옮겨 그려질(결과가 될) HDC 변수
destX, //결과가 될 시작 x좌표
destY, //결과가 될 시작 y좌표
sourWidth, //자르게 될 이미지 너비
sourHeight, //자르게 될 이미지 높이
hMemDC, //이미지가 가지고 있는 HDC 변수
sourX, //소스가 될 이미지의 시작점 x좌표
sourY, //소스가 될 이미지의 시작점 y좌표
SRCCOPY); //복사 옵션(WinApi 제공)
위처럼 자르는 좌표와 너비를 정해주면
이미지를 잘라서 가져올 수 있는데
그렇다면 이제 어떤 개념이 떠오를까?
게임창의 높이는 이미지 높이에 맞추었다고하고
게임창은 당연히 (0, 0)부터 창 크기까지 맞추어 준다고 했을 때
값이 변할 변수는 sourX밖에 없을 것이다.
sourX축을 계속 증가 적용시켜주면
이미지는 오른쪽에서 왼쪽으로 계속 움직이는 것처럼 된다.(영상처럼)
하지만 이미지를 짜르는데 sourX + sourWidth 의 크기가
배경원본 이미지의 범위를 벗어 날 수가 있다.
그렇다면 어떻게 해야 되는 것인가.
벗어난 만큼을 다시 BitBlt 해주면 되는 것이다.
즉 이미지를 자를 때 온전히 이미지 영역 내(內)라고 하면 한번 BitBlt 하고
영역 밖이 라고 하면 BitBlt 를 두번 하는 것이다.
이는 X축만 따졌을 때 그런 것이고
만약 X, Y축 둘 다 따진다면(배경이 대각선으로 움직인다거나 할 때)
BitBlt 가 총 4번까지 이루어 질 수 있다.
이미지 관련 렌더는 함수로 지정하여
프레임워크 화 하는 것이 보통이다.
하지만 개념만 익혀두자.
WinApi로 게임을 만들 일이 99% 없을 것이고
요즘엔 게임용 2D 엔진도 있고 내부 처리도 잘되어 있다.
WinApi는 2D용으로 공부한지도 꽤 됐고 한데
오늘 나온 게임인 "프렌즈런"이 이전에 만든 것을 떠오르게 하여(영상 참조)
포스팅 해보았다.
요즘은 유니티 공부하기도 바쁘니
그럼 이만...
'공부 > WinAPI' 카테고리의 다른 글
WM_마우스 이벤트 (0) | 2015.10.05 |
---|
태그(tag)로 찾기, 비교하기
유니티의 스크립트(script)에서 자신과 상속관계에 있지 않은
하이어라키(hierarchy)에 있는 오브젝트 들을
찾아 사용 하는 것도 가능하다.
GameObject test1 = GameObject.Find("오브젝트 네임"); //오브젝트 이름으로 찾기
GameObject test2 = GameObject.FindGameObjectWithTag("태그 네임"); //태그로 찾기. 단일 반환
GameObject[] test3 = GameObject.FindGameObjectsWithTag("태그 네임"); //태그로 찾기. 복수 반환.
그렇다면 오브젝트 네임으로 찾아 가져오게 된
GameObject는 원하는 태그로 되어있는지 어떻게 비교해야할까?
if(test1.tag == "test") 와 같이 string 비교도 가능하다.
하지만 string비교는 불필요한 리소스를 잡아 먹어 비효율적이다.
if(test1.CompareTag("test")) 와 같이 유니티에서 만들어 놓은 비교 함수를 권장한다.
'공부 > Unity' 카테고리의 다른 글
GameObject 삭제, 활성, 비활성화 (0) | 2016.05.20 |
---|---|
[잡담]유니티를 일주일정도 공부 하면서 드는 생각 (0) | 2016.05.19 |
유니티 프로젝트 폴더 백업 방법 (1) | 2016.05.13 |
[잡담]유니티 첫 공부 소감 (0) | 2016.05.12 |
유니티 공부 시작 - 자습 방법 (0) | 2016.05.12 |
유니티 프로젝트 폴더 백업 방법
유니티는 프로젝트를 만들 때
별도로 WorkSpace가 생기지 않는다.
프로젝트를 Open할 때에도
파일이 아닌 폴더를 지정하여 불러온다.
그렇다고 폴더를 통째로 복사하기에는 용량이 꽤 된다.
Library 같은 경우는 다시 만들어 주므로
유니티 설정을 통해 최소화 시켜보자.
1. Edit -> Project Settings -> Editor 에서
Version Control Mode를 Visible Meta Files 로 바꾸고
Asset Serialization Mode를 Force Text 로 바꾼다.
종료...
2. 이제 Assets에 Meta파일이 같이 생기고 아래의 2폴더만 백업을 해둔다.
3. Unity를 실행하여 폴더를 잡아 Open하면
Project의 오브젝트들은 그대로이지만
Hierarchy는 기본 값으로 되어있다.
Open Scene을 해주면 된다.
4. 자신이 만든 Scene(파일 명.unity)을 불러오자. 보통 Assets폴더에 저장해 두거나 그 아래에 Scene폴더를 둘것 이다.
5. 불러오면 Hierarchy에 설정했던 것들이 다시 보이게 된다.
//끝.
'공부 > Unity' 카테고리의 다른 글
GameObject 삭제, 활성, 비활성화 (0) | 2016.05.20 |
---|---|
[잡담]유니티를 일주일정도 공부 하면서 드는 생각 (0) | 2016.05.19 |
태그(tag)로 찾기, 비교하기 (0) | 2016.05.19 |
[잡담]유니티 첫 공부 소감 (0) | 2016.05.12 |
유니티 공부 시작 - 자습 방법 (0) | 2016.05.12 |
Console 키입력 - Console.ReadKey, ConsoleKeyInfo
//Console 키입력
ConsoleKeyInfo cKey = Console.ReadKey(true); //bool 값은 입력된 값 표시 여부로 true 일 때 표시 안함이다.
//Console.ReadKey() 는 기본 false이다. 콘솔창에 표시된다.
switch (cKey.Key) //변수.Key로 어떤 키를 입력 했는지 알 수 있다.
{
//대략 아래처럼 ConsoleKey 를 가져와 처리한다.
case ConsoleKey.LeftArrow: //방향키 왼쪽
break;
case ConsoleKey.RightArrow: //방향키 오른쪽
break;
case ConsoleKey.UpArrow: //방향키 위쪽
break;
case ConsoleKey.DownArrow: //방향키 아래쪽
break;
}
//ConsoleKey는 enum으로 되어있다. 꽤 많으나 주석 처리가 잘되어있으니
//Visual Studio에서 F12를 눌러 필요한 것을 찾아보자.
'공부 > C#' 카테고리의 다른 글
소켓 통신, 웹 통신(간략 설명, 메모) (0) | 2016.05.28 |
---|---|
yield return, yield break (0) | 2016.05.24 |
예외처리 - try, catch, finally, throw new Exception (0) | 2016.05.12 |
파일 로드 - FileStream, StreamReader, ReadAllText, ReadAllLines (0) | 2016.05.12 |
파일 저장 - FileStream, StreamWriter, WriteAllText, WriteAllLines (0) | 2016.05.12 |
예외처리 - try, catch, finally, throw new Exception
//예외처리 - try, catch, finally
//예전에 java랑 Jsp 다룰때 꽤 많이 썼었다.(try, catch 안쓰면 컴파일 에러나는 것도 꽤 있었다.)
//쉽게 생각하자.
//try - 하다가 (문제가 없어야 되는게 맞지만) 문제가 생기면
//catch - 잡는다.(문제가 없으면 잡을 것도 없다.)
//finally - 마지막으로 문제가 있든 없든 실행할 코드 - 안써도 됨.
class ExceptionTest //일부러 에러 내보기 위한 class생성
{
public int i = 10;
}
class Program
{
//함수로 에러발생이 나게 만들어 보자 - 아래의 main함수 먼저 보고 돌아오자.
static void TestDiv(int n1, int n2)
{
if(n2==0)
{
//커스텀 Exception - 내가만든 에러 메세지
throw new Exception("n2는 0이 아니어야 한다.");
}
Console.WriteLine("n1 / n2 함수");
Console.WriteLine("{0} / {1} = {2}", n1, n2, n1 / n2);
}
//메인 함수
static void Main(string[] args)
{
ExceptionTest t = null;
//예외 처리
try
{
//위험 요소가 있는 코드를 작성
Console.WriteLine("Test : {0}", t.i);
}
catch (NullReferenceException e) //특정 예외만 골라내기 - new되지 않는 class사용하려고 함
{
//try 부분에서 에러가 발생하면 catch 소스로 접근
//프로그램을 죽이지 않고 처리하기 위한 방법
Console.WriteLine("널 참조 예외가 발생");
Console.WriteLine(e.Message); //한글로 간략 오류 설명
Console.WriteLine("=======================");
Console.WriteLine(e); //예외 메세지 전체
}
//catch를 여러개 사용할 수 있는데 위에서 먼저 잡히면 아래껀 무시
catch (Exception e) //모든 예외
{
//try 부분에서 에러가 발생하면 catch 소스로 접근
//프로그램을 죽이지 않고 처리하기 위한 방법
Console.WriteLine("예외가 발생함.");
Console.WriteLine(e.Message); //한글로 간략 오류 설명
//Console.WriteLine("=======================");
//Console.WriteLine(e); //예외 메세지 전체
}
finally
{
//예외가 발생 하든 안하든
//무조건 들어와서 실행되는 영역.
Console.WriteLine("try 마지막");
}
//0으로 나눌때 에러를 발생해보자
try
{
Console.WriteLine("10/0 = ?");
//int n1 = 10 / 0; //에러 - 0으로 나눌 수 없어서 빨간줄
int n1 = 10;
int n2 = 0;
//int n3 = n1 / n2;
//Console.WriteLine("{0} / {1} = {2}", n1, n2, n3);
TestDiv(n1, n2);
}
catch(DivideByZeroException e) //0으로 나눌때 잡는 Exception
{
Console.WriteLine("0으로 나누려고 함");
Console.WriteLine(e);
}
catch (Exception e)
{
Console.WriteLine("에러!!!!!!!");
Console.WriteLine(e);
}
//catch가 개발용...테스트 할 때 포함 하면 좋지만
//성능이 그리 좋은게 아니라
//배포시에는 뺄수 있으면 빼는 것이 좋다.
}
}
'공부 > C#' 카테고리의 다른 글
yield return, yield break (0) | 2016.05.24 |
---|---|
Console 키입력 - Console.ReadKey, ConsoleKeyInfo (0) | 2016.05.12 |
파일 로드 - FileStream, StreamReader, ReadAllText, ReadAllLines (0) | 2016.05.12 |
파일 저장 - FileStream, StreamWriter, WriteAllText, WriteAllLines (0) | 2016.05.12 |
컬렉션(Collection), 제네릭 컬렉션(Generic Collection) - 예) ArrayList, List<T> (0) | 2016.05.11 |
파일 로드 - FileStream, StreamReader, ReadAllText, ReadAllLines
//파일 로드 - FileStream, StreamReader, ReadAllText, ReadAllLines
//이전 글 - 파일 저장과 대입되는 4가지 방법 이다.
private string loadData; //로드한 데이터를 담을 변수
//디렉터리 경로 지정
private const string path = "./save/test1/"; //요즘 많이 사용하는 방법 /
private const string path2 = ".\\save\\test2"; //옛날부터 디렉터리 구분하는 방법 \\
private const string path3 = @".\save\test3"; //@뒤에 있는 string은 디렉터리를 표시하는 것이라고 지정 - 최신
private void PrintLoadData()
{
Console.WriteLine("읽은 데이터는 다음과 같습니다.");
Console.WriteLine("{0}\n", loadData);
}
//로드
//1. FileStream
public void LoadFromFileStream(string fileName = "S_FileString.txt")
{
string fullpath = path + "/" + fileName; //그냥 쉽게 하려고 쓴것이다. 성능은 StringBuilder이 좋다.
try
{
//파일 스트림 생성. cs파일 상단에 using System.IO; 추가
FileStream fs = new FileStream(
fullpath,
FileMode.Open,
FileAccess.Read);
//바이트 단위로 로드
byte[] bytes = new byte[fs.Length];
fs.Read(bytes, 0, bytes.Length);
loadData = Encoding.UTF8.GetString(bytes);
fs.Close();
}
//파일 못찾음
catch (FileNotFoundException) //변수 없어도 됨
{
Console.WriteLine("파일을 찾지 못했습니다.");
return;
}
//디렉터리 못찾음
catch(DirectoryNotFoundException)
{
Console.WriteLine("폴더가 없습니다.");
return;
}
catch (Exception e)
{
Console.WriteLine(e);
}
Console.WriteLine("로딩 완료 LoadFromFileStream");
PrintLoadData();
}
//2. StreamReader
public void LoadFromStreamReader(string fileName = "S_StreamWriter.txt")
{
string fullpath = path2 + "/" + fileName;
try
{
FileStream fs = new FileStream(
fullpath,
FileMode.Open,
FileAccess.Read);
StreamReader sr = new StreamReader(fs); //스트림 생성
string line;
StringBuilder builder = new StringBuilder();
while((line = sr.ReadLine()) != null) //한줄 읽는데 null이 아니면
{
builder.Append(line); //한줄 저장
builder.Append("\n"); //개행
}
loadData = builder.ToString();
sr.Close();
fs.Close();
}
//파일 못찾음
catch (FileNotFoundException) //변수 없어도 됨
{
Console.WriteLine("파일을 찾지 못했습니다.");
return;
}
//디렉터리 못찾음
catch (DirectoryNotFoundException)
{
Console.WriteLine("폴더가 없습니다.");
return;
}
catch (Exception e)
{
Console.WriteLine(e);
}
Console.WriteLine("로딩 완료 LoadFromStreamReader");
PrintLoadData();
}
//3. ReadAllText
public void LoadFromReadAllText(string fileName = "S_WriteAllText.txt")
{
string fullpath = path3 + "/" + fileName;
try
{
loadData = File.ReadAllText(fullpath); //걍 모두 저장. 한줄이라 참쉽다.
}
//파일 못찾음
catch (FileNotFoundException) //변수 없어도 됨
{
Console.WriteLine("파일을 찾지 못했습니다.");
return;
}
//디렉터리 못찾음
catch (DirectoryNotFoundException)
{
Console.WriteLine("폴더가 없습니다.");
return;
}
catch (Exception e)
{
Console.WriteLine(e);
}
Console.WriteLine("로딩 완료 LoadFromReadAllText");
PrintLoadData();
}
//4. ReadAllLines
public void LoadFromReadAllLines(string fileName = "S_WriteAllLines.txt")
{
string fullpath = path2 + "/" + fileName;
try
{
string[] lines = File.ReadAllLines(fullpath); //라인별로 string 배열에 저장
StringBuilder builder = new StringBuilder(lines.Length); //스트링 변수의 크기를 알고 있으면 선언해주는게 좋다
foreach(var line in lines)
{
builder.Append(line);
builder.Append("\n");
}
loadData = builder.ToString();
}
//파일 못찾음
catch (FileNotFoundException) //변수 없어도 됨
{
Console.WriteLine("파일을 찾지 못했습니다.");
return;
}
//디렉터리 못찾음
catch (DirectoryNotFoundException)
{
Console.WriteLine("폴더가 없습니다.");
return;
}
catch (Exception e)
{
Console.WriteLine(e);
}
Console.WriteLine("로딩 완료 LoadFromReadAllLines");
PrintLoadData();
}
'공부 > C#' 카테고리의 다른 글
Console 키입력 - Console.ReadKey, ConsoleKeyInfo (0) | 2016.05.12 |
---|---|
예외처리 - try, catch, finally, throw new Exception (0) | 2016.05.12 |
파일 저장 - FileStream, StreamWriter, WriteAllText, WriteAllLines (0) | 2016.05.12 |
컬렉션(Collection), 제네릭 컬렉션(Generic Collection) - 예) ArrayList, List<T> (0) | 2016.05.11 |
C#에서의 struct(구조체)와 class - 메모리 구조 차이, Boxing, Unboxing 예제소스 (0) | 2016.05.11 |
파일 저장 - FileStream, StreamWriter, WriteAllText, WriteAllLines
//파일 저장 - FileStream, StreamWriter, WriteAllText, WriteAllLines
//4가지 방법
//string 1줄
private string saveData = "1.테스트\n2.진행중\r\n3.입니다.";
//\n 개행 \r 캐리지리턴 - 시스템마다 개행을 나타내는 문자가 달라서 적음 \r
//string배열
private string[] saveData2 = { "1.테스트", "2.진행중", "3.입니다." };
//디렉터리(폴더) 경로 지정
private const string path = "./save/test1/"; //요즘 많이 사용하는 방법 /
private const string path2 = ".\\save\\test2"; //옛날부터 디렉터리 구분하는 방법 \\
private const string path3 = @".\save\test3"; //@뒤에 있는 string은 디렉터리를 표시하는 것이라고 지정 - 최신
//1.FileStream
public void SaveByFileStream(string fileName = "S_FileString.txt")
{
StringBuilder fullPath = new StringBuilder();
fullPath.Append(path);
fullPath.Append("/");
fullPath.Append(fileName);
//string fullPath = path + "/" + fileName;
try
{
//상단에 using System.IO; 추가
FileStream fs = new FileStream(
fullPath.ToString(),
FileMode.Create,
FileAccess.Write);
//Byte단위로 바꾸어 주어야 함.
byte[] bytes = Encoding.UTF8.GetBytes(saveData); //string문자가 UTF8인코딩으로 byte화
fs.Write(bytes, 0, bytes.Length); //byte 저장. 0부터 총 길이만큼
fs.Close();
}
catch(DirectoryNotFoundException e)
{
Console.WriteLine("디렉터리가 없습니다. 생성합니다.");
Directory.CreateDirectory(path);
SaveByFileStream(fileName);
return;
}
catch(Exception e)
{
Console.WriteLine(e);
return;
}
Console.WriteLine("세이브 완료(SaveByFileStream)");
}
//2.StreamWriter
public void SaveByFileStreamWriter(string fileName = "S_StreamWriter.txt")
{
StringBuilder fullPath = new StringBuilder();
fullPath.Append(path2);
fullPath.Append("/");
fullPath.Append(fileName);
try
{
//상단에 using System.IO; 추가
FileStream fs = new FileStream(
fullPath.ToString(),
FileMode.Create,
FileAccess.Write);
StreamWriter sw = new StreamWriter(fs); //스트림을 만들어서
sw.WriteLine(saveData); //일괄 저장
sw.Close();
fs.Close();
}
catch (DirectoryNotFoundException e)
{
Console.WriteLine("디렉터리가 없습니다. 생성합니다.");
Directory.CreateDirectory(path2); //디렉터리 생성
SaveByFileStreamWriter(fileName); //자기 자신 다시 부름
return; //함수 종료
}
catch (Exception e)
{
Console.WriteLine(e);
return;
}
Console.WriteLine("세이브 완료(SaveByFileStreamWriter)");
}
//3.WriteAllText
public void SaveByWriteAllText(string fileName = "S_WriteAllText.txt")
{
StringBuilder fullPath = new StringBuilder();
fullPath.Append(path3);
fullPath.Append("/");
fullPath.Append(fileName);
//string fullPath = path + "/" + fileName;
try
{
File.WriteAllText(fullPath.ToString(), saveData); //핵심 - string 통째로 저장
}
catch (DirectoryNotFoundException e)
{
Console.WriteLine("디렉터리가 없습니다. 생성합니다.");
Directory.CreateDirectory(path3); //디렉터리 생성
SaveByWriteAllText(fileName); //자기 자신 다시 부름
return; //함수 종료
}
catch (Exception e)
{
Console.WriteLine(e);
return;
}
Console.WriteLine("세이브 완료(SaveByWriteAllText)");
}
//4.WriteAllLines
public void SaveByWriteAllLines(string fileName = "S_WriteAllLines.txt")
{
StringBuilder fullPath = new StringBuilder();
fullPath.Append(path2);
fullPath.Append("/");
fullPath.Append(fileName);
//string fullPath = path + "/" + fileName;
try
{
File.WriteAllLines(fullPath.ToString(), saveData2); //핵심 - string 배열 저장
}
catch (DirectoryNotFoundException e)
{
Console.WriteLine("디렉터리가 없습니다. 생성합니다.");
Directory.CreateDirectory(path2); //디렉터리 생성
SaveByWriteAllLines(fileName); //자기 자신 다시 부름
return; //함수 종료
}
catch (Exception e)
{
Console.WriteLine(e);
return;
}
Console.WriteLine("세이브 완료(SaveByWriteAllLines)");
}
//짧은게 쓰기에는 편하지만 준비과정이 길고 쓰기 불편하게 성능은 더 좋지 않을 까 한다.
'공부 > C#' 카테고리의 다른 글
예외처리 - try, catch, finally, throw new Exception (0) | 2016.05.12 |
---|---|
파일 로드 - FileStream, StreamReader, ReadAllText, ReadAllLines (0) | 2016.05.12 |
컬렉션(Collection), 제네릭 컬렉션(Generic Collection) - 예) ArrayList, List<T> (0) | 2016.05.11 |
C#에서의 struct(구조체)와 class - 메모리 구조 차이, Boxing, Unboxing 예제소스 (0) | 2016.05.11 |
C#에서의 struct(구조체)와 class - 메모리 구조 차이, Boxing, Unboxing 개념 (0) | 2016.05.11 |
[잡담]유니티 첫 공부 소감
정~~~말 쉽게 3D프로그래밍을 할 수 있게
잘 만들어진 엔진 툴인거 같다.
DirectX로 게임 하나 만들 때에는
Vector3하나부터 갖가지 Matrix 변수들까지
신경 써줄게 많았는데
Unity는 오브젝트 생성이나 각각의
world의 location, scale, pos컨트롤
메테리얼 적용,
카메라 컨트롤,
충돌 함수, 조명,
심지어 셰이더로 어렵게 써야하는 그림자 까지
유니티는 그냥 된다.
말 그대로 기본적으로 되어있더라.....그냥이다...그냥...
정말 크나큰 감동이다.
아예 쌩초보자가 보기에는
위의 설명들도 어려울수 있겠고
Unity 자습서동영상을 봐도
뭔말인가 싶겠지만
DirectX에서 3D의 개념을 공부하고
익힌 사람이라면(게임 좀 쟈기가 만들어 봤다면)
Unity는 정말 쉬운 툴이다.
이렇게 첫 초행길에 감동을 받았는데
앞으로 중, 고급 스킬을 익힐 때는 어떨지 기대가 된다.
'공부 > Unity' 카테고리의 다른 글
GameObject 삭제, 활성, 비활성화 (0) | 2016.05.20 |
---|---|
[잡담]유니티를 일주일정도 공부 하면서 드는 생각 (0) | 2016.05.19 |
태그(tag)로 찾기, 비교하기 (0) | 2016.05.19 |
유니티 프로젝트 폴더 백업 방법 (1) | 2016.05.13 |
유니티 공부 시작 - 자습 방법 (0) | 2016.05.12 |
유니티 공부 시작 - 자습 방법
유니티는 책이 있으면 좋지만
책 없이도 유니티 홈페이지 제공하는 자습 공간이 있어
누구나 쉽게 접근 하고 배울 수 있다. - 인터넷만 되면 된다.
심지어 동영상으로 되어있고 한글 자막이 달린 것도 있다.
1. 위의 홈페이지 주소에 접근하자.
2. 홈페이지 상단의 교육 자료를 클릭
3. 자습서 메뉴를 클릭
4. 엔진 부분의 프로젝트에서 보고 싶은 것을 클릭
5. Introdution은 소개니까 굳이 안봐도 되고 아래부터 하나씩 보기
// 모두 한글 자막이 있으면 좋지만 후반 부로 갈 수록 자막이 없는 것도 나온다.
// 그럴 땐 동영상을 보면서 단어의 키포인트를 잡아 따라해보자.
'공부 > Unity' 카테고리의 다른 글
GameObject 삭제, 활성, 비활성화 (0) | 2016.05.20 |
---|---|
[잡담]유니티를 일주일정도 공부 하면서 드는 생각 (0) | 2016.05.19 |
태그(tag)로 찾기, 비교하기 (0) | 2016.05.19 |
유니티 프로젝트 폴더 백업 방법 (1) | 2016.05.13 |
[잡담]유니티 첫 공부 소감 (0) | 2016.05.12 |
컬렉션(Collection), 제네릭 컬렉션(Generic Collection) - 예) ArrayList, List<T>
//컬렉션(Collection), 제네릭 컬렉션(Generic Collection)
//가장 큰 차이점
//컬렉션은 아무거나 잡다하게 다 집어 넣어 사용 할 수 있고
//제네릭 컬렉션은 제네릭 타입<T>을 집어넣어 해당 타입만 컨트롤 하는 것이다.
//안정성이나 속도 면에서 제네릭 컬렉션이 좋다.
//컬렉션 - 템플릿 없음
//상단에 using System.Collections; 추가
ArrayList array = new ArrayList(); //std::vector 비슷한 녀석
array.Add(10);
array.Add(20);
array.Add(15.5f);
array.Add("가나다");
array.Add(c1);
array.Add(s1); //struct는 박싱이 일어난다.
//자료형이나 class, struct 구분없이 전부 다 들어갈 수 있다.
for (int i = 0; i < array.Count; ++i )
{
Console.WriteLine(array[i]);
}
Console.WriteLine();
//그외
//HashTable //std::map 과 비슷
//Queue
//Stack
//===================================================//
//제네릭 컬렉션 - <T> 템플릿 형식
//std::vector<T> 같은 녀석
List<int> numList = new List<int>(); //타입이 지정되어야 한다.
numList.Add(19);
numList.Add(30);
numList.Add(54);
//numList.Add(1.15); //타입이 안맞아 에러
foreach(int node in numList)
{
Console.Write(node + " ");
}
Console.WriteLine();
//std::list<> 같은 녀석
LinkedList<int> linked = new LinkedList<int>();
linked.AddLast(50);
linked.AddLast(60);
linked.AddLast(70);
linked.AddFirst(40);
foreach (int node in linked)
{
Console.Write(node + " "); // 40 50 60 70
}
Console.WriteLine();
//그외
//Dictionary<key, value> //std::map
//Queue<T>
//Stack<T>
'공부 > C#' 카테고리의 다른 글
파일 로드 - FileStream, StreamReader, ReadAllText, ReadAllLines (0) | 2016.05.12 |
---|---|
파일 저장 - FileStream, StreamWriter, WriteAllText, WriteAllLines (0) | 2016.05.12 |
C#에서의 struct(구조체)와 class - 메모리 구조 차이, Boxing, Unboxing 예제소스 (0) | 2016.05.11 |
C#에서의 struct(구조체)와 class - 메모리 구조 차이, Boxing, Unboxing 개념 (0) | 2016.05.11 |
정렬 Array.Sort, Array.Reverse (0) | 2016.05.10 |