2024. 2. 6. 18:24ㆍSKKU DT
뉴스 기사 가져오기
이름과 이메일을 입력하면 바로 API 키를 할당 받을 수 있다.
https://newsapi.org/v2/top-headlines?country={country}&apiKey={apiKey}
위의 링크를 Postman에 넣어서 보면, 뉴스 기사가 나온다!
클래스를 생성하면 아래와 같다.
[System.Serializable]
public class NewsData
{
public string status;
public int totalResults;
public List<Article> articles;
}
[System.Serializable]
public class Article
{
public Source source;
public string author;
public string title;
public string description;
public string url;
public string urlToImage;
public string publishedAt;
public string content;
}
[System.Serializable]
public class Source
{
public string id;
public string name;
}
위의 내용을 바탕으로 NewsAPI 스크립트를 생성한다.
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Networking;
using static WeatherAPI;
using static NewsAPI;
public class NewsAPI : MonoBehaviour
{
private const string apiKey = "Your API";
private string country = "us";
public TMP_Text text1;
void Start()
{
StartCoroutine(GetNews());
}
IEnumerator GetNews()
{
string url = $"https://newsapi.org/v2/top-headlines?country={country}&apiKey={apiKey}";
using (UnityWebRequest webRequest = UnityWebRequest.Get(url))
{
yield return webRequest.SendWebRequest();
if (webRequest.result == UnityWebRequest.Result.ConnectionError || webRequest.result == UnityWebRequest.Result.ProtocolError)
{
Debug.Log($"Error : {webRequest.error}");
}
else
{
ProcessNewsInfo(webRequest.downloadHandler.text);
}
}
}
private void ProcessNewsInfo(string jsonData)
{
NewsData newsData = JsonUtility.FromJson<NewsData>(jsonData);
foreach (var article in newsData.articles)
{
text1.text += $"Title: {article.title}\n\n";
}
}
//Json 파싱
[System.Serializable]
public class NewsData
{
public string status;
public int totalResults;
public List<Article> articles;
}
[System.Serializable]
public class Article
{
public Source source;
public string author;
public string title;
public string description;
public string url;
public string urlToImage;
public string publishedAt;
public string content;
}
[System.Serializable]
public class Source
{
public string id;
public string name;
}
}
뉴스의 타이틀이 잘 불러와졌다.
국가 코드 입력을 [SerializeField]로 바꾸면 유니티 에디터에서 쉽게 수정할 수 있다.
[SerializeField] private string country = "us";
kr로 바꾸면 국내 뉴스도 나온다.
버튼을 눌러 기사 출력하기
스크립트를 조금 수정하여, 버튼을 눌렀을 때 기사가 출력되게 하였다.
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Networking;
public class NewsAPI : MonoBehaviour
{
private const string apiKey = "apiKey";
[SerializeField] private string country = "us";
private NewsData newsData;
public TMP_Text text1;
void Start()
{
StartCoroutine(GetNews());
}
IEnumerator GetNews()
{
string url = $"https://newsapi.org/v2/top-headlines?country={country}&apiKey={apiKey}";
using (UnityWebRequest webRequest = UnityWebRequest.Get(url))
{
yield return webRequest.SendWebRequest();
if (webRequest.result == UnityWebRequest.Result.ConnectionError || webRequest.result == UnityWebRequest.Result.ProtocolError)
{
Debug.Log($"Error : {webRequest.error}");
}
else
{
ProcessNewsInfo(webRequest.downloadHandler.text);
Debug.Log(webRequest.downloadHandler.text);
}
}
}
public void ProcessNewsInfo(string jsonData)
{
newsData = JsonUtility.FromJson<NewsData>(jsonData);
}
public void RefreshNews()
{
foreach (var article in newsData.articles)
{
text1.text += $"Title: {article.title}\n\n";
}
}
//Json 파싱
[System.Serializable]
public class NewsData
{
public string status;
public int totalResults;
public List<Article> articles;
}
[System.Serializable]
public class Article
{
public Source source;
public string author;
public string title;
public string description;
public string url;
public string urlToImage;
public string publishedAt;
public string content;
}
[System.Serializable]
public class Source
{
public string id;
public string name;
}
}
여기서의 핵심은 버튼에 함수를 매핑하기 위해서는 매개변수가 없어야 해서 맨 위에 private Newsdata newsdata로 필드 선언을 하였고 아래에 ProcessNewsInfo 메서드를 수정하고 RefreshNews 메서드를 생성하였다.
랜덤 기사 받아오기
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Networking;
public class NewsAPI : MonoBehaviour
{
private const string apiKey = "apiKey";
[SerializeField] private string country = "us";
private NewsData newsData;
public TMP_Text text1;
void Start()
{
StartCoroutine(GetNews());
}
IEnumerator GetNews()
{
string url = $"https://newsapi.org/v2/top-headlines?country={country}&apiKey={apiKey}";
using (UnityWebRequest webRequest = UnityWebRequest.Get(url))
{
yield return webRequest.SendWebRequest();
if (webRequest.result == UnityWebRequest.Result.ConnectionError || webRequest.result == UnityWebRequest.Result.ProtocolError)
{
Debug.Log($"Error : {webRequest.error}");
}
else
{
ProcessNewsInfo(webRequest.downloadHandler.text);
Debug.Log(webRequest.downloadHandler.text);
}
}
}
public void ProcessNewsInfo(string jsonData)
{
newsData = JsonUtility.FromJson<NewsData>(jsonData);
}
public void RefreshNews()
{
foreach (var article in newsData.articles)
{
text1.text += $"Title: {article.title}\n\n";
}
}
public void RandomNews()
{
Article randomArticle = newsData.articles[Random.Range(0, newsData.articles.Count)];
text1.text = $"Title: {randomArticle.title}\n\nSourceName: {randomArticle.source.name}\n\nContent: {randomArticle.content}";
}
//Json 파싱
[System.Serializable]
public class NewsData
{
public string status;
public int totalResults;
public List<Article> articles;
}
[System.Serializable]
public class Article
{
public Source source;
public string author;
public string title;
public string description;
public string url;
public string urlToImage;
public string publishedAt;
public string content;
}
[System.Serializable]
public class Source
{
public string id;
public string name;
}
}
중간에 RandomNews() 함수를 이용해서 버튼을 눌렀을 때 뉴스가 랜덤하게 나오게 했다.
Joke API 받아오기
https://v2.jokeapi.dev/joke/Any
위의 링크로 api를 받아올 수 있다. 다른 api 키는 필요없다.
Postman에 링크를 넣으면 정보가 나온다.
JokeAPI 코드를 다음과 같이 작성한 후 텍스트를 연결해서 출력한다.
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Networking;
public class JokeAPI : MonoBehaviour
{
public TMP_Text text1;
void Start()
{
StartCoroutine(GetJokes());
}
IEnumerator GetJokes()
{
string url = $"https://v2.jokeapi.dev/joke/Any";
using (UnityWebRequest webRequest = UnityWebRequest.Get(url))
{
yield return webRequest.SendWebRequest();
if (webRequest.result == UnityWebRequest.Result.ConnectionError || webRequest.result == UnityWebRequest.Result.ProtocolError)
{
Debug.Log($"Error : {webRequest.error}");
}
else
{
ProcessJokesInfo(webRequest.downloadHandler.text);
}
}
}
public void ProcessJokesInfo(string jsonData)
{
JokeData jokeData = JsonUtility.FromJson<JokeData>(jsonData);
text1.text = $"Joke: {jokeData.joke}";
Debug.Log($"Joke: {jokeData.joke}");
}
//Json 파싱
[System.Serializable]
public class JokeData
{
public bool error;
public string category;
public string type;
public string joke;
public Flags flags;
public int id;
public bool safe;
public string lang;
}
[System.Serializable]
public class Flags
{
public bool nsfw;
public bool religious;
public bool political;
public bool racist;
public bool sexist;
public bool explicitFlag;
}
}
주식 정보 받아오기
아래의 링크를 들어가서 api 키를 받는다.
https://www.alphavantage.co/query?function=GLOBAL_QUOTE&symbol={symbol}&apikey={apikey}
Postman에 위의 링크를 넣으면 주식 정보가 불러와진다. (물론 symbol인 티커와 apikey도 넣어야 한다.)
문제는, Global Quote 클래스명 사이에 빈 칸을 둘 수 없고, 각 변수명이 숫자로 시작한다는 점이다.
Newtonsoft.Json을 설치하기 위해서 https://www.newtonsoft.com/json 사이트에서 아래의 버튼을 클릭한다.
zip 파일 다운로드, 압축해제 후 Newtonsoft.Json.dll 파일을 Unity에 넣는다.
그러면 코드에서 드디어 using Newtonsoft.Json; 네임스페이스를 사용할 수 있게 되었다!
**그래도 데이터는 유니티로 받아지지 않고, 중간에 .Net과 Newtonsoft가 충돌이 한 번 났는데...
패키지 매니저에서 [Add package by name...]에 "com.unity.nuget.newtonsoft-json"를 입력하고 Package Manager로부터 g한 번 더 Newtonsoft Json을 설치한다. 이 방법이 맞는지는 모르겠지만 일단 오류는 없어졌다.
더 알아봐야겠다...
기둥 오브젝트에 Gradient Shader 적용하기
3D URP 씬을 하나 만들고, Unlit Shader Graph 하나, Material을 하나 만든다.
테스트로, Simple Noise 노드를 만들어서 적용하면, UV가 맞지 않아서 이상하게 보인다.
셰이더 그래프를 다음과 같이 작성하면, 타워의 색이 자연스럽게 바뀐다.
Shader를 수정하면 다른 무늬도 낼 수 있다.
시간에 따라서 색이 변하는 셰이더도 만들 수 있다. 여러 색깔이 들어있는 텍스쳐 파일이 필요하다.
셰이더로 열 추적 화면 만들기
'SKKU DT' 카테고리의 다른 글
[SKKU DT] 70일차 -웹 스크래핑(웹 크롤링), 파이썬 (1) | 2024.02.13 |
---|---|
[SKKU DT] 69일차 -유니티 Shader Graph(셰이더 그래프), Particle System(파티클 시스템) 정리, 예제 (0) | 2024.02.07 |
[SKKU DT] 67일차 -유니티 Rest API 활용하기(날씨, 정보, 사진) (1) | 2024.02.05 |
[SKKU DT] 66일차 -유니티 UI 활용하기 (0) | 2024.02.02 |
[SKKU DT] 65일차 -유니티에서 ChatGPT Api 가져오기 (0) | 2024.02.01 |