본문 바로가기

▶Programming/Unity

**직렬화(Serializable)


위와 같이 script를 짜면 아래의 화면과 같이 지저분하게 유니티에 나온다.



보는 것과 같이 직렬화(Serializable)를  시키면 아래와 같이 깔끔한 모습을 인스펙터에서 볼 수 있다.



===========================================================================================================

**중력(Gravity) 

리지드바디 사용시 중력을 사용함에 체크 하면 간혹가다 배경 아래로 가라앉는 경우가 생긴다.

이러한 이유는 콜라이더가 없어서이다. collider를 추가하자. 그러면 배경 아래로 가라앉지 않는다.


===========================================================================================================


**오일러(Euler) 와 쿼터니언(Quaternion)

오일러는 축을 이용한 자유로운 회전이 장점. x,y,z축을 각각 원하는 값을 입력하여 회전 시킬 수 있음.

        GetComponent<Rigidbody>().rotation = Quaternion.Euler(0.0f, 0.0f,10f) 라고 만약 함수를 사용한다고 하자.

그러면 x,y축은 그대로 두고 z축만을 회전시킨다. 

이런식으로 오브젝트에 자신이 원하는 회전을 만들 수 있다는게 Euler의 장점.

대신에 짐벌락이라고 하는 단점이 생긴다. 그냥 그렇구나 라고 알아두자.


쿼터니언은 오일러에 비해 연산속도가 빠르다. 어쨋든 유니티에서는 Quaternion.Euler 이런식으로 사용한다.

복잡하게 생각하지 말고 쿼터니언도 오일러와 같이 회전을 위한 함수정도로 기억하자. 


중요한 것은 유니티에 나온 함수를 얼마나 이해하고 적재적소에 사용하냐 이다.


===========================================================================================================

물질(material)에 텍스쳐를 입히면 그 다음에는 이 텍스쳐가 잘 보이도록 하는게 중요하다.

여기서 잘 보인다는 뜻은 게임의 미사일이라면 미사일답게, 배경이면 배경답게 보이는 것을 의미한다.

이때 사용할 방법이 shader이다. shader에는 여러 종류가 있는데 그 중 한가지를 소개하려 한다.

shader -> Particles-> Additive 이녀석을 사용하면 검은색 부분은 0으로 된다.

한가지 더 팁을 말하자면 Shader ->mobile 이 있는데 여기 있는 녀석들을 사용하면 게임 리소스 효율면에서 다른 것 보다 효율적이다.


왼쪽이 standard고 오른쪽이 Additive


===========================================================================================================

OnTriggerEnter 를 쓸 때 조심해야한다. 이건 접촉되는 모든 collider에 대해 예외없이 적용된다.

만약 OnTriggerEnter 안에 내용이 Destroy일 경우 의도하지 않게 배경이나 주위 사물이 접촉되어 있어 파괴될 수 있다.

따라서 접촉되더라도 파괴되지 않아야 하는 녀석들은 tag를 걸고, script에 if문을 써서 파괴되지 않도록 해주는 것이 좋다.

    void OnTriggerEnter (Collider other) {

        if (other.tag == "파괴하면되는녀석tag") return;


===========================================================================================================

만약에 position이나 오브젝트에 랜덤 범위의 값이 들어가야하는 경우...

static function Range (min : float, max : float) : float 를 사용하면 된다.

예를들어 몬스터를 임의의 지역에 리스폰하는 경우..지도를 벗어나지 않는 범위에 리스폰되게 하려면 범위를 정해야한다.
이때 사용하면 좋다.

===========================================================================================================
collider 씌울때 웬만하면 circle 말고 BOX로...이상하게 circle로 만들면 움직일 때 
뒤뚱거리다 넘어지는 경우가 있는데 box로 하면 안정적이다.

===========================================================================================================
[HideInInspector] :말 그대로 인스펙터에 있는 목록을 지워준다.
스크립트에는 보이고 유니티에는 안 보이게 해줌.

===========================================================================================================
UnityEngine.UI.dll is in timestamps but is not known in assetdatabase 등 유니티 켰을 때 c: 어쩌구 저쩌구 빨강색으로 나올때...
C:\Program Files\Unity\Editor\Data\UnityExtensions\Unity 로 들어간다. 유니티 설치 폴더 안에 있음 C(하드디스크)에 설치가 안되어 있는 분들은 어쨋든 UnityExtensions로 들어가야 한다.
그 후에 Unity폴더에 있는 UnityAnalytics폴더,Networking폴더,
GUISystem폴더 등을 바탕화면에 완전히 잘라놓기로 빼놓고 유티티 한번 키고...키면 자동으로 꺼지거나 안 꺼지거나 둘 중에 하나인데 안 꺼지면 끄시고....유니티를 완전히 끈 상태에서
C:\Program Files\Unity\Editor\Data\UnityExtensions\Unity에
바탕화면에 있던 폴더들을 옮겨주고 유니티를 키면 된다. 그러면 해결됌.
===========================================================================================================
Canvas에 text 추가하고 글자가 너무 커서 안 보이는 경우, 격자를 크게 하면 되지만
그것조차 귀찮다고 하면 옵션에 vertical overflow를 overflow하면 글자가 커도 제대로 보인다. 물론 그걸 오버해서 글자수를 크게한 경우에는 격자를 조절해야겠지만...

===========================================================================================================

이런식으로 인스펙터에 범위를 자유롭게 정할 수 있는 옵션을 추가 하고 싶다면 스크립트에 public float test =0.5f; 쓰고 이 위에 

[Range(0,1)] <-이걸 쓰면 된다.



===========================================================================================================

유니티 배경 화면 변경하기!

Window -> Lighting 들어가면 Environment Lighting 에 Skybox 가 있음.

===========================================================================================================

Random.Range() 함수는 

Random.Range(0, max);

했을 때, 0~(max-1)의 랜덤 값을 반환 단 int 일때만

flaot일땐 max값 반환

static function Range (min : int, max : int) : int 
Description - 
Returns a random integer number between min [inclusive] and max [exclusive] (Read Only). 

static function Range (min : float, max : float) : float 
Description - 
Returns a random float number between and min [inclusive] and max [inclusive] (Read Only).
===========================================================================================================
physics.raycast에서 layermask는 영어로는 ignore로 되어 있지만 사실은 catch가 맞는 의미.. 즉 특정 마스크를 잡아 낸다. 그러면 그 특정 레이어만 빼고 다 잡아내려면 어떻게 해야될까? 특정마스크를 나타내는 레이어마스크 앞에` ~ `를 붙여주면 된다. 물결무늬를 붙여주면 not 의미가 된다.