페이지

레이블이 C#인 게시물을 표시합니다. 모든 게시물 표시
레이블이 C#인 게시물을 표시합니다. 모든 게시물 표시

11/14/2015

[Unity][C#] GameObject, gameObject 차이

  유니티 튜토리얼 진행중에 둘의 차이점이 궁금해졌다. 어떨때는 gameObject로 사용하다가 어떨때는 GameObject로 사용하고..

  유니티 매뉴얼을 뒤져보면 GameObject는 Base Class로 Object Class를 상속 받고... blah blah....;; 역시 모든 매뉴얼은 이해하기 최대한 어렵게 써놓아야 제맛(?)인듯. 그래야 그거 쉽게 풀어논 사람이 또 돈도 벌고 책도 쓰고 그러는거 같다.

  이와 관련해서 유니티 Q&A에 fafase 라는 아이디를 가진분이 완전 자세히 둘의 차이점을 설명 해준듯.

When using gameObject, it means the script has a reference to the game object, Unity did that for you so you do not have to find the object the script is attached to. So gameObject refers to the GO the script is attached to. When a method or a member is static, and then belongs to the class and not the instance, you use GameObject like in :
 GameObject.Find("ObjectName");

as opposed to
 gameObject.GetComponent<Script>();

in the first we are doing a general action not related to the game object so it belongs to the class. You could actually called that method even though there are no GO in your scene. The second is directly related to a particular GO so we use the reference to that GO.

  간단히 정리하자면,

사용하려는 메소드나 멤버가 정적(Static)으로 선언된 것들은 직접 클래스로 사용해야 하므로 이런경우 GameObject 사용한다는 말이고,

흔히 스크립트 생성 -> 유니티에서 마우스로 드래그하여 생성된 Object에 Attach하는데,
이는 GameObject gameObject = new GameObject()으로 선언된거나 마찬가지. 그러나 유니티는 이를 알아서 수행해주므로 "So gameObject refers to the GO the script is attached to" gameObject는 attach된 스크립트로 바로 참조가 된다고 한다.


  아직은 어렵고 헷갈리는데 나처럼 초보자의 수준에서는 아래처럼 생각하는게 편한듯.
어떤 Object에 Attached된 스크립트 안에서 gameObject는 '나자신=해당Object 자신'이고 GameObject는 '다른 Object' 이다.
지금까지의 유니티 수준에서는 GameObject를 활용하는 수준은 .Find나 .FindWithTag등이다. 즉, 나자신말고 타 오브젝트를 참조(Refer to)할때 사용.





11/11/2015

[C#][Unity] Update(), FixedUpdate() 차이

둘다 주기적으로 매 프레임마다 호출되는 메소드 임.

그러나, 

Update의 경우 호출 주기(Interval)이 일정하지 않음
  - 비 물리적인 오브젝트의 처리, 단순 타이머 계산등에 사용

FixedUpdate의 경우 호출 주기가 일정
  - 물리적인 오브젝트의 계산에 사용


[C#] namespace, #include 선언의 의미

학부때 C언어 배운 지식으로 무턱대고 C#을 살펴보려니 대체 한줄 한줄이 해석이 안된다.
아무래도 Syntax를 모르기 때문인듯..

특히, C#시작시에 매번 당연하게 선언해주는

#include <iostream>
using namespace std

에 대해서 MSDN이랑 다수 여러 네이버 블로그 님들 지식을 짜집기 해서 간단히 정리 하고자 한다.
(매번 느끼는 거지만 이렇게 직접 글로 써보고 나면 머리에 남는다.)

#include, #define 등은 'Preprocessor'라고 하며 글자 그대로 본 프로그램 시작전에(pre) 실행되는걸 의미하는데, 중요한건 어떻게 부르는지보다 왜 쓰는지 아는게 중요한것 같다.

#include A 의 의미는 A헤더 파일의 내용을 본 프로그램 상단에 글자 그대로 포함 시키라는 의미이다. 더 쉽게 말해 A라는 이름의 헤더 파일에 적혀있는 모든 글자를 Ctrl + A, C 해서 Ctrl + V 하라는 의미이다.

헤더 파일안에는, namespace, class, struct, 변수 등등이 포함되어 있는데,
대략적으로 간단하게 이해하기 위해서는 

namespace > class ~= struct > function(=method), variables(=field) 

등의 먹이사슬(?) 관계를 가진다. 사실 독립적인거 같지만, 즉, 네임스페이스 바로 아래에 충분히 여러 메소드들이나 필드들이 정의 될 수 있는거 같다. 

그런데 그렇게 생각하기 시작하면 헷갈리는듯...
그냥 필드랑 메소드는 동급레벨이며 따라서 메소드 안에서 필드들이 사용될 수 있고,
비슷한 속성(Attributes)의 필드와 메소드들이 모여서 구조체나 클래스가 되고, 
비슷한 속성의 구조체나 클래스들이 모여서 네임스페이스로 정의된다 로 알고 있을 생각이다.;;
나중에 익숙해지면, 한단계 나아가겠지;;

이렇게 구분짓는 이유는 메소드, 변수들의 이름 '충돌(중복사용)등을 막기 위함' 이라고 함.

암튼 헤더파일안에 정의 되어 있을 'std' 라는 이름의 네임스페이스의 내부 값(메소드, 구조체, 클래스 etc..)에
접근하기 위해서는 아래와 같이

[C++] std:: class.method.variable..
[C#]   std.class.method.variable.. 

사용된다. 그러나, 매번 접근을 위한 operator를 사용하기 귀찮으므로,

using namespace std라고 서두에 정의를 해두면 매번 귀찮은 namespace의 이름을 쳐주지 않아도 된다. 즉,

class.method.variable만으로도 ㅇㅋ

쉽게 생각해서 컴퓨터가 나 대신에 std::을 복사  붙여넣기 해준다는 의미이다.




블로그 보관함

Facebook

Advertising

Disqus Shortname

Popular Posts