FPS = Frames Per Second(초당 프레임 횟수)


즉, 1초에 출력, 만들어낼 수 있는 프레임 횟수를 뜻한다.


PC의 성능에 따라 FPS는 다를 수밖에 없다.


성능이 뛰어난 컴퓨터는 1초에 100FPS가 날 수도 있고,


후진 고물 컴퓨터는 1초에 5FPS일 수도 있다.


이럴경우, 총싸움을 하면 어떻게 될까?


예를들어, 1초에 100발이 나가는 사람과 1초에 5발이 나가는 사람이 싸운다면?


말이 안된다. 게다가 게임 성능에도 매우 좋지 않다. 큰 리소스를 잡아먹는다.


따라서, 성능에 무관하게 Time.deltatime으로 두 사용자가 동일한 FPS 결과값을 보장하게 한다.



Time.deltaTime의 의미는 다음과 같다.


이전 프레임에서 현재 프레임까지 걸린 시간이다.


만약,


int speed=1; 


void Update(){ 

      shotBullet += speed; 



정리하면, 


슈퍼 컴퓨터는 1초에 1000프레임이라고 가정하자.


그러면 Time.deltaTime는 1/1000(1000분의 1)이다.


이것을 곱하면  1000 * speed * 1/1000 이므로  = speed만 남는다.

 


게임용 일반 컴퓨터는 1초에 80프레임이라고 가정하자.


그러면 Time.deltaTime는 1/80(80분의 1)이다.


이것을 곱하면  80 * speed * 1/80 이므로  = speed만 남는다.



10년이 지난 구린 컴퓨터는 1초에 20프레임이라고 가정하자.


그러면 Time.deltaTime는 1/20(20분의 1)이다.


이것을 곱하면  20 * speed * 1/20 이므로  = speed만 남는다.



결론 : Time.deltaTime을 이용하면, PC의 성능과는 무관하게 동등한 조건이 되게 되므로 반드시 필요하다. 

Posted by sungho88
,

1. GameObject.Find(string name)


GameObject shop = GameObject.Find("Shop");


이렇게하면, Shop이라는 이름을 갖은 게임오브젝트를 찾은 뒤 그 값을 리턴한다.


가장 처음에 나오는 게임오브젝트를 찾아서 반환한다.


이후에는 shop 변수를 통해 게임오브젝트를 조작할 수 있다.


예를 들어 시작했을때, 이 게임오브젝트를 안 보이게... 비활성화시키고 싶다면,


shop.SetActive(false);


를 Start함수에 입력해주면 된다.


또한,


shop.activeSelf을 통해 현재 Object가 어떤 상태인지 확인해볼 수 있다.



bool temp = (shop.activeSelf == true) ? false : true;


이렇게하면, shop.activeSelf를 if 조건문에 넣어


true라면 false로, false라면 true로 토글(Toggle)할 수 있게 된다.



2. GameObject FindGameObjectsWithTag(string tagname)


var t = GameObject.FindGameObjectsWithTag("Player");


이렇게 작성하게 되면, 유니티에서 Player이라고 Tag를 설정한 게임오브젝트들의 리스트를 반환한다.


만약, 발견되지 않으면 null값을 반환한다.


리스트이므로, for문이나 foreach문을 사용하여 처리한다.

s

3. GameObject.FindGameObjectWithTag()


var t = GameObject.FindGameObjectWithTag("Player");


이렇게 하면, Player라는 태그를 갖는 게임오브젝트를 불러온다.


위에 GameObject.FindGameObjectsWithTag("태그명")과 헷갈린다. 뭐가 다른지 한참을 처다봤다.


s 차이다. 복수로 리스트 형태로 가져오느냐, 달랑 하나만 가져오느냐 차이이다.


태그를 여러개 사용시에는 2번을 사용해 리스트로 사용하고, 태그가 하나라면 3번을 사용한다.



4. transform.Find(string name)


Text titleTxt = transform.Find("Title").GetComponent<Text>();


이렇게 하면, Find와 마찮가지로 찾지만, 자식이나 부모 관계에서만 찾는다.


즉, 해당 게임오브젝트의 자식 관계에 있는 Title이라는 게임오브젝트를 찾고 


그 Title에 붙어있는 컴포넌트들 중 Text를 가져온뒤 titleTxt에 저장하는 코드이다.


반면, GameObject.Find("오브젝트명"); 으로 작성할 경우에는 Hierarchy안에서 위에서부터 다 찾는다.





Posted by sungho88
,




인스펙터에서 값을 조정하기 위해서는 기본적으로 public으로 공개를 하고, 변수를 선언했다.


public int Size = 12;


이렇게 작성하면, 유니티 상의 Inspector에서는 


이렇게 나오는 것이 정상(기본)적이었다.

하지만, 그 외에 형태를 바꿔서 Inspector에서 볼 수도 있다.

만약, 슬라이더 형태로 값을 변경하기 위해서는 


[Range(0, 12)]

public int Size = 12;


으로 작성하면 된다.


이렇게 하면,


이렇게 슬라이더로 값을 변경할 수 있게된다.

이렇게 하면, 최소값과 최대값을 제한해놓을 수 있기때문에 유용하다.

만약, 소숫점까지 하고 싶다면,


[Range(0.0f, 12.0f)]

public float Size = 12.0f;


로 변경하면, 소수점 두 자리까지 컨트롤할 수 있게 된다.

Posted by sungho88
,