# data[].attributes.attachment_link.readable_text
TextMeshPro
UnityPackageManager에서 TextMeshPro를 추가
noto sans 유니티에 넣기
Window > TextMeshPro > Font Asset Creator
Padding : 4
Packing Method : Fast
Atlas Resolution : 4096
Character Set : Custom Range
Character Sequence : 32-126, 44032-55203, 12593-12634


# data[].attributes.attachment_link.readable_text
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Mover : MonoBehaviour
{
    private CapsuleCollider capsuleCollider;
    public VariableJoystick joy;
    public float speed;
    Rigidbody rigid;
    Animator anim;
    Vector3 moveVec;

    void Start()
    {
        // ìº¡ì ì½ë¼ì´ë ì»´í¬ëí¸ ì°¸ì¡°
        capsuleCollider = GetComponent<CapsuleCollider>();
    }

    void Awake()
    {
        rigid = GetComponent<Rigidbody>();
        anim = GetComponent<Animator>();
    }

    void FixedUpdate()
    {
        float x = joy.Horizontal;
        float z = joy.Vertical;

        moveVec = new Vector3(x, 0f, z) * speed * Time.deltaTime;
        rigid.MovePosition(rigid.position + moveVec);

        if (moveVec.sqrMagnitude == 0)
            return;

        Quaternion dirQuat = Quaternion.LookRotation(moveVec);
        Quaternion moveQuat = Quaternion.Slerp(rigid.rotation, dirQuat, 0.3f);
        rigid.MoveRotation(moveQuat);
    }

    void LateUpdate()
    {
        if (anim != null)
        {
            anim.SetFloat("Move", moveVec.sqrMagnitude);
        }
    }

    void Update()
    {
        // ìº¡ì ì½ë¼ì´ëì íì¬ íì ê°ì ê°ì ¸ì´
        Quaternion currentRotation = capsuleCollider.transform.rotation;

        // ìº¡ì ì½ë¼ì´ëì íì ê°ì ìì§ì¼ë¡ ì¡°ì 
        Quaternion verticalRotation = Quaternion.Euler(0f, currentRotation.eulerAngles.y, 0f);

        // ì¡°ì ë íì ê°ì ì ì©íì¬ ìº¡ì ì½ë¼ì´ëë¥¼ ìì§ì¼ë¡ ì ì§
        capsuleCollider.transform.rotation = verticalRotation;
    }
}

# data[].attributes.body
내일 강의 전 준비사항입니다. 아래 4가지를 미리 준비해주시면 감사하겠습니다.^^

1. 유니티 허브 설치

(패들렛에 파일 있습니다.)

2. 유니티 2022.3.32f1 버전 설치

(다른 버전이라도 무관하며, 유니티는 유니티 허브를 실행하여 다운 받을 수 있습니다.)

3. visual studio 2022 설치

(패들렛에 파일 있습니다.)

4. 유니티 회원 가입 후 로그인

*유니티 설치 방법은 첨부된 PPT를 확인해주세요

*학교 보안 프로그램과 유니티가 충돌이 되는 경우가 있어 학교가 아닌 가정에서 강의를 들어주시면 감사하겠습니다.

*학교에서 수강하시려면 학교 컴퓨터로는 강의를 실행하고 유니티 실습은 개인 노트북에 설치 후 진행하시면 됩니다

*혹시 준비 과정에 어려움이 있으신 분은 저녁 늦은 시간이라도 괜찮으니 언제든 연락주세요!

# data[].attributes.body
https://visualstudio.microsoft.com/ko/vs/community/

# data[].attributes.body
https://unity.com/kr/download

# data[].attributes.attachment_link.readable_text
using UnityEngine;
using UnityEngine.UI;

public class Point : MonoBehaviour
{
    public Text targetText;
    private int currentValue = 0;

    public void PointClick()
    {
        currentValue++;

        targetText.text = currentValue.ToString();
    }
}

# data[].attributes.attachment_link.readable_text
using UnityEngine;
using UnityEngine.UI;
using TMPro;

public class Point : MonoBehaviour
{
    public TMP_Text targetText;
    private const string PlayerPrefKey = "CurrentValue";

    void Awake()
    {
        // ì ì¥ë ê°ì ë¶ë¬ìµëë¤.
        int currentValue = PlayerPrefs.GetInt(PlayerPrefKey, 0);
        // íì¤í¸ë¥¼ ìë°ì´í¸í©ëë¤.
        targetText.text = currentValue.ToString();
    }

    public void PointUp()
    {
        int currentValue = PlayerPrefs.GetInt(PlayerPrefKey, 0);

        currentValue++; // ì ìë¥¼ 1 ì¦ê°
        targetText.text = currentValue.ToString(); // íì¤í¸ ìë°ì´í¸

        // ê°ì PlayerPrefsì ì ì¥í©ëë¤.
        PlayerPrefs.SetInt(PlayerPrefKey, currentValue);
        PlayerPrefs.Save();
    }


    public void PointDown()
    {
        int currentValue = PlayerPrefs.GetInt(PlayerPrefKey, 0);

        currentValue--; // ì ìë¥¼ 1 ì¦ê°
        targetText.text = currentValue.ToString(); // íì¤í¸ ìë°ì´í¸

        // ê°ì PlayerPrefsì ì ì¥í©ëë¤.
        PlayerPrefs.SetInt(PlayerPrefKey, currentValue);
        PlayerPrefs.Save();
    }

}

# data[].attributes.attachment_link.readable_text
using UnityEngine;
using TMPro;

public class Name : MonoBehaviour
{
    public TMP_InputField _inputField;
    public TMP_Text _text;

    void Update()
    {
        string PlayerName = PlayerPrefs.GetString("PlayerName");
        _text.text = PlayerName;
    }

    public void NameClick()
    {
        PlayerPrefs.SetString("PlayerName", _inputField.text);
        PlayerPrefs.Save();

        // ìë°ì´í¸ë ì´ë¦ì _textì ì¤ì 
        _text.text = _inputField.text;
    }
}

# data[].attributes.attachment_link.readable_text
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.IO;


public class LoadGallery : MonoBehaviour
{
    public RawImage img;

    public void OnclickImageLoad()
    {
        NativeGallery.GetImageFromGallery((file) => 
        {
            FileInfo selected = new FileInfo(file);

            if(selected.Length > 50000000)
            {
                return;
            }

            if (!string.IsNullOrEmpty(file))
            {
                StartCoroutine(LoadImage(file));
            }

        });
    }

    IEnumerator LoadImage(string path)
    {
        yield return null;

        byte[] fileData = File.ReadAllBytes(path);
        string filename = Path.GetFileName(path).Split('.')[0]; //ë°°ì´ 0ë²ì íì¼ ì´ë¦ ê°ì ¸ì´
        string savePath = Application.persistentDataPath + "/Image";

        if(!Directory.Exists(savePath)) 
        {
            Directory.CreateDirectory(savePath);
        }

        File.WriteAllBytes(savePath + filename + ".png", fileData);

        var temp = File.ReadAllBytes(savePath + filename + ".png");

        Texture2D tex = new Texture2D(0, 0);
        tex.LoadImage(temp);

        img.texture = tex;
    }

}

# data[].attributes.attachment_link.readable_text
using UnityEngine;
using UnityEngine.UI;

public class Question : MonoBehaviour
{
    public Image uiImage; // UI Imageë¥¼ ì°¸ì¡°í©ëë¤.

    private void Start()
    {
        // ê²ì ìì ì UI Imageë¥¼ ë¹íì±íí©ëë¤.
        if (uiImage != null)
        {
            uiImage.transform.localScale = new Vector3(0, 0, 0);
        }
    }

    private void OnTriggerEnter(Collider other)
    {
        // ì¶©ëí ì¤ë¸ì í¸ê° Cubeì¸ì§ íì¸í©ëë¤.
        if (other.gameObject.CompareTag("Q"))
        {
            // UI Imageë¥¼ íì±íí©ëë¤.
            if (uiImage != null)
            {
                uiImage.transform.localScale = new Vector3(1, 1, 1);
            }
        }
    }
}

# data[].attributes.attachment_link.readable_text
using UnityEngine;
using TMPro;

public class MathQuiz : MonoBehaviour
{
    public TMP_Text num1Text; // ì²« ë²ì§¸ ì«ì íì¤í¸
    public TMP_Text num2Text; // ë ë²ì§¸ ì«ì íì¤í¸
    public TMP_InputField answerInputField; // ì ëµ ìë ¥ íë
    public TMP_Text resultText; // ê²°ê³¼ íì íì¤í¸

    private int answer;
    private int num1;
    private int num2;

    private void Start()
    {
        GenerateNewProblem();
    }

    public void CheckAnswer()
    {
        string answerInput = answerInputField.text;

        if (int.TryParse(answerInput, out int userAnswer) && userAnswer == answer)
        {
            resultText.text = "ì ëµìëë¤!";
        }
        else
        {
            resultText.text = $"íë ¸ìµëë¤. ì ëµì {answer}ìëë¤.";
        }
    }

    private void GenerateNewProblem()
    {
        num1 = Random.Range(1, 101);
        num2 = Random.Range(1, 101);

        answer = num1 + num2;

        num1Text.text = num1.ToString();
        num2Text.text = num2.ToString();
    }
}

# data[].attributes.attachment_link.readable_text
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Close : MonoBehaviour
{
    public void Closethis()
    {
        Destroy(gameObject);
    }
}
