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


[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
,

먼저, 녹스 앱 플레이어를 설치한다.(설치는 간편하게 쉽다.)


홈페이지



그 다음에, 유니티에서(또는 안드로이드 스튜디오에서) 빌드한 APK를 실행해보자.

이전에는 APK파일을 그냥 드래그하면 설치가 되었지만, 이제는 그렇게 하지 알고 1단계 거쳐야 한다.

맥 기준으로 왼쪽 메뉴(윈도우는 하단? 우측?)에 apk 업로드하는 버튼이 있다.

이렇게 해서 파일을 선택하면 된다.





Posted by sungho88
,

프로젝트를 진행하다보면 한 개 더 띄워서 작업하거나 비교하고 싶을때가 있다.

이럴 경우 어떻게 할까?


유니티를 하나 켜놓은 상태에서 터미널(terminal) 실행 후,



> open -na unity



을 입력한다.


그러면 New / Open을 묻는 창이 뜰 것이고,


만들던지 기존 프로젝트를 열던지 그것은 자유!


이상. 맥에서 유니티 에디터를 여러개 띄우는 방법이다. 

Posted by sungho88
,

인앱결제... 앱 안에서 어떠한 아이템이나 원하는것을 구매하는 결제 시스템을 뜻한다.


IAP이라고도 부르며, In-App Purchase의 약자이다.


이를 사용하다가 문제가 발생했다.


폰에 바로 빌드를 해서 실행을 해보니까 제목과 같은 에러가 발생했다.





찾아보니 유니티에서 빌드를 해서 실행시키면 안된다.

구글 플레이 콘솔에 알파 버전이든 베타 버전이든 올려둔 뒤에, 다운받아서 테스트해야한다.


즉, 게시 상태가 아닌 APK를 빌드하여 테스트하려고 시도할 때, 이러한 에러가 발생한다.  

Posted by sungho88
,

윈도우에서는 Delete키 누르면 게임오브젝트를 삭제할 수 있어서 편리하다.

그런데, 맥에서는 이 키가 먹지 않는다.


찾아본결과..


Command키와 함께 Delete키를 누르면 윈도우에서와 같이 삭제할 수 있다.

아, 맥 키보드에 Delete가 두 개 있다면(큰 키보드라면)


 방향키 윗쪽에 Home 부분의 Delete키 말고...


윈도우로치면 Back space기능을 하는 Delete 

Posted by sungho88
,

[같은 게임오브젝트(GameObject)에서 컴포넌트(Component) 호출하기]

 

동일한 게임오브젝트가 갖고 있는 특정 다른 컴포넌트에 접근해야 할 경우 사용하는 방법은 다음과 같다.

이러한 선언은 Start()함수에서 또는 Awake()함수에서 미리 할당해놓아야 한다.

 

void Start() {

Transform tr = GetComponent<Transform>();

Transform tr = gameObject.GetComponent<Transform>();

Transform tr = (Transform)GetComponent("Transform");

Transform tr = (Transform)GetComponent(typeof(Transform));

}

 

이 스크립트가 포함된 게임오브젝트가 갖고 있는 컴포넌트 중에서 Transform 컴포넌트를 추출하여 tr 변수에 저장해라

 

 

[다른 게임오브젝트(GameObject)에 있는 컴포넌트(Component) 호출하기]

 

오브젝트들은 서로 독립적으로 작동하기때문에, 

위와같이 GetComponent만으로는 다은 오브젝트에 컴포넌트는 호출할 수 없다. 

이럴때는, 스크립트에 

 

public GameObject other;

 

와 같이 위에 선언해주고,

 

tr = other.GetComponent<Transform>();

 

이렇게하면, other의 게임오브젝트에 붙어있는 컴포넌트를 tr에 저장하여 사용할 수 있게된다.

 

아, 게임오브젝트는 유니티 에디터로 돌아와서, other가 어떤 게임오브젝트인지를 알려주어야한다.

즉, 이 스크립트가 붙어있는 게임오브젝트로 가면 Inspector에 스크립트 하단에 other가 보이고, 그 옆에 값은  None.

이 부분에다가 참조하고 싶은 게임오브젝트를 드래그 앤 드롭으로 옮겨주면 None대신 게임오브젝트가 들어간다.

이것이 연결된 것이라고 할 수 있다.

 

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

또는 Tag를 이용한 방법도 있다.

 

Button button = GameObject.FindGameObjectWithTag("게임오브젝트이름").GetComponent<Button>();

 

이렇게하면, 게임오브젝트에 태그를 검색해서, 찾아온 뒤, Button 컴포넌트를 가져오게 된다.

 

https://www.10000duck.com/ducks/37

 

10000duck - 그레타 툰베리가 우리 도서관에 ?!

온라인 모금함을 통해 기부하세요.

www.10000duck.com

 

Posted by sungho88
,

유니티에서 변수를 여러개 작성한다.

유니티에서 사용하기 위해서는 public을 사용한다고 한다.


그러면 유니티 에디터에서는 해당 게임오브젝트 옆에 인스펙터(Inspector)에 자동으로 그 변수가 표시된다.

이곳에서, 값을 쉽게 바꿀 수 있다고 한다. 그래서 처음에는 아. 둘 다 지원되는구나 했는데..


그런데, 이상한 점을 하나 발견했다. 

스크립트에서 값을 변경해도 이 인스펙터에서는 전혀 변경되지 않는다. 

즉, 플레이를 할 때, 변경하기 이전값이 그대로 출력된다.

뭔가 문제가 있는것 같아서 유니티를 재설치해볼까도 생각해봤는데...

검색해서 이유를 발견했다.


스크립트보다 인스펙터 값이 우선시된다. 스크립트에서 아무리 고쳐도 인스펙터 값이 적용된다는 것이다.

왜 실시간으로 바뀌지 않는것일까?

이 스크립트가 들어있는 인스펙터에서 설정 아이콘을 클릭 - Reset을 해줘야만 스크립트에 값들이 로드되는것을 볼 수 있다. 자동으로 업데이트 되는 방법은 없는것인가?


알게되면 블로그에 작성해야겠다.

매번 리셋을 할 수는 없는 것 아닌가.

Posted by sungho88
,