유니티에서도 메서드에 접근할 때 접근 지정자를 둘 수 있다.
여기서 알아볼 것은 public과 private, static 세가지이다. 그리고 데이터를 유니티에 저장하는 PlayerPrefs에 대해 알아보자.
간단한 요약
public : 스크립트와 하이러키 뷰에서 선택하여 인스펙터에서 값을 변경할 수 있다. 하지만 유니티 툴에서 값을 변경하면 스크립트보다 인스펙터에서 변경한 값이 우선시 되니 우선 순위를 알아두자.
private : 스크립트에서 수정해야 하며 public처럼 인스펙터에서 값을 변경할 수 없다. 즉 감춰진다.
UI 버튼에서는 SendMessage를 이용하여 메서드를 호출할 수 있다.
static : 다른 클래스라도 클래스이름으로 바로 호출할 수 있다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RotateBox : MonoBehaviour
{
public static int numX = 0;
public static int AddTwoNum(int x, int y) // static
{
return x + y;
}
public void Rotate1() // public
{
this.transform.Rotate(Vector3.up * 90f);
}
private void Rotate2() // private
{
this.transform.Rotate(Vector3.up * -90f);
}
}
위의 스크립트를 이용하여 하단의 오브젝트를 Button Public을 눌렀을 때는 왼쪽으로 90도, Button Private를 눌렀을 때는 오른쪽으로 90도를 회전시켜보자.
UI는 하이러키 뷰에서 우클릭 - UI -Button TextMeshPro를 선택하여 생성하자.
public
public void Rotate1() // public
{
this.transform.Rotate(Vector3.up * 90f);
}
앞서 설명했듯이 스크립트나 하이러키 뷰에서 선택하여 인스펙터에서 값을 변경할 수 있다.
그리고 UI 버튼에서 보았을 때, public으로 선언된 해당 메서드를 직접 호출할 수도 있다.
priavte
private void Rotate2() // private
{
this.transform.Rotate(Vector3.up * -90f);
}
private는 스크립트에서 수정을 해야하고 인스펙터에서도 감춰져서 변경할 수 없다.
그렇다면 UI에서도 접근이 불가능한가? -> 그것은 아니다. 해당클래스의 SendMessage를 이용하여
private으로 선언된 Rotate2() 메서드를 간접 호출할 수 있다.
static
public class RotateBox : MonoBehaviour
{
public static int numX = 0;
public static int AddTwoNum(int x, int y) // static
{
return x + y;
}
}
static으로 선언하게 되면 다른클래스에서 static으로 선언된 클래스의 필드나 메서드를 클래스 이름으로 호출할 수 있다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RunStatic : MonoBehaviour
{
void Start()
{
Debug.Log($"RotateBox.numX = {RotateBox.numX}");
Debug.Log($"RotateBox.AddTwoNum(3, 5) = {RotateBox.AddTwoNum(3, 5)}");
}
}
RotateBox.numX와 RotateBox.AddTwoNum(3, 5)로 다른 클래스의 이름으로 바로 호출한다.
PlayerPrefs
PlayerPrefs를 이용하면 유니티에서도 데이터를 저장하고 불러올 수 있다. 그리고 다시 재실행해도 입력한 값이 저장된다.
아래 처럼 값을 저장하고 불러와보자.
PrefsSaveLoad
using System;
using System.Collections;
using System.Collections.Generic;
using TMPro; // 추가
using UnityEngine;
using UnityEngine.UI; // 추가
public class PrefsSaveLoad : MonoBehaviour
{
//public TMP_InputField inputIntKey;
public TMP_InputField inputIntKey; //직접 연결
public TMP_InputField inputIntValue;
public TMP_InputField inputFloatKey;
public TMP_InputField inputFloatValue;
public TMP_InputField inputStringKey;
public TMP_InputField inputStringValue;
public TMP_InputField outputKey;
public TMP_InputField outputField;
public void saveInt()
{
PlayerPrefs.SetInt(inputIntKey.text, Int32.Parse(inputIntValue.text));
}
public void saveFloat()
{
PlayerPrefs.SetFloat(inputFloatKey.text, float.Parse(inputFloatValue.text));
}
public void saveString()
{
PlayerPrefs.SetString(inputStringKey.text, inputStringValue.text);
}
public void loadData()
{
int num = PlayerPrefs.GetInt(outputKey.text);
float fnum = PlayerPrefs.GetFloat(outputKey.text);
String str = PlayerPrefs.GetString(outputKey.text);
if (num != 0)
outputField.text += String.Format($"{outputKey.text} : {num}\r\n");
if (fnum != 0f)
outputField.text += String.Format($"{outputKey.text} : {fnum}\r\n");
if (str != "")
outputField.text += String.Format($"{outputKey.text} : {str}\r\n");
}
}
PlayerPrefs를 이용하여 데이터를 Set으로 저정하고 변환하여 Get으로 저장된 것을 불러올 수도 있다.
해당 스크립트를 작성한 후 빈 게임 오브젝트를 생성하여 컴포넌트에 추가한 후, InputField를 지정한 변수에 맞게 드래그하여 넣어주면 된다.
'개발 > Unity' 카테고리의 다른 글
[Unity] 2.5D 아이소메트릭 타일맵 그리기 [Isometric 2.5D TileMap] (1) | 2023.03.13 |
---|---|
[Unity] 씬, 씬 전환 [SceneManager, LoadScene] (1) | 2023.03.05 |
[Unity] 코루틴 [Coroutine] (0) | 2023.02.27 |
[Unity] 레이캐스트, 레이저 충돌 [Raycast] (0) | 2023.02.27 |
[Unity] 프리팹의 복제와 재사용, Instantiate [Prefab, Instantiate] (0) | 2023.02.24 |