Slider와 InputField 모두 Cube를 돌릴 수 있습니다.

머리가 곤란하기 때문에 메모

할 일



마지막 기사 의 계속입니다.
타이틀대로 Unity의 Slider와 InputField 모두에서 같은 것을 Cube를 돌릴 수 있도록 합니다. InputField에 값을 입력할 때 Cube가 회전할 뿐만 아니라 Slider에도 반영하도록 합니다.
자신이 전 망각했을 때의 대비로서의 메모입니다.
전회 기사를 읽은 사람, 혹은 Unity로 스크립트를 첨부할 수 있는 사람이 대상입니다.

소재 준비



먼저 캔버스, 슬라이더, 텍스트, 입력 필드, 큐브, 빈 객체(이름은 "ParamMaster"로 한다)의 6개를 준비합니다.
계층 구조는 그림과 같습니다.


작성한 각 오브젝트에 대해, Game 화면을 보면서 인스펙터의 Transform-Pos Y의 값을 변경해, 모든 요소가 보이도록 이동시킵니다.
(아래 그림의 PosY 값의 예는 Slider:0, Text:50, InputField:30, Cube:3)



그리고 앞으로 만들 스크립트를 첨부해 갑니다.

① ParamMaster용 스크립트



빈 객체인 ParamMaster에 연결하는 스크립트입니다.
ParamMaster는 개체의 매개 변수를 통합적으로 관리할 수 있도록 하는 자체 제작 스크립트입니다. (Unity에 그러한 기능이 있는 것은 아닙니다.)
슬라이더나 입력 필드로부터 재기록되는 public인 변수를 두어 놓고,
그것을 Cube의 회전 정확도에 반영합니다.

ParamMaster.cs
using UnityEngine;

public class ParamMaster : MonoBehaviour
{
    public float open_value = 0; //publicな変数を設定
}

스크립트를 객체의 ParamMaster에 연결합니다.

② Cube용 스크립트



ParamMaster 변수 open_value를 참조하여 Cube의 회전 정확도로 설정합니다.

CubeOp.cs
using UnityEngine;

public class CubeOp : MonoBehaviour
{
    GameObject paramaster;

    void Start()
    {
        paramaster = GameObject.Find("ParamMaster"); //①のオブジェクトを見つける
    }

    void Update()
    {
        ParamMaster script = paramaster.GetComponent<ParamMaster>(); //見つけたオブジェクトのスクリプトを指定
        Vector3 rot = this.transform.localEulerAngles;
        rot.y = -script.open_value;
        this.transform.localEulerAngles = rot;
    }
}


Cube 객체에 연결합니다.

③ Slider용 스크립트



슬라이더의 값을 ParamMaster에 기입하는 스크립트입니다.

SliderOp.cs
using UnityEngine;

public class SliderOp : MonoBehaviour
{
    GameObject paramaster;
    public void SendSliderValue(float newValue)
    {
        ParamMaster script = paramaster.GetComponent<ParamMaster>(); //見つけたオブジェクトのスクリプトを指定
        script.open_value = newValue;
    }

    void Start()
    {
        paramaster = GameObject.Find("ParamMaster"); //スクリプト①のオブジェクトを見つける
    }
}

Slier 객체에 스크립트를 연결합니다.

그런 다음 Slier 객체를 설정해 둡니다.
Min Value를 -180, Max Value를 180으로 설정합니다.
또한 On Value Changed 설정을 Runtime Only 아래의 상자에 Slider 개체를 연결합니다.
오른쪽 풀다운에서 SliderOP - SendSliderValue를 선택합니다.



④ InputField용 스크립트



InputField 의 값을 ParamMaster 에 기입하는 스크립트입니다.
숫자 이외의 문자에는 반응하지 않게 하고 있습니다.

InputFieldOp.cs
using UnityEngine;
using UnityEngine.UI;
using System; //convertを使うために必要

public class InputFieldOp : MonoBehaviour
{
    GameObject parammaster;
    InputField inputField;
    Slider slider;

    void Start()
    {
        inputField = GameObject.Find("InputField").GetComponent<InputField>();
        parammaster = GameObject.Find("ParamMaster");
        slider = GameObject.Find("Slider").GetComponent<Slider>();
    }

    public void IfPushEnter(string _)
    {
        //エンターが押されたら調べる(誤動作防止)
        Debug.Log(inputField);
        if (Input.GetKey(KeyCode.Return))
        {
            //InputFieldからテキスト情報を取得する
            string value = inputField.text;

            //入力されたものが数字かどうか判断する
            bool result = float.TryParse(value, out float _);
            if (result != false)
            {
                ParamMaster script = parammaster.GetComponent<ParamMaster>(); //見つけたオブジェクトのスクリプトを指定
                script.open_value = Convert.ToSingle(value);
                slider.value = script.open_value;
            }
            else
            {
                Debug.Log("Input Error");
            }
            inputField.text = ""; //入力フォームのテキストを空にする
        }
    }
}

InputField 객체에 스크립트를 연결합니다.

InputField 객체의 설정은
RuntimeOnly를 선택하고 아래 상자에 InputField 객체를 연결합니다.
또한 오른쪽 풀다운에서 InputFieldOP - IfPushEnter를 선택합니다.



⑤ Text용 스크립트



ParamMaster 숫자를 참조하고 표시합니다.

TextOp.cs
using UnityEngine;
using UnityEngine.UI;

public class TextOp : MonoBehaviour
{
    public GameObject value_display = null; // Textオブジェクト
    GameObject parammaster;

    void Start()
    {
        parammaster = GameObject.Find("ParamMaster"); //①のオブジェクトを見つける
    }

    void Update()
    {
        ParamMaster script = parammaster.GetComponent<ParamMaster>(); //見つけたオブジェクトのスクリプトを指定
        Text display_text = value_display.GetComponent<Text>();
        display_text.text = (script.open_value).ToString();
    }
}

Text 객체에 연결하고,
인스펙터의 "Value_display"열에 TEXT 객체를 할당합니다.

완성·실행



화면 상단의 삼각 버튼에서 프로그램을 실행합니다.
슬라이더의 조작에 연동해, 큐브가 회전하는 것과 동시에, 텍스트의 수치도 갱신됩니다.
또한 입력 필드에 숫자를 입력하고 Enter를 누르면 각도가 큐브와 슬라이더에 반영됩니다.



다음 일



텍스트의 표시는 인풋 필드내에서 완결해 컴팩트한 UI로 해 가고 싶습니다.
또, 외부로부터의 데이터가 왔을 때에도 대응할 수 있는 구조로 해 가고 싶습니다.

좋은 웹페이지 즐겨찾기