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
,

enum을 선언해도, Inspector에 나타나지 않아 잠시 당황했지만,


간단한 이유때문이었다.


enum의 경우 아래와 같이 class 외부에 작성하므로,


public enum MoveDirection{

Right, Left, Up, Down

}


public class InputManager : MonoBehaviour {



클래스 안에 선언되 있지 않기떄문에 유니티 인스펙터(Inspector) 창에 보이지 않는다.

예제에서는 보였는데 왜 보이지 않을까?

당연하게도 public으로 enum 변수를 선언해주어야 한다.

public class InputManager : MonoBehaviour {
public MoveDirection md;
}


와 같이 작성해주어야 보이게 된다.



Posted by sungho88
,

Random.Range(0, 10);


이라는 명령어를 통해 0부터 9까지의 값들 중 하나를 랜덤으로 생성하게 된다.


중요한 것은 0부터 10이 아니라는 것이다.


매개변수 두 개 중 


시작값인 0은 포함(inclusive)되고, 끝값은 제외(exclusive)된다.


물론 시작값이 0이 아니어도 마찮가지이다.


만약, 1부터 99까지의 값들중에 랜덤으로 값을 만들기 위해서는 다음과 같이 작성하면 된다.


Random.Range(1, 100);


100까지 하고 싶다면, 마지막 값에 +1을 해주는 방식으로 작성해야한다.


/////


float와 int형 두 개의 값을 구할 수 있다. 다른점은



 


float 범위를 구할때는 최대값이 포함되고,

int 범위를 구할때는 최대값이 제외된다.


즉,


Random.Range(0.0, 4.0);  --> 0.0부터 4.0까지의 범위 중 소숫점 임의의 값을 구할 수 있다. 4.0도 포함이다.


Random.Range(0, 4);  --> 0부터 4까지의 범위 중 정수값 중 임의의 값을 구할 수 있다. 4는 제외된다.



 

Posted by sungho88
,

이동을 하기 위해 키보드의 값 또는 마우스의 클릭을 받아야할 때가 있다.

이때 사용하는 문법이 바로 Input클래스이다.

 

        if (Input.GetKeyDown(KeyCode.UpArrow) || Input.GetKeyDown(KeyCode.W))

        {

            anim.Play(walk_up); 

        }

        else if (Input.GetKeyDown(KeyCode.DownArrow) || Input.GetKeyDown(KeyCode.S))

        {

            anim.Play(walk_down); 

        }


이렇게 작성을 하면, 


위 화살표 키 또는 W키가 눌렸을때, walk_up 애니메이션을 실행하고,

아래 화살표 키 또는 S키가 눌렸을때, walk_down 애니메이션을 실행한다.


Input.GetKeyDown(KeyCode.XX)


이것으로 키보드의 입력을 받아들인다.

그렇다면, 마우스 클릭은 어떻게 받아들일까?


Input.GetMouseButtonDown(0)


이렇게 작성하면 마우스의 클릭 신호를 받는다. 

그런데 괄호안에 0은 무엇을 의미하는 것일까.

바로, 0은 왼쪽 마우스 버튼, 1은 오른쪽 마우스 버튼을 의미한다.


게임할때는 주로 왼쪽을 사용하므로 (0)을 기입하면된다.


Posted by sungho88
,
GameObject Object.Instantiate<GameObject>(GameObject original, Vector3 position, Quaternion rotation)


Instantiate()함수를 사용하면 게임을 실행하는 도중에 게임오브젝트를 생성할 수 있다.

물론 게임이 실행되기 전 미리 만들어놓을 수 있겠지만, 사실상 불가능하다!


만약, RPG 게임이라면 수많은 아이템, 캐릭터, 배경등 모든것들을 어떻게 미리 만들어놓을 수 있을까?

만약, 총을 쏘는 게임이라면 그... 수많은 총알을 어떻게 미리 만들어 놓을 것인가? 

미리 만들어 놓는다는 것은 말도 안된다. 이럴 때는 게임 중에 게임오브젝트를 생성해야 한다.

아니, 생성이 아니라 해당 게임오브젝트의 복제본을 생성한다고 해야 정확할 것이다.

이럴 때 사용하는 함수가 바로 Instantiate() 함수이다. 
ㅇㅣ 함수는 위와 같이 3개의 매개변수를 갖고 있다.


Instantiate(GameObject original ,Vector3 position ,Quaternion rotation)


1. GameObject original

- 생성하고자 하는 게임오브젝트명. 현재 씬에 있는 게임오브젝트나 Prefab으로 선언된 객체를 의미함.


2. Vector3 position

- Vector3으로 생성될 위치를 설정함.


3. Quaternion rotation

- 생성될 게임오브젝트의 회전값을 지정한다. 

- 회전을 굳이 줘야할 상황이 아니라면, 그냥 기본값으로 설정하는 것. --> Quaternion.identity

- 또는 게임오브젝트에서 설정된 회전값. 즉, original.transform.rotation으로 작성해도 됨.


아래와 같이 선언해서 obj라는 게임오브젝트 객체를 동적으로 생성한다.


Instantiate(obj, new Vector3(x,y,z), Quaternion.identity);      // 그냥 회전없음.

또는 

Instantiate(obj, new Vector3(x,y,z), obj.transform.rotation);   // obj의 회전값.


유니티로 돌아와서 실행을 해보면, 해당 게임오브젝트가 복제되고 있음을 볼 수 있다.

어떻게 보냐면, 오브젝트 옆에 괄호로 (clone)이 줄줄이 복제되어 늘어나는 것을 볼 수 있다.

그런데...안 없어진다.

총알을 100번을 날렸다고 가정해보자. 그럼 100개의 총알이 Instantiate에 의해 생성되어 있다는 것이다.


+ 2018/06/08일 내용 추가 & 수정


GameObject UnityEngine.Object.Instantiate<GameObject>(GameObject original, Transform parent)


즉, position과 rotation 설정하지 않고, 특정 하이어라키 위치에서 생성하기 위해 사용할 수 있다.

넣고 싶은 오브젝트를 두 번째 파라미터인 parent에 적어주면 복제 생성시 하위 자식으로 생성된다.



그렇다면, 반대로 Instantiate로 생성한 오브젝트를 제거.삭제하는 함수는 무엇일까?

바로 Destroy()함수이다. Destroy라는 뜻 자체가 파괴하다, 죽이다. 라는 의미이다.


사용방법은 매우 쉽다.

Destroy(GameObject obj);


괄호안에 게임오브젝트 객체를 넣으면 제거된다. 이렇게 호출하면, 그 객체는 곧바로 사라진다.

바로 사라지지 않고 짧은 시간을 지연시킨 후에 오브젝트를 파괴하는 것도 가능하다.


Destroy(GameObject obj, float time);


두 번째 매개변수로 float형 소수를 적어주면, 그 시간만큰 지연 후 사라지도록 할 수 있다.



Posted by sungho88
,

유니티에서 변수를 선언할 때, 


[HideInInspector]를 붙여서 변수들을 생성하는 것을 볼 수 있다.

해석을 해보면, "Inspector 안에서 감춘다" ??


맞다. 해석 그대로이다. 


public으로 선언된 변수를 인스펙터 뷰에서 보이지 않게하는 구문이다. 


이상하다? private를 사용하거나 public을 안 쓰면 되는데 왜 이것을 사용하는 것일까?


더 이상한 것들도 있다.


바로 SerializeField라는 것이다.


이것은 반대로, private나 protected로 선언된 변수를 인스펙터에 보이게 하는 명령어이다.


이것 역시... public을 쓰면 되는데 왜 이렇게 위에 선언하는 것일까?


[HideInInspector]


public int number01 = 112;


[SerializeField]


private int number02 = 119;


왜 이러는 걸까?



Posted by sungho88
,

두 개의 오브젝트를 생성 후, 동등한 관계 그리고 자식으로 생성한 것의 위치 차이점을 알아보려 한다.

먼저 아래 사진과 같이 Parent 게임오브젝트와 Child 게임오브젝트가 동일한 관계에 있다고 가정하고,


각각 원하는대로 위치를 놓는다.



그러면 다음과 같이 좌표에 나타난다.(빈 오브젝트이므로 아무것도 보이지 않는다)


그런데 만약, 아래와 같이 부모-자식 관계로 연결을 했다면? 어떻게 될까?


먼저, PARENT는 동일하게 (-35,0,-9)이다. 부모는 아무것도 변화되지 않았다.


하지만, CHILD는 변화되었다. (20,20,0)으로 변경되었다. 이게 무슨 뜻일까?


기본값...Reset을 해보자. 어디로 이동할까? (0,0,0) 이 과연 어디일까?


바로!! Parent의 위치이다. 위 (20,20,0)은 부모 게임오브젝트인 PARENT로부터 떨어진 거리를 의미한다.

이것을 통해 만약 A게임오브젝트 안에 B게임오브젝트를 넣게 되면 B는 A에 종속되어 컨트롤되게 된다.




Posted by sungho88
,

배열(Array) 사용하는 방법


int[] data = new int[10]; // int형의 배열을 10크기로 생성해라.


사용하는 방법


data[0] = 10; // 이렇게 배열에 접근. 배열은 첫 번째 접속을 0번째이므로 마지막은 10이 아니라 9이다.


배열은 바늘과 실처럼 사용하는 것이 바로 반복문 for이다. (while도..)


for(int i = 0; i < data.Length; i++) {

data[i] = Random.Range(0,100);

}


이렇게 하면 data 배열안에 0부터 99까지(100은 포함되지 않음) 값들 중 랜덤으로 배열에 담기게 된다.


for문을 돌면서 


data[0]

data[1]

data[2]

data[3]

data[4]

.

.

.

data[9]


까지 값을 담게 된다.

ㅎㅏ지만!! 

for문이 위처럼 간단하지 않고, 수십줄...이상이 되면 코드가 복잡해져 가독성이 떨어질 것이다.

이 경우, 따로 함수를 생성한 뒤에, 함수를 호출하면 좀 더 깔끔해질 것이다.




Posted by sungho88
,

배너를 붙여 광고를 나오게 하려한다면 애드몹을 사용하면 된다.


1. 먼저 구글 애드몹 플러그인 다운로드(시간이 지날수록 버전이 변경될 수 있음)


깃 허브 홈페이지


이 예제의 경우 v3.10.0을 사용할 것이다.




2. 유니티를 새로 만들거나(테스트하려면) 또는 기존의 프로젝트를 연다.


3. 1에서 받은 .unitypackage파일을 임포트 한다.( Asset - Import Package - Custom Package...)


(임포트 구성 항목)


4. Admob 홈페이지에 들어가서 앱을 추가해줘야한다.


공식 홈페이지


처음이라면, 다음과 같이 가입하기를 진행해야한다. 다음과 같이 나오는데 계정을 생성하자.


몇 가지 확인 절차를 거치면 계정이 확인되며 다음과 같이 뜨면 성공이다.



5. 가입이 성공했다면, 메인화면 왼쪽 탭에 앱을 클릭 --> 첫 번쨰 앱 추가 버튼을 클릭한다.





6. 앱을 애드몹에 추가한다.

있으면 예 없으면 아니요~




7. 광고될 광고 형식을 선택한다. 이 블로그의 경우 배너 광고를 삽입할 것이므로 배너를 선택한다.


선택하면, 광고 단위 이름을 작성하라고 나온다. 이것은 별로 중요하지않다. 임의로 생성하면 된다. 



작성 후, 광고 단위 만들기 버튼 클릭하면 만들어진다.

광고 단위 ID라는 것이 만들어지는데, 이것을 유니티 엔진에서 사용하게 되므로 복사해두자.

유니티로 돌아오자.

유니티에 띄워보자.

새로운 빈 오브젝트 또는 원하는 오브젝트에 스크립트를 생성 후 붙여넣으면 된다.

나는 새로운 프로젝트를 만들었으므로 빈 오브젝트를 하나 생성 후, C# Script를 하나 컴포넌트로 추가하려고한다.

C# Script를 열고, 다음과 같은 코드를 붙여넣는다.



using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using GoogleMobileAds.Api;

public class NewBehaviourScript : MonoBehaviour {

    static bool isAdsBannerSet = false;



    // Use this for initialization

    void Start () {



        if(!isAdsBannerSet)

            RequestBanner();

    }

 
    private void RequestBanner()

    {

        #if UNITY_ANDROID

        string AdUnitID = "애드몹 광고 단위ID";

        #else

        string AdUnitID = "unDefind";

        #endif

        BannerView banner = new BannerView(AdUnitID, AdSize.Banner, AdPosition.Bottom);



        AdRequest request = new AdRequest.Builder().Build();

        banner.LoadAd(request);

        isAdsBannerSet = true;

    }
 
}


위에 코드를 붙여넣고,  파란색으로 쓰여진 애드몹 광고 단위ID 부분만

아까 위에서 생성해서 복사해둔 아이디를 붙여넣자.


끝났....다고 하기 전에.

빈 오브젝트에 이 스크립트를 붙여넣자.

그 다음 실행!

Posted by sungho88
,