반응형

1. 산술 연산자

단항
++ (1씩 증가)
-- (1씩 감소)
+ (양수)
- (음수)

이진 연산자
+(더하기)
-(빼기)
* (곱하기)
/ (나누기)
% (나머지)


2. 부울 논리 연산자

단항
!(논리 부정) - 피연산자의 값이 false일 때 true, 값이 true일 때 false.

이진
&(논리 AND)
|(논리 OR)
^(논리 배타적 OR(XOR))
&&(조건부 논리 AND)
||(조건부 논리 OR)

예제
bool bCheck = false;
Console.WriteLine(!bCheck);
output:True

bool bCheck1 = false;
bool bCheck2 = true;

Console.WriteLine(bCheck1 & bCheck2);
Console.WriteLine(bCheck1 | bCheck2);
Console.WriteLine(bCheck1 ^ bCheck2);
Console.WriteLine(bCheck1 && bCheck2);
Console.WriteLine(bCheck1 || bCheck2);

output:
False
True
True
False
True


3. 비트 및 시프트 연산자

단항
~(비트보수) - 비트를 반대로 하여 피연산자의 비트 보수를 생성

이진
<<(왼쪽 시프트)
>>(오른쪽 시프트)
&(논리 AND)
|(논리 OR)
^(논리 배타적OR(XOR))

예제
uint num1 = 0x2A; // 101010
uint num2 = ~num1;
Console.WriteLine(Convert.ToString(num2, toBase: 2));
output:11111111111111111111111111010101

uint num1 = 0x2A; // 101010
uint num2 = num1 << 2;
Console.WriteLine(Convert.ToString(num2, toBase: 2));
output:10101000

uint num1 = 0x2A; // 101010
uint num2 = num1 >> 2;
Console.WriteLine(Convert.ToString(num2, toBase: 2));
output:1010

uint num1 = 0x2A; // 101010
uint num2 = num1 & 0x1B; // 101010 and 011011
Console.WriteLine(Convert.ToString(num2, toBase: 2));
output:1010

uint num1 = 0x2A; // 101010
uint num2 = num1 | 0x1B; // 101010 or 011011
Console.WriteLine(Convert.ToString(num2, toBase: 2));
output:111011

uint num1 = 0x2A; // 101010
uint num2 = num1 ^ 0x1B; // 101010 xor 011011
Console.WriteLine(Convert.ToString(num2, toBase: 2));
output:110001

4. 같음 연산자
==(같음)
!=(같지 않음)

예제
int num1 = 1;
int num2 = 2;
Console.WriteLine(num1==num2);
output:False

int num1 = 1;
int num2 = 2;
Console.WriteLine(num1!=num2);
output:True

5. 비교 연산자(관계형 연산자)
<(보다 작음)
>(보다 큼)
<=(작거나 같음)
>=(크거나 같음)

예제
int num1 = 1;
int num2 = 2;
Console.WriteLine(num1>num2);
output:False

6. ?: 연산자
구문의 다음과 같습니다
조건 ? A : B
조건이 true이면 A가 false이며 B가 결과값이 됩니다.

예제
int num1 = 1;
int num2 = (num1 == 1) ? 1 : 2;
Console.WriteLine(num2);
output : 1

7. ?? 및 ??= 연산자
??는 null이 아닌 경우 왼쪽 피연산자를 반환하고 그렇지 않다면, 오른쪽 연산자를 평가합니다.
??=는 왼쪽 피연산자가 null일 경우만 오른쪽 피연산자의 값을 왼쪽 피연산자에 대입합니다. 

예제

int? num1 = null;
int num2 = num1 ?? -1;
Console.WriteLine(num2);  
output: -1


List numbers = null;
(numbers ??= new List()).Add(5);
Console.WriteLine(string.Join(" ", numbers));  
output: 5

반응형

'개발공부 > C#' 카테고리의 다른 글

[C#] yield  (0) 2019.10.14
[C#] 반복문  (0) 2019.10.13
[C#] 조건문  (0) 2019.10.12
[C#] 데이터 타입  (0) 2019.10.09
[C#] 직렬화(Serialization)  (2) 2019.07.16
반응형

데이터 타입에 대해 알아보겠습니다.

 

1. 정수 형식

C# 형식 / 키워드 범위 크기 .NET 형식
sbyte -128 ~ 127 부호 있는 8비트 정수 System.SByte
byte 0 ~ 255 부호 없는 8비트 정수 System.Byte
short –32,768 ~ 32,767 부호 있는 16비트 정수 System.Int16
ushort 0 ~ 65,535 부호 없는 16비트 정수 System.UInt16
int –2,147,483,648 ~ 2,147,483,647 부호 있는 32비트 정수 System.Int32
uint 0 ~ 4,294,967,295 부호 없는 32비트 정수 System.UInt32
long –9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 부호 있는 64비트 정수 System.Int64
ulong 0 ~ 18,446,744,073,709,551,615 부호 없는 64비트 정수 System.UInt64

 

다음과 같이 사용할 수 있습니다.

int num = 1234;

 

정수 리터럴은 10진수, 16진수, 2진 리터럴로 다음과 같이 지정할 수 있습니다.

(리터럴 : 변하지 않는 데이터)

var decimalLiteral = 42;

var hexLiteral = 0x2A;

var binaryLiteral = 0b_0010_1010;

 

2. 부동 소수점 숫자 형식

C# 형식 / 키워드 근사 범위 전체 자릿수 .NET 형식
float ±1.5E−45 ~ ±3.4E38 ~6-9개 자릿수 System.Single
double ±5.0E−324 ~ ±1.7E308 ~15-17개 자릿수 System.Double
decimal ±1.0E-28 ~ ±7.9228E28 28-29개의 자릿수 System.Decimal

 

다음과 같이 사용할 수 있습니다.

double dbNum = 12.34;

 

부동 소수점 리터럴은 다음과 같이 지정할 수 있습니다.

d 또는 D 접미사는 리터럴을 double로 변환

f 또는 F 접미사는 리터럴을 float로 변환

m 또는 M 접미사는 리터럴 decimal로 변환

 

double dbNum = 12.34d;

float fNum = 12.34f;

decimal fNum = 12.34m;

 

3. char 형식

형식 범위 크기 .NET형식
char U+0000~U+FFFF 유니코드 16비트 문자 System.Char

 

4. enum 형식

열거형 데이터 타입으로 상수 집합으로 구성이 됩니다.

 

이렇게 정의 할 수 있습니다.

enum Day {Sun, Mon, Tue, Wed, Thu, Fri, Sat};

 

Sun가 0으로 시작되어, Mon에는 1, Tue에는 2와 같은 식으로 데이터가 정의됩니다.

 

그리고 이런 식으로 사용할 수 있습니다.

int x = (int)Day.Sat;

 

int형에 데이터를 넣기 이해서는 명시적 캐스트가 필요합니다.

 

 

5. bool 형식

부울 값인 true / false를 저정할 변수를 선언하는데 사용됩니다.

 

다음과 같이 사용할 수 있습니다.

bool bCheck = true;

 

 

6. Nullable 형식

기본적으로 값형식(int형 등)들은 null값을 가질 수 없습니다. 하지만 null값을 가지기 위해서는 nullable형식으로 만들면 됩니다.

 

값형식에 ?를 붙이거나, Nullable<int>로 null값을 가질 수 있는 데이터를 만들 수 있다. 

 

다음과 같이 사용합니다.

 

int? num1 = null

Nullable<int> num2= null;

 

반응형

'개발공부 > C#' 카테고리의 다른 글

[C#] yield  (0) 2019.10.14
[C#] 반복문  (0) 2019.10.13
[C#] 조건문  (0) 2019.10.12
[C#] 연산자  (0) 2019.10.10
[C#] 직렬화(Serialization)  (2) 2019.07.16
반응형

안녕하세요

 

오브젝트를 키보드로 이동하는 방법을 예제를 통해 알아보도록 하겠습니다.

 

새로운 프로젝트를 만듭니다.

 

그리고 바닥 오브젝트를 생성합니다.

 

Hierachy에서 오른쪽 클릭하여 3D Object - Plane로 생성합니다.

 

다음은 움직일 오브젝트를 생성합니다.

 

Hierachy에서 오른쪽 클릭하여 3D Object - Cube로 생성합니다.

 

그 후 Plane위에 Cube가 위치하도록 y축 값을 변경합니다.

 

다음과 같이 변경하였습니다.

그리고 Cube Object 스크립트를 추가합니다.

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Mover : MonoBehaviour
{
 
    float m_fSpeed = 5.0f;
    
    void Start()
    {
        
    }
 
    void Update()
    {
        float fHorizontal = Input.GetAxis("Horizontal");
        float fVertical = Input.GetAxis("Vertical");
 
        transform.Translate(Vector3.right * Time.deltaTime * m_fSpeed * fHorizontal, Space.World);
        transform.Translate(Vector3.up  * Time.deltaTime * m_fSpeed * fVertical, Space.World);
    }
}
 
 

 

Input.GetAxis("Horizontal");와 Input.GetAxis("Vertical"); 는 수평과 수직 입력값을 받아옵니다.

 

Input에 관한 키값은 Edit - Project Settings를 통해 설정할 수 있습니다.

 

기본적으로 Horizontal에는 방향키 왼쪽, 오른쪽 키와 'a'와 'd'키로 되어있고,

Vertical에는 방향키 아래, 위 키와 's'와 w 키로 되어있습니다.

 

왼쪽 키 혹은 a 키를 입력했을 경우에는 fHorizontal에 -1이 대입되고, 오른쪽 키 혹은 d키를 입력할 경우에는 fHorizontal에 1이 대입됩니다.

그리고, 아래키 혹은 s키를 입력할 경우에 fVertical에 -1이 대입되고, 위키 혹은 w키를 누를 경우 1이 대입됩니다.

 

 

다음 Translate함수를 통해 이동을 하게 되는데 다음과 같이 구현을 했습니다.

transform.Translate(Vector3.right * Time.deltaTime * m_fSpeed * fHorizontal, Space.World);

transform.Translate(Vector3.up  * Time.deltaTime * m_fSpeed * fVertical, Space.World);

입력값이 없으면 fHorizontal나 fVertical가 0이기 때문에 이동을 안하게 되고 입력값이 들어오면 값만큼 이동을 하게 됩니다.

 

 

위에 코드는 아래, 위, 왼쪽, 오른쪽으로 이동하도록 구현하였는데, 만약에 앞, 뒤, 왼쪽, 오른쪽으로 오브젝트를 이동하고자 한다면

transform.Translate(Vector3.up  * Time.deltaTime * m_fSpeed * fVertical, Space.World);

이 코드를 

transform.Translate(Vector3.forward  * Time.deltaTime * m_fSpeed * fVertical, Space.World);

이렇게 변경하면, 앞, 뒤로 이동하게 됩니다.

반응형
반응형

안녕하세요.

 

오늘은 유니티에서 마우스 클릭 시 객체가 이동하도록 구현해보겠습니다.

 

일단 기본적으로 바닥과 객체를 하나 생성하겠습니다.

 

바닥은 Quad로 생성하겠습니다.

 

 

그리고, 생성 후 바닥 같은 모양을 만들기 위해, 크기와 로테이션을 변경하겠습니다.

 

그리고 움직일 객체를 만들어보겠습니다.

 

Cube로 만들겠습니다.

 

Cube Object를 바닥 오브젝트와 적당한 거리로 이동시킵니다.

 

 

그리고 Cube Object에 스크립트를 추가합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Player : MonoBehaviour
{
    public float m_fSpeed = 5.0f;
    Vector3 m_vecTarget;
    void Start()
    {
        m_vecTarget = transform.position;
    }
 
    void Update()
    {
        if(Input.GetMouseButtonDown(0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            if(Physics.Raycast(ray, out hit, 10000f))
            {
                m_vecTarget = hit.point;
                m_vecTarget.y = transform.position.y;
            }
        }
        transform.position = Vector3.MoveTowards(transform.position, m_vecTarget, m_fSpeed * Time.deltaTime);
    }
}
 
 
cs

이렇게 추가하면 클릭할 때 마다 이동하는 것을 볼 수 있습니다.

 

Physics.Raycast(ray, out hit, 10000f)에 들어간 매개변수의 의미는

 

ray는 광선의 시작점과 방향

hit는 충돌체가 발생한 위치에 대한 정보가 함수에서 받아옵니다.

10000f는 광선이 충돌을 확인해야하는 최대 거리를 의미합니다.

 

반응형
반응형

안녕하세요.

 

처음 Toggle UI에 초기값을 스크립트를 통해 넣으려면 혼란스러운 점을 발견해서, 그거에 관련해서 넣는 방법에 대해 적으려고 합니다.

 

Toggle에 초기값을 에디터상에서 셋팅을 하려면 IsOn값을 변경하면 됩니다.

 

Is On상태에 대해 check 활성화 / 비활성화 상태가 됩니다.

 

스크립트에서도 마찬가지로 void Start()에서 초기값을 이런식으로 셋팅할 수 있습니다.

 

m_goToggle = GameObject.Find("Canvas/Toggle");
m_goToggle.GetComponent().isOn = true;

 

그리고 이벤트도 OnChangeToggle 함수를 연결했습니다.

 

public void OnChangeToggle(bool bActive)
{

       m_bToggle = !m_bToggle ;

}

 

이렇게 연결했을 경우 토글값이 계속 변경이 되어 확인해보니, 

 

에디터상에서 Is On 초기값과 스크립트 Start()함수에서 "m_goToggle.GetComponent().isOn = true"이 다를 경우 

 

"m_goToggle.GetComponent().isOn = true"구문에서, OnChangeToggle 함수가 호출되는 현상이 발생했습니다.

(On 초기값과 스크립트 Start()함수에서 "m_goToggle.GetComponent().isOn = true"이 같은 경우는 OnChangeToggle가

호출되지 않습니다.)

 

그래서, 이렇게 구현을 해야합니다.

 

public void OnChangeToggle(bool bActive) 
{ 

       m_bToggle = bActive ; 

}

 

혹시 이것도 문제가 발생한다면, 

 

public void OnChangeToggle(bool bActive) 
{ 

       m_bToggle = m_goToggle.GetComponent().isOn; 

}

 

이렇게 구현해보면 됩니다.

반응형
반응형

안녕하세요.

 

유니티로 개발을 하다보면, 유니터 에디터는 PC에서 구동되니까 모바일 환경에서의 문제를

 

유니터 에디터상에서 확인할 수 없는 상황이 있습니다.

 

폰으로 계속 연결하기도 좀 번거로운 경우가 많기 때문에 같은 PC환경이면서 모바일 환경이 지원되는 애뮬레이터를 사용하게 되는 경우가 많습니다. 

 

오늘은 제가 사용하는 안드로이드 에뮬레이터 미뮤(Memu)에 연결하여 adb logcat을 확인하는 방법에 대해 알아보겠습니다.

 

일단 미뮤(Memu)가 설치된 경로로 이동합니다.

 

미뮤(Memu) 바로가기 아이콘에 오른쪽 클릭 후 속성을 누르면 확인할 수 있습니다.

 

 

여기서 경로 표시줄에 "cmd"라고 쓰고 엔터를 누르면 명령 프롬프트를 실행할 수 있습니다.

 

 

미뮤(Memu)를 실행시킵니다.

 

그리고 명령 프롬프트창에서 미뮤와 연결을 시킵니다.

 

"adb connect 127.0.0.1:21503" 를 입력합니다.

 

 

성공메세지를 확인합니다.

 

그리고 adb logcat명령어를 사용합니다.

 

"adb logcat"이라고 적으면 미뮤(Memu)을 로그 데이터를 확인할 수 있습니다.

 

adb의 옵션에 대한 설명은 안드로이드 개발자 페이지에 자세히 나와있습니다.

 

https://developer.android.com/studio/command-line/logcat.html?hl=ko#filteringOutput

 

logcat 명령줄 도구  |  Android Developers

Logcat은 기기에서 오류와 메시지(앱에서 Log 클래스로 작성)가 표시될 때 스택 추적을 비롯하여 시스템 메시지의 로그를 덤프하는 명령줄 도구입니다.

developer.android.com

기본적으로 유니티로 만들 프로젝트의 로그를 확인하려면,

 

"adb logcat -s Unity" 를 입력합니다.

 

그러면 "Unity"가 포함된 로그만 출력이 되게 됩니다.

 

대소문자 구분을 합니다.

 

사용시 주의해야합니다.

 

 

반응형
반응형

Toogle UI를 이용해서 ON/OFF UI를 제작해보겠습니다.

 

일단 Hierarchy에서 오른쪽 클릭하여 Toogle UI를 생성합니다.

 

 

Hierarchy에서 Toogle이 가지고 있는 하위 오브젝트를 보면 Background(배경 이미지), Checkmark(체크 이미지), Lavel(텍스트)로 구성되어있는 것을 확인할 수 있습니다.

일단 텍스트는 필요 없기 때문에 Label은 제거합니다.

 

그리고 Toggle 오브젝트를 클릭해서 Inspector창을 확인해보면, 다음과 같이 구성되어있습니다.

Is On은 토글의 초기 상태를 켬 / 끔을 선택합니다.

 

Toggle Transition을 보시면 Fade / None이 있는데 이건 스르륵 사라지거나 생성되는 효과를 줄 건지를 정하는 건데 많은 차이가 없는 것 같습니다.

 

Graphic에 있는 이미지가 체크 해제를 하면 사라질 이미지 오브젝트를 지정합니다.

 

단순하게 해당 이미지 오브젝트를 사라지게 하는 것 같습니다. 하위에 있는 자식 오브젝트까지 사라지지 않습니다.

 

체크를 해제하면 checkmark 오브젝트의 이미지를 사라지게 합니다.

 

그래서 이것을 이용해 체크되었을 때는 ON이미지를 표시하고 체크 해제되면 ON이미지를 없애도록 구현하려고 합니다.

 

체크 해제 시에는 OFF가 표시되어야 하므로 바탕 이미지는 Background에 OFF이미지를 등록합니다.

 

Checkmark오브젝트에 Source Image를 On이미지를 넣습니다.

 

 

그리고 이미지 사이즈에 맞춰서 Width와 Height도 조절합니다.

 

제가 추가한 이미지 사이즈는 Width가 197, Height가 103이기 때문에 맞춰서 넣어줍니다.

 

그리고 Background 오브젝트에 OFF이미지를 넣어줍니다.

 

마찬가지로 이미지 사이즈에 따라서 Width, Height를 넣습니다.

 

이제 실행해봅니다.

 

클릭할 때마다 ON이 생기고 사라지는 것을 볼 수 있습니다.

 

Toogle이 바뀔 때마다 이벤트 처리는 Toogle 오브젝트의 Inspector창을 보시면 On Value Changed에서 함수를 넣어주면 됩니다.

 

그리고 참고로 토글 내 영역 외에도 더 넓게 클릭 시 영향을 받게 하고 싶다면 Toogle하위에 오브젝트를 생성하면 됩니다.

 

이렇게 하면 GameObject 영역을 클릭해도 영향을 받습니다.

 

하위 자식 오브젝트의 영향을 다 받는 것으로 보입니다.

 

소리 끄기 영역을 클릭하거나 ON/OFF영역을 클릭하면 ON이미지가 사라지거나 생성됩니다.

 

 

반응형
반응형

안녕하세요.

 

힘들게 만든 게임에서 수익을 얻으려면 게임 내에 광고를 붙여야 합니다.

 

그래야 보람도 있고, 살림살이도 나아지고.. 다음 게임도 제작할 수 있기 때문이죠...

 

그래서 오늘은 유니티에서 구글 애드몹 광고를 넣는 법에 대한 내용을 적어보겠습니다.

 

안드로이드에서만 연동할 것이기 때문에 IOS는 다른 사이트로 검색해보시는 것이 좋을 것 같습니다.

 

진행하겠습니다.

 

일단 아래 과정으로 진행할 예정입니다.

 

1. 구글 애드몹 가입

2. 앱 등록

3. unity plugin 다운 후 프로젝트에 임포트(Import)

4. 테스트 프로젝트에 코드 작성

 

 

 

1. 구글 애드몹 가입

아래 사이트에 접속합니다.

https://www.google.co.kr/admob/

 

Google AdMob - 모바일 앱 수익 창출, 분석, 조정

Google을 활용한 앱 홍보 애드워즈 유니버설 앱 캠페인을 사용하여 검색, Google Play, YouTube, Gmail, Google 디스플레이 네트워크에서 앱을 홍보하세요. ₩100,000달러를 지출하면 ₩100,000달러의 광고 크레딧이 제공됩니다. > 자세히 알아보기

www.google.co.kr

그리고 기존 구글 계정이 있다면, 구글 계정으로 로그인하고, 없다면 새롭게 회원가입을 해서 로그인합니다.

 

 

가입하기를 누르면 다음과 같이 나옵니다.

 

여기서 저는 대한민국, 서울, 대한민국 원으로 기입하고 약간 동의 체크를 했습니다.

 

계정 생성이 완료되면 다음 페이지가 나오게 되는데, 저는 무슨 내용이 오는지 궁금해서 다 "예"로 체크했습니다.

"아니요"하셔도 상관없을 것 같습니다.

이제 가입은 완료되었습니다.

 

 

2. 앱 등록

 

이제 다음과 같은 페이지가 뜨는데, 시작하기를 누릅니다.

 

다음엔 앱을 게시했는지 확인하는 페이지가 뜨는데, 저는 아직 앱을 올리지 않았기 때문에 "아니요"를 눌렀습니다.

 

"예"일 경우 등록된 앱을 검색해서 찾아줍니다.

 

앱 이름을 입력하고 유니트 프로젝트를 작성할 때 사용해야 하기 때문에 기억해둡니다. 메모장 같은데 적어두는 것을 추천합니다)

 

다음과 같이 기입 후 추가 버튼을 눌러서 다음 페이지로 넘어갑니다.

 

앱이 AdMob에 추가되었습니다.

앱 ID는 나중에 사용해야 하기 때문에 앱 ID를 메모장 같은데 복사해놓고 "다음 단계:광고 단위 만들기"를 누릅니다.

 

 

그람 광고 단위를 설정할 수 있는 페이지가 나오는데, 저는 전면 광고를 선택합니다.

 

 

광고 단위 이름을 입력 후 "광고 단위 만들기" 버튼을 누릅니다.

 

 

앱 ID와 단위 ID를 메모장에 넣고, 완료 버튼을 누릅니다.

 

 

등록이 완료되었습니다.

 

그 후 실제 광고 게재 설정을 위해서는 다음과 같은 설정이 필요합니다.

 

다음은 결제 세부정보를 입력하고 제출을 누릅니다.

 

스크린샷을 깜빡하고 못 찍었네요..

 

완료하면 다음과 같은 페이지가 뜹니다.

 

 

 

3. unity plugin 다운 후 프로젝트에 임포트(Import)

 

다음 사이트에 접속해서 플러그인을 다운로드합니다.

 

https://developers.google.com/admob/unity/start

 

시작하기  |  Unity  |  Google Developers

Unity에서 앱을 제작 중인 AdMob 게시자를 위한 모바일 광고 SDK입니다.

developers.google.com

 

버전이 계속 업데이트되기 때문에 다른 페이지가 보일 수도 있지만, 2019년 10월 3일 기준으로 다음과 같은 페이지에서 

unitypackage를 다운로드합니다.

 

임포트 할 프로젝트를 열어둔 후 임포트를 합니다.

임포트 후 유니티 빌드 세팅을 Android로 설정합니다.

 

이렇게 뜬다면 "Enable"을 누릅니다.

 

이 화면이 뜨지 않고 Plaform이 이미 바꾸었다면,

 

Unity 편집기에서 Assets(애셋) > Play Services Resolver(Play 서비스 리졸버) > Android Resolver(Android 리졸버) > Resolve(해결)를 선택합니다.

 

이후 Google AdMob설정을 합니다.

 Assets(애셋) > Google Mobile Ads > Settings

Inspector창을 보면 Google AdMob을 Enabled 체크하고 AppID를 넣습니다.

 

 

 

 

4. 테스트 프로젝트에 코드 작성

유니티에서 테스트할 버튼 UI를 만들어줍니다.

버튼을 이용해서 광고를 보여줄 예정입니다.

빈 게임 오브젝트를 만든 후 스크립트를 생성해서 넣습니다.

 

스크립트를 작성합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
using System;
using UnityEngine;
using GoogleMobileAds.Api;
 
public class GoogleAdsManager : MonoBehaviour
{
    private BannerView bannerView;
    private InterstitialAd interstitial;
 
    // Start is called before the first frame update
    void Start()
    {
#if UNITY_ANDROID
        string appId = "ca-app-pub-3940256099942544~3347511713";
#elif UNITY_IPHONE
        string appId = "ca-app-pub-3940256099942544~1458002511";
#else
        string appId = "unexpected_platform";
#endif
        MobileAds.Initialize(appId);
 
        RequestInterstitial();
 
    }
 
    // Update is called once per frame
    void Update()
    {
        
    }
 
 
    private void RequestInterstitial()
    {
#if UNITY_ANDROID
        string adUnitId = "ca-app-pub-3940256099942544/1033173712";
#elif UNITY_IPHONE
        string adUnitId = "ca-app-pub-3940256099942544/4411468910";
#else
        string adUnitId = "unexpected_platform";
#endif
 
        // Initialize an InterstitialAd.
        this.interstitial = new InterstitialAd(adUnitId);
        // Called when an ad request has successfully loaded.
        this.interstitial.OnAdLoaded += HandleOnAdLoaded;
        // Called when an ad request failed to load.
        this.interstitial.OnAdFailedToLoad += HandleOnAdFailedToLoad;
        // Called when an ad is shown.
        this.interstitial.OnAdOpening += HandleOnAdOpened;
        // Called when the ad is closed.
        this.interstitial.OnAdClosed += HandleOnAdClosed;
        // Called when the ad click caused the user to leave the application.
        this.interstitial.OnAdLeavingApplication += HandleOnAdLeavingApplication;
        // Create an empty ad request.
        AdRequest request = new AdRequest.Builder().Build();
        // Load the interstitial with the request.
        this.interstitial.LoadAd(request);
 
        
 
    }
    public void HandleOnAdLoaded(object sender, EventArgs args)
    {
        MonoBehaviour.print("HandleAdLoaded event received");
    }
 
    public void HandleOnAdFailedToLoad(object sender, AdFailedToLoadEventArgs args)
    {
        MonoBehaviour.print("HandleFailedToReceiveAd event received with message: "
                            + args.Message);
    }
 
    public void HandleOnAdOpened(object sender, EventArgs args)
    {
        MonoBehaviour.print("HandleAdOpened event received");
    }
 
    public void HandleOnAdClosed(object sender, EventArgs args)
    {
        MonoBehaviour.print("HandleAdClosed event received");
        RequestInterstitial();
    }
 
    public void HandleOnAdLeavingApplication(object sender, EventArgs args)
    {
        MonoBehaviour.print("HandleAdLeavingApplication event received");
    }
    public void AdsShow()
    {
        if (this.interstitial.IsLoaded())
        {
            this.interstitial.Show();
        }
        else
        {
            RequestInterstitial();
        }
    }
}
 
cs

 

AdsShow() 함수를 버튼 클릭 시 연결합니다.

 

앱 ID와 광고 단위 아이디는 테스트용 아이디를 사용했습니다.

실제 광고를 보려면 아까 발급받은 아이디를 사용하면 됩니다.

1시간 정도면 적용이 된다고 하는데, 그 이상이 걸릴 수 있을 것 같습니다.

1시간이 지났는데도, 테스트 광고는 뜨는데, 실제 광고가 안 뜨는 경우 Google Mobile Ads SDK Developers 그룹에 문의를 한 블로그가 있어서 링크를 했습니다.

https://hoonihoon.tistory.com/category/Admob

 

'Admob' 카테고리의 글 목록

앱, IT, 블로그, 생활상식, 등 도움이 되는 모든 것을 공유 합니다.

hoonihoon.tistory.com

댓글에서 확인해보면 플레이 스토어에 올리면 해결이 된다고합니다.

반응형
반응형

안녕하세요.

 

앱을 제작 후 혼자만 한다면 상관없지만, 대부분의 사람들은 다른 사람들이 내가 개발한 앱을 했으면 좋겠다고 생각할 것입니다.

 

그러기 위해서는 안드로이드 앱은 구글 플레이에 앱을 등록해야 합니다.

 

일단 앱을 등록하려면 Google Play 개발자 계정 등록부터 해야 합니다.

 

오늘은 구글 플레이에 앱을 올릴 수 있도록 개발자 등록하는 과정을 소개하려고 합니다.

 

 

Google Play Console로 접속합니다.

https://play.google.com/apps/publish/signup/#

 

Redirecting...

 

play.google.com

 

일단 구글 계정이 필요합니다.

 

기존에 사용하는 계정이나 새로운 계정을 다시 생성해서 로그인해야 합니다.

 

 

18세 이상임을 확인한 후 25달러를 결제할 신용카드를 준비한 후

 

"결제 페이지로 이동" 버튼을 누릅니다.

 

그럼 결제 페이지가 뜨고,

 

카드 정보를 입력합니다.

 

이때 스크린샷을 안 찍고 결제를 눌러버려서 이미지가 없네요;;

 

개발자 프로필에 대해 입력합니다.

 

개발자 이름, 이메일 주소, 웹사이트, 전화번호를 입력합니다

 

개발자 계정 ID는 부여되어있습니다.

 

저는 전화번호 입력을 어떻게 해야 하는지 혼란스러웠습니다.

 

010-5555-2222라면 +82-10-5555-2222로 입력합니다.

 

입력을 완료하면 다음과 같은 페이지가 뜹니다.

 

 

정말 쉽게 개발자 등록이 완료되었습니다.

 

이제 어엿한 구글 Goolgle Play 개발자가 되었습니다.

반응형
반응형

 

안녕하세요.

 

오늘은 안드로이드에서의 백버튼을 눌렀을 경우 게임이 종료와 홈버튼을 눌러서 프로그램이 비활성화 되었을 경우에 대해서 알아보겠습니다.

 

유니티 종료 함수

Application.Quit() 함수를 이용하여 종료를 합니다.

 

사용은 다음과 같이 합니다.

1
2
3
4
5
6
7
8
void Update()
{
    if (Input.GetKeyDown(KeyCode.Escape))
    { 
        Application.Quit();
    }
}
 
 
cs

 

참고로 Input.GetKeyDown(KeyCode.Escape) 이건 에디터상에서는 ESC키를 입력했을 때이며, 안드로이드폰에서 실행했을 경우에는 백버튼을 눌렀을 경우 발생이 됩니다.

 

비활성화 시 처리

OnApplicationPause 함수에서 처리를 합니다.

다음과 같이 OnApplicationPause에서 정지시 이벤트를 구현합니다.

1
2
3
4
void OnApplicationPause(bool pauseStatus)
{
    m_bPause = pauseStatus;
}
 
cs

 

 

응용

종료 함수를 넣고, 간단하게 text ui값이 1초마다 1씩 증가하는데, 비활성되었을 경우 잠시 중지되고, 활성화되면 다시 증가하도록 구현해보겠습니다.

구성은 이렇게 했습니다.

Text와 Button을 생성하고 빈 GameObject를 생성합니다.

용도는 Text는 숫자가 증가하는 값을 넣을것이고, Button은 직접 기기로 테스트가 불가능하므로 버튼에서 OnApplicationPause를 호출하도록 하겠습니다. 그리고 빈 GameObject에 스크립트를 넣겠습니다.

버튼 변경 내용
GameObject 스크립트추가

 

이렇게 하고 스크립트에 다음 코드를 넣습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class GameManger : MonoBehaviour
{
    GameObject m_goText;
    float m_fCount = 0;
    bool m_bPause = false;
    void Start()
    {
        m_goText = GameObject.Find("Canvas/Text");
        m_goText.GetComponent<Text>().text = "1";
    }
    void Update()
    {
        if (!m_bPause)
        {
            m_fCount += Time.deltaTime;
            m_goText.GetComponent<Text>().text = "";
            m_goText.GetComponent<Text>().text += (int)m_fCount;
        }
        // 백버튼을 눌렀을 경우 게임 종료
        if (Input.GetKeyDown(KeyCode.Escape))
        {
            Application.Quit();
        }
    }
    // 임의로 버튼에 OnApplicationPause호출
    public void SetPause()
    {
        OnApplicationPause(!m_bPause);
    }
    // 백버튼 눌렀을 때 발생하는 함수
    void OnApplicationPause(bool pauseStatus)
    {
        m_bPause = pauseStatus;
    }
}
 
 
cs

 

이렇게 하면 버튼을 눌렀을 경우 카운터를 잠시 중지하고, 다시 누르면 진행되는 것을 볼 수 있습니다.

 

반응형
반응형

안녕하세요.

 

오늘은 게임에서 화면을 드래그해서 UI를 볼 수 있는 UI Scroll View를 구현해보겠습니다.

 

1. UI를 만들겠습니다.

보통 게임상에서는 버튼을 스크롤하는 경우가 많기 때문에, 여러개의 버튼을 생성해서 스크롤 할 수 있도록 만들려고합니다.

3가지 오브젝트를 만듭니다.

바탕이 될 이미지 오브젝트, 스크롤할 빈 GameObject, 스크롤할 버튼들을 만듭니다.

- Hierarchy에서 오른쪽 클릭 후 UI - Image에서 이미지 오브젝트를 생성합니다.

 

- 그리고 Canvas에서 빈오브젝트를 생성합니다.

- 같은 방식으로 버튼들을 여러개 생성합니다.(UI - Button)

 

저는 4개정도를 생성해보겠습니다.

 

그러면 Hierarchy에 다음과 같이 오브젝트가 생성되어있는 것을 볼 수 있습니다.

 

2. 이제 위치와 사이즈를 조정하겠습니다.

이미지 오브젝트의 구석에 위치 시키고 사이즈를 화면에 맞춥니다.

그리고 빈 게임오브젝트를 선택해서 크기를 늘려줍니다.

주의할 점은 배경으로 사용할 이미지보다는 사이즈를 크게 만들어야합니다.

저같은 경우는 지금 배경으로 사용할 이미지의 Width와 Height의 크기가 각각 926, 521이기 때문에 이것보다 더 크게 만들어야 합니다.

 

이렇게 사이즈를 키우겠습니다.

 

Width와 Height값은 각각 1271.2, 757.6으로 설정했습니다.

 

그리고 이제 버튼의 위치를 조정합니다.

 

위 / 아래와 좌 / 우 스크롤을 확인하기 위해 다음과 같이 조정합니다.

 

 

3. 이제 오브젝트의 구성을 합니다.

Button들의 GameObject하위에 넣고 GameObject는 Image하위에 넣습니다.

4. 이미지 오브젝트를 선택 후 Add Componect하여, Scroll Rect를 추가합니다.

5. GameObject를 Image의 Scroll Rect에 Content에 넣습니다.

 

이제 실행해봅니다.

 

화면을 드래그 하면 UI를 이동시킬 수 있습니다.

 

6. 이미지 오브젝트를 선택 후 Add Componect하여, mask를 추가하면 화면에 보이지 않는 이미지 오브젝트 영역밖에 있는 버튼들은 안보이도록 할 수 있습니다.

 

Scroll Rect에 대한 자세한 내용은 유니티 메뉴얼을 참조하시면 될 것 같습니다.

https://docs.unity3d.com/kr/current/Manual/script-ScrollRect.html

 

스크롤 사각 영역 - Unity 매뉴얼

공간을 많이 차지하는 콘텐츠를 작은 영역에 표시해야 할 때 스크롤 사각 영역을 활용할 수 있습니다. 스크롤 사각 영역(Scroll Rect)은 콘텐츠를 스크롤하는 기능을 제공합니다.

docs.unity3d.com

감사합니다.

반응형
반응형

안녕하세요.

 

간단하게 캐릭터의 HP를 유니티 슬라이더로 제작하려고 합니다.

 

일단 전에 만들었던 방식으로 Slider를 생성합니다.

 

 

1. Hierarchy에서 오른쪽 클릭해서 UI - Slider로 슬라이더 오브젝트를 생성

 

2. Background, Fill Area, Handle Slide Area 설정

Silder에는 Background, Fill Area, Handle Slide Area로 구성되어있는데,

Handle Slide Area는 슬라이더 조절이 필요하지 않기 때문에 이건 비활성화(disable)합니다.

 

 

 

3. 배경색과 채워졌을 때 색을 설정합니다.

(1) 배경색 변경(Canvas-Silder-Background)

 

(2) 채워졌을 때 색 변경(Canvas-Silder-Fill Area-Fill)

4. 값이 다 채워졌을 경우를 위해 Cavas - Slider - Fill Area에 Right수치 변경

값을 맥스값으로 설정했을 경우에도 다 채워 지지 않은걸 볼 수 있습니다.

 

 

이 경우에는 Cavas - Slider - Fill Area에 Right수치를 5로 변경하면 다 채워지는 것을 볼 수 있습니다.

 

 

5. 슬라이더 값이 0일 때 처리

슬라이더 값이 채워질때 사용하는 소스 이미지 모양이 네모난 모양입니다.

그로 인해서, 0일 경우에도 이미지가 남아있는 것을 볼 수 있습니다.

 

이것을 해결하기 위해서는 슬라이더가 아닌 직접 만드는 방식을 사용할 수 있습니다.

https://www.youtube.com/watch?v=l11fkFoFfrg

하지만 여기서는 순수 Slider만 사용할 것이기 때문에, 0일 경우 Fill Area를 비활성화시키고, 0 이상일 경우 활성화하는 방식을 사용하겠습니다.

 

스크립트를 추가하겠습니다.

 

Slider에서 Add Component 클릭하여 스크립트를 추가합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;  // Silder class 사용하기 위해 추가합니다.
 
public class TestSlider : MonoBehaviour
{
    Slider slHP;
    float fSliderBarTime;
    void Start()
    {
       slHP = GetComponent<Slider>();
    }
 
 
    void Update()
    {
        if (slHP.value <= 0)
            transform.Find("Fill Area").gameObject.SetActive(false);
        else
            transform.Find("Fill Area").gameObject.SetActive(true);
    }
}
 
cs

 

Slider에서 값을 임의로 바꿔서 제대로 실행되는 지 확인합니다.

 

반응형
반응형

 

게임 중에 제한된 시간내에 미션을 수행해야 하는 게임이 많은데요.

 

이때 사용할 유니티 슬라이더 타이머 UI를 만들어보겠습니다.

 

1. Hierarchy에서 오른쪽 클릭해서 UI - Slider로 오브젝트를 생성합니다.

 

 

2. Silder에는 Background, Fill Area, Handle Slide Area로 구성되어있다.

우리는 타이머용 슬라이더 UI가 필요하기 때문에 "Handle Slide Area" 는 비활성화 합니다.

 

3. 채워졌을 때 색과 배경색을 설정합니다.

   (1) 채워졌을 때 설정 (Canvas-Silder-Fill Area-Fill)

 

   (2) 배경색 변경(Canvas-Silder-Background)

4. 색이 제대로 적용되었는지 확인합니다.

Value값을 변경해봅니다.

확인 후 수치 변화를 수월하게 확인을 위해 Max Value값 수치를 100으로 변경합니다.

5. Slider에서 Add Component 클릭하여 스크립트를 추가합니다.

 

6. 스크립트에 코드를 입력합니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;   // Silder class 사용하기 위해 추가합니다.
 
public class SliderTimer : MonoBehaviour
{
    Slider slTimer;
    float fSliderBarTime;
    void Start()
    {
        slTimer = GetComponent<Slider>();
    }
 
    void Update()
    {
        if (slTimer.value > 0.0f)
        {
            // 시간이 변경한 만큼 slider Value 변경을 합니다.
            slTimer.value -= Time.deltaTime;
        }
        else
        {
            Debug.Log("Time is Zero.");
        }
    }
}
 
cs

7. 실행을 해서 슬라이더가 줄어드는 것을 확인합니다.

반응형
반응형

 

 

안녕하세요. 개발남입니다.

 

티스토리를 사용하다보니 다른 블로거들은 프로그래밍 코드를 예쁘게 삽입하는것을 보고,

 

html태그를 제작하려고 찾아보니, 간단하게 추가하는 방법이 있어서 소개드리려고합니다.

 

Color Scripter를 이용하는 방법입니다.

정말로 간단하게 추가할 수 있습니다.

https://colorscripter.com/

 

Color Scripter

Simple & Flexible Syntax HighLighter

colorscripter.com

이 사이트에 들어가면 다음과 같은 화면이 뜹니다.

 

여기에서 소스 코드를 붙여넣습니다.

자동으로 언어를 인식됩니다. 그 후 스타일패키지, 배경 등을 이용해서 원하는 스타일로 만들어줍니다.

 

그리고 우측(오른쪽)하단에 HTML로 복사 버튼을 누릅니다.

 

 

 

 

여기서 Ctrl+c버튼을 눌러서 복사를 합니다.

 

그리고 티스토리에서 글쓸때, 기본모드 -> HTML로 변경해준 후 위치에 맞춰서 태그를 붙여넣어줍니다.

 

다음은 HTML로 추가한 상태입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
using System
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; // 파일 입출력 스트림을 위해 추가 
using System.Runtime.Serialization.Formatters.Binary; // 바이너리 포맷을 위해 추가 
using System.Runtime.Serialization; // IFormatter 인터페이스 사용을 위해 추가 
 
[Serializable] 
public class DataObject 
    public int num1; 
    public int num2; 
 
namespace ConsoleTest 
    class Program 
    { 
        static void Main(string[] args) 
        { 
            DataObject data1 = new DataObject(); 
            data1.num1 = 1
            data1.num2 = 2
 
 
            IFormatter formatter = new BinaryFormatter(); 
 
            Stream streamFileWrite = new FileStream("tttt.txt", FileMode.Create, FileAccess.Write, FileShare.None); 
            formatter.Serialize(streamFileWrite, data1); 
            streamFileWrite.Close(); 
 
            Stream streamFileRead = new FileStream("tttt.txt", FileMode.Open, FileAccess.Read, FileShare.None); 
            DataObject data2 = (DataObject)formatter.Deserialize(streamFileRead); 
            streamFileRead.Close(); 
 
            Console.WriteLine("num1 : " + data2.num1); 
            Console.WriteLine("num2 : " + data2.num2); 
 
            } 
        } 
cs

 

 

 

 

반응형
반응형

 

 

유니티를 이용하여 게임을 제작 시 유저의 데이터(점수, 위치)등을 저장해야 하는 경우가 있습니다.

 

그러기 위해서 Json이라는 형식을 이용하면 텍스트로 이루어져 있기 때문에 이해하기도 쉽고, 직렬화 / 역직렬화를 통해  

게임 내 데이터와 Json데이터의 상호 변환이 쉽게 가능합니다.

 

현재 제가 쓰는 2018.3.9 버전에서는 기본적으로 지원하기 때문에 따로 using 할 필요가 없습니다.

 

그럼 바로 실습을 해보겠습니다.

 

JsonTest라는 프로젝트를 하나 만들었습니다.

 

빈 오브젝트를 만듭니다.

 

Add Component를 눌러서 Script를 추가합니다.

스크립트를 더블클릭 합니다.

 

 

 

1. 코드를 확인합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 
 
public class JsonTest : MonoBehaviour 
    // Start is called before the first frame update 
    void Start() 
    { 
         
    } 
 
    // Update is called once per frame 
    void Update() 
    { 
         
    } 
}
cs

이제 여기서 작업을 하겠습니다.

 

 

 

2. 클래스를 추가합니다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 
 
[System.Serializable] 
public class Data 
    public int m_nLevel; 
    public Vector3 m_vecPositon; 
 
    public void printData() 
    { 
        Debug.Log("Level : " + m_nLevel); 
        Debug.Log("Position : " + m_vecPositon); 
    } 
 
public class JsonTest : MonoBehaviour 
    // Start is called before the first frame update 
    void Start() 
    { 
         
    } 
 
    // Update is called once per frame 
    void Update() 
    { 
         
    } 
cs

 

 

 

 

3. 클래스 오브젝트를 생성하고, 데이터를 삽입합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 
 
[System.Serializable] 
public class Data 
    public int m_nLevel; 
    public Vector3 m_vecPositon; 
 
    public void printData() 
    { 
        Debug.Log("Level : " + m_nLevel); 
        Debug.Log("Position : " + m_vecPositon); 
    } 
 
public class JsonTest : MonoBehaviour 
    // Start is called before the first frame update 
    void Start() 
    { 
        Data data = new Data(); 
        data.m_nLevel = 12
        data.m_vecPositon = new Vector3(3.4f, 5.6f, 7.8f); 
 
    } 
 
    // Update is called once per frame 
    void Update() 
    { 
         
    } 
}
cs

 

 

 

 

4. 오브젝트 데이터를 Json형식으로 스트링에 넣습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 
 
[System.Serializable] 
public class Data 
    public int m_nLevel; 
    public Vector3 m_vecPositon; 
 
    public void printData() 
    { 
        Debug.Log("Level : " + m_nLevel); 
        Debug.Log("Position : " + m_vecPositon); 
    } 
 
public class JsonTest : MonoBehaviour 
    // Start is called before the first frame update 
    void Start() 
    { 
        Data data = new Data(); 
        data.m_nLevel = 12
        data.m_vecPositon = new Vector3(3.4f, 5.6f, 7.8f); 
 
        string str = JsonUtility.ToJson(data); 
        
        Debug.Log("ToJson : " + str); 
    } 
 
    // Update is called once per frame 
    void Update() 
    { 
         
    } 
}
cs

-----------------------------------------------------------------------------------------

 

JsonUtility.ToJson함수를 이용하여 오브젝트를 json형식으로 변환합니다.

다음과 같이 실행됩니다.

 

 

 

5. json형식의 데이터를 다시 오브젝트 형으로 변환합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 
 
[System.Serializable] 
public class Data 
    public int m_nLevel; 
    public Vector3 m_vecPositon; 
 
    public void printData() 
    { 
        Debug.Log("Level : " + m_nLevel); 
        Debug.Log("Position : " + m_vecPositon); 
    } 
 
public class JsonTest : MonoBehaviour 
    // Start is called before the first frame update 
    void Start() 
    { 
        Data data = new Data(); 
        data.m_nLevel = 12
        data.m_vecPositon = new Vector3(3.4f, 5.6f, 7.8f); 
 
        string str = JsonUtility.ToJson(data); 
 
        Debug.Log("ToJson : " + str); 
 
       Data data2 = JsonUtility.FromJson<Data>(str);
        data2.printData(); 
    } 
 
    // Update is called once per frame 
    void Update() 
    { 
         
    } 
 
 
cs

 

 

 

-----------------------------------------------------------------------------------------

 

JsonUtility.FromJson 함수로 오브젝트로 값을 넣습니다.

 

실행되면 결과는 다음과 같습니다.

 

 

 

 

6. json파일로 저장하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
using System.Collections; 
using System.Collections.Generic; 
using System.IO; 
using UnityEngine; 
 
[System.Serializable] 
public class Data 
    public int m_nLevel; 
    public Vector3 m_vecPositon; 
 
    public void printData() 
    { 
        Debug.Log("Level : " + m_nLevel); 
        Debug.Log("Position : " + m_vecPositon); 
    } 
 
public class JsonTest : MonoBehaviour 
    // Start is called before the first frame update 
    void Start() 
    { 
        Data data = new Data(); 
        data.m_nLevel = 12
        data.m_vecPositon = new Vector3(3.4f, 5.6f, 7.8f); 
 
        string str = JsonUtility.ToJson(data); 
 
        Debug.Log("ToJson : " + str); 
 
       Data data2 = JsonUtility.FromJson<Data>(str);
        data2.printData(); 
 
        // file save 
 
        Data data3 = new Data(); 
        data3.m_nLevel = 99
        data3.m_vecPositon = new Vector3(8.1f, 9.2f, 7.2f); 
 
        
        File.WriteAllText(Application.dataPath + "/TestJson.json", JsonUtility.ToJson(data3)); 
    } 
 
    // Update is called once per frame 
    void Update() 
    { 
         
    } 
}
cs

 

Application.dataPath는 지금 작업 폴더를 말합니다.

실행을 하면 TestJson.json 파일이 생성됩니다.

 

 

 

 

 

7. 저장한 json파일 로드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
using System.Collections; 
using System.Collections.Generic; 
using System.IO; 
using UnityEngine; 
 
[System.Serializable] 
public class Data 
    public int m_nLevel; 
    public Vector3 m_vecPositon; 
 
    public void printData() 
    { 
        Debug.Log("Level : " + m_nLevel); 
        Debug.Log("Position : " + m_vecPositon); 
    } 
 
public class JsonTest : MonoBehaviour 
    // Start is called before the first frame update 
    void Start() 
    { 
        Data data = new Data(); 
        data.m_nLevel = 12
        data.m_vecPositon = new Vector3(3.4f, 5.6f, 7.8f); 
 
        string str = JsonUtility.ToJson(data); 
 
        Debug.Log("ToJson : " + str); 
 
       Data data2 = JsonUtility.FromJson<Data>(str);
        data2.printData(); 
 
        // file save 
 
        Data data3 = new Data(); 
        data3.m_nLevel = 99
        data3.m_vecPositon = new Vector3(8.1f, 9.2f, 7.2f); 
 
        File.WriteAllText(Application.dataPath + "/TestJson.json", JsonUtility.ToJson(data3)); 
 
        // file load 
 
        string str2 = File.ReadAllText(Application.dataPath + "/TestJson.json"); 
 
       Data data4 = JsonUtility.FromJson<Data>(str2);
        data4.printData(); 
    } 
 
    // Update is called once per frame 
    void Update() 
    { 
         
    } 
}
cs

저장한 파일을 로드합니다.

그 후 콘솔에서 출력합니다.

 

반응형

+ Recent posts