목록Study (37)
noname02
C++의 auto와 같은 키워드이다.자료형을 암시적으로 선언하여 컴파일러가 그 자료형을 결정짓게 만든다.
모바일 터치 입력을 구현해 보자. 유니티는 멀티터치를 지원한다. 화면을 터치하게 되면, 화면을 터치한 순서대로 해당 터치의 정보는 터치정보를 담는 배열에 들어가는데 0, 1, 2 순서대로 들어간다.그리고 이러한 터치정보는 Input.GetTouch(index) 로 얻어올 수 있다.index는 int형이며 위에서 말했다싶이 터치의 인덱스 값이다. Input.GetTouch(index)는 Touch 클래스로 그 정보를 반환하므로 Touch touch = Input.GetTouch(index); 와 같은 형태로 해당 터치정보를 참조변수 touch로 접근할 수 있게 하면 된다. 만약 화면 3곳을 터치하고 있으면 index값 0,1,2에 각각 그 정보가 들어가는 것이다.그런데 여기서 3곳을 터치하고 있다가 두 번..
Mass : 질량. 힘을 가할 때 이 값에 따라 움직임의 속도가 달라짐.Linear Drag : x,y축에 대한 이동의 저항력. 이게 있어야 힘을 주지 않을 경우 감속이 됨.Angular Drag : 각 속력에 대한 저항력. 이게 0이면 계속 돈다.Is Kinematic : 이 옵션이 켜져있으면 어떠한 힘의 영향도 받지 않는다.
UNITY_STANDALONE - 유니티 내 게임 테스트UNITY_WEBPLAYER - 웹플레이어UNITY_IOS - iOS환경UNITY_IPHONE - 아이폰 환경UNITY_ANDROID - 안드로이드 환경 보통 키조작 스크립트에 사용된다. 123456789#if UNITY_STANDALONE || UNITY_WEBPLAYER...// 게임테스트 혹은 웹플레이어로 빌드할 경우 컴파일됨....#elif UNITY_IOS || UNITY_IPHONE || UNITY_ANDROID...// iOS나 아이폰, 안드로이드 환경으로 빌드할 경우 컴파일됨....#endif cs 이렇게 사용하면 된다.
12345678910111213public static GameManager instance = null; void Awake() { if (instance == null) instance = this; else if (instance != this) Destroy(gameObject); DontDestroyOnLoad(gameObject); } cs 싱글톤 객체는 1개만 존재하는 객체다.보통 게임이 시작부터 끝까지 하나만 존재해야 될 객체에 적용시켜주면 된다. 일단 public static으로 해당 객체를 참조할 수 있는 참조변수를 생성한다.static이므로 class가 많이 생겨도 instance 변수는 하나만 존재한다. 그리고 최초에 해당스크립트를 실행한 GameManager의 주소값을 instan..
배열 arr이 있을 때 for ( int i : arr ){sum += i;} 와 같이, Rvalue의 값을 Lvalue에 차례대로 하나씩 배열 arr의 끝 요소까지 넘겨준다.
1. 포인터 프로그래밍을 하면 변수를 생성하죠. 변수의 값은 메모리에 저장이 됩니다. 메모리의 최소단위는 1byte입니다. 그리고 각 메모리는 주소값을 가지고 있습니다. int a=10; 을 선언했다고 하면, 10이라는 값을 저장하고 10이 저장된 메모리공간에 a라는 이름을 붙여줍니다. 그리고 이 메모리 공간은 int형입니다. 즉 4byte의 크기를 갖게 되는거죠 0000a(int) 0001 0002 0003 즉 이렇게 되있는겁니다. 왼쪽은 주소값이며(편의상 정의한 주소값입니다) 오른쪽은 변수의 이름입니다. a라는 변수는 int형이기 때문에 4byte크기를 할당받았죠. 주소값을 반환하는 연산자인 &를 아실겁니다. 위와 같은 상황에서 printf("%d",&a)이렇게 a의 주소값을 출력하라고 하면 0000..
함수도 변수라고 생각하면 된다.그러니까 함수의 이름도 사실은 변수인 것이다.마치 int a = 10;으로 하면 어떤 메모리공간에 a라는 이름이 할당되고 거기에 10이라는 값이 들어가서 a를 10처럼 사용할 수 있듯이 void Func(int a) { ... } ;로 함수를 선언하면 어떤 메모리공간에 Func라는 이름이 할당되고 호출하면 { ... } 를 수행하는 것이다.물론 Func만 호출한다고 될 리가 없다. 함수는 매개변수를 갖기 때문에 Func(); 와 같이 소괄호를 같이 넣어줘야 한다. 물론 매개변수도 넣어줘야 하고. 자 그럼 변수에는 포인터라는 개념이 있다.int a = 10;int *b = &a;이렇게 하면 b라는 변수공간에 a의 주소값이 들어가 있게 된다. 그런데 알다시피 b는 포인터변수이기..
++class; 의 형태나 class++; 의 형태나 operator++로 오버로딩을 한다.그럼 어떻게 구분하느냐? operator++(); 와 같이 매개변수가 없는 경우 전위증가고operator++(int); 와 같이 매개변수에 int키워드를 넣어주면 후위증가다.여기서 int는 그냥 단순히 전, 후위증가를 나타내는 키워드일 뿐 매개변수를 받는 것이 아니다.
Coroutine은 결국 메서드의 실행순서를 지연시킬 수 있다는 점에서 사용된다.원래 메서드는 한번 읽히면 해당 메서드가 종료될 때까지 쭈-욱 읽힌다.그런데 Coroutine을 사용하게 되면, 해당 메서드가 진행되다가 잠깐 Stop된다. 그리고 resume 조건에 따라 다시 돌아와서 처음부터가 아닌 중간부터 수행된다.이러한 Coroutine 메서드의 반환형은 무조건 IEnumerator 로 설정해야 한다.나도 정확히는 모른다. 어렴풋이 개념적으로만 이해하고 있어서 설명은 못하고, 해당 설명은 다른 글을 참고하면 될 것이다.여튼 그래서 Coroutine 메서드는 IEnumerator Method() { ... }의 형태로 정의한다. 메서드의 몸체에는 무조건 yield return 문이 와야 하는데, 이 y..
void Invoke(String name, float time)메서드, 호출, 반복 Invoke는 "name"메서드를 time초 뒤에 호출한다. MonoBehaviour 클래스에 정의된 함수이니 보통 Invoke로 그냥 사용하면 된다. void InvokeRepeating(String name, float time, float repeat_rate)메서드, 호출, 반복 InvokeRepeating은 "name"메서드를 time초 뒤에 호출하기 시작해서 repeat_rate 초 만큼 반복해서 호출한다. 이 역시 MonoBehaviour 클래스에 정의되어있다. void CancleInvoke(String name) "name"에 해당하는 함수의 Invoke를 취소시킨다. Repeating과 짝을 이룬다고 ..
매우 간단.JAVA의 super와 같다.자식 클래스의 변수가 부모 클래스와 같으면, 자식 클래스의 변수가 부모 클래스의 변수를 가리게 되는데 이 때 super 키워드를 사용하면 부모 클래스의 변수를 뜻하게 된다. 굳이 변수가 아니어도 super라는 키워드 자체가 부모 클래스를 가리킨다는 키워드이다.
코루틴(Coroutine)이 뭔가요? C 언어등에서 일반적으로 사용하는 함수는 시작할 때 진입하는 지점이 하나 존재하고 함수가 모두 실행되거나, return 구문에 의해서 종료되는 지점을 설정할 수 있습니다. 이러한 함수를 서브루틴(Subroutine)이라 부르는데, 코루틴은 이를 더 일반화한 개념으로 진입하는 지점까지 여러 개를 가질 수 있는 함수를 의미합니다. 개념적으로만 본다면 서브루틴도 코루틴의 한 종류라고 볼 수 있겠지요. 코루틴이 왜 필요한가요? 코루틴이 없어도 게임을 만드는데 지장은 없습니다. 하지만 유니티에서 코루틴을 잘 활용하면 높은 성능을 내는 스크립팅의 제작이 가능해지고, 읽기 쉬운 코드를 만들 수 있게 됩니다. 코루틴은 어떻게 사용하나요? C# 언어를 기준으로, 코루틴은 언제나 아래..
out과 ref 키워드는 매개변수의 값을 참조하게 한다.C와 C++에서 포인터를 생각하면 된다. 혹은 C++에서 &연산자를 생각하면 된다.객체는 어차피 항상 참조형이므로 굳이 사용할 필요는 없다. out과 ref는 매개변수에 키워드를 적어줘야 한다.정의할 때에는 당연히 12public void Method(ref int a) { ... } ;public void Method(out int a) { ... } ;cs 의 형태로 정의를 하며, 이 함수를 호출할 때에는 12Method(ref a);Method(out a);cs 의 형태로 ref, out을 명시해줘야 한다. ref와 out의 차이점이라고 한다면, ref는 매개변수를 전달할 때 해당 변수가 꼭 초기화가 되어있어야 된다는 것이다. 1234int a..
드래그 하고 난 뒤 Ctrl + K + F!
as DataTypeDataType 으로 형 변환이 가능하면 해당 형으로 반환하며, 불가능하면 null을 반환한다. is DataTypeDataType 으로 형 변환이 가능하면 true, 아니면 false를 반환한다. (논리연산자)
Arrays.toString(배열); 배열의 값들을 모두 표기한다.
-202쪽 클래스의 로딩 시기는 JVM마다 달라서 클래스 초기화 블럭의 사용을 심사숙고해봐야 한다.
- 인스턴스 변수는 초기화를 안해주면 기본값으로 설정된다.- 배열 역시 초기화를 안해주면 기본값으로 설정된다.- 클래스변수(static)도 초기화를 해주지 않으면 기본값으로 설정된다.- 지역변수는 초기화를 해주지 않으면 사용 불가능하다. -200쪽 참고
JAVA 174쪽 참고
1. 형변환변수 선언시 float a = 3.14 의 경우, C/C++은 자동 형변환으로 3.14를 float형으로 변환시키지만 JAVA는 컴파일 에러.큰 자료형->작은 자료형 변환의 경우 C/C++은 컴파일러가 알아서 하지만(손실되지만) JAVA는 컴파일 에러.단, 작은 자료형->큰 자료형의 경우 자동으로 형 변환 2. char형의 크기차이C/C++은 1byte(ASCII코드라서) JAVA는 2byte(UNICODE라서) 3. const와 finalC/C++의 상수화는 const, JAVA는 final 4. 다차원배열C/C++의 경우 5x3의 배열, 5x5의 배열 등 무조건 사각형 크기의 배열이 선언되지만JAVA의 경우 행 성분이 각각 다를 수 있다.즉 C/C++은 ㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁ 와 같아..
- 클래스 내에 선언된 const 멤버변수의 초기화는 이니셜라이저를 통해야만 한다.
1234567891011121314151617181920212223242526272829303132333435363738#include using namespace std; class SoSimple{private: int num;public: SoSimple(int n) : num(n) { cout
디폴트 생성자는 객체에 생성자가 단 하나라도 정의되어 있지 않은 경우 컴파일 과정에서 자동으로 생성하며, 만약 하나의 생성자라도 정의된 경우 디폴트 생성자는 자동으로 생기지 않는다.예를 들어서 12345678class AAA{ int aaa;public: AAA (int ABC) : aaa(ABC)..}cs 와 같이 객체가 선언되었다고 하면, 앞으로 AAA객체를 선언해야 하는 경우AAA abc; 와 같은 형태로는 선언이 불가능하다는 뜻이다. 무조건AAA (123); 과 같이 선언을 해야 한다.물론 오버로딩을 통해 디폴트선언자를 따로 명시해주면 가능하다.
소멸자는 어떤 특정한 함수 A 내에서 객체가 생성되고, 그 함수A가 종료됨과 동시에 객체가 사라진다면(본래 함수 내에서 선언된 변수는 함수 종료와 함께 사라진다. 객체도 마찬가지.) 함수가 종료되기 바로 전에 소멸자가 처리되고 함수가 종료된다.평소에는 딱히 쓸 일이 없지만, 만약 객체에서 힙 영역을 사용하게 된다면, 함수가 종료되어도 해당 힙 영역에 생성된 메모리는 제거되지 않을 것이다. 이 때, 소멸자에 delete 함수를 통해서 할당된 메모리를 해제시켜줘야 메모리 효율이 좋으므로 보통 이런 경우에 사용한다. 참고로 힙 영역으로 할당된 유효메모리는 프로그램이 종료되도 사라지지 않는다.따라서 반드시 delete 명령어를 통해 memory leak를 방지해줘야 한다.