본문 바로가기
개발일지

버스역 대기시간 앱 만들기 프로젝트 - 2

by 라이티아 2025. 3. 16.

개인정도 때문에 가리지만, 정상 출력에 성공했다

string url = $"http://apis.data.go.kr/6270000/dbmsapi01/getRealtime?serviceKey={apiKey}&bsId={busStopId}";

해법은 https에서 http로 변경했다

using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
using SimpleJSON; // JSON 파싱을 위해 SimpleJSON 사용

public class GetBusInfo : MonoBehaviour
{
    private string apiKey;
    public string busStopId;

    void Awake()
    {
        System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
    }

    void Start()
    {
        TextAsset textAsset = Resources.Load<TextAsset>("BusApiData");
        if (textAsset != null)
        {
            apiKey = textAsset.text.Trim();
        }
        else
        {
            Debug.LogError("API Key file not found!");
            return;
        }
        StartCoroutine(GetBusArrivalInfo());
    }

    IEnumerator GetBusArrivalInfo()
    {
        string url = $"http://apis.data.go.kr/6270000/dbmsapi01/getRealtime?serviceKey={apiKey}&bsId={busStopId}";

        using (UnityWebRequest request = UnityWebRequest.Get(url))
        {
            yield return request.SendWebRequest();

            if (request.result == UnityWebRequest.Result.ConnectionError || request.result == UnityWebRequest.Result.ProtocolError)
            {
                Debug.LogError($"Error fetching bus data: {request.error}");
            }
            else
            {
                string jsonResponse = request.downloadHandler.text;
                Debug.Log($"Raw Bus Data: {jsonResponse}");

                var json = JSON.Parse(jsonResponse);

                int totalCount = json["body"]["totalCount"].AsInt;
                Debug.Log($"총 {totalCount}개의 버스 도착 정보");

                for (int i = 0; i < totalCount; i++)
                {
                    string routeNo = json["body"]["items"][i]["routeNo"];
                    string arrState = json["body"]["items"][i]["arrList"][0]["arrState"];

                    Debug.Log($"{routeNo}번 버스 - {arrState} 후 도착");
                }
            }
        }
    }
}

그리고 이렇게 뽑아낸 파일을 사용하기 위해서 json 파싱을 사용한다

이때 simple json이라는 커스텀 cs를 사용해서 쉽게 json을 핸들링한다

 

SimpleJSON/SimpleJSON.cs at master · Bunny83/SimpleJSON

A simple JSON parser in C#. Contribute to Bunny83/SimpleJSON development by creating an account on GitHub.

github.com

뽑아낸 정보를 TMP로 출력한다

대충 디자인을 해준다

 

TMPro에서 사용할 font를 다운한다

대충 폰트를 구워준다

참고로 한글 font이름이면 안되니까 알아서 조절을 해준다

 

적용해준 뒤 모습이다

최종 완성본이다

 

using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
using SimpleJSON;
using TMPro;

public class GetBusInfo : MonoBehaviour
{
    private string apiKey;
    public string busStopId;

    public TextMeshProUGUI[] BusInfo;
    public TextMeshProUGUI[] RoutNum;

    void Awake()
    {
        System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
    }

    void Start()
    {
        TextAsset textAsset = Resources.Load<TextAsset>("BusApiData");
        if (textAsset != null)
        {
            apiKey = textAsset.text.Trim();
        }
        else
        {
            Debug.LogError("API Key file not found!");
            return;
        }
        StartCoroutine(GetBusArrivalInfo());
    }

    IEnumerator GetBusArrivalInfo()
    {
        string url = $"http://apis.data.go.kr/6270000/dbmsapi01/getRealtime?serviceKey={apiKey}&bsId={busStopId}";

        int BusNum = 0;

        using (UnityWebRequest request = UnityWebRequest.Get(url))
        {
            yield return request.SendWebRequest();

            if (request.result == UnityWebRequest.Result.ConnectionError || request.result == UnityWebRequest.Result.ProtocolError)
            {
                Debug.LogError($"Error fetching bus data: {request.error}");
            }
            else
            {
                string jsonResponse = request.downloadHandler.text;
                Debug.Log($"Raw Bus Data: {jsonResponse}");

                var json = JSON.Parse(jsonResponse);
                var items = json["body"]["items"];

                if (items == null || items.Count == 0)
                {
                    Debug.Log("버스 도착 정보가 없습니다.");
                    yield break;
                }
                foreach (var route in items.Children)
                {
                    string routeNo = route["routeNo"];
                    Debug.Log($"{routeNo}번 버스");
                    RoutNum[BusNum].text = $"{routeNo}번 버스";

                    if (route["arrList"] != null && route["arrList"].Count > 0)
                    {
                        string arrState = route["arrList"][0]["arrState"];
                        Debug.Log($"도착 예정: {arrState}");
                        BusInfo[BusNum].text = $"도착 예정: {arrState}";
                    }
                    else
                    {
                        Debug.Log("도착 정보 없음");
                        BusInfo[BusNum].text = "도착 정보 없음";
                    }
                    BusNum++;
                }
            }
        }
    }
}