일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- Algorithm
- C#
- Programming
- python
- dfs
- String
- 재귀
- guide
- 프로그래밍
- github
- Class
- w3school
- Tutorial
- DP
- parameter
- c++
- dynamic
- 시작해요 언리얼 2022
- Material
- 오류
- 문제풀이
- UE5
- Unreal Engine 5
- 백준
- Basic
- 기초
- 파이썬
- Unity
- W3Schools
- loop
- Today
- Total
행복한 개구리
Unity 복습 21.05.03. 데이터 저장&불러오기 // 쉐이더 본문
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Newtonsoft.Json;
using System.IO;
using System.Linq;
public class InfoManager
{
public Dictionary<int, Info> dicInfo;
public List<Info> listInfos = new List<Info>();
static InfoManager instance;
string path = string.Format("{0}/info.json", Application.persistentDataPath);
public static InfoManager GetInstance()
{
if(instance == null)
{
instance = new InfoManager();
}
return instance;
}
public void Save(Info info)
{
this.listInfos.Add(info);
var json = JsonConvert.SerializeObject(this.listInfos);
File.WriteAllText(path, json);
}
public void LoadInfos()
{
DataManager.GetInstance().LoadData();
var dicData = DataManager.GetInstance().dicData;
if (File.Exists(path))
{
var json = File.ReadAllText(path);
this.dicInfo = JsonConvert.DeserializeObject<Info[]>(json).ToDictionary(x => x.id);
}
else
{
var go = GameObject.Find("Canvas/bg/InputField");
go.SetActive(true);
var input = go.GetComponent<InputField>();
var desc = input.text;
foreach(var pair in dicData)
{
var data = pair.Value;
var info = new Info(data.id, data.name, desc);
this.listInfos.Add(info);
}
var json = JsonConvert.SerializeObject(this.listInfos);
File.WriteAllText(path, json);
LoadInfos();
}
}
}
인포매니저에서 데이터를 불러 올 때, 초기값은 데이터를 인포에 직접 연동해주고, 로드인포를 한번 더 불러오며 시작시켰다. 그 결과 desc의 값이 없는 데이터들이 생성되었고, 이 desc는 UIManager에서 코드로 할당해주었다. 또한, Save메서드를 만들어 저장하기 용이하게 만들었다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class UIItem : MonoBehaviour
{
public Text name;
public Text desc;
public void Init(Info info)
{
this.name.text = info.name;
this.desc.text = info.desc;
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Info
{
public int id;
public string name;
public string desc;
public Info(int id, string name, string desc)
{
this.id = id;
this.name = name;
this.desc = desc;
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Data
{
public int id;
public string name;
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Newtonsoft.Json;
using System.Linq;
public class DataManager
{
public Dictionary<int, Data> dicData;
static DataManager instance;
public static DataManager GetInstance()
{
if (instance == null)
{
instance = new DataManager();
}
return instance;
}
public void LoadData()
{
var ta = Resources.Load<TextAsset>("Datas/data");
var json = ta.text;
this.dicData = JsonConvert.DeserializeObject<Data[]>(json).ToDictionary(x => x.id);
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class UIManager : MonoBehaviour
{
public InputField input;
public Button btn;
public GameObject prefab;
public Transform parent;
public UIItem[] items;
void Start()
{
Init();
}
public void Init()
{
InfoManager.GetInstance().LoadInfos();
var dicInfo = InfoManager.GetInstance().dicInfo;
int i = 0;
foreach(var pair in dicInfo)
{
var info = pair.Value;
this.items[i].Init(info);
Debug.Log(Application.persistentDataPath);
i++;
}
this.btn.onClick.AddListener(() =>
{
for(int i = 0; i < dicInfo.Count; i++)
{
this.items[i].desc.text = i.ToString();
var info = new Info(i + 1, this.items[i].name.text, this.items[i].desc.text);
InfoManager.GetInstance().Save(info);
}
});
}
}
UIManager에서 버튼을 누를 시, desc로 인덱스에 해당하는 숫자들을 할당해 주었고, 그와 동시에 저장했다. 하지만 Info의 ID는 좀 성의없게 처리한 감이 있다.

셰이더======================================================================

우선 Assets에 Material폴더와 Shader폴더를 만든 뒤, 각각 Material과 Shader를 만들었다. Shader는 Standard Surface Shader로 만들었다. 그리고 둘의 이름을 Test로 만든 뒤 쉐이더를 material에 바인딩시키고, 그 material을 quad에 부여했다. 그 다음엔 material 의 texture로 fireTest를 선택했다.
이제 코딩을 하자.
나는 4_2효과가 불에 맞게 일렁이게 할것이다.
일단은 텍스쳐가 하나 더 필요하다.
그리고 알파값이 0인 부분을 안보이게 하고싶다. - alpha:fade
그리고 불과 효과텍스쳐들의 겹치는 부분만 보이게 하고싶다.

프로퍼티에 텍스쳐2번칸과 스피드를 인스펙터에 띄워서 속도를 조절하고 효과텍스쳐를 넣도록 했다.
그리고 surf에서 이 material의 색을 c2.rgb * c.rgb를 해주어 두 텍스쳐의 색을 모두 표현해주고, 투명도 또한 같게하여 겹치는 부분만 이펙트가 보이게 했다.
그리고 c2는 _Time * _Speed를 이용하여 시간당 일정값씩 y축이 올라가거나 내려가도록 설정했다.
이렇게 하면 텍스쳐2만 이동하며 움직이는 효과를 주지만 c자체의 UV값에 변화를 주려면

이런식으로 c에 c2를 더해주면 된다. 한자리 수 연산이 가능하므로 c2.r또는 c2.g같은 수들도 가능하다.(흑백이라면 c2나 c2.r이나 더해봤자 같은 값이 나온다.)

텍스쳐 2 는_Time값에 따라 Y축으로 이동하므로 그에 맞게 c또한 일그러지는 모습이다.

여기에 첫번째 텍스쳐에 불을 넣는다면 일렁이는 모습이 된다. 좀더 사실적인 모습의 불이라고 할 수 있겠다.
하지만 윗부분에 살짝 불이 튀어나오는 부분이 거슬리니 코드로 Y축을 조금 조정해주자.


Y축을 0.08만큼 내렸더니 거슬리는게 사라졌다.
여기서 일그러지는 정도를 올리려면 c2의 값이 커지면 되므로 c2 * 계수를 설정해 주면 된다.
또한 일렁이며 올라가는 속도를 조절하려면 c2의 v좌표에 계수를 달면 된다. 여기서는 이미 계수가 달려있으니 일그러지는 정도를 조절해보자.
일렁이는 정도와 속도 조절을 Range가 아닌 Float으로 선언하여 숫자를 기입하도록 만들었다.


이런식으로 조절할 수 있다.
**주의할 점은 쉐이더 코드를 작성할 때는 프로퍼티영역에서는 세미콜론을 붙이지 않는다는 것이다.
또한 프로퍼티의 변수 이름앞엔 '_'를 붙여주어야 한다.
'Unity > 복습' 카테고리의 다른 글
Unity Shader 21.05.06. LambertLight 복습 (0) | 2021.05.06 |
---|---|
Unity 복습 21.05.04. UGUI Daily Reward 구현 (0) | 2021.05.05 |
Unity UGUI 21.05.02. 과제 겸 복습 (0) | 2021.05.02 |
Unity UGUI 21.05.01 과제 겸 복습 (0) | 2021.05.02 |
Unity 21.04.28. 개념복습 (0) | 2021.04.28 |