GUITexture 의 location 부분에도 x,y,z 좌표가 존재 한다
x,y 좌표는 화면 해상도 상에서 2차원 개념적으로 x,y좌표 역할을 한다
하지만 한 가지 특이한 점은 z축으로 depth 역할을 을 한다.

예를 들면..



위와 같은 각각의 카드 GUITexture 객체가 있다고 가정한다면...
z좌표가 높은 순서가 GUI 상에서 상위에 그려지게된다.

A 카드 x = 0, y = 0, z = 0
8 카드 x = 50 , y = 0 , z =1

A카드가 8카드 z 좌표의 값이 낮다 그래서 A라는 카드는 밑에 있고 8 이란 카드는 위에 있는 것이다.

'개발지식창고 > Unity3D' 카테고리의 다른 글

GUI 콤보박스 생성  (0) 2012.03.12
GUITexture의 객체 충돌체크방법  (0) 2012.03.10
Unity3D 개요  (0) 2012.02.26
Unity3DStudent 를 이용한 공부 2/2  (0) 2012.02.26
Unity3DStudent 를 이용한 공부 1/2  (0) 2012.02.26
Posted by 모과이IT
,

현재 프로젝트 진행중인 게임에서 GUITexture로 객체를 만든것에 대한 충돌체크를 고민 하였다

3D로 모델링 된것은 해당 객체에 Collider를 추가 시키고 RayCastHit이란 함수를 이용해서
쉽게 충돌 체크가 가능하였다.

하지만  GUITexture로 만들어진 객체는 근본 뿌리가 2D이기때문에 계속 3D 모델링 된것을 Collider를 추가 시켜서
충돌 테스트를 하는 삽질을 감행한 끝에....


위와 같은것을 Unity script API Reference에서 확인했다.
위의 코드는 해당 x,y,z 좌표의 값의 GUITexture가 있을경우 값을 bool 값으로 리턴을 해준다

인자 값으로 Input.mousePosition를 해주게 되면 현재 마우스포인터 값을 인자로 집어 넣을수있다

'개발지식창고 > Unity3D' 카테고리의 다른 글

GUI 콤보박스 생성  (0) 2012.03.12
GUITexture의 좌표  (0) 2012.03.10
Unity3D 개요  (0) 2012.02.26
Unity3DStudent 를 이용한 공부 2/2  (0) 2012.02.26
Unity3DStudent 를 이용한 공부 1/2  (0) 2012.02.26
Posted by 모과이IT
,

출처 : http://soyoja.com/413

예전에도 이런 글을 쓴 적이 있었는데, 이번에 MSDN 에서 잘 정리된 글을 본 김에 두 언어간의 차이를 좀 더 정리해 볼까 한다.


1. C++ 에서 클래스(class) 와 구조체(struct) 는 거의 동일하다. ( C++ 에서 struct 는 모든 멤버가 public 인 class 라고 생각하면 된다 ).
반면에 C# 은 class 와 struct 의 용도가 다르다. C# 의 struct 는 상속을 지원하지 않으며 명시적 기본생성자를 지원하지 않는다. 

2.  C++ 과 달리 C# 의 배열은 C++ 의 vector 와 유사한, 자체적인 메소드를 제공하는 자료구조 개체이다. 예를 들면 C# 의 배열 자료구조는 자체적으로 Min, Max, Length 등의 라이브러리 함수를 제공한다. 또한, C++ 과 C# 은 배열을 선언하는 방법이 매우 다르다. 

- C++ 의 배열 선언 
char split[3] = { ' ', '\t', '\"' };

- C# 의 배열 선언
char[] split = { ' ', '\t', '\"' };  // 방법1
char[] split = new char[3], char[0] = ' ', char[1] = '\t', char[2] = '\"'; // 방법2
char[] split = new char[3]{' ', '\t', '\"' };  // 방법3

 
3. C++ 의 bool 타입은 int 와 동일하다. 반면에 C# 은 bool 은 true / false 를 갖는 고유한 데이터타입이며 아래와 같은 묵시적 타입캐스팅이 불가능하다.

int start = 0;  
if( start ) data.Add(s);  // 암시적으로 int 형을 bool 형으로 변환할 수 없다.

4. C++ 의 long 은 int 와 마찬가지로 32 비트 자료형이다. C++ 에서 64 비트 자료형을 쓰기 위해서는 long long 을 쓴다. 반면에 C# 의 long 은 64 비트 자료형이다.

5. C++ 과 C# 모두 값에 의한 전달과 참조에 의한 전달을 지원한다. C 와 C# 모두 명시적으로 참조에 의한 전달을 표시하지 않은 경우 기본적으로는 값에 의한 전달방식으로 처리된다. C++ 과 C# 에서의 참조에 의한 전달 방식은 각각 아래와 같다.
 
- C++ 의 방식 


#include <iostream>
using namespace std;
void Method(int &i)
{
    i = 44;
}
int main()
{
    int val = 0;
    Method(val);
 cout << val << endl;  // val = 44
    return 0;
}

 
- C# 의 방식 
class RefExample
{
    static void Method(ref int i)
    {
        i = 44;
    }
    static void Main()
    {
        int val = 0;
        Method(ref val);
        // val is now 44
    }
}

6. C# 은 기본적으로는 포인터 사용이 금지되어 있다. C# 에서 포인터를 쓰기 위해서는 컴파일러 옵션으로 _unsafe 를 쓴다. 포인터 사용을 가급적 금지한 이유는 C/C++ 에게 있어서 강력한 기능인 포인터가 그만큼 잘못사용할 경우 심각한 오류를 일으키는 존재였기 때문이다. 조엘 스폴스키는 최근에 널리 사용되는 프로그래밍 언어(대표적으로 자바를 많이 까더군) 들이 보여주는 포인터 사용에 제한적인 트렌드에 대해서 개탄하면서, 수준낮은 프로그래머들은 절대 포인터에 대해서 이해하지 못한다고 독설을 남기기도 했다. 어쨌든 보다 배우고 쓰기 쉽고, 안정성 추구하는 C# 의 언어 설계철학을 엿볼 수 있다.

7. switch 문
- C++ 과 달리 C# 의 switch 문은 break 가 없는 경우 자동적으로 다음 case 로 넘어가지 않는다. C++의 switch 문에서 break 를 빼 먹어서 생기는 실수를 방지하기 위한 규칙으로 보인다. 단, C# 의 switch ~ case 에서 case 문에 코드가 없는 경우에는 다음 case 로 넘어갈 수 있다.

8. C++ 의 typedef 대신에 C# 에서는 using 을 사용한다.

9. C# 의 지역 변수는 C++ 과 달리 항상 초기화를 해야만 사용할 수 있다. C++ 의 경우 실행시 에러가 나더라도 초기화 하지 않은 지역변수를 일단 쓸 수는 있다. (일부 C++ 코드에서는 일부러 초기화 하지 않은 변수를 사용하는 바람직하지 않은 테크닉이 사용되기도 한다) 그러나 C# 은 초기화하지 않은 지역변수를 사용할 경우 컴파일 에러가 발생한다. 

10. 자료구조에 있어서 모든 타입을 자유롭게 쓸수 있게 하여 재사용성과 효율성을 높이는 기법 -  C++ 의 템플릿(Template) 과 유사한 개념이 C# 에서는 제네릭(Generic) 이라 한다. 단, C# 의 제네릭의 타입정보는 런타임에 적용된다.

11. C# 도 C++ 과 마찬가지로 goto 를 지원한다. 단, C# 은 goto 에 지정된 label 에서 반드시 코드가 있어야 한다.
참고로 Java 에는 goto 가 없다. goto 는 강력한 기능이지만 코드의 가독성과 논리적인 flow 를 흐리게 한다는 점에서 많은 논란이 되어 왔다.

12. C++ 에서 사용하는 #define 을 통한 매크로 정의를 C# 은 할 수 없다. C# 의 define 은 컴파일 옵션에 따른 전처리기 사용에 국한된다.

13. unsigned 데이터 타입  : C/C++ 에 존재하는 unsigned 데이터 타입이 C# 과 자바에서는 없다. 
unsigned 타입을 없앤 이유는 signed 와 unsigned 를 혼용할 경우에 발생될 가능성이 있는 오류 때문으로 추정되는데, 여기에 대해서는 아래 포스팅에 잘 설명되어 있다. 

잘 모르겟거든 unsigned 는 쓰지 말지어다

unsigned 자료형의 이점은 양수 데이터를 표현하기 위한 최대치가 2 배로 늘어난다는 점이다. 최근의 컴퓨팅 환경은 메모리에 대한 제약이 예전에 비해 많이 사라져서 메모리에서 손해를 보더라도 오류를 낼 가능성이 있는 unsigned 타입을 삭제하는 언어 설계철학을 도입한 것으로 보인다.

14. C# 은 C++ 과 달리 전역변수와 전역함수를 쓸 수 없다. 따라서 C++ 프로젝트를 할 때 전역변수를 모아놓고 한곳에 관리해서 쓰는 constant.h 헤더를 사용하는 기법등을 C# 에서는 쓸 수 없다. C# 에서 이와 같이 하려면 해당 변수들을 멤버로 가진 클래스를 사용한다. 예를 들면 Constant.cs 를 만들고 여기에 Constant 클래스를 만드는 식으로..

15. C++ 과 달리 C# 은 비트필드를 지원하지 않는다.

16. C# 은 C++ 에는 없는 foreach 문이란 반복문이 존재한다. foreach 문의 용도는 C++ 에서의 for 와 거의 유사하다. 

17. 가비지 컬렉션
최근에 등장하는 언어들의 주요 특징 중 하나가 가비지 컬렉션을 지원한다는 점이다.
C# 에는 delete 가 없다. 단, C# 도 프로그래머가 명시적으로 new 로 할당된 데이터를 삭제할 수 있다.



새로운 언어를 공부하면서 기존에 널리 사용되던 언어와의 차이점을 비교해보고, 왜 이런 차이점이 생기게 되었는지를 생각해 보면 프로그래밍 언어의 설계철학과 발전 과정을 음미해 볼 수 있는 좋은 공부가 된다.

참고 : C++ 개발자를 위한 C#  http://msdn.microsoft.com/ko-kr/library/yyaad03b(VS.90).aspx


===============================================================================================================
C++과 문법적으로 다른점
 여기서는 C++과 C#의 차이점을 간단히 설명할 것이다. 여기서 다른점 모든 것을 설명하는 것은 아니고 기본 문법 요약 정도로 생각하면 될듯하다. 여기서 설명하는 내용은 C++과 다른점이지 C++ .NET과 다른점이라고 생각하면 안된다.
1. Header 파일이 존재하지 않는다.
C++에서 Class 선언을 Header(.h)에 하고 #include를 사용하여 그 Header 파일을 포함 시킴에 의해 .cpp파일의 Class를 사용하도록 한다. 그러나 C#은 .cs 파일만으로 구성된다. 실제 C++에서 Header파일은 형선언을 하여 그 Class를 사용한다고 컴파일러에게 알려주는 역할을 수행한다. 이 부분을 하기 위해서 Header 파일을 만드는 일도 약간이나마 번거러운 일이다. C#은 같은 프로젝트에 .cs로 존재하거나 다른 어셈블리(.exe, .dll)일 경우 참조(향후 설명)만 하면 자동으로 인식하여 컴파일을 하게된다.
 
2. Namespace라는 개념이 추가 되었다.
Namespace는 Class를 감싸는 대표이름이라고 생각하면 된다. 여러개의 Class를 제작하여 하나의 대표이름을 붙여 놓은 것이 namespace다. 이것은 같은 이름의 Class를 여러개 만들수 있도록 하는데, 같은 이름의 Class가 다른 namespace에 존재하면 구분이 가능하게 된다.
여기서 설명의 편의상 Class라고 했으나 Class는 Type의 대표적 종류이다.
 
Type
- Struct
- Enum
- Class
- Interface
- Delegate
Delegate만 제외하면 모두 C++에도 있는 개념이다. Delegate는 Event와 쌍으로 사용하는데 C# 문법에서 가장 중요한 개념이다. 자세한 설명은 두 번째 강의에서 설명하도록 하겠다.
참고로 Struct와 Class는 C#에서 거의 같은 기능을 수행한다. Struct도 Method(함수), Property(변수)등 모든 Member를 가질 수 있다. 다만 Class는 상속이 가능하고 Struct는 불가능하다는 것만 다르다. 이 두가지의 차이는 만들때의 목적을 생각하면 기억하기 좋다. Struct는 빠른 데이터 처리를 위해 만들어 졌고, Class는 다양한 가지 기능을 가질수 있도록 만들어 졌다. 상속은 속도는 저하되나 다양한 기능을 지원할 수 있도록 한다.
Member
- Field
- Method
- Property
- Event
여기서도 Event만 제외하면 모두 C++에 있는 개념이다.
 
3. using
위에서 설명한 바대로 namespace라는 개념이 추가되어 같은 이름의 Type을 여러개 작성할 수 있도록 되었다. 그러나 이개념에 의해 Method하나 호출하기 위해 Namespace.Type.Method의 형태로 호출해야만한다.
즉 MessageBox하나 호출하기 위해 System.Windows.Forms.MessageBox.Show("Hellow World")라고 호출해야만 하는 번거로움이 있다. 여기서 System.Windows.Forms가 Namespace다(Type 및 Member는 사이에 .을 넣지 않으므로 구분이 쉽게 될것이다). 이 Namespace를 생략하고 쓸수 있는 방법이 있는데 이것이 바로 using이다.
즉 using System.Windows.Forms를 선언하여 컴파일러에게 namespace 사용을 알려 준 후 MessageBox.Show("Hellow World")라고 호출하면 같은 기능을 수행하게 된다.
 
4. delete가 존재하지 않는다.
   C#은 new로 메모리를 할당하는 것은 C++과 같으나 메모리를 삭제하는 delete가 존재하지 않는다. 메모리 삭제는 가비지컬렉터가 사용하지 않는 시점에 알아서 삭제를 해 준다.
 
5. 포인터가 없어졌다.
   C, C++에서 초보자를 괴롭히는 것이 포인터이다. 포인터 교육시 잘사용하는 예제는 다음과 같다.
void Swap(int *data1, int *data2)
{
     int dataBuff;
     dataBuff = *data1;
     *data1 = *data2;
     *data2 = dataBuff;
}
int nValue1 = 100, nValue2 = 200;
Swap(&nValue1, &nValue2);
 
   뭐 다들 알겠지만 Swap에 nValue1과 nValue2의 주소를 넘겨 주어 주소의 내용을 서로 바꾸므로 실제 내용이 nValue1은 200으로 nValue2는 100으로 바뀌어 들어가게 된다.
   C++에서는 다음과 같이 레퍼런스 개념이 생겼다.
void Swap(int &data1, int &data2)
{
     int dataBuff;
     dataBuff = data1;
     data1 = data2;
     data2 = dataBuff;
}
int nValue1 = 100, nValue2 = 200;
Swap(nValue1, nValue2);
 
   레퍼런스를 사용함으로 해서 포인터를 사용한것과 같이 Swap 기능을 구현한 것이다. 좀 보기가 편해진 감이 있다.
   C#에서는 레퍼런스만 사용할 수 있는데 사용 또한 다음과 같이 바뀌었다.
void Swap(ref int data1, ref int data2)
{
     int dataBuff;
     dataBuff = data1;
     data1 = data2;
     data2 = dataBuff;
}
int nValue1 = 100, nValue2 = 200;
Swap(ref nValue1, ref nValue2);
 
   ref 대신 in(입력 전용), out(출력 전용)을 사용할 수 있다.
 
6. 기본적으로 sizeof를 사용할 수 없다.
  C나 C++에서 sizeof는 많이 사용하는 기능이다. 그러나 C#에서는 sizeof가 내부적으로 메모리를 직접 다루는 명령어 이므로 권장하지 않는다. sizeof는 구조체 복사와 파일에서부터 읽을 때 그 구조체의 크기를 구할 때 가장 많이 사용한다. 예를 들어 다음과 같은 경우이다.
typedef struct Size
{
     int cx;
     int cy;
}
Size size1(10, 20), size2;
memcpy(&size2, &size1, sizeof(Size));
 
 이것은 C#에서 단순히 =을 사용하면 복사가 이루어 진다.
struct Size
{
     public int cx;
     public int cy;
}
Size size1(10, 20), size2;
size2 = size1;
 
  또한 파일로부터 읽고 쓸때는 구조체 Member Method로 Save와 Load를 만들어 개별 Member 변수를 읽을 수 있도록 구성하면 된다.
  참고로 꼭 sizeof를 사용해야 하는 경우라면 sizeof를 사용하는 코드를 unsafe{}로 감싸 주고, 프로젝트 속성에서 안전하지 않은 코드 블록 허용을 True로 설정해야 한다. 그러나 호환성도 떨어지고 안전하지 않으므로 가능하면 사용하지 말기 바란다.
 
7. 데이터 형
   데이터 형은 C#과 C++은 거의 같다. 다른 부분이라면 char, long, decimal이다. char는 하나의 문자를 저장하는 기능을 수행하며 C++과 다르게 2byte를 차지 한다. C++에서는 ASCII 코드를 사용하였으나 C#에서는 유니코드(전세계언어를 2byte코드로 나타낸것)를 사용한다. 참고로 1byte를 차지하는 데이터 형은 byte와 sbyte가 있다. long은 C++에서는 4byte를 차지 했으나 C#에서는 8byte를 차지한다. decimal은 8byte 상수로 추가되었다.
 
8. 배열 선언
   C++에서는 배열을 다음과 같이 설정했을 것이다.
   int arr[30];
   C#에서는 다음과 같이 선언한다.
   int[] arr = new int[30];
 
9. if 조건문
  int a = 1, b = 8;
   if(a && b >= 5)
 
  위 문장은 C++에서 당연히 참이다. 그러나 C#에서는 컴파일 에러가 나타난다. 위 문장은 if(a!=0 && b >= 5)로 수정해야만 한다. 조건문 내부에는 boolen으로 구성되어야 한다. 이것은 C++에서도 마찬가지였다. 그러나 C#에서는 형변환 규칙이 엄격해졌다. 따라서 위 문장에서 a는 boolen변수가 아니므로 에러가 나타나는 것이다. 이것은 다음과 같은 오류를 줄여 준다.
if(a == 1)이라고 해야 하는 자리에 if(a = 1)라고 하면 위와 같은 이유로 C#에서는 컴파일 에러를 내어 준다. 이 실수는 한번쯤은 해봤으리라 예상이 된다.
그러나 C#에서도 a가 boolen으로 선언되었다면 if(a = 1)은 에러가 나타나지 않을 것이다.
 
10. switch 문
switch(a)
{
   case 3:
       b = 7;
   case 4:
       c = 3;
       break;
}
 

  위문장은 C++에서는 이상이 없으나 C#에서는 컴파일 에러가 나타난다. break없이 다음 case로 넘어가는 것을 허용하지 않는다. 예외로 아래와 같이 첫 번째 case 문에 아무것도 하지 않고 다음 case로 넘어 가는 것은 허용한다.
switch(a)
{
   case 3:
   case 4:
       c = 3;
       break;
}
 
 
11. 반복문
int[] arr = new int[30];
for(int i = 0; i < arr.Length; i++)
{
   Console.Write("{0}", arr[i]);
}
 
  위 문장을 실행하면 0 이 30번 출력된다(new를 사용하면 데이터가 0으로 초기화 되는 것을 보장한다). C#에서는 다음과 같이 해도 같은 기능을 수행한다.
int[] arr = new int[30];
foreach(int value in arr)
{
   Console.Write("{0}", value);
}
 
  참고로 Write의 {0}는 첫 번째 인자라는 뜻이다.
 
12. static 메서드
   C++에서는 외부변수와 외부함수 선언(C기능)이 가능했다. 그러나 C#은 완벽한 OOP개념의 언어이므로 이 두가지를 전혀 지원하지 않고 Type 내에 선언해야 한다. Type내에 메서드를 선언하면 호출시 다음과 같이 해야만한다.
class Calc
{
     public double Add(double value1, double value2)
     {
         return value1 + value2;
     }
}
 
   Calc calc = new Calc;
   double result = calc.Add(1, 2);
   그러나 Add 메서드를 호출하기 위하여 무조건 위와 같이 해야 하는 것은 약간 번거롭다. 따라서 Type내의 메서드를 static으로 선언하는 것을 지원한다.
class Calc
{
     public static double Add(double value1, double value2)
     {
         return value1 + value2;
     }
}
 
   double result = Calc.Add(1, 2);
   즉 static 메서드는 Class이름.메서드의 형태로 바로 호출할 수 있게 해준다. 참고로 9번 반복문에서 Console.Write는 Write를 static 메서드로 선언 했기 때문에 호출가능한 구조이다.
 
13. C++ 은 다중 상속이 가능하나 C#은 단일 상속만 가능하다.
  Class Calc1, Calc2, Calc3가 있다고 가정하고 Calc3가 Calc1의 기능과 Calc2의 기능을 모두 사용해야 한다면, C++에서는 class Calc3 : public Calc1, public Calc2 라고 선언하여 가능했다. 그러나 C#에서는 이것을 허용하지 않는다. 굳이 사용하고자 한다면 Calc2를 Calc1으로부터 상속받도록 하고 Calc3는 Calc2로 상속받아 계층적 구조를 이루어야만 한다.
  이것은 어떤면에서 C#의 단점이라고 할 수 있다. 그러나 다중상속은 잘못 사용하면 프로그래머에게 엄청난 오류를 범하게 한다고 한다. 그 오류의 가능성을 사전에 차단했다라고 보면 될듯하다.
 
  기본 문법 설명은 여기까지 하겠다. 나머지는 프로그래밍을 하면서 차츰익히기 바란다.
  여기서 이해가 안된다고 너무 괴로워하지 말기 바란다. 프로그래밍은 모든 문법을 다 외워서 하는 것이 아니다. 사용하면서 저절로 익히는 것이다.


 

'개발지식창고 > C#' 카테고리의 다른 글

C++로 만든 DLL 을 C#에서 사용하기  (0) 2013.01.03
Serialize an ArrayList object to a binary file  (0) 2012.12.24
C# 관련 추천사이트  (0) 2012.12.04
Form 이벤트  (0) 2012.11.30
C++과 C#의 차이  (0) 2012.02.27
Posted by 모과이IT
,

Visual C# 언어 개념
C++ 개발자를 위한 C#

다음 표에는 /clr를 사용하지 않는 네이티브 C++와 C# 사이의 중요한 차이점에 대한 비교 설명이 나와 있습니다. C++ 프로그래머의 경우 이 표를 통해 두 언어 사이의 중요한 차이점을 알 수 있습니다.

참고

C++ 프로젝트와 C# 프로젝트는 서로 다른 프로젝트 모델에서 파생됩니다. C++ 프로젝트와 C# 프로젝트 간의 차이점에 대한 자세한 내용은 프로젝트의 항목 관리솔루션 탐색기 사용을 참조하십시오.

기능 참조할 항목

상속: C++의 경우 클래스와 구조체는 사실상 동일한 반면, C#의 경우 이 둘은 전혀 다릅니다. C# 클래스에서는 인터페이스를여러 개 구현할 수 있지만 단일 기본 클래스에서만 상속할 수 있습니다. 또한 C# 구조체는 상속을 지원하지 않으며 명시적 기본생성자를 지원하지 않습니다. 생성자 하나가 기본적으로 제공됩니다.

class

interface

struct(C# 참조)

배열: C++의 경우 배열은 단순한 포인터입니다. C#의 경우 배열은 메서드와 속성을 포함하는 개체입니다. 예를 들어, Length속성을 통해 배열의 크기를 쿼리할 수 있습니다. C# 배열에는 배열에 액세스하는 데 사용되는 각 인덱스를 확인하는 "인덱서"도사용할 수 있습니다. C# 배열을 선언하는 구문은 C++ 배열을 선언하는 구문과 다릅니다. C#에서 "[]" 토큰은 변수가 아닌배열 형식 뒤에 사용됩니다.

배열(C# 프로그래밍 가이드)

인덱서(C# 프로그래밍 가이드)

부울: C++의 경우 bool 형식은 근본적으로 정수입니다. C#에서는 bool 형식과 다른 형식 간의 변환이 없습니다.

bool

long 형식: C++에서는 long 형식이 32비트인 반면 C#에서는 64비트입니다.

long

매개 변수 전달: C++의 경우 포인터나 참조를 사용하여 명시적으로 전달되지 않는 모든 변수는 값으로 전달됩니다. C#의 경우 ref 또는 out 매개 변수 한정자를 사용하여 참조로 명시적으로 전달되지 않는 클래스와 구조체는 각각 참조와 값으로 전달됩니다.

struct

class

ref(C# 참조)

out(C# 참조)

switch 문: C++ switch 문과 달리 C#에서는 case 레이블에 대해 순차 조건 검사를 지원하지 않습니다.

switch

대리자: C# 대리자는 C++의 함수 포인터와 비슷하지만 형식 안전성과 보안성을 제공한다는 점이 다릅니다.

대리자

기본 클래스 메서드: C#은 파생 클래스에서 재정의된 기본 클래스 멤버를 호출하기 위한 base 키워드를 지원합니다. 또한 C#에서는 override 키워드를 사용하여 가상 또는 추상 메서드를 명시적으로 재정의할 수 있습니다.

base

override 예제 참조

메서드 숨기기: C++는 상속을 통한 메서드의 암시적 "숨김"을 지원합니다. C#의 경우 상속된 멤버는 new 한정자를 사용하여 명시적으로 숨겨야 합니다.

new

조건부 컴파일에 전처리기 지시문을 사용합니다. C#에서는 헤더 파일을 사용하지 않습니다.

C# 전처리기 지시문

예외 처리: C#에서는 예외가 throw되었는지 여부와 상관없이 실행해야 할 코드를 제공하기 위한 finally 키워드를 제공합니다.

try-finally

try-catch-finally

C# 연산자: C#은 istypeof 같은 연산자를 추가로 지원합니다. 또한 일부 논리 연산자의 다양한 기능이 도입되었습니다.

& 연산자

| 연산자

^ 연산자

is

typeof

extern 키워드: C++의 경우 extern은 형식을 가져오는 데 사용됩니다. C#의 경우 extern은 동일한 어셈블리의 다른 버전을 사용하기 위해 별칭을 만드는 데 사용됩니다.

extern

static 키워드: C++의 경우 static은 모듈별 형식을 선언하거나 클래스 수준 엔터티를 선언하는 데 모두 사용할 수 있습니다. C#의 경우 static은 클래스 수준 엔터티를 선언하는 데만 사용할 수 있습니다.

static

C#의 Main 메서드는 C++의 main 함수와 다르게 선언됩니다. C#의 경우 이 메서드는 대문자로 시작하고 항상 static입니다. 또한 C#에서는 명령줄 인수에 대한 처리 지원 기능이 훨씬 더 강력해졌습니다.

Main()과 명령줄 인수(C# 프로그래밍 가이드)

C#에서 포인터를 사용할 수 있지만 이는 unsafe 모드에서만 가능합니다.

unsafe

C#에서는 연산자 오버로드가 다르게 수행됩니다.

C# 연산자

문자열: C++의 경우 문자열은 문자의 배열에 불과합니다. C#의 경우 문자열은 강력한 검색 방법을 지원하는 개체입니다.

string

String

foreach 키워드를 사용하여 배열 및 컬렉션을 반복 처리할 수 있습니다.

foreach, in

전역: C#의 경우 전역 메서드와 변수는 지원되지 않습니다. 메서드와 변수는 class 또는 struct 안에 포함되어야 합니다.

C# 프로그램의 일반적인 구조

형식 가져오기: C++의 경우 여러 모듈에 공통적인 형식은 헤더 파일에 배치됩니다. C#의 경우 이 정보는 메타데이터를 통해 얻을 수 있습니다.

using

메타데이터 개요

C#의 지역 변수는 초기화하지 않으면 사용할 수 없습니다.

메서드(C# 프로그래밍 가이드)

메모리 관리: C++는 가비지 수집 언어가 아니므로, 명시적으로 해제하지 않은 메모리는 프로세스를 종료할 때까지 할당된 상태를 유지합니다. C#은 가비지 수집 언어입니다.

가비지 수집

소멸자: C#에서는 관리되지 않는 리소스를 명확하게 해제하기 위해 다른 구문을 사용합니다.

소멸자

using 문(C# 참조)

생성자: C++와 마찬가지로 C#에서는 클래스 생성자를 제공하지 않으면 기본 생성자가 자동으로 생성됩니다. 기본 생성자는 모든 필드를 기본값으로 초기화합니다.

인스턴스 생성자

기본값 표

C#은 비트 필드를 지원하지 않습니다.

C++ 비트 필드

C# 입출력 서비스 및 형식 지정은 .NET Framework의 런타임 라이브러리에 따라 수행됩니다.

C# 언어 자습서

숫자 결과 형식 지정 표

C#에서는 메서드 매개 변수가 기본값을 가질 수 없습니다. 동일한 효과를 얻고 싶다면 메서드 오버로드를 사용합니다.

컴파일러 오류 CS0241

C#의 경우 C++ 템플릿과 비슷한 방식으로 형식 매개 변수화를 위한 제네릭 형식 및 메서드를 제공하지만 여기에는 중요한 차이점이 있습니다.

C#의 제네릭

as 키워드는 표준 캐스트와 비슷하지만, 변환에 실패한 경우 예외를 throw하는 대신 null 값을 반환한다는 점에서 차이가 있습니다. 이는 C++에서 static_cast를 사용하는 것과 비슷합니다. 이 경우 dynamic_cast와 달리 런타임 검사를 수행하지 않으므로 작업에 실패해도 예외가 throw되지 않습니다.

as(C# 참조)

C# 및 기타 프로그래밍 언어의 키워드에 대한 자세한 비교는 언어 관련 정보를 참조하십시오. C# 응용 프로그램의 일반적인 구조에 대한 자세한 내용은 C# 프로그램의 일반적인 구조(C# 프로그래밍 가이드)를 참조하십시오.



출처 : http://msdn2.microsoft.com/ko-kr/library/yyaad03b(VS.80).aspx

 
=================================================================================================================================
출처 : http://soyoja.com/342

앞으로 공적으로는 C++ 을 쓰고, 사적으로는 C# 으로 쓰기로 마음먹었다.
C# 자체도 좋은 언어이지만, WCF, WPF, Silverlight, ASP.Net 사용도 고려해 볼때 꼭 익혀놓아야 하는 언어임은 틀림없다.
C# 을 쓰면서 느끼는 C++ 과의 차이점들을 정리해 놓고자 한다.
1. Windows Application 개발 환경의 차이.
C# 의 개발 환경은 전통적인 Visual C++ 보다는 Visual Basic 에 가깝다. 폼을 디자인하고, 이 폼을 동작하는 코드를 별도로 코딩하는 환경은 보다 RAD 를 지향하고 개발생산성을 중시한 C# 의 철학을 잘 보여준다.
또한 윈도우즈 어플 개발시 Visual C++ 에서 나눠져 있던 SDI, MDI, Dialog Based 구분이 없어지고 C# 에서는 Windows Forms 이라는 하나의 형태로만 존재한다. ( 도구상자에 MDI Parent 라는 컨트롤이 존재하는 것은 확인했다. )
2. 보다 강력해진 Intellisense 
Visual C# 의 Intellisense 는 정말 강력하다.
예약어로 정의된 키워드들과, 라이브러리에 이미 정의된 멤버들이 팝업으로 표시되는 것은 물론이고, 심지어 개발자가 정의한 변수/함수 들도 인텔리센스에서 나타난다. 이걸 처음에 보고 얼마나 감동받았는지 ㅜ.ㅜ
덕분에 코딩 시간이 많이 단축된다.
여담이지만, TopCoder 를 할 때 C++ 개발자들은 조금이라도 코딩을 빨리 하기 위해서 자주 사용하는 긴 문장들은 매크로를 즐겨 쓴다.
예 )
#define FOR(i,a,b) for(int i = (a); i < (b); ++i)
#define REP(i,n) FOR(i,0,n)
그런데 C# 에서는 굳이 저릴 필요가 없다. 인텔리센스가 잘 받쳐주고 있으니까...
사실, 인텔리센스는 언어의 기능이 아니라 툴의 기능이므로, 이런 강력한 인텔리 센스는 Visual C++ 에도 충분히 도입할 수 있다고 보여지는데... C# 과 C++ 에 차이를 둔 것은 결국 정책적으로 MS 가 C# 을 밀고 있다는 이야기만 확인시켜주는 셈이다...
그리고 여담. 나는 ret 이란 변수를 즐겨 쓰는데 이걸 쓰다보면 인텔리센스가 return 으로 자꾸 인식해서 좀 불편하다.

3. C# 은 더욱 더 강력하게 객체지향적이다.
자료구조등을 새로 선언할때 class 형으로 만들어서 써야 한다. 자바랑 비슷하다.
자료구조나 컨트롤들 하나 하나가 모두 철저하게 객체로 관리하고, 객체지향적으로 코딩해야 한다는 느낌이 팍팍 한다. 간혹보면 C++ 을 C 처럼 쓰는 것 처럼 구조적 프로그래밍 방식으로 코딩하는건 C# 에서는 거의 불가능해졌다. 
 
4. 자료 구조의 차이
C++ STL 의 List, Vector 대신에 C# 에서는 ArrayList 가 제공된다.
C++ STL 의 Map 대신에 C# 에서는 Hashtable, Dictionary 가 제공된다.
C++ STL 의 Pair 대신에 C# 에서는 KeyValuePair 가 제공된다.
C++ 의 경우 STL 에서 제공하는 자료구조들을 쓰기 위해서 C# 에서는 Collection 을 인클루드 한다.

5. 형변환이 보다 엄격하면서도, 쉬워졌다.
예를 들어 C++ 에서 허용되는 다음과 같은 코드가 C# 에서는 에러가 난다.

                int start = 0;
                if( start ) data.Add(s);  // 암시적으로 int 형을 bool 형으로 변환할 수 없다.
반면에 데이터 타입의 변환은 Convert 라는 객체를 통해서 ToString, ToInt16, ToInt32, ToDateTime 과 같이 다양한 형태의 형변환을 메소드로 지원해서 형변환이 아주 쉬워진다.
6. 클래스 멤버들의 public, private, protected 구분이 더 엄격해졌다.
C++ 과 달리 C# 에서는 메소드, 변수 마다 붙인다.

public a;
public b;
private c;
 
public struct a
{
public int b;
public int c;
};
 
struct 의 경우 C++ 에서는 별도로 선언을 하지 않아도 암시적으로 모든 멤버가 public 으로 선언된다. 하지만 C# 에서는 struct 를 사용할때 위와 같이 멤버들에 대해서 명시적으로 public 인지 지정해야 한다.
7. C# 은 가비지 콜렉션을 지원하며 C++ 과 달리 new 는 존재하지만 delete 는 없다.
C# 에서 객체를 생성할때는 항상 new 로 생성한다. 하지만 C++ 과 달리 delete 를 해줘야 하는 것이 아니라, 가비지 콜렉터가 자동으로 매니지드 힙의 메모리 영역에서 생성된 객체의 메모리를 지워준다.
예를 들어 C# 에서 배열을 선언할 때 아래와 같이 쓴다.
int [] dat = new int [];
2차원 배열은 아래와 같이 할당한다.
int [,] dat = new int [100,100];  // 다중 배열에서 콤마를 쓰는 이런 방식이 처음엔 상당히 생소했다.
new 로 생성하지만 delete 를 하지는 않는다.
명시적으로 프로그래머가 힙 영역에서 데이터를 삭제할 때는 Dispose 명령을 사용한다. 
=========================================================================================================================================
방준영님께서 C++와 C#간의 차이점 정리에 덧붙여 글에서 몇 가지 잘못된 부분을 지적해 주셔서 Update 했습니다.

C++과 C#의 차이점 #1: 선행처리기의 지시어로 #include가 없습니다. Java import와 비슷하게 using 이라는 키워드를 써서 library 에 있는 class 들을 쓸 수 있습니다. 나름대로 그 역할에 충실했던 선행처리기는 자신의 문제점과 함께 갈수록 기능이 줄어 드는 것 같습니다. 그렇지만 C#에서는 Java와 달리 conditional compiler을 위한 지시어들은 계속 지원하는 것 같습니다. 방준영님의 글에 따르면 "C++와의 차이점이라면 선행처리기가 컴파일러 안에 통합되어 있다는 것"이 라네요. 컴파일된 object 자체에 풍부한 metadata 가 포함되어 있다는 의미겠죠. 그렇게 되면 object 파일이 어쩔 수 없어 커진다는 문제도 있습니다. 이건 Embedded System 용으로는 치명적인 약점이 될 수도 있을 것입니다(Java C# CSharp cpp 프로그래밍언어 비교 선행처리기)2008-07-08 23:18:16
C++와 C#의 차이점 #2: Java Byte Code와 비슷하게 IL(Intermediate Language)라는 중간 코드가 있습니다. IL은 Java Byte Code와는 다르게 여러 프로그래밍 언어를 지원하네요. VB, C#, C++ 등. 홍민희님이 그러시는데, JScript.NET, Boo, F# 등이 있다고 하네요(프로그래밍언어 C# C++ Java 비교 중간언어 cpp CSharp)2008-07-08 23:23:07
C++와 C#의 차이점 #3: Application을 의미하는 클래스가 꼭 있어야 합니다. 프로그램 진입점이 ApplicationClass.Main() 이네요. Java는 ApplicationClss.main() 인데… 마치 대학교때 친구 숙제 베껴서 낼 때 변수 이름만 바꾼 듯한 느낌이 드는 것은 저만의 느낌일까요 ? (프로그래밍언어 C# C++ Java 비교 cpp CSharp 프로그램진입점)2008-07-08 23:26:33
C++와 C#의 차이점 #4: Array가 단순 메모리 공간이 아닌 부가정보를 가진 객체입니다. 즉, 간단한 예로, array.Length 이런게 먹힌다는 거죠. Java 랑 정말 비슷합니다. C에서처럼 array의 element 개수를 주고 받느라 귀찮게 함수 형식인자 하나 더 쓸 필요가 없다는 것이고, C++에서처럼 element 개수를 가지고 있는 array class를 정의할 필요도 없다는 것이죠. 또는 vector 를 쓸 때처럼 초기화할 때 불편하게 초기화할 필요도 없겠죠. 초기화 방식이 built-in type 하고 똑같으니까요. 물론 최근 c++0x에서는도 언어수준에서 vector 같은 클래스에 대해 uniform initialization 이 가능하게 하려고 하고 있긴 하죠(프로그래밍언어 C# C++ Java 비교 cpp CSharp array)2008-07-08 23:30:26
int[] ia = { 100 }; System.Console.WriteLine(ia[2]); 했더니 “처리되지 않은 예외: System.IndexOutOfRangeException: 인덱스가 배열 범위를 벗어났습니다”라는 run-time exception이 발생하네요. 이 얘기는 array access 할 때마다 range check 를 한다는 얘기인데… bug 를 막는데는 도움이 되겠지만 성능에는 좋지 않을 것입니다. 언어의 설계 철학을 느낄 수 있는 대목입니다.
C++와 C#의 차이점 #5: 설계 철학이 다릅니다(프로그래밍언어 C# C++ Java 비교 cpp CSharp 설계철학)2008-07-08 23:37:47
C++는 꼭 쓸사람만 비용을 부담하게 하자는 주의이고(수익자 부담의 원칙이랄까...), C#은 Modern Language 답게 비용이 부담되더라도 버그가 생길 여지를 아예 없애자라는 주의입니다. 요즘 같이 CPU 성능이 갈수록 좋아지는 때에는 Java 나 C# 같은 언어가 좋게 느껴질 수도 있지만 여전히 아주 다양한 Embedded System 에 쓰기는 무리일 것입니다. 세상은 우리가 생각하는 것보다 우리가 경험한 것보다 훨씬 다양하고 다채롭죠.
C++와 C#의 차이점 #6: sbyte, short, int, long, byte, ushort, uint, ulong, float, double, decimal, bool 등 기본 데이터 타입의 크기가 표준화되어 있습니다. 이건 참 맘에 든다. C++도 이렇게 표준화 됐었으면 좋으련만. 그럼 프로젝트 할 때마 OSAL에 int8, int16, int32, int64 이딴거 정의 안해도 될텐데 말입니다.(프로그래밍언어 C# C++ Java 비교 cpp CSharp 기본데이터타입)2008-07-08 23:44:01
C++와 C#의 차이점 #7: 상속 계층의 꼭대기에 언어 수준의 object(Java 에서는 Object) 라는 class가 있습니다. 방준영님의 글에 따르면 "엄밀히 구분하면 object는 C#의 키워드고 실제 클래스명은 자바와 같이 Object다"라고 하네요. 각종 언어 수준의 작업을 일관된 인터페이스로 해주는 녀석이겠죠. 이것도 type system에 구멍이 생길 수 있어서 논란의 여지가 있습니다. 저에게는 object 는 마치 C++의 void * 같은 녀석처럼 보이네요. ^^(프로그래밍언어 C# C++ Java 비교 cpp CSharp 상속계층꼭대기기본클래스 object)2008-07-08 23:55:55
C++와 C#의 차이점 #8: 문자열 리터럴이 char * 가 아니라 언어 수준의 utf-16(Java 에서 String 은 utf-8 이던가요 ? 방준영님의 글에 따르면 "자바도 C#과 마찬가지로 String 타입이 UTF-16이다"라고 하네요.) 유니코드 문자열 클래스인 string의 인스턴스이다. “hello” 라고 하면 내부적으로 적어도 10 bytes 가 할당되겠네. 메모리가 싼 요즘엔 별 이슈는 안되겠다.(프로그래밍언어 C# C++ Java 비교 cpp CSharp 문자열리터럴 string)2008-07-09 00:04:57
C++와 C#의 차이점 #9: C++와 달리 pointer 사용에 제약이 있는 것 같다(이건 정확한 게 아니라서 나중에 더 확인하고 정리해 보겠습니다). 큰 장점이자 단점이 될 수 있겠지. 그런데 이제 단점으로 작용하는 영역이 별로 클 것 같진 않다. OS나 Device Driver 에서나 쓰기 어렵지 다른 곳에서 웬만하면 쓰일 수 있을테니까. 방준영님의 글에 따르면 "C#에도 포인터가 있다. C#으로 만든 OS도 있다"고 하네요.(프로그래밍언어 C# C++ Java 비교 cpp CSharp pointer 포인터)2008-07-09 00:10:38
C++와 C#의 차이점 #10: C++의 struct 는 또다른 class 이지만 C#의 struct 는 힙에 할당할 수도 없고, 상속 관계를 쓸 수도 없습니다. 무조건 object 에서 직빵으로 상속받는군요. 그리고 default accessibility 는 private 이네요(C++에서는 public 이죠)(프로그래밍언어 C# C++ Java 비교 cpp CSharp struct)2008-07-09 00:30:56
아주 간단한 concrete object 를 정의할 때나 써 먹는 게 낫겠습니다. 힙에 할당도 안되고, reference로 가리킬 수도 없고 값 형식만으로만 쓰기 때문에 큰 객체는 정의할 꿈도 꾸지 않는게 낫겠네요
new 로 할당하더라도 heap에 할당되는 게 아니라 스택에 할당됩니다. 그리고 모든 연산에 대해 항상 값 자체를 리턴합니다. matrix 를 struct 로 정의하면 모든 연산을 할 때마다 stack 안에서 엄청난 임시 객체들이 만들어지고, 계속해서 객체 복사가 일어난다는 뜻입니다. 허걱! struct를 써서는 각종 optimize 를 할 수가 없다는 뜻이겠죠. 웬만하면 class 를 써야겠네요.
C++와 C#의 차이점 #11: C#의 class 는 단일 상속만 허용됩니다. 그리고, 멤버 변수 및 멤버 함수 외에 속성, 인덱서, 이벤트 등의 멤버가 있고, access 도 internal, protected internal 이 있습니다. Java와 같이 interface 를 따로 뒀으니 단일 상속으로 해도 별로 문제 될 것 같진 않습니다(프로그래밍언어 C# C++ Java 비교 cpp CSharp 클래스 class)2008-07-09 00:46:52
C++와 C#의 차이점 #12: C#에서 함수 매개 변수 선언시에는 값 매개 변수 외에 참조 매개 변수(ref 키워드 사용), 출력 매개 변수(out 키워드 사용)를 지정할 수 있습니다.(프로그래밍언어 C# C++ Java 비교 cpp CSharp 매개변수)2008-07-09 00:51:28
그리고 params 라는 키워드로 매개 변수를 배열로 지정할 수 있는데… 그건 C/C++에서 매개변수에 대해 '...'이라고 표시하고 함수 implementation 안에서는 va_arg 를 쓰는 것과 비슷합니다. 단지 매개 변수 배열로 넘기면 마치 array 쓰듯이 할 수 있다는 점이 다르겠죠. 단순 syntactic sugar 라고 생각됩니다.
함수의 signature 에는 ref, out 키워드가 붙어 있는지의 여부도 포함됩니다. 단, ref, out 만다른 함수 overload 는 불가능합니다.
C++와 C#의 차이점 #13: 초기화되지 않은 지역 변수를 사용하려고 하면 컴파일러 에러(경고가 아니라!!!)가 발생한다.(프로그래밍언어 C# C++ Java 비교 cpp CSharp 지역변수 초기화)2008-07-09 00:59:27
초보 프로그래머들이 저지르기 쉬운 실수를 미연에 막아준다. 좋은 특징이라고 생각됩니다. out 과 ref 를 구분해서 초기화되지 않은 경우를 컴파일러가 쉽게 알아낼 수 있도록 한 것도 눈에 띄네요. 똑똑한 것들!
C++와 C#의 차이점 #14: 가상 함수와 순수 가상 함수를 나타내는 키워드를 분리했습니다. 가상 함수는 virtual, 순수 가상 함수는 abstract! subtype 이 override 할 때는 override 라는 키워드를 써야 합니다. 순수 가상 함수는 interface 와 기능이 겹칠 것 같은데… 왜 class 에서도 중복해서 지원할까? 단일 상속 제약때문에 그럴까요 ? 방준영님의 글에 따르면 "인터페이스가 있는데도 굳이 순수 가상 함수를 둔 이유는 일부 함수는 상위 클래스에서 미리 구현하고 일부 함수는 하위 클래스에 구현을 맡기는 형태의 디자인이 가능하기 때문. 반대로 정말 순수하게 순수 가상 함수로만 이루어진 클래스를 만든다면 인터페이스를 쓰는 쪽이 훨씬 깔끔하다"라고 하네요.(프로그래밍언어 C# C++ Java 비교 cpp CSharp 가상함수)2008-07-09 01:10:33
C++와 C#의 차이점 #15: 형식 매개 변수의 형태로 template과 같은 기능을 제공합니다. C#용어로는 지네릭이라고 합니다. C++처럼 강력한 generic programming 이 가능한지는 모르겠지만. 그리고, template이란 키워드를 사용하지 않고 <> 안에 형식 매개변수만 나열하면 됩니다(프로그래밍언어 C# C++ Java 비교 cpp CSharp template)2008-07-09 01:15:30
C++와 C#의 차이점 #16: 클래스의 event 멤버는 signal/slot 기능을 언어 수준에서 제공해주는 것입니다. event는 delegate와 연결됩니다. Boost.Signal library 처럼 type safe signal/slot 기능을 제공해 줍니다. event 멤버를 정의하면 +=, -= 을 이용해서 event handler 를 등록하고 제거할 수 있습니다.(프로그래밍언어 C# C++ Java 비교 cpp CSharp class event member delegate)2008-07-09 01:26:13
C++와 C#의 차이점 #17: C++의 RAII idiom은 using 문으로 구현할 수 있습니다. using (resource 초기화) { // 실행 코드 } 이런식으로 작성하시면 됩니다.(프로그래밍언어 C# C++ Java 비교 cpp CSharp using구문 코드 블록)2008-07-09 01:32:35
C++와 C#의 차이점 #18: loop construct 로 foreach도 있습니다. int[] ia = {1,2,3}; foreach (int e in ia) { … } 이런게 가능합니다. c++0x 에서도 비슷한 기능을 도입하려고 하고 있죠(프로그래밍언어 C# C++ Java 비교 cpp CSharp foreach)2008-07-09 01:35:42
C++와 C#의 차이점 #19: scope operator 가 '::' 이 아니라 '.' 입니다. 전 이게 더 좋은 것 같아요. 어떤 경우는 :: 을 쓰고 어떤 경우는 . 을 쓰고 그랬는데, 이렇게 하나로 통일하는 게 좋은 것 같네요(프로그래밍언어 C# C++ Java 비교 cpp CSharp scope operator)2008-07-09 01:38:54
=============================================================================================================================
 
이번주는 틈틈이 검색 엔진과 메타 블로그 사이트를 시간순으로 훑으면서 국내 블로거들이 C#을 주제로 쓴 글을 하나씩 읽어 보려고 계획하고 있는 중이다. 그 중 C++와 C#간의 차이점 정리라는 재미있는 글을 발견했는데 내용 중에 약간 잘못된 부분이 있어 지적하려고 한다.
C++과 C#의 차이점 #1: 선행처리기를 쓰지 않습니다.
C#에서도 선행처리기를 쓴다. C++와의 차이점이라면 선행처리기가 컴파일러 안에 통합되어 있다는 것.
C++와 C#의 차이점 #3: Application을 의미하는 클래스가 꼭 있어야 합니다. 프로그램 진입점이 ApplicationClass.Main() 이네요. Java는 ApplicationClss.main() 인데… 마치 대학교때 친구 숙제 베껴서 낼 때 변수 이름만 바꾼 듯한 느낌이 드는 것은 저만의 느낌일까요 ?
C#의 Main()은 리턴 값을 가질 수도 있고 안 가질 수도 있고 파라미터를 가질 수도 있고 안 가질 수도 있고 private으로 선언해도 되고 public으로 선언해도 되는 등 자바의 main()에 비해 유연성이 높다. 단순히 변수 이름만 바꾼 것보다는 조금 더 다르다.
C++와 C#의 차이점 #7: 상속 계층의 꼭대기에 언어 수준의 object(Java 에서는 Object) 라는 class가 있습니다. 각종 언어 수준의 작업을 일관된 인터페이스로 해주는 녀석이겠죠. 이것도 type system에 구멍이 생길 수 있어서 논란의 여지가 있습니다.
엄밀히 구분하면 object는 C#의 키워드고 실제 클래스명은 자바와 같이 Object다(전체 명칭은 System.Object). 오남용하면 타입 시스템에 구멍이 생길 수 있는 건 맞지만 C# 2.0부터는 지네릭을 지원하기 때문에 논란의 여지가 될 수 있었던 것은 먼 과거의 일.
C++와 C#의 차이점 #8: 문자열 리터럴이 char * 가 아니라 언어 수준의 utf-16(Java 에서 String 은 utf-8 이던가요 ?) 유니코드 문자열 클래스인 string의 인스턴스이다.
자바도 C#과 마찬가지로 String 타입이 UTF-16이다.
C++와 C#의 차이점 #9: Java처럼 pointer 가 없다. 큰 장점이자 단점이 될 수 있겠지. 그런데 이제 단점으로 작용하는 영역이 별로 클 것 같진 않다. OS나 Device Driver 에서나 쓰기 어렵지 다른 곳에서 웬만하면 쓰일 수 있을테니까.
C#에도 포인터가 있다. C#으로 만든 OS도 있다.
C++와 C#의 차이점 #14: 가상 함수와 순수 가상 함수를 나타내는 키워드를 분리했습니다. 가상 함수는 virtual, 순수 가상 함수는 abstract! subtype 이 override 할 때는 override 라는 키워드를 써야 합니다. 순수 가상 함수는 interface 와 기능이 겹칠 것 같은데… 왜 class 에서도 중복해서 지원할까? 단일 상속 제약때문에 그럴까요 ?
C++도 가상 함수와 순수 가상 함수를 명시적으로 구분하지만 단지 괴악한 "= 0" 문법을 사용한다는 점이 C#과 다르다. 인터페이스가 있는데도 굳이 순수 가상 함수를 둔 이유는 일부 함수는 상위 클래스에서 미리 구현하고 일부 함수는 하위 클래스에 구현을 맡기는 형태의 디자인이 가능하기 때문. 반대로 정말 순수하게 순수 가상 함수로만 이루어진 클래스를 만든다면 인터페이스를 쓰는 쪽이 훨씬 깔끔하다.
C++와 C#의 차이점 #15: 형식 매개 변수라는 걸 통해 template과 같은 기능을 제공합니다. C++처럼 강력한 generic programming 이 가능한지는 모르겠지만.
형식 매개 변수가 아니고 지네릭을 통해 C++ 템플릿과 비슷한 기능을 제공한다(형식 매개 변수는 지네릭의 일부임). 지네릭을 제공하므로 당연히 지네릭 프로그래밍이 가능하고, 내 생각에는 C++보다 더 쓰기 쉽고 강력하다(C#이니까 다소간의 성능 저하는 이해와 사랑이 필요...^^).
C++와 C#의 차이점 #19: scope operator 가 '::' 이 아니라 '.' 입니다. 전 이게 더 좋은 것 같아요. 어떤 경우는 :: 을 쓰고 어떤 경우는 . 을 쓰고 그랬는데,
(이건 잘못된 내용은 아니지만 부연 설명 차원에서) C#에도 :: 연산자가 있다. 예를 들어 C++에서는 전역 네임스페이스를 나타낼 때 ::std처럼 쓸 수 있지만 C#에선 global::System이라고 쓴다. 주의: 모양은 비슷하지만 용법에 차이가 있다.
[출처] C++와 C#간의 차이점 정리|작성자 하이바

 

'개발지식창고 > C#' 카테고리의 다른 글

C++로 만든 DLL 을 C#에서 사용하기  (0) 2013.01.03
Serialize an ArrayList object to a binary file  (0) 2012.12.24
C# 관련 추천사이트  (0) 2012.12.04
Form 이벤트  (0) 2012.11.30
C++과 C#의 문법적인 차이점  (0) 2012.02.27
Posted by 모과이IT
,

http://unity3d.com/unity/ : 유니티 홈페이지

드디어... 우연치 않은 계기로 공부를 하게 되었습니다.
기본적으로 Unity 3D Engine은 모든 플랫폼을 지원하고, Javascript 와 C# 등을 이용하여 개발이 가능하네요..우선 Unity에 대해서 간략하게 정리 해놓은 글이 있어서..

특징!!!
첫 번째 멀티플렛폼 엔진
두 번째 통합 인터페이스
세 번째 저렴한 가격



참조글 : http://dustinlee.me/130110694303 에서 읽어 왔습니다.
극찬글 : http://blog.naver.com/fpdlwu2000?Redirect=Log&logNo=90116567963 

Unity3D의 역사

유니티는 2000년도 후반부터 가장 빠른 속도로 스포트라이트를 받고 있는 게임엔진이다.
실리콘 밸리도 아닌, 덴마크에서 시작한 이 회사의 기술력이 기존의 게임엔진들을 제치고 스포트라이트를 받는 원동력이 무엇일까? 

Unity의 역사를 살펴보면 지금과는 다르게 Mac만을 타겟으로 2001년부터 개발을 시작하여 2005년에 첫 버젼인 1.0을 출시한다. 그때 당시 쟁쟁하게 이름을 떨치던 다른 게임엔진들을 피해 맥에서 동작하는 3D게임개발 소프트웨어 제작을 목표로 집중하였고, 이런 노력을 인정받아 2006년 애플에서 Design Award 를 수상하게 된다.

처음에는 틈새시장인 애플에서 게임엔진을 만드는 것으로 목표로 하였지만 여기서 그치지 않고 확장성과 편의성, 그리고 빠른 처리 속도 모두를 잡을 수 있는 기술적인 방안에 대해서 중점적으로 고민하였고, 고민끝에 Mono를 기반 인프라로 채택한다.

Mono를 탑재한 2.0을 출시하면서 멀티플랫폼 기능으로 대중적으로 서서히 알려지게 되었으며, 모바일 바람이 불면서 이는 더욱 가속화되어  2009년도 탑 5 게임회사로 Gamasutra에 선정되면서 크게 주목받게 되었다.

이후 Unity는 전방에서 엔진 성능 및 게임제작에 필요한 기능들을 추가함으로서 게임엔진으로서 많은 발전을 하였고, 후방을 맡은 Mono도 제자리걸음을 하지 않고 PC, Linux, Mac, Smartphone에 이르는 멀티플랫폼을 안정적으로 지원해주면서, 쉽고, 빠르고, 멀티플랫폼지원이 되는 지금의 높은 생산성을 가진 솔루션이 탄생하게 되었다.
 
Unity3D과 기존엔진의 비교

 게임제작에 필요한 개발 소프트웨어를 크게 렌더링 엔진과 리소스와 렌더링 엔진을 연결하는 개발툴의 두가지로 나눈다면, 크게 2가지 게임엔진의 유형이 있을 것이다.
 
1. 에디터를 통해 모두 묶어서 제공하는 토털솔루션 유형.
2. 렌더링 엔진 중심으로 제공하되 보조툴을 별도로 제공하는 유형.

전자의 형태로 제공되는 게임엔진은 타겟이 어느정도 정해져 있어서, 이 타겟과 같은 장르의 게임을 제작한다면 빠른 기간에 퀄리티가 높은 결과물이 나올 수 있었으나 확장성이 매우 부족하여 다른 유형의 게임을 제작할 경우 소스코드를 뜯어서 재구성하는 경우가 많았다. 이런 엔진들은 주로 고가에 판매되어 다룰 수 있는 사람이 큰 규모의 게임회사인원으로 한정되어 있으며, 자유자재로 엔지니어링 하기 위해서 오랜기간의 노력과 리서치가 들어간다.

후자의 형태로 제공되는 게임엔진은, 엔진을 잘 이해한다면 다양한 장르의 괜찮은 퀄리티의 게임을 만들 수 있으나, 문제는 게임 제작에 필요한 개발툴의 제작기간이 오래걸리는 점이다. 게임이 완성되어질 쯤 엔진과 툴들은 전부 뜯어고쳐져서 원래의 모습은 흔적도 사라진 형태가 되는데, 게임브리오가 이런 유형의 대표적인 엔진이라고 볼 수 있다.
 
결국 양쪽 모두 개발기간이 오래걸리며, 주로 경험있는 개발자에 의해 프로젝트의 진행여부가 결정되는 경우가 많았다.

 
이런 구분에서 유니티를 평가한다면,
유니티는 토털솔루션이면서, 소스코드의 분석이 없이 다양한 게임의 제작이 가능한 매우 생산적인 게임제작도구라고 정의할 수 있다.

유니티가 기존의 다른 엔진을 뛰어넘는 만능 엔진이라는 맹목적인 찬사가 아니다. 
렌더링 엔진성능에 치중하는 기존 엔진회사들의 전략과는 다르게 게임제작의 생산성을 극대화하는쪽으로 치중하고, 이것이 아래에 설명하는 현재의 게임업계의 Trend와 부합되어 많은 고객들을 확보하고 있는 중이다.

게임업계의 Long-tail Trend

 SNS와 스마트폰의 발달은 단순한 유행이 아닌 하나의 큰 트렌드이고 향후 세상을 변화시킬 요소로 가장 주목받고 있음은 누구나 다 알고 있을 것이다.
 
Zynga, Rovio, Ngmoco  라는 회사들을 아는가?
 
기존의 EA와 같은 거대 공룡회사가 아닌 20여명내외의 작은 규모에서 출발하여 제각각 대박을 만든 신화적인 회사들이다. 불과 2-3년전에 갑작스럽게 벌어진 일들이다.
개발자의 관점에서 위 회사들의 게임 결과물을 보았을 때 관심을 가질만한 기술적인 장점이 그다지 안보인다. 최근에 나온 크라이시스2등의 그래픽과 비교한다면 너무 초라할 따름이다.
 
거품일수도 있지만 불과 20명 남짓한 웹 SNG(Social Network Game)전문 회사인 Zynga의 시가총액이 EA를 능가한다는 보도가 있으며, We Rule을 개발한 Ngmoco는 지난해 4500억원에 일본회사에 매각되었다. Rovio도 다르지 않다. 핀란드 벤쳐회사인 이 회사는 앵그리버드 하나로 핀란드의 삼성과 같은 존재인 노키아보다 더 많이 보도가 되고 있으며, 총 2억건 이상의 다운로드를 기록하고, 최근 4500만달러 투자를 유치하는 등 승승장구 중이다. 하지만 직원은 2011년 기준 이제 55명일 뿐이다.
 
이 회사들의 성공요인은 트렌드 붐이 일어나는 적절한 시점에 아이디어를 통해 시장을 선점하였다는 것이다.  독창적인 아이디어도 중요하지만 트렌드에 맞춘 시간적인 타이밍이 더욱 중요한 것이다.
 
최고의 MMORPG, FPS서비스를 위해 몇년동안 기존 엔진들의 소스를 분석하여 서버기술과 접목하여 재구성하는 노력이 메이저 게임 회사들이 지금까지 노력한 집중 포인트였다면, 이제는 아이디어를 바탕으로 가볍고 빠른 게임을 시장에 가장 먼저 내놓는 것이 트렌드인 것이다.
 
인터넷과 물류의 발달이 비인기상품들이 모여 틈새시장을 새롭게 형성하는 롱테일 현상을 가져다 주었다면, 모바일, SNS의 혁명은 대형 패키지 , 온라인 게임개발사가 차지했던 영역을 개인,소수 개발자들이 모여 새로운 게임의 장르를 형성하고 있다.

모바일에서도 게임은 전체 어플에서 차지하는 비중이 겨우 20%중반대이지만, 70%이상이 Top100안에 들정도로 매우 부가가치가 높은 장르다. 이 게임 앱들의 70%는 개인 혹은 소규모 게임 개발회사들이 제작하고 있다.
 
이들에게 필요한 것은 화려한 렌더링 기술, 많은 동접자를 처리하는 서버기술이 아닌 아이디어를 빠르게 시장에 선보이는 Time to Market을 단축시키는 기술이며, 이를 위한 게임엔진으로 유니티는 최고의 솔루션으로 자리매김 중에 있다.

유니티는 2005년도 1.0을 선보인 이래 2010년도에 25만명의 개발자가 등록했는데, 2011년도 초반에 벌써 50만 개발자가 등록하는 무서운 성장세를 보이고 있다.
 
유니티는 매년 3배씩 성장을 하고 있으며, 성장의 힘을 새로운 플랫폼을 안정적으로 지원하는 것과 개발자 고객을 지원하는데 사용하고 있다.  다른 게임엔진회사들이 고객에 대한 기술지원보다, 새로운 기술개발에 전념하는 것과는 180도 다른 전략이다. 

 Unity3D여야 하는 이유.
 
앞서서 말했듯이 Unity3D만의 차별화된 장점은 시대 Trend에 맞는 민첩한 생산성이다.
천재프로그래머인 당신이 어느날 멋진 아이디어가 떠올라 개인 혹은 소규모 회사를 창립한다 가정해보자.
OpenGL ES기반으로부터 직접 3D엔진을 만들고 게임까지 개발한다면 출시까지 얼마나 걸릴것인가? 이후 아이폰 및 안드로이드들의 고려한다면 당신의 천재성을 아이디어와 서비스 로직을 발전시키는데 활용할지, 각각의 기기들을 조율하는 엔지니어링에 활용할지 심각히 고민해볼 문제다. 또한 최종산출물 출시까지 걸린 시간과 노력의 댓가가 라이선스 값보다 과연 적게 들것인지 냉정하게 경제성 평가를 고민하여야 할것이다.
기술적으로 Unity3D를 사용함으로 얻게되는 생산성들을 정리해보면 다음과 같다.
  
- Mono VM 
  Mono를 한줄로 요약해본다면, 
 윈도우에서 만든 .NET 프로그램을 리눅스와 맥에서도 사용할 수 게 만들어주는 기반 인프라다.  '해킹이나 다른 비합법적인 방법을 통해 MS의 기밀을 빼내서 만든것이 아닌가?' 라는 생각이 들법도 한데
사실 .NET의 근간을 이루는 CLR이라는 체계는 MS만 사용했을 뿐이지, 표준기관인 ECMA를 통해 공개되어 있었고, Mono는 이 공개된 규약을 가지고 리눅스와 맥에서도 돌아가는 VM인프라를 제작한 것이다. 개발자 입장에서 보는 Mono의 큰 장점은 기존의 .NET 라이브러리 호환성이다.
 
.NET에서 제공하는 기본 라이브러리(List, Queue, Hashtable, Dictionary등등.)들을 사용하여 리눅스, 맥, 요즘 지원하는 안드로이드 및 iOS에서동작하는 어플리케이션의 제작이 가능하다는 것이다. VM레벨에서 명령어가 호환이 되므로 재사용을 위해 OS별로 다시 컴파일하는 과정도  필요없으며, 조금 더 생각해본다면 모듈을 의존성없이 잘 설계한다면 하나의 dll을 가지고 여러 OS에서 재활용 할 수 있다. 기존 C# 개발자들에 의해 만들어진 수많은 라이브러리도 같이.

그리고 .NET은 멈추지 않고 MS의 전폭적인 지원을 받으며 점점 성장하고 있다.
지난기간동안  .NET의 프로그래밍 기능에서의 큰 변화를 꼽으라면

- 2.0의 Delegate, Generic지원.
- 3.5의 Lambda expression을 통한 Linq.
- 4.0의 Parallel Programming지원
 
등이라 생각하는데, Mono는 현재 빠른속도로 업그레이드를 통해 MS가 만들어놓은 위의 기능들을 대부분 지원하고 있다. 
 
다만 상황이 글에서만큼 완벽한 것만은 아니다.

Mono가 Novell의 후원을 받고 있지만, 엄청난 두뇌와 자본이 모인 MS의 기술력을 따라잡기에는 많이 부족한것은 사실이다. MS는 C#이 cpp나 C와 견주어서 성능에서 큰 손색이 없도록 정말 많은 노력을 초창기에 쏟아부었고, Mono에서도 이러한 노하우와 퍼포먼스가 반영되기는 아직은 더 시간이 필요하다. 특히 스마트폰과 같은 Embedded 시스템에 .NET을 포팅하는 작업들은 이제 시작단계라 윈도우와 동일한 결과를 장담할 수 없고 기업차원에서 체계적인 기술지원이 없으면 이를 믿고 개발하는 사람들에게 위험한 상황이 발생할 수도 있다.

다행히 Mono의 전략이 Embedded시스템쪽으로 특화시키는 것으로 보여지며, Unity에서도 Mono와의 협력을 통해 각 OS별로 최적화된 작업을 추가적으로 진행하고 있다. 
 
예를 들면 안드로이드에 특화하여 Dalvik VM과 Mono CLR과 연동하는 기능의 제공이라던지,
.NET 기본 라이브러리 크기를 줄이는 Strip Byte Code기능등이 대표적인 예인데, 이를 통해 확장성있고 최적화된 앱들의 제작이 가능하다.
 
Java가 Oracle에 인수되고 Java아버지는 회사를 떠나고 없는 뒤숭숭한데, 노키아도 자사의 Java ME기반 OS를 버리고 윈도우폰을 사용하기로 협약한 이 상황에서 , Mono만큼의 좋은 결과를 보여주는 멀티플랫폼 솔루션은 없으며 이는 Unity와의 공조로 부족한 레퍼런스 및 최적화 기능들이 빠른 속도로 완성되가고 있다. 

 -  C#의 생산성
 
Unity는 C#과 Javascript의 사용이 가능한데, 개인적으로 선호하는 언어는 C#이다. 
개인적인 경험에 따른 이야기를 통해 C#의 생산성을 이야기하고자 한다. 
일전에 반년정도 기간동안 하나의 프로젝트를 한적이 있었다. php로 되어 있는 리눅스 웹 서비스를 6개월안에 윈도우즈 서버 플랫폼으로 변환하는 내용이었는데, 일이 언제나 그렇듯이 초기 3개월은 스펙하고 기획들을 협의하는데 시간을 소비하고, 시스템 구조 잡고, 하드웨어 세팅하다보니,시간이 훌쩍 흘러갔다.  설상가상으로 내정된 개발자가 중도에 퇴사를 하는 일이 발생하여 개발자가 없어졌고, C#에 과거에 경험이 있던 내가 직접할 수 밖에 없었다. 우리는 이 작업에 대해 3명, 3개월개발기간을 예상하였지만.. 
이 상황에서 적당한 해법을 찾기 위해 ASP.NET에 대해 좀 심도있게 살펴보았다. 이때가 ASP.NET MVC2버젼이 막 나왔을 무렵이었던거 같다. 프레임웍이 이해되고, LINQ 사용법에도 익숙해졌을 때, 기획이 어느정도 완성이 되자 ASP.NET MVC Framework 구조를 반영한 나름 최적화된 설계가 잡혔다. 이후 기획된 로직을 구현하면서 계속 리팩토링을 하다보니 어느순간 끝이 보이기 시작하면서 나머지는 비슷한 패턴들에 대한 반복작업이되었다. 시간을 보니 1개월 반정도 지난 시점에서 대부분의 기능들이 완료가 되어있었고, 남은 시간에 필드테스트를 거쳐 일정에 차질없이 서비스를 시작할 수 있었다.
 
  
이때 느낀점들은.
 
   - Java가 생산성 높은 구조를 위한 프로그래밍 환경제작에 많은 공헌을 하였다.
   - .NET이 Java가 만들어 놓은 좋은 것들을 다 소화하면서 따라오고 있다.
   - .NET은 새로운 개념을 도입하는데 전혀 주저하지 않으며 자신만의 장점도 계속 발전시키고 있다.
   - C#은 배를 조종하는 사공이 한사람만 있다. 사공이 정한 규칙을 잘 준수한다면 배를 타는 승객들은 누구보다 가장 빨리 목적지까지 갈 수 있다.
   - C#은 편하고 생산성 높은 언어다. 대신 잘쓰려면 공부를 많이 해야한다.
   - Visual Studio 2010의 단축키, 리팩토링, 고급기능을 적절히 활용하면 코딩시간의 큰 부분을 줄일 수 있다. 유니티는 Visual Studio 2010과 디버깅을 제외하고 완벽히 연동된다.
 

- 확장성
 
Unity3D는 엔진뿐 아니라 에디터의 구성요소까지 많은 부분을 모듈화하였다.
이를 통해 어느정도 에디터를 자신에 맞게 커스터마이징도 가능하다. 
모듈화된 구성요소들은 스크립트를 통해 제어가 가능하며. 이를 위한 문서들은 온라인사이트를 통해 잘 정리되서 제공된다. 게다가 개발자 커뮤니티가 활발히 활성화되어 있어 문제 해결에 도움받기가 무척 수월하다.
스크립트로 제어할 수 있는 수준은 원시적인 레벨까지 가능하며, 실제로 에디터에 아무 설정이 없어도, 스크립트를 통해 하나의 점으로부터 게임레벨까지 모두 동적으로 생성하는 것도  가능하다.
 
개인적으로 Unity3D가 제공하는 인프라를 보면 게임제작에만 활용되는 부분이 아깝기까지 하다.

지금은 게임개발에 종사하지 않지만, 현재 종사하는 분야의 솔루션을 위해 Unity3D 인프라를 이용하여 저작도구 및 시뮬레이션 어플리케이션을 제작하고 있는데, 현재까지의 성과는 매우 만족스럽다.
현재 어플리케이션을 만들면서 느끼는 점은 2D UI에 대한 지원이 생각보다 미흡하다는 점인데, Asset Store 커뮤니티에서는 다른 개발자들이 만든 3rd Party 솔루션들을 구입하여 사용하여 이를 보완하고 있다.
 
결론
 
소규모 혹은 1인게임개발을 꿈꾸거나, 아이디어가 있는데 빨리 출시를 생각한다면 유니티를 도입해보는 것을 적극추천한다.
우선 무료인 일반 버젼을 받은 후에 기본 기능들을 충분히 스터디를 하고, 상황에 따라 적절한 라이센서를 구입하여 프로젝트를 진행한다면 빠른 시간에 경제적으로 최종 결과물을 볼 수 있다.
개발에 대한 문서 및 레퍼런스등은 유니티 웹페이지와 커뮤니티를 통해 충분히 지원받을 수 있으며, 영어가 부담된다면 아직 우리나라에는 유니티관련된 깊이 있는 전문 커뮤니티가 부족하지만 unity3dkorea.com과 같은 커뮤니티를 통해 점점 활성화되고 있으니 이를 참고하면서 진행하면 많은 도움을 받을 수 있다.

대학에서도 무료 유니티강좌들이 시도되고 있으니, 이들을 활용하는 것도 처음 시작에 대한 감을 잡는데 좋은 방법이 될 수 있다.



그러쿠낭~ 반가워용

Unity 3를 이용한 Image Effects
http://www.youtube.com/watch?v=wc1vJ-FixM8

Posted by 모과이IT
,

Intermediate(중간) 단계의  강좌들입니다.
요걸 다 보고 나니... 볼것이 없네요.. 다른 강좌들이 있는지 좀 찾아 봐야 할것 같습니다..

1. Raycasting

많이 들어 본것 같은데 Ray(x-ray 들어봤는데.. 빛인가??) 는 안보이는 선인것 같다.
나중에 좀더 보충해야지.. 가상의 선을 그어.. 그 선과 다른 객체와의 관계를 나타내고 있습니다.

function Update () {
 
   var up = transform.TransformDirection(Vector3.up);
   var hit : RaycastHit;   

   Debug.DrawRay(transform.position, -up * 10, Color.green);
 
   if(Physics.Raycast(transform.position, -up, hit, 10)){
      Debug.Log("Hit");   
      if(hit.collider.gameObject.name == "floor"){
           Destroy(GetComponent(Rigidbody));
      }
   }
}

2. Basic Animation and Events

Animation 를 추가 해서.. 해당 시간에 해당 객체가 어떠한 이동/확대/회전 을 하느냐를 적용합니다.
또한 해당 이동시에 Flat 이라는 것을 적용해서 부드럽게 이동하도록 하는 효과도 주는 군요
애니메이션 과정중에 사운드도 집어 넣지요... 으하하핫

var blip : AudioClip;
 
function blipSounder () {
 AudioSource.PlayClipAtPoint(blip, transform.position);
}


Unity3DStudent 와 함께 있는 LearnUnity3D 가 있군요.. 형제(자매) 사이트 인듯 싶은데... 이곳에도 튜토리얼이 있더군요.. 참고하면 좋을 싶습니다. (영어를 잘한다면.. 쉽게 접근가능 하겠습니다.)
http://learnunity3d.com/ 

Posted by 모과이IT
,

Become a videogame developer 라는 부제를 가지고 있는 사이트입니다.
http://www.unity3dstudent.com/



교육 단계 모두 동영상으로 구성되어 있어서 , 공부하는데 정말 수월하게 진행 될수 있었습니다.
아래 내용은 제가 공부 하는데, 정리한 내용들이니.. 위에 사이트 가셔서 직접 공부하시는 것이 더더욱 도움이 많이 될것입니다. ^^

기본적으로 해당 강좌는 모두 javascript 로 구현되어져 있습니다.


Adding Mass / Gravity with Rigidbodies

해당 객체에 아래와같이 함수를 추가해주시고, 중력을 줍시다.

기본적으로 이렇게 중력을 추가하는 것이 가장 기본이고, 이게 너무 신기 했습니다.

1. Basic Collision Detection  
충돌 탐지 : 해당 객체에 아래와 같이 함수를 추가해 보시면.. 아래와 같이 디버깅 창에 로그가 나타납니다. 충돌이 되는 순간을 알수 있다라는 것 알게 되었지요


function OnCollisionEnter(theCollision : Collision){
 if(theCollision.gameObject.name == "Floor"){
  Debug.Log("Hit the floor");
 }else if(theCollision.gameObject.name == "Wall"){
  Debug.Log("Hit the wall");
 }
}


2. Detecting Input
입력값 탐지 : Update 함수는 Play가 되는 동안을 알수 있는 함수 있다.
스페이스바를 눌렀을때.. 로그가 나오는 거죠

 

function Update () {
    if(Input.GetButtonUp("Jump")){
        Debug.Log("We Have Hit the Space Bar!");
    }
}


3. Prefabs
Prefabs – How to make them, what they are for, and why!
Hierarchy에서 생성한 객체를 Prefabs 로 생성해서 추가합니다.
그리고 맘대로 쓸수가 있군요.. 한번 만든것을 응용해서 사용하자는 거군요.

4. Destroying Objects

오브젝트를 삭제하는 것을 알려 줍니다.
타겟을 지정하고, 지연시간을 추가할수도 있지요.

function Start () {
 Destroy(gameObject.Find("Cube"),2);
}


5.Instantiate to Create Objects

빈 객체(GameObject)에다가.. javascript로 객체 생성을 하고, prefab에다가... 기존에 만들어 놓은 BounyBox(prefab)를 추가하면.. 생성이 되지요

6.SImple Timer
타이머를 추가해서.. 이것저것 로그 찍어봅시다.

//A simple countdown timer
var myTimer : float = 5.0;
 
function Update () {
 if(myTimer > 0){
  myTimer -= Time.deltaTime;
 }
 if(myTimer <= 0){
  Debug.Log("GAME OVER");
 }
}

7. Basic Translate Movement
해당 객체를 이동시키는 거군요.. 간단 하면서..


//Basic movement of an object with Translate
var speed : float = 5.0;
 
function Update () {
 transform.Translate(Vector3(0,0,speed) * Time.deltaTime);
}

8. Basic Force Movement
힘...해당축으로 밀어주는 힘을 말하는 군요..냐하하하

//Basic force to move a rigidbody object
var power : float = 500.0;
 
function Start () {
 rigidbody.AddForce(Vector3(0,0,power));
}

9.Adding Materials
배경 입히는 것이군요..

10. Audio Basics

스크립트를 통해 사운드를 넣어주게 됩니다.

//Play an instance using attached AudioSource component
var myClip : AudioClip;
 
function Start () {
 audio.PlayOneShot(myClip);
}
Using PlayClipAtPoint:

//Spawn a new object with AudioSource and Clip set, at a point in the 3D world
var myClip : AudioClip;
 
function Start () {
 AudioSource.PlayClipAtPoint(myClip, transform.position);
}

11. Basic Joints
기본 관절... 헐..이음새 등을 이용하게 되는 군요.. 오홋 정말 신기합니다.
이음새를 연결하여 헐렁 헐렁...

12.Input with Axes

방향키로 객체를 조정하는 방법을 배워봅니다.
응용범위가 점점 넓어지는 군요

function Update () {
 var horiz : float = Input.GetAxis("Horizontal");
 Debug.Log(horiz); 
 transform.Translate(Vector3(horiz,0,0));

}

13. Trigger Collision Detection

Trigger를 체크 했을때, 객체가 통과가 되네요..
또한 통과했을때의 확인할수 있습니다.


function OnTriggerEnter (myTrigger : Collider) {
 if(myTrigger.gameObject.name == "box"){
  Debug.Log("Box went through!");
 }
}


14. GUI Text and Counters
GUIText 객체를 사용하는 방법에 대해서 알아봅니다.
오홋 카운트도 넣을수가 있네요.. 이런 말도 안되는;;

var Counter : int = 0;
 
function Update () {
 Counter++;
 guiText.text = "Counter is: "+Counter;
}


15. Adding Componets via Script

스크립트를 사용해서 다른 객체에게 기능을 추가하는 요소

function OnCollisionEnter (myCollision : Collision) {
 if(myCollision.gameObject.name == "Platform"){
  if(!myCollision.gameObject.rigidbody){
   myCollision.gameObject.AddComponent(Rigidbody);
  }
 }
}

16. Switching Scenes
화면 전환입니다.(Build Setting 를 사용할수도 있지요..)
플레이 화면과 결과 화면을 연동에 응용하면 좋을것 같습니다.

var myLevel : String;
 
function OnCollisionEnter (myCollision : Collision) {
 if(myCollision.gameObject.name == "Floor"){
  Application.LoadLevel(myLevel);
 }
}


17. Tweaking Components via script
스크립트를 이용하여, 불을 켜다...

function OnCollisionEnter (myCollision : Collision) {
 if(myCollision.gameObject.name == "Floor"){
  var myLight : Light = gameObject.Find("Light").GetComponent(Light);
   myLight.enabled = true;
   myLight.intensity = 5;
 }
}

18.Local vs World Direction
alt 키를 누르면 되고.. Local 과 World Direction은 좀더 찾아서 공부를 해봐야 할 것 같습니다.

function Update () {
 //transform.Translate(Vector3(0,0,1) * Time.deltaTime);
 var fwd = transform.forward * 100;
 rigidbody.AddForce(fwd);
}

19. Following with LookAt()
카메라 이동 컷입니다. 오호홋.. 바로 이거야. 멋쪄브렁


var myTransform : Transform;
function Update () {
 transform.LookAt(myTransform);
}

20. IF Statement and Booleans
boolean의 상태값 에 따라 변경하는 방법


var myCheck : boolean = true; 
function Update () {
 
 if(myCheck){
  guiText.text = "Its on!";
 }else{
  guiText.text = "Its Off!";
 }
 
 if(Input.GetButtonUp("Jump") && myCheck){
  myCheck = false;
 }else if(Input.GetButtonUp("Jump") && myCheck == false){
  myCheck = true;
 }
}


21. Finding Distance with Vector3
떨어지는 객체에 대한 거리를 측정하여, 다양한 액션을 취하도록 합니다.


var box : Transform; 
function Update () {
 var dist : float = Vector3.Distance(box.position, transform.position);
 Debug.Log(dist);
 
 if(dist <= 10){
  light.enabled = true;
 }else{
  light.enabled = false;
 }
}


22. Pausing Scripts with WaitForSeconds()
몇초동안 멈추는듯 한데유..
더욱 신기한것은 Instantiate 함수 입니다.
계속 인스턴스를 생성하네요 @.@

var box : GameObject;
var readynow : boolean = true;
 
function Update () {
 if(readynow){
  MakeBox();
 }
}
 
function MakeBox(){
 readynow=false;
 Instantiate(box, transform.position, transform.rotation);
 yield WaitForSeconds(2);
 readynow=true;
}


23. Particle Systems
파티클을 적용 해봅시다. 터지는 효과등에 사용하면 그만이겠군요!

var stars : ParticleEmitter;
 
function OnCollisionEnter (col : Collision) {
 Instantiate(stars, transform.position, transform.rotation);
 Destroy(gameObject);
}

24. For Loops
루프를 돌려 보자구용
var myPrefab : Rigidbody;
var distanceMultiplier : float = 2;
 
function Start(){
 
    var i : int = 0;
    var pos : Vector3 = transform.position;
 
    for(i=0; i&lt;=3; i++){
        Instantiate(myPrefab, Vector3(pos.x+i*distanceMultiplier, pos.y, pos.z), transform.rotation);
        yield WaitForSeconds(0.5);
        Debug.Log("made ball "+i);
 
    }
 
}

25. GUI Texture & mouse Event
드디어.. 버튼 롤오버.. 와 클릭 이벤트를 알아냈군요..
게임내 버튼을 만들면 되겠군요..요걸 가지고

var normalTex : Texture2D;
var hoverTex : Texture2D;
 
function OnMouseEnter () {
 guiTexture.texture = hoverTex;
}
 
function OnMouseExit(){
 guiTexture.texture = normalTex;
}
 
function OnMouseDown(){
 Debug.Log("clicked");
}


26. Using Mathf.Clamp to restrict values
이동의 제한을 두는 방법입니다.
Clamp 자체가 꺽쇠 라는 뜻이라는 군요..


function Update () {
 var xMove : float = Input.GetAxis("Horizontal") * Time.deltaTime * 20;
 transform.Translate(Vector3(xMove,0,0));
 transform.position.x = Mathf.Clamp(transform.position.x, -10, 10);
}


27.Using Time.timeScale to Pause
timeScale 를 이용한 일시정지..(스페이드바 키를 이용)

var paused : boolean = false;
 
function Update () {
 if(Input.GetButtonUp("Jump")){
  if(!paused){
   Time.timeScale = 0;
   paused=true;
  }else{
   Time.timeScale = 1;
   paused=false;
  }
 }
}


28. SendMessage() to Call External Functions

자.. 그러니까.. 외부 함수를 SendMessage를 통해서 전달할수가 있다는 말이야.

var downTexture : Texture2D;
 
function React () {
 renderer.material.mainTexture = downTexture;
 yield WaitForSeconds(1);
 gameObject.AddComponent(Rigidbody);
}

 

function OnCollisionEnter(col : Collision) {
 if(col.gameObject.name == "Switch"){
  gameObject.Find("Block").SendMessage("React");
 }
}


'개발지식창고 > Unity3D' 카테고리의 다른 글

Unity3D 개요  (0) 2012.02.26
Unity3DStudent 를 이용한 공부 2/2  (0) 2012.02.26
MonoBehaviour 로 오버라이딩 되는 함수 정리  (0) 2012.02.26
기본 용어 및 개념정리  (0) 2012.02.26
Unity 3D란?  (0) 2012.02.26
Posted by 모과이IT
,

출처 : http://forum.unity3d.com/threads/34015-Newbie-guide-to-Unity-Javascript-(long)

** Text in RED applies to Unity iPhone users only

1. 변수 VARIABLES

Think of a variable as a container that holds something.

You can choose to name a variable anything you wish, as long as it contains no spaces, starts with a letter (preferably lower case), contains only letters, numbers, or underscores, and is not a reserved keyword.

Use the keyword 'var' to create a variable. Let's call our first one 'box'.

Code:
var box;

There you go, you've declared your first variable! If you're wondering about the semicolon at the end, statements (commands) in Javascript must end in a semicolon.

iPhone programmers, if you declare a variable without setting it to a value, you must state what type the variable is, in this case String. Common types include String, int, float, boolean, and Array. Note that proper capitalization is necessary!

var box : String;

Of course, our box is empty, so let's set it to a value by adding the following line:

Code:
box = "apple";

Now our box contains a text string (variable type), which happens to be "apple".
Note that you can declare your variable and set it to a value in the same statement:

Code:
var box = "apple";


But once it's declared, you can't declare it again.
You can, however, change it to another value (as long as the new value is the same type as the original).

Code:
box = "orange";

In addition to text strings, variables can hold numbers:

Code:
var number = 10;

This is an integer (int), which means whole numbers only... no decimal places.
But we could also do a floating point number (float), which has decimal places:

Code:
var myFloat = 10.5;

Variables can also contain booleans. A boolean is simply a true/false value:

Code:
var gameOver = true;


We'll discuss these more later.

Notice that a variable can normally only contain one thing at a time. But we can make a variable that contains multiple things, by creating an array:

Code:
var applePie = Array("apple", "brown sugar", "butter", "pie crust");

This variable contains everything you need to make an apple pie!

If we wanted to view the contents of applePie, we could output it to the Unity console using the Debug command. Add this line to the code above:

Code:
Debug.Log(applePie);

On play, the console should display:

apple,brown sugar,butter,pie crust

To access a single element (item) from an array, we can access it thru its index (position in array). This may seem confusing, but indexes start at 0. So index 0 is actually the first element in the array.

Code:
var applePie = Array("apple", "brown sugar", "butter", "pie crust");
var item1 = applePie[0];
Debug.Log(item1);


You can actually use indexing with Strings as well. The following code displays the first character of "hello", the letter 'h':

Code:
var myString = "hello";
Debug.Log(myString[0]);

Now lets alter our variables in other ways.
We can add variables:

Code:
var number1 = 10;
var number2 = 11;
var total = number1 + number2;
Debug.Log(total);

If you add an int (integer) to a float (floating point number) the result becomes a float:

Code:
var number1 = 100;
var total = number1 + 1.5;
Debug.Log(total);

Obviously, we can also subtract/divide/multiply ints and floats.
Less obvious, we can also 'add' strings. This merges them together:

Code:
var string1 = "apple";
var string2 = "cider";
var combo = string1 + string2;
Debug.Log(combo);

If we add a number to a string the result becomes a string.
We can also multiply strings.

Code:
var greeting = "howdy";
Debug.Log(greeting * 3);

Unfortunately, we can't divide or subtract strings. There are ways to split strings and remove parts of strings, but that is a more advanced topic.

Let's wrap up our discussion on variables with incrementing numbers (changing their value by a set amount).

First, declare a variable and set it to 1:

Code:
var number = 1;

We can increment numbers various ways. 

Code:
number = number + 1;

The above adds 1 to our number, and it becomes 2.
But programmers are lazy, and decided this was too long. So they abbreviated it to: 

Code:
number += 1;

This is simply shorthand for number = number + 1;
But guess what? Lazy programmers decided even THIS was to long, and shortened it to: 

Code:
number ++;

Use whichever makes most sense to you, they all do the same thing! But note that if you choose to increment by a value other than 1, ++ won't work.

++ is shorthand for += 1 only.

You can also do the same with subtraction: 

Code:
number --;

But for division and multiplication, you must use one of the longer forms:

Code:
number = number/2;
number *= 2;

Note that an asterisk means multiply, a slash means divide.


2. 조건문 IF STATEMENTS

If statements are conditional statements. If a condition evaluates as true, do something.

We can do a comparison of two values by using two equal signs, ==

"number == 10" evaluates as true if our number variable equals 10, otherwise it evaluates as false.

Note: it's important to remember to use two equal signs when comparing variables/values, but one equal sign when setting a variable to a value!

The following creates a variable and sets it to true, checks to see if the variable equals true, and if so prints a text string to the console:

Code:
var gameStarted = true;
if (gameStarted == true)
 Debug.Log("Game has started");


The above is actually redundant, since our variable 'gameStarted' is a boolean. There is no reason to check "if true equals true", just check "if true":

Code:
var gameStarted = true;
if (gameStarted)
 Debug.Log("Game has started");



If you're wondering why I didn't put a semicolon behind if (gameStarted), it's because technically it is only the first half of the statement. I could have written it like so:

Code:
if (gameStarted) Debug.Log("Game has started");

I could have also written it this way:

Code:
if (gameStarted){
 Debug.Log("Game has started");
}

Those brackets represent a block of code, and tell the if statement to execute anything in between... if the condition is true!

When if contains only one statement to execute, the brackets are optional. But if it contains more than one statement, you MUST use the brackets! Note that semicolons are not needed after brackets.

Code:
var gameStarted = false;
If (gameStarted == false){
 gameStarted = true;
 Debug.Log("I just started the game");
}

Read the second line of code above. Remember those lazy programmers? They don't want to write

Code:
if (gameStarted == false)

When they can just write:

Code:
If (not gameStarted)

But you know what? Why write 'not' when I can shorten that too?

Code:
if (! gameStarted)

Yes, an exclamation point means 'not' to lazy programmers!
You can also combine this with equals, where it means "not equals":

Code:
var answer = 1;
if (answer != 42) Debug.Log("Wrong question!");


You can also check for greater than or less than:

Code:
var age = 18;
if (age > 18)
 Debug.Log("old enough");
else if (age < 18)
 Debug.Log("jailbait");
else
 Debug.Log("exactly 18");

Notice the 'else if' and 'else' keywords? if the first if statement condition fails (evaluates as false), it then checks the condition under else if. If that one fails, it will check the next else if (if one is available), and finally if all conditions fail, it executes the statement under else. Again, if the 'if', 'else if', or 'else' statements contain more than one statement, each block of code must be separated by brackets.

You can also check for multiple conditions in a single statement:

Code:
if (age >= 21 && sex == "female")
 buyDrink = true;



Above, we introduced greater than or equal to >= and the AND operator, which is two ampersand characters: &&. If both conditions are true, the statement is executed. If even one is false, the statement is not.

Note: if you want to run the above code, remember to create variables for age (int), sex (String), and buyDrink (boolean) first!

Code:
if (engine == "Unity" || developer == "friend")
 buyGame = true;


Above, we used the OR operator, which is two pipe characters: ||. If either condition is true, the statement is executed. If both are false, the statement is not.

Note: if you want to run the above code, remember to create variables for engine (String), developer (String), and buyGame (boolean) first!

If can also be used with the keyword 'in'. This is generally used with Arrays:

Code:
var names = Array("max", "rick", "joe");
if ("joe" in names) Debug.Log("Found Joe!");




3. 순환문 LOOPING

Looping allows you to repeat commands a certain amount of times, usually until some condition is met.
What if you wanted to increment a number and display the results to the console?
You could do it this way:

Code:
var number = 0;
number += 1;
Debug.Log(number);
number += 1;
Debug.Log(number);
number += 1;
Debug.Log(number);

And so on... but this is redundant, and there is nothing lazy programmers hate more than rewriting the same code over and over!

So lets use a For Loop:

Code:
var number = 0;
for (i=1; i<=10; i++){
 number += 1;
 Debug.Log(number);
}

Okay, that for statement on the second line may look a little confusing. But it's pretty simple actually.
i=1 -created a temporary variable i and set it to 1. Note that you don't need to use var to declare it, it's implied.
i<=10 -how long to run the loop. In that case, continue to run while i is less than or equal to 10.
i++ -how to increment loop. In this case, we are incrementing by 1, so we use the i++, shorthand for i+=1

If we're just printing 1 thru 10, our code above could be shortened. We don't really need the number variable:

Code:
for (i=1; i<=10; i++)
 Debug.Log(i);

Just like if statements, brackets are optional when there is only one statement to execute. Talk about beating a dead horse...

We can also count backwards:

Code:
for (i=10; i>0; i--)
 Debug.Log(i);

Or print all even numbers between 1 and 10:

Code:
for (i=2; i<=10; i+=2)
 Debug.Log(i);

We could also use a While loop, an alternative to For statements.
While executes repeatedly until a condition is true.

Code:
var number = 0;
while (number < 10){
 number ++;
 Debug.Log(number);
}

While loops are most useful when used with booleans. Just make sure the escape condition is eventually met, or you'll be stuck in an infinite loop and the game will most likely crash!

Code:
var playerJumping = true;
var counter = 0;
while (playerJumping){
 //do jump stuff 
 counter += 1;
 if (counter > 100) playerJumping = false;
}
Debug.Log("While loop ended");

Notice the fourth line of code above? The one that starts with two slashes? This means the text afterwards is a comment, and will not be executed. Comments are useful for noting how your code works for yourself or others, for putting in placeholder text to be replaced later (as above), or for commenting out sections of your code for debug purposes.


4. 함수 FUNCTIONS

If you thought loops were a time saver, wait until you find out about functions!
Functions allow you to execute a whole bunch of statements in a single command.

But lets keep things simple at first. Lets define (create) a function that simply displays "Hello world" on the console.

Code:
function SayHello(){
 Debug.Log("Hello world");
}

To execute, or 'call' this function, simply type:

Code:
SayHello();

Note the parenthesis after our function. They are required, both when we define our function and call it. Also note that our function name is capitalized. It doesn't have to be, but capitalizing function names is the norm in Unity.

What if we wanted a function to say different things? We can pass a value, or argument, to the function:

Code:
function Say(text){
 Debug.Log(text);
}

Above, text is the argument, a temporary variable that can be used within the function only.

iPhone programmers, you should also state what type the argument is, in this case String.
function Say(text : String){

Now when we call our function, we have to provide an argument:

Code:
Say("Functions are cool!");

We can also pass variables:

Code:
var mytext = "I want a pizza";
Say(mytext);

Another useful thing functions can do is return a value. The following function checks to see if a number is even and if so it returns true, else it returns false:

Code:
function EvenNumber(number){ 
 //iPhone programmers, remember to add type to arg (number : int);
 if (number % 2 == 0)
        // NOTE: % is the mod operator. It gets the remainder of number divided by 2
  return true;
 else
  return false;
}

var num = 10;
if ( EvenNumber(num) )
 Debug.Log("Number " + num + " is even");


When the return command is executed in a function, the function is immediately exited (stops running). Returns don't have to return a value:

Code:
function Update(){
 if (!gameStarted) return; //exit function
}

The Update() function above is one of the main functions in Unity. You do not have to call it manually, it gets called automatically every frame.


5. 오버로딩 OVERLOADING FUNCTIONS

Functions can be overloaded. Sounds complicated, but it's really quite simple. It means you can have multiple versions of a function that handles different types of arguments, or different numbers of arguments.

To handle different types of arguments, simply use the colon : to state the type of argument being passed. Common types include String, int, float, boolean, and Array. Note that proper capitalization is necessary!

Code:
function PrintType(item : String){
 Debug.Log("I'm a string, type String");
}

function PrintType(item : int){
 Debug.Log("I'm an integer, type int");
}

function PrintType(item : float){
 Debug.Log("I'm a float, type float");
}

function PrintType(item : boolean){
 Debug.Log("I'm a boolean, type boolean");
}

function PrintType(item : Array){
 Debug.Log("I'm an array, type Array");
}

function PrintType(item: GameObject){ //catches everything else
 Debug.Log("I'm something else");
}

function PrintType(){
 Debug.Log("You forgot to supply an argument!");
}

PrintType();
PrintType("hello");
PrintType(true);

6. 클래스 CLASSES

So variables have different types, such as String and int. But what if you need a new type that does something different?

Classes are simply new types that YOU create.

Code:
class Person{
 var name;
 var career;
}

//Create objects of type Person
var john = Person();
john.name = "John Smith";
john.career = "doctor";
Debug.Log(john.name + " is a " + john.career);

The above class has two class variables, or properties, name and career. You access them by typing the name of the instance (in this case, John) followed by a period and the name of the property.

You can also pass arguments when creating instances of a class. You do this by creating a constructor, which is a special function that is automatically called whenever a new instance of your class is created. This function has the same name as your class, and is used to initialize the class:

Code:
class Animal{
 var name;
 function Animal(n : String){ //this is the constructor
  name = n;
  Debug.Log(name + " was born!");
 }
}

cat = Animal("Whiskers");   //var keyword is optional when creating instances!

Classes can have regular functions as well. Class functions are sometimes called methods. Again, you access these by typing the name of your instance followed by a period and the function name (don't forget the parenthesis). This is useful for having instances interact with one another:

Code:
class Person{
 var name : String;
 function Person(n : String){
  name = n;
 }
 function kiss(p : Person){
  Debug.Log(name + " kissed " +  p.name + "!");
 }
}

jenni = Person("Jenni");
bob = Person("Bob");
jenni.kiss(bob);

7. 상속 INHERITANCE

Classes can inherit or extend (add functionality to) another class. The class that gets inherited from is usually called the base class or the parent class. The extended class is also called the child class or the derived class.

This will be our base class:

Code:
class Person{
 var name : String;
 function Person(n : String){ //constructor
  name = n;
 }
 function Walk(){ //class function
  Debug.Log(name + " is walking");
 }
}

To extend this class, create a new class with the keyword 'extends':

Code:
class Woman extends Person{
 var sex : String;
 function Woman(n : String){ //constructor
            super(n);  //calls the original constructor and sets name
     sex = "female"; //adds additional functionality to the extended class
 }
 function Walk(){
  super.Walk(); //calls the original function
  Debug.Log("And she is so sexy!"); //adds additional functionality to the extended class
 }
}

Note that we can access the base/parent class properties and functions by using the keyword 'super'.

If we create an instance of Woman and call function Walk(), both the parent and child function are called:

Code:
amanda = Woman("Amanda");
amanda.Walk();



8 .BUILT IN TYPES AND PROPERTIES

Now you're probably wondering, "if classes, the types I create, can have properties and functions, why can't the built in types"?

They do, actually.

To convert an int to a String, use the built-in function ToString():

Code:
var number = 10;
var text = number.ToString();


To get the length of an Array (or a String), use the built-in property length:

Code:
var animals = Array("cat", "dog", "pig", "dolphin", "chimpanzee");
var total = animals.length;

You can use this in a for loop. Add the following two lines to the code above:

Code:
for (i=0; i<animals.length; i++){
 Debug.Log(animals[i]);
}


This displays the contents of our array, one item at a time.
To add an item to an Array, use the function Add():

Code:
animals.Add("lemur");

To split a String into an array, use the function Split():

Code:
var sentence = "The quick brown fox jumped over the lazy dog";
var words = sentence.Split(" "[0]);
Debug.Log(Array(words));

To get a part of a String, use the function Substring(). Substring takes two arguments, the starting index and the ending index:

Code:
var sentence = "The quick brown fox jumped over the lazy dog";
var firstHalf = sentence.Substring(0, 19);
Debug.Log(firstHalf);

To capitalize a text string, use the function ToUpper();

Code:
var mission = "go make cool games!";
Debug.Log( mission.ToUpper() );

As you might expect, there is also a ToLower() function.

Code:
Debug.Log( ("THE END").ToLower() );



아래는 가이드 이고, 다운받아서 보시면 도움이 되지요~

Intro to the Unity Interface:
http://download.unity3d.com/support/...Essentials.pdf

Intro to Scripting with Unity - read sections labeled "Our first script", and "Attaching the script".
http://download.unity3d.com/support/...20Tutorial.pdf

Posted by 모과이IT
,

출처 : http://kimseunghyun76.tistory.com/194

1. MonoBehaviour
 
  모든 스크립트가 상속받는 기본 클래스입니다.
 (Javascript 는 무조건 MonoBehaviour 를 상속받고 C#, Boo 의 경우 명시적으로 상속받아야 합니다.
  C#, Boo 에서 단순 데이터 보관용 클래스, 전역으로 동작하는 매니저 클래스같은 건 상속받지 않고 쓸 수 있습니다.)
  MonoBehaviour 는 Behaviour 클래스를 상속받고 Behaviour 는 Component 를 상속받습니다.
  즉 MonoBehaviour 를 상속받은 클래스는 게임 오브젝트에 component 로 붙일 수 있다는 뜻입니다.(붙일 수 있다는 건 모두 알고 계시죠? ㅎㅎ)
Behaviour 클래스는 enable/disable 가능합니다.
때문에 MonoBehaviour 도 역시 켜고 끌 수 있습니다.
(스크립트를 Inspector 에 붙이면 앞에 체크박스가 나오죠? 그겁니다.)
레퍼런스를 보면 MonoBehaviour,  Behaviour, script 라는 명칭을 혼재해서 쓰는데 혼란을 줄 수 있으니, 앞으로 모두 '스크립트'로 통칭하도록 하겠습니다.

2. 앞에 On 이 붙지 않는 함수

 1) Update

  Update 함수는 스크립트가 켜져 있을 때(enabled 상태일 때) 매 프레임마다 호출됩니다.
  Update 함수는 스크립트에서 가장 빈번하게 사용되는 함수입니다.
  지나간 시간을 알고 싶으면, Time.deltaTime 을 사용하면 됩니다.
  이 함수는 스크립트가 켜져 있을 때만 불립니다.

 2) LateUpdate

   LateUpdate 함수는 스크립트가 켜져 있을 때 매 프레임마다 호출됩니다.
   LateUpdate 함수는 모든 Update 함수가 호출된 후 호출됩니다.
   이것은 스크립트의 실행 순서를 정하는 것에 도움이 됩니다.
   예를 들어 따라다니는 카메라는 언제나 LateUpdate 를 구현해야 하는데, 그 이유는 이 카메라가 따라가는 오브젝트들은
   Update 함수 안에서 움직일 가능성이 있기 때문입니다. 이 함수는 스크립트가 켜져 있을 때만 불립니다.

 3) FixedUpdate

   FixedUpdate 함수는 스크립트가 켜져 있을 때 매 프레임마다 호출됩니다.
   FixedUpdate 함수는 Rigidbody 를 다룰 때 Update 대신에 사용됩니다.
   예를 들어 rigidbody에 일정한 힘을 가할 때, FixedUpdate를 구현하여 매 fixed frame 마다 힘을 가해주어야 합니다.
   ※ FixedUpdate 는 매 프레임마다 호출되지만 한 프레임에 여러번 호출될 수도 있습니다. ??
  
* FixedUpdate 는 매 프레임마다 호출됩니다. 그런데 한 프레임에 여러번 호출될 수도 있습니다. 사실 이거 거짓말입니다.
   그냥 알기 쉽게 하려고 이렇게 적어넣은 것이고... 정확히 하면 'FixedUpdate 는 1초에 50번 매 0.02초마다 호출됩니다.
   그러니까 실제 렌더링 프레임 사이에 여러번 호출될 수도 있습니다.
   Update 는 실제 렌더링 프레임 기반으로 동작하지만 FixedUpdate 는 고정 프레임(아마 50fps)으로 다른 쓰레드에서
   동작한다고 생각하시면 됩니다.

   이렇게 나뉘어져 있는 이유는 주로 '물리 연산 중의 충돌 체크 및 정확한 움직임 처리의 근사' 때문입니다.
   물체는 곡선운동도 하고 회전운동도 하므로 그 궤적이 항상 직사각형이나 실린더 모양이라고 생각할 수 없습니다.
   물리 공식에 의해 곡선으로 움직이는 궤적도 계산해 낼 수 있고, 궤적 사이에 충돌 체크를 할 수도 있겠지만 여기에는
   막대한 CPU 자원이 들어갈 것입니다. (사실 3차원 곡면 사이의 충돌 검출이라.... 생각하는 것만으로도 머리 아퍼)
   그래서 대체로 물리 엔진은 시간을 아주 짧게 잘라서 물체를 이동시키고 충돌 체킹을 하게 됩니다.

   3D 에서 평면 폴리곤으로 곡면을 표현하는 걸 생각하시면 될 것 같네요.
   잘게 자르면 자를 수록 점점 원하는 모양에 근사시킬 수 있죠?
  즉, 전체적인 모습을 보면 곡선의 움직임이지만 자세히 들여다 보면 직선 움직임의 덩어리라는 것이죠.
  계산상으로 직선을 처리하는 것 (1차 방정식) 과 곡선 (2차 이상의 방정식 or 심하면 음함수 그래프 같은 움직임까지)을
  처리하는 것은 넘사벽의 차이가 있습니다.
  어쨌든 계산을 빠르고 편하게, 하지만 나름 정확하게 하기 위해 이런 방식을 씁니다.
  (제가 예전에 담당하고 있던 라이브 게임에도 이펙트 코드에 가끔씩 이전 프레임과의 시간 차이를 계산한 후에
  더 자잘하게 잘라서 실제 처리하는 함수를 여러번 호출하는 루틴도 있었습니다.)
 
   참고로 테스트 해 보니 아무런 조작도 없을 때 FixedUpdate 실행 주기는 0.02 초 정도인 듯 합니다.
   (위에서 50fps 라고 적은 이유)
  
   사실 스크립트 짜는 데 아무런 도움도 안될 것 같은 느낌이 드는데 그냥 '이런 저런 사정 때문에 이런 함수가 있고,
   이렇게 동작한다.' 정도만 아시면 될 것 같습니다.
   

 // 매 프레임마다 rigid body 에 위로 향하는 힘을 가해준다.
 // 즉 이 예는 등가속 운동입니다. (Vector3.down 하면 중력을 받는 것과 동일하다는 뜻입니다.)
function FixedUpdate()
 {
     rigidbody.AddForce(Vector3.up);
 }

 

4) Awake

  Awake 함수는 스크립트 객체가 로딩될 때 호출됩니다.
  Awake 함수는 게임이 시작하기 전에 변수나 게임 상태를 초기화하기 위해 사용합니다.
  Awake 함수는 스크립트 객체의 라이프타임 동안 단 한번만 호출됩니다.
  Awake 함수는 모든 오브젝트가 초기화된 후 호출되기 때문에, 다른 오브젝트에 메시지를 날리거나 GameObject.FindWithTag 같은 함수를 안전하게 사용할 수 있습니다.
이런 이유로 Awake 함수에서 스크립트를 레퍼런싱한 후, Start 함수에서 필요한 정보를 넘겨받거나 넘겨줄 수 있습니다.
Awake 함수는 언제나 Start 함수 전에 호출됩니다. 이것은 스크립트의 초기화 순서를 정할 수 있게 합니다.
Awake 함수는 coroutine 으로 동작할 수 없습니다.

 5) Start

  Start 함수는 Update 함수가 처음 호출될 때 Update 함수 직전에 호출됩니다.
  Start 함수는 스크립트가 동작하는 라이프타임 동안 단 한번만 호출됩니다.
  Awake 함수와의 차이는 Start 함수는 스크립트가 켜져있을 때만 호출된다는 것입니다.
  이것은 정말로 필요할 때까지 초기화 코드 실행을 연기시킬 수 있습니다.
  Awake 함수는 언제나 Start 함수가 호출되기 전에 호출됩니다. 이것은 스크립트의 초기화 순서를 정할 수 있게 합니다.
  Start 함수는 모든 스크립트 객체의 Awake 함수가 호출된 후에 호출됩니다.

 6) Reset

  기본값으로 리셋합니다.
  Reset 함수는 유저가 Inspector의 context menu 에서 Reset 버튼을 눌렀을 때나, 게임 오브젝트에 스크립트를 처음 붙였을 때 호출됩니다. 이 함수는 에디터 모드에서만 호출됩니다.
Reset은 Inspector에 초기 값을 설정할 때 가장 자주 사용하는 함수입니다.

 
 7 ) Awake, Start, Update, LateUpdate 순서도

'A,  B, C 라는 게임 오브젝트가 있고, A, B 에 스크립트가 하나씩 붙어있습니다. B는 스크립트가 비활성화 되어 있습니다.'
 라는 상황을 가정하겠습니다.

 1. 게임이 로딩되면 우선 A, B, C 모든 게임 오브젝트가 초기화 됩니다.
 
 2. 이후 A, B 에 붙어있는 스크립트의 Awake 함수가 호출됩니다.
   (이 상황에서도 이미 A, B, C 게임 오브젝트와 구성 컴포넌트는 모두 메모리에 들어있는 상태이므로 null 체크
   이런 거 없이 안심하고 데이터 전달 등을 할 수 있습니다.)

 3. 이후 A 의 Update 함수가 호출되려고 합니다. B 는 스크립트가 비활성화 상태이기 때문에 동작하지 않습니다.

 4. A 의 Update 함수가 호출되려고 하는데, 이번이 첫번째 호출이네요! 우선 Start 가 호출됩니다.

 5. A 의 Start 가 호출되었으니 Update 가 호출됩니다. 앞으로 매 프레임마다 호출되겠네요.

 6. A 의 LateUpdate 도 호출됩니다. 역시 앞으로 매 프레임마다 호출됩니다.

 - 여기서 B의 스크립트를 활성화시켰습니다.

 7. B 의 Update 함수도 호출되기 시작합니다. 제일 처음 Update 호출될 때 역시 Start 가 우선 한 번 호출됩니다.

 8. A, B 의 Update 함수가 모두 호출된 후 A, B 의 LateUpdate 가 호출됩니다.

 - 여기서 C에 스크립트 컴포넌트를 붙였습니다.

 9. C 에 스크립트가 붙자 C의 Awake 가 호출됩니다.

 10. A, B, C 의 Update 차례. C의 경우 처음 Update 호출이라서 그전에 Start 함수가 우선 호출됩니다.

 11. A, B, C 의 LateUpdate 차례. A, B, C 의 모든 Update가 끝나면 호출되기 시작합니다.


 


3. On~ 계열 함수

 1) OnMouse~ 함수군

  마우스와 GUIElement, Collider 사이의 인터랙션에 관련한 함수 집합입니다.
  게임 오브젝트가 Ignore Raycast 레이어에 속해있으면 호출되지 않습니다. (내부적으로 Raycast 를 하는 듯.)
  이 함수들은 co-routine 으로 사용할 수 있습니다. (yield 사용 가능.)
  이 이벤트는 GUIElement, Collider 에 붙어있는 모든 스크립트에 전달됩니다.

  OnMouseEnter - 마우스가 처음 오브젝트 위로 올라왔을 때 호출.
  OnMouseOver - 마우스가 오브젝트 위에 있을 경우 매 프레임마다 호출.
  OnMouseExit - 마우스가 처음 오브젝트 밖으로 나갔을 때 호출.
  OnMouseDown - 오브젝트 위에서 마우스 버튼을 눌렀을 때 호출.
  OnMouseUp - 오브젝트 위에서 마우스 버튼을 땠을 때 호출. 눌렀을 때의 오브젝트와 같은 오브젝트일 때만 호출됨.
  OnMouseDrag - 오브젝트 위에서 마우스 버튼을 누른 상태로 있을 때 매 프레임마다 호출.

  여기서 Drag 는 일반적으로 생각하는 드래그가 아니라 그냥 꾸욱 누르고 있는 상태를 나타냅니다.
 (물론 그 상태로 마우스를 움직이면 드래그지만..)
  그리고 오브젝트 위에 마우스를 올려놓고 누르고 있으면 Over와 Drag 가 매 프레임마다 호출됩니다.
  Drag 호출된다고 Over 호출 안된다거나 하는 거 없습니다. *ㅅ*

  스크립트가 enable / disable 과 상관없이 호출됩니다.
  즉 Inspector 에서 체크박스를 해제해도 스크립트가 붙어있다면 무조건 호출됩니다.
  앞으로 '스크립트가 켜져있을 때만 호출된다.' 는 말이 없으면 기본적으로 비활성화 상태에서도 호출된다고 생각하세요.

 2) OnTrigger~(other : Collider), OnCollision~(collisionInfo : Collision) 함수

  OnTrigger~, OnCollision~ 은 모두 충돌 관련 함수입니다.
  충돌이 일어나려면 두 오브젝트 모두 Collider 를 가져야 하고 둘 중 하나는 Rigidbody 를 가져야 합니다.
  그리고 Rigidbody 를 가진 쪽이 움직여서 서로 만날 경우만 이벤트가 일어납니다. 물론 둘 다 움직이고 있어도 됩니다.
  (그러니까 Rigidbody 를 가진 녀석은 가만히 있는데 그냥 Collider 가 아무리 와서 들이박아도 아무런 일도 생기지 않는다는 겁니다. ==> 중요한것입니다.)

  Trigger 는 Inspector 창에서 Collider 의 Is Trigger 속성이 켜져있을 때 발생합니다.
  Trigger 가 켜져있을 때는 Collision 관련 함수는 호출되지 않습니다.
  Trigger 가 켜져있을 때는 두 오브젝트 사이에 물리 계산이 이루어지지 않습니다.
   그래서 Trigger 는 단순한 '영역' 으로 이해하는 것이 좋습니다.

  Collision 은 두 오브젝트 중 적어도 하나가 Inspector 창에서 Rigidbody 의 Is Kinematic 속성이 꺼져있을 때 발생합니다.
   (Is Kinematic 이 켜져있으면 이 오브젝트는 내부 물리연산을 하지 않기 때문에 부딪쳐도 그냥 뚫고 지나갑니다.)
  두 오브젝트 모두 Kinematic 속성이 켜져있으면 어느 쪽이 움직여서 겹치더라도 물리 연산이 이루어지지 않기 때문에
  충돌 함수가 호출되지 않습니다.

  Trigger 는 함수의 파라메터로 Collider 변수가 들어옵니다. 이것은 자신과 접촉한 오브젝트의 Collider 입니다.
  Collision 은 함수의 파라메터로 Collision 변수가 들어옵니다. 이것은 접촉에 대한 여러가지 정보를 담고 있는 클래스입니다.

  relativeVelocity - 두 오브젝트의 상대 속도입니다. 충격량이라는 느낌일까요? (읽기 전용)
  rigidbody - 자신과 접촉한 Rigidbody 입니다.
                  만약 상대가 Rigidbody 가 없는 Collider 라면 이 값은 null 입니다. (읽기 전용)
  collider - 자신과 접촉한 Collider 입니다. (읽기 전용)
  transform - 자신과 접촉한 오브젝트의 Transform 정보입니다. (읽기 전용)
  gameObject - 자신과 접촉한 오브젝트입니다. (읽기 전용)
  contacts - 물리 엔진에서 연산한 접촉 포인트 정보입니다. ContactPoint 의 배열입니다.

두 종류 모두 ~Enter, ~Stay, ~Exit 함수를 제공합니다.

Enter 는 접촉을 시작했을 때 호출,
Stay 는 접촉 중일 때 매 프레임마다 호출,
Exit 는 접촉이 끝났을 때 호출됩니다.

두 함수군 모두 yield 사용 가능합니다.


 * Mesh Collider 관련해 추가 설명

기본 도형으로 이루어진 Collider 이외에 실제 모델같은 Mesh Collider 를 붙일 수도 있습니다. (알고 계시겠죠? ㅎ)
그런데 기본적으로 Mesh Collider 는 다른 Mesh Collider 와 충돌 계산이 이루어지지 않습니다.
아마 계산이 오래 걸리기 때문에 막아놓은 것으로 보입니다. 기본 도형은 대체로 방정식 몇번 풀면 체크 끝나지만, Mesh 는... 모든 폴리곤을 순회하면서 체크해야 하니까요.
그래도 하고 싶은 사람을 위해 준비된 Inspector 창의 Mesh Collider 의 Convex 속성을 켜면 다른 Mesh Collider 와 충돌 계산을 합니다. 단, Convex 속성을 켜기 위해서는 Mesh Collider 의 폴리곤 개수가 255개를 넘으면 안됩니다.
이런 제한이 있습니다~ 간단한 게임이나 계산 파워가 부족한 iphone 게임을 만들 때는 굳이 Mesh Collider 쓸 필요는 없을 것 같습니다.

3) OnControllerColliderHit(hit:ControllerColliderHit)
 CharacterController 가 Move 함수로 이동하는 도중 다른 Collider 와 충돌했을 때 호출됩니다.
 (CharacterController 가 붙어있는 gameObject 를 Translate 로 움직여서 충돌할 때는 호출되지 않습니다. 
  무조건 CharacterController 의 Move 함수로 움직일 때만 호출됩니다.)
CharacterController 는 이전 충돌 함수 때처럼 따로 Rigidbody, Collider 가 필요없습니다.

4) OnJointBreak(breakForce:float)
게임 오브젝트에 붙어있는 조인트가 끊어질 때 호출됩니다.
조인트에 설정된 breakForce 보다 높은 힘이 가해지면 조인트는 끊어집니다.
조인트가 끊어질 때 주어진 힘이 파라메터로 들어옵니다.
조인트가 끊어지고 OnJointBreak 가 호출된 후 조인트는 자동적으로 게임 오브젝트에서 지워집니다.

5) OnParticleCollision(other:GameObject)
파티클이 Collider 와 충돌했을 때 호출됩니다.
WorldParticleCollider 와 충돌한 Collider 에 붙어있는 모든 스크립트에 호출됩니다.
Inspector 창에서 WorldParticleCollider 의 sendCollisionMessage 속성을 켜야지 호출됩니다.
 (즉, 기본적으로 WorldParticleCollider 가 붙어있어야 합니다.)
Collider 는 따로 Rigidbody 일 필요 없습니다. yield 사용 가능합니다.

6) OnBecameVisible / OnBecameInvisible
 renderer 가 어떤 카메라에 보이기 시작할 때, 보이지 않기 시작할 때 호출됩니다.

레퍼런스 설명은 위와 같은데, '어떤' 카메라라는 것은 여러대의 카메라가 있을 때 그 중 하나라도 보이기 시작하면 Visible, 모두 보이지 않을 때 Invisible 이라는 것이며, 단, 카메라가 있어도 비활성화 상태이거나 화면에 보이지 않을 경우 (즉 View Port Rect 의 width, height 가 0일 때) 는 '어떤' 카메라에 포함되지 않습니다.
오브젝트의 renderer 컴포넌트를 꺼도 마찬가지로 Invisible 입니다.

그러니까 단순히 말해서  어쨌든 화면에 보이기만 하면 Visible, 안보이면 Invisible 입니다.

renderer 에 붙어있는 모든 스크립트에 호출됩니다.
화면에 보일 때만 스크립트가 처리되도록 할 때 유용합니다.
yield 사용 가능합니다.

 // 화면에 보일 때만 스크립트 활성화.
function OnBecameVisible ()
 {
     enabled = true;
 }
 function OnBecameInvisible()
 {
     enabled = false;
 }


주의점이 있습니다. 툴에서 작업할 때 Scene View 에도 동일하게 동작합니다.
Game View 에서 안보여도 Scene View 에서 보이고 있는 상태라면 Invisible 호출이 안됩니다.

7) OnLevelWasLoaded(level:int)
새로운 레벨(scene)이 로딩되었을 때 호출됩니다.
level 파라메터는 로딩된 레벨의 인덱스를 나타냅니다.
메뉴 File - Build Settings... 에서 레벨과 인덱스를 설정할 수 있습니다.
yield 사용 가능합니다.
레퍼런스에는 적혀있지 않지만 해당 장면의 모든 스크립트에서 호출되는 것 같습니다.

8) OnEnable/OnDisable
스크립트가 켜지거나 꺼졌을 때 호출됩니다.
추가로 OnDisable 의 경우 스크립트가 붙은 게임 오브젝트가 제거될 때도 호출되므로 파괴자로 사용할 수 있습니다.
툴에서 플래이 모드 중에 스크립트를 편집할 경우, 편집이 끝난 후 스크립트가 다시 로딩되면서 OnDisable, OnEnable 이 순차적으로 호출됩니다.
참고로 툴에서 플래이 중 스크립트를 고쳤을 때 고쳐진 스크립트의 Awake, Start 는 호출되지 않습니다.
그리고 OnEnable 은 Awake 함수 바로 다음에 호출됩니다. (켜져있을 경우)

9) OnGUI
 GUI 를 그리거나 이벤트를 처리하기 위해 호출됩니다.
이벤트 처리도 맡고있기 때문에 한 프레임에 여러번 호출될 수 있습니다. (한 이벤트에 한 번) 스크립트가 꺼져있으면 호출되지 않습니다.
OnGUI 함수 안에서 Event.current 를 사용하면 현재 처리하고 있는 이벤트 내용을 알 수 있습니다.
이 때 사용되는 Event 클래스의 내용은 다음과 같습니다.

 type - 이벤트의 타입. (http://unity3d.com/support/documentation/scriptReference/EventType.html)
 mousePosition - 마우스 위치. (Vector2)
 delta - 지난번 처리한 이벤트와 현재 마우스 위치의 차이. (Vector2)
 button - 어떤 마우스 버튼이 눌려졌는지. (int) (0:왼쪽, 1:오른쪽, 2:가운데)
 clickCount - 마우스 클릭 횟수. (int)
 character - 키보드로 입력한 문자. (char)
 commandName - 단축키로 입력된 명령. (string) ("Copy", "Cut", "Paste", "Delete"... 툴에서만 호출.)
 keyCode - 키보드로 입력한 가공되지 않은 키코드.(http://unity3d.com/support/documentation/scriptReference/KeyCode.html)
 shift - 쉬프트 눌려져 있는지.
 control - 컨트롤 눌려져 있는지.
 alt - 알트 눌려져 있는지.
 command - Command(맥)/Windows(윈도우) 키 눌려져 있는지.
 capsLock - CapsLock 켜져있는지.
 numeric - 키패드 입력인지.
 functionKey - 펑션키 입력인지.
 isKey - 키보드 이벤트인지.
 isMouse - 마우스 이벤트인지.

Event 클래스의 기타 함수는 영역이 애매해서 따로 설명하지 않습니다. (http://unity3d.com/support/documentation/scriptReference/Event.html)

10)  OnApplicationPause(pause:bool)
플레이어가 정지/재개될 때 모든 스크립트에서 호출됩니다. yield 사용 가능합니다.

11) OnApplicationQuit
어플리케이션이 종료되기 직전에 모든 스크립트에서 호출됩니다.

12) OnDrawGizmos
게임 오브젝트에 기즈모를 추가합니다.
이 기즈모는 선택할 때 사용할 수 있고 언제나 그려집니다.

13) OnDrawGizmosSelected
게임 오브젝트가 선택되었을 때 기즈모를 그리고 싶을 때 구현합니다. 이 기즈모는 선택에 사용할 수 없습니다.
Gizmos 클래스는 http://unity3d.com/support/documentation/scriptReference/Gizmos.html 에서 사용법을 확인할 수 있습니다.

혹 기즈모가 뭔지 모르시는 분은..
툴의 Scene 뷰에 빛이나 카메라의 위치를 볼 수 있게 해 주는 아이콘이 기즈모입니다.
눈에 보이지 않지만 위치 설정이 필요할 때, 중요한 오브젝트를 보기 좋게 표현하기 위해.. 기타 여러가지 이유로 사용할 수 있습니다. 실제 어플리케이션에는 표시되지 않지만 툴로 작업할 때 여러모로 편하게 해 줍니다.
공동 작업할 때 자주 사용하면 좋을 거라 생각합니다.

4. 렌더링에 관련한 고급 기능

 1) OnPreCull
 
카메라에서 장면을 컬링하기 전에 호출됩니다. 여기서 컬링이란 프러스텀 컬링입니다. (후면 컬링 아님)
  카메라에 붙어있는 스크립트에만 호출됩니다.
  카메라의 속성을 바꾸고 싶을 때, 이 함수 안에서 하면 좋습니다.
  이 함수가 호출된 후 실제 프러스텀 컬링을 하고 각 오브젝트가 화면에 그려질지 그려지지 않을지 정해집니다.

 2) OnPreRender
  카메라가 장면을 렌더링하기 전에 호출됩니다.
  카메라에 붙어있는 스크립트에만 호출됩니다.
  yield 사용 가능합니다.

 3) OnPostRender
  카메라가 장면을 렌더링한 후 호출됩니다.
  카메라에 붙어있는 스크립트에만 호출됩니다.
  yield 사용 가능합니다.
  이 함수는 해당 카메라가 모든 오브젝트를 렌더링한 후 호출됩니다.
  만약 '모든' 카메라와 GUI가 렌더링된 후 무언가를 하고 싶으면 WaitForEndOfFrame coroutine 을 사용하면 됩니다.

 4) OnWillRenderObject()
  해당 오브젝트를 렌더링하는 카메라마다 한 번 호출됩니다.
  (세 대의 카메라가 하나의 오브젝트를 보고 있으면 그 오브젝트에 붙어있는 스크립트에서 세 번 불린다는 뜻.)
  (툴에서 작업할 때는 Scene View 카메라도 들어갑니다.)
  이 함수는 렌더링하기 전, 컬링 중에 호출됩니다.
  Camera.current 를 사용하면 현재 어떤 카메라가 렌더링할 것인지 알 수 있습니다.

 5) OnRenderObject(queueIndex:int)
  오브젝트가 렌더링될 때 호출됩니다. queueIndex 는 해당 오브젝트를 렌더링할 때 사용하는 렌더 큐의 값입니다.
  RenderBeforeQueues 속성으로 특정한 렌더링 큐에서 동작하도록 설정할 수 있습니다.
  이 함수도 OnWillRenderObject 함수처럼 각 카메라가 그릴 때마다 한 번 호출됩니다.

 6) OnRenderImage(source:RenderTexture, destination:RenderTexture)
  모든 렌더링이 끝난 후 호출됩니다. 카메라에 붙어있는 모든 스크립트에서 호출됩니다.
  포스트 프로세스 효과를 줄 때 사용합니다. (Pro 전용)
  source 는 렌더링이 끝난 화면이며 destination 텍스쳐에 결과물을 그려주면 됩니다.
  카메라에 여러 이미지 필터가 붙어있을 경우 순차적으로 진행됩니다.


게임의 경우 때깔내는데 가장 중요한 포스트 프로세싱 부분이 Pro 전용으로 빠져있습니다.
(그러고 보니 free 에서 렌더 타겟이 사용 불가였으니 당연히 이것도 사용이 불가능하겠네요.)
여기 있는 함수들은 제가 사용해 본 적이 없고, 지금 당장 특별히 어떻게 쓰면 좋을지 잘 모르는 관계로 특별한 부연 설명 없이 레퍼런스를 옮겨적기만 했습니다.

참고로 3.0 부터 이쪽 함수들은 스크립트가 꺼져있으면 동작하지 않는다고 합니다.

5. 네트워킹 관련 함수
점점 써 본적이 없는 함수만 나와서 정말 난감하네요;;;

 1) OnPlayerConnected(player:NetworkPlayer)
   새 유저가 성공적으로 접속했을 경우 서버에서 호출됩니다.

 2) OnServerInitialized
   Network.InitializeServer 를 호출한 후 완료되었을 때 서버에서 호출됩니다.

 3) OnConnectedToServer
   서버에 성공적으로 접속했을 경우 클라이언트에서 호출됩니다.

 4) OnPlayerDisconnected(player:NetworkPlayer)
   유저의 접속이 끊겼을 경우 서버에서 호출됩니다.

 5) OnDisconnectedFromServer(mode:NetworkDisconnection)
  서버와 접속이 끊기거나 접속을 종료했을 때 클라이언트에서 호출됩니다.

 6) OnFailedToConnect(error:NetworkConnectionError)
  접속 시도가 실패했을 때 클라이언트에서 호출됩니다.

 7) OnFailedToConnectToMasterServer(error:NetworkConnectionError)
  서버나 클라이언트에서 마스터 서버로의 접속에 문제가 있을 경우 호출됩니다.

 8) OnMasterServerEvent(msEvent:MasterServerEvent)
  서버나 클라이언트로 마스터 서버에서 보낸 이벤트를 받았을 때 호출됩니다.

 9) OnNetworkInstantiate(info:NetworkMessageInfo)
  Network.Instantiate 함수로 네트워크를 통해 게임 오브젝트가 생성되었을 때 해당 오브젝트에서 호출됩니다.
  네트워크 상에서 새 게임 오브젝트가 생성되었을 때 다른 사람이 생성했는지 내가 생성했는지에 따라 오브젝트에 특별한
  처리를 할 때 유용합니다.

 10) OnSerializeNetworkView(stream:BitStream, info:NetworkMessageInfo)
  네트워크 상에서 전달되는 변수들(variables in a script watched by a network view)의 동기화 처리를 커스터마이징할
  때 사용합니다..
  이 함수는 직렬화된 값 (즉 BitStream으로 바뀐 정보)을 전달할 것인지 받을 것인지에 대해서 자동으로 판단합니다.
 (이 오브젝트를 소유권에 따라서 처리됩니다. 소유자는 보내고 나머지는 받고.)

사실 저같은 경우 tcp, udp 연결이 필요한 게임을 만드는 게 아니라 그냥 WWW 클래스만으로도 충분합니다..

'개발지식창고 > Unity3D' 카테고리의 다른 글

Unity3D 개요  (0) 2012.02.26
Unity3DStudent 를 이용한 공부 2/2  (0) 2012.02.26
Unity3DStudent 를 이용한 공부 1/2  (0) 2012.02.26
기본 용어 및 개념정리  (0) 2012.02.26
Unity 3D란?  (0) 2012.02.26
Posted by 모과이IT
,

1. 3D용어 

3D 그래픽스 좌우, 앞뒤, 상하를 표현한 그래픽스 
3D 그래픽스는 삼각형 폴리곤이 기본이고 이를 모아서 만든것이 Mesh라고 하며 모델을 생성한다.
vertex는 두선의 정점 
edge는 모서리
point는 점 
segment
3d오브젝트 좌표계 y,x,z축으로 구성 
world 좌표계

PS) 카메라 셋팅이 중요하다. 건물이 안보일수도 있다.


2. 카메라 

-  카메라 오브젝트와 대상이 되는 오브젝트의 위치를 카메라에 오브젝트가 개발자가 의도한대로 위치 시킨다.
-  카메라 속성

 - 투영법 -> 직교투영 - 원근감이 없는것 3d이지만 2d게임을 만들고 싶을때 쓴다. Orthographic
 -> 원근투영 - 원근감이 있는것 뒤에 있는것은 작아진다.  Perspective
     - frustum : 절두체 피라미드 머리를 날린다. Far와 Near를 이용하여 화면을 비율적으로 본다.
                     near이 0.3으로 되어 있는 이유 보이는 것이 있어야 하긴 때문에 0이 될수 없다.
         Far을 잡아 랜더링 할 부분까지 정해준다. 즉 최대 시야 범위를 정한다. 이 범위 만큼 리소스를 
         먹기 때문에 잘 정해줘야 한다. Far끝부분은 포그로 막아준다.
     - field of view : 화면의 각도를 늘리고 줄인다.  
 
 - 원근법


3. 화면구성

Scene - 화면 배치
Game - 실제 게임에서 보이는 화면
Project -  는 클래스라고 보면된다
Hierachy - 는 인스턴스라고 보면된다.
Inspector - 구성요소
transform - 객체 크기 위치 기울기 조정
GameObject - 객체
Component - 구성 메서드

PS) 3D는 오브젝트의 크기가 별로 중요하지 않다. 카메라 위치가 중요.


4. Scene 

- 오브젝트를 배치하고 연결하는 것


5. GameObject

plane - 장소 지형 texture(u,v) vertex(x,y,z) normal(x1,y1,z1)
plane의 한 폴리곤의 각점은 normalVector 값을 가지고 있다.
directional light 는 한방향에서만 쏟아지는 빛

-게임 오브젝트는 서로 부모 자식 관계를 가질수 있다. 자식은 부모의 행동을 따라 한다.
 
6. Vector   크기와 + 방향을 가진 
Vector2(x,y)
Vector3(x,y,z)
내적 , 외적? - ㅅ ㅡ ;
벡터를 꼭 마스터 하라!~
normal(x1,y1,x1)는 벡터의 크기를 없애버린다. - 정규화 1로만들어 버린다. 방향만을 알려준다. 바라보고 있는 방향을 나타낸다,

ps. 빛은 최소한으로 사용 하라 !! 리소스를 많이 먹는다.


7. 텍스처를 들고와 material를 이용하여 폴리곤에 표면상 이미지를 셋팅할수 있게 해준다.

8. 스크립트 적용 

  - 메인 카메라에 스크립트 달아 적용하는 방법 : 화면 전체에 일어 나는 변화는 여기에 다는것이 좋고 
 - 오브젝트에 스크립트를 달아 적용하는 방법 : 오브젝트에 일어 나는 변화는 여기에 다는것이 좋다.


9. JavaScript  구조

private var box:GameObject; // 받아올 오브젝트 변수 

function Start(){ // 화면이 처음 만들어 질때 호출 스타트 할때 최대한 변수를 초기화 해주는것이 좋다.
box = GameObject.Find("Cube"); // 받아올 오브젝트의 이름을 찾아 변수에 할당을 해준다.

}

function Update () {// 프래임을 연속 해서 뿌려주는 작업을 하는 함수 
// 백버퍼 플리핑 1프레임은 백버퍼에 잡은 화면 을 프론트 버퍼에 한번 뿌려 줬을때 한번 작업을 나타낸다.
// 모든 단말기의 프레임 속도를 고려 해서 타임을 맞춰 주어야 한다
box.transform.position.x +=1 * Time.deltaTime; 
// transForm 은 게임 오브젝트의 크기, 위치, 기울기를 수정 할 수 있다.
// Time.deltaTime 를 넣어줘야 프렝미 속도 뿌리른 타임이 통일 된다.
}




10.Prefab

- 게임오브젝을 구성과 모양을 저장해서 재사용을 가능하게 해준다.
                 (게임오브젝을 리소스로 만든다.) 
               게임오브젝트 중 파란 색이 들어오는것은 prefab의 오브젝이다. 

11. 접근한정자

private는 : 속성에서 숨겨 사용을 못하게 한다.
public : private가 없으면 public이며 게임 오브젝에 속성으로 나타난다.


12. Camera

ViewportToWorldPoint : Transforms position from viewport space into world space.
- 뷰 좌표를 월드 좌표로 바꿈
 ScreenToWorldPoint : Transforms position from screen space into world space.
- 스크린 좌표를 월드 좌표로 바꿈
ScreenToViewportPoint :Transforms position from screen space into viewport space. 
-  스크린 좌표를 뷰폴트 좌표로 바꿈


13. 3D 설계 수학

1)Vector - 좌표
2)Matrix - 행렬
3)Quaternion - 각도 // 거의 쓸일없음 


14.  배경 

Mesh Collider     -  plane에 대한 이벤트를 체크 하고  충돌과 효과를 준다.
Mesh Renderrer  -  plane에 대한 그래픽적 작업을 한다.
ps. 이둘을 잘 확인하여 bg맵을 만들어야 한다. 맵을 만들때 충돌 이벤트가 있는 부분은 따로 Collider로 만들어주는것이 좋다.





'개발지식창고 > Unity3D' 카테고리의 다른 글

Unity3D 개요  (0) 2012.02.26
Unity3DStudent 를 이용한 공부 2/2  (0) 2012.02.26
Unity3DStudent 를 이용한 공부 1/2  (0) 2012.02.26
MonoBehaviour 로 오버라이딩 되는 함수 정리  (0) 2012.02.26
Unity 3D란?  (0) 2012.02.26
Posted by 모과이IT
,