개요

본 항목에서는 Unity Web Request와 Coroutine을 활용하여 서버와 데이터 통신을 수행하는 스크립트를 작성하는 방법을 다룬다.

UnityWebRequest

HandDataWriter.cs

손의 데이터를 전송하기 위해 HandDataWriter.cs 파일을 생성하였다. 스크립트는 다음과 같이 구현한다. (송신 관련 스크립트만 표시하였다.) 자세한 설명은 주석으로 남겨 두었다.

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;

public class HandDataWriter : MonoBehaviour
{
		public TaskDataJsonArray taskDataJsonArray { get; private set; }

		private void Awake()
				// Awake is called while initiating scripts
		{
				taskDataJsonArray = new TaskDataJsonArray();
		}

    public void SendData()
    {
				// Coroutine is used not to exclusively use the main thread
        StartCoroutine(WriteDataToDB());
    }

    private void IEnumerator WriteDataToDB()
    {   
				// With UnityEngine.JsonUtility, we can convert Serializable class
				// into a JSON string.
        string toJson = JsonUtility.ToJson<TaskDataJsonArray>();

				// Make an UnityWebRequest object to send a data to server with by POST.
        var request = new UnityWebRequest(URL_DB, "POST");

				// Convert JSON string to bytes
        byte[] bodyRaw = Encoding.UTF8.GetBytes(toJson);

				// Set uploadHandler and downloadHandler
				// Each objects takes the role of sending/getting data from/to server
        request.uploadHandler = (UploadHandler)new UploadHandlerRaw(bodyRaw);
        request.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();

				// Specify sending data by setting request handler to "application/json"
        request.SetRequestHeader("Content-Type", "application/json");

				// yield return not to not to exclusively use the main thread
				// when WriteDataToDB() is running for data sending
        yield return request.Send();
    }
}

HandData.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[Serializable]
public class HandData
{
    /* Hand Attributes */
    // x, y, z rotations of 
    public float hangle_wrist;
    public float vangle_wrist;
    public float handspin;
    public float elbowspin;

    // horizontal (Z-axis) rotation of each joint in each finger
    public float hangle_f_thumb;
    public float hangle_f_index;
    public float hangle_f_middle;
    public float hangle_f_ring;
    public float hangle_f_pinky;

    // vertical (X-axis) rotation of each joint in each finger
    public float vangles_f_thumb0;
    public float vangles_f_thumb1;
    public float vangles_f_thumb2;
    public float vangles_f_index0;
    public float vangles_f_index1;
    public float vangles_f_index2;
    public float vangles_f_middle0;
    public float vangles_f_middle1;
    public float vangles_f_middle2;
    public float vangles_f_ring0;
    public float vangles_f_ring1;
    public float vangles_f_ring2;
    public float vangles_f_pinky0;
    public float vangles_f_pinky1;
    public float vangles_f_pinky2;

    // horizontal rotation of shoulder
    public float hangle_a_shoulder;

    // vertical rotation of elbow
    public float vangle_a_elbow;

    // vertical rotation of shoulder
    public float vangle_a_shoulder;
}

TaskDataJsonArray.cs

저장할 Task 결과 데이터는 다음과 같이 구현되어 있다.

using System;
using System.Collections;
using System.Collections.Generic;

[Serializable]
public class TaskDataJsonArray
{
	public int ptid;
	public int ctid;
	public float score;
	public List<TaskData> tresultArr;
}

[Serializable]
public class TaskData
    {
        public int tkid ;
        public float etime ;
        public float rtime ;
        public int epoint ;
        public string cdatetime ;

        //

        public float lthumbfirstmin ;
        public float lthumbfirstmax ;
        public float lthumbsecondmin ;
        public float lthumbsecondmax ;

        //

        public float lindexfirstmin ;
        public float lindexfirstmax ;
        public float lindexsecondmin ;
        public float lindexsecondmax ;

        //

        public float lmiddlefirstmin ;
        public float lmiddlefirstmax ;
        public float lmiddlesecondmin ;
        public float lmiddlesecondmax ;

        //

        public float lringfirstmin ;
        public float lringfirstmax ;
        public float lringsecondmin ;
        public float lringsecondmax ;

        //

        public float lpinkyfirstmin ;
        public float lpinkyfirstmax ;
        public float lpinkysecondmin ;
        public float lpinkysecondmax ;

        // //

        public float rthumbfirstmin ;
        public float rthumbfirstmax ;
        public float rthumbsecondmin ;
        public float rthumbsecondmax ;

        //

        public float rindexfirstmin ;
        public float rindexfirstmax ;
        public float rindexsecondmin ;
        public float rindexsecondmax ;

        //

        public float rmiddlefirstmin ;
        public float rmiddlefirstmax ;
        public float rmiddlesecondmin ;
        public float rmiddlesecondmax ;

        //

        public float rringfirstmin ;
        public float rringfirstmax ;
        public float rringsecondmin ;
        public float rringsecondmax ;

        //

        public float rpinkyfirstmin ;
        public float rpinkyfirstmax ;
        public float rpinkysecondmin ;
        public float rpinkysecondmax ;

    }