11월 기록

by 꽈배기

11월 27일 비버잼 공부 기록

변수명은 확실히 짓자 변수의경우 쓰임새와 정체성으로 함수의 경우 동작에 초점을 맞춰서!!

선형보간 a to b일때 t의 값, 즉 t는 a와 b 사이에 t 일때의 위치 값을 가져오는것!

애니메이션 굽기 => 최적화된 리소스임.

foreach문과 for문의 차이, exception 에러

스마트 머지

timeSinceLevelLoad

Debug.Log() 보다는 -> Debug.Log($”루프 데스티네이션 값 : {loopDestInt}”);

11월 18일

상속과 base


객체지향, 상속 등등 뭐라 말은 많지만 이게 사실 실제로 적용해보려면 너무 머리가 아팠다. 내가 해맸던 이유와 상속에서 헷갈렸던점을 정리하고자 한다.

  1. monobehaviour의 유무 차이
  2. base 키워드 사용방법 2-1 override, virtual

첫번째

상속에서 monobehaviour의 유무 차이는 뭘까?
기본적으로 유니티의 모든 개체는 mobonehaviour를 상속받아야 컴포넌트로 부착이 가능하다.

그말은 즉슨.
image
이렇게 상속을 받는다 쳤을때, rabbit, cat, fox , russian blue 등등 모두 컴포넌트로써 부착이 가능하다는것.
마찬가지로 컴포넌트의 역할이기에 동적으로 생성하면 안된다.
만약 동적으로 개체를 생성할시 유니티가 경고한다.
mobonehaviour를 상속받는 개체를 동적으로 정의하려 한다고.

image
반대로 mobonehaviour를 상속받지 않을 경우, 개체는 부착이 불가능하며 접근이 불가하다.
사용하는 방법은 알다싶이 인터페이스를 담당할 스크립트 MakeAnimal.cs 가 있다고 치면

Cat _mycat = new Cat(); //기본 생성자를 사용한다고 가정한다.
russian_blue_bluecat= new russian_blue(); //자식 개체 생성
Cat _blue_bluecat= new russian_blue(); // 자식을 부모로 업캐스팅

하여 생성 및 정의 가능한것이다.

두번째

base의 사용법이다.

Character, Player

이 사진을 보면 Player.cs 에서는 Die 메소드를 base.Die()로 쓰고있다.
이 뜻은 부모 개체에 있는 Die 라는 메소드를 자식 스크립트에서 base 키워드로 실행하겠다는 것.
다음으로 생성자를 base로 사용할 수 도 있다.
image
생성자 실행 순서는.

  1. 부모의 생성자 실행
  2. 자식의 생성자 실행
  3. 자식의 종료자 실행
  4. 부모의 종료자 실행 이 순서대로 흘러간다.

그 다음으로는 override와 virtual이다.

간단히 얘기하자면 virtual은 부모단에서 override는 부모의 virtual로 지정된 메소드나 프로퍼티등을 내 입맛에 맞게 내용을 바꾸는 것이다.

image

image

위의 사진처럼 virtual로 선언된 getDamage를 Player 스크립트에서 override로 선언하고 몸통 부분을 바꾼것과 같다. 이렇게 되면 자식에서 getDamaged() 실행 시 부모의 메소드를 사용하는것이 아닌 자식 별개의 메소드로 사용된다. 물론 부모의 getDamage를 사용하고 싶다면 base.getDamage를 쓰면 된다. 유용하게 쓰자.

11월 16일

데이터셋을 만들때 구조체와 클래스의 차이

항상 궁금했다.
구조체와 클래스의 근본적인 차이는 value 타입과 reference 타입이라고 한다.
그러면 데이터셋을 만들고 이를 처리할때 상속을 제외하고는 무슨 근본적인 차이가 있는가?

대략적으로 찾아본 결과.

구조체vs클래스

구조체 사용 경우를 정리하자면 이렇다.

반면, 사용하지 말아야 할 경우는..

구조체는 스택 영역에 생성된다 -> call by value 값 복사
클래스는 힙 영역에 생성된다. - > call by reference 값 참조


기본적으로 구조체가 클래스보다 100배 빠르게 인스턴스를 생성한다.
그렇다면 클래스 타입에 구조체 변수가 들어가면 데이터는 어떻게 저장될까?

결론적으로, 클래스 개체에 들어가는 구조체 객체는 힙 영역에 들어간다.

구조체 a가 있다.

a의 인스턴스 -> List<a> a_List = new List<a>();

이러면 a 구조체의 변수가 리스트에 들어가 스택이 아닌 힙 영역에 들어가진다.
또한 vector, color 같은 타입은 구조체를 사용한다. 그렇기에 이러한 데이터 타입은 구조체로 캐싱하면 유리하다.

but 구조체 내부의 변수에 레퍼런스 타입을 쓸 경우 반드시 클래스를 이용하자.
복사를 기준으로 하는 값 타입 (구조체)의 정의에 어긋난다.

tags: TIL