잔잔이네
article thumbnail

유니티에서도 메서드에 접근할 때 접근 지정자를 둘 수 있다.

여기서 알아볼 것은 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를 지정한 변수에 맞게 드래그하여 넣어주면 된다.

 

profile

잔잔이네

@잔잔잔잔

🌈

검색 태그