Unity_Web/Assets/1_Script/SearchCtrl.cs

363 lines
10 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Cysharp.Threading.Tasks;
using System;
using System.Linq;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
using System.Threading.Tasks;
public class SearchCtrl : SingletonMonoBehaviour<SearchCtrl>
{
[SerializeField] GameObject opsion;
[SerializeField] Image searchMenuButtonImage;
[SerializeField] Sprite[] searchMenuButton;
[SerializeField] TMP_Text searchMenuButtonText;
[SerializeField] TMP_InputField name;
[SerializeField] TMP_Dropdown suitStyle;
[SerializeField] TMP_Dropdown suitType;
[SerializeField] TMP_Dropdown region;
[SerializeField] TMP_Dropdown animalTypes;
[SerializeField] Toggle[] colors;
[SerializeField] Sprite[] isOnSprite;
[SerializeField] ItemPrefab item;
[SerializeField] Transform results;
[SerializeField] GameObject listTop;
[SerializeField] GameObject bar;
[SerializeField] RectTransform content;
[SerializeField] Animator searchUI;
[SerializeField] ModalCtrl model;
private SearchRequest request;
private List<Library> librarys = new();
private Queue<Library> searchResults = new Queue<Library>();
private bool hasMore;
#if UNITY_EDITOR
[SerializeField]
#endif
private List<ItemPrefab> itemPrefabs;
private UnityEngine.Pool.ObjectPool<ItemPrefab> itemPrefabPool;
protected override void OnAwake()
{
Application.targetFrameRate = 30;
QualitySettings.vSyncCount = 0;
itemPrefabPool = new UnityEngine.Pool.ObjectPool<ItemPrefab>(itemPrefabs_OnCreate,itemPrefabs_OnGet, itemPrefabs_OnRelease,null,true, 100);
itemPrefabs = new List<ItemPrefab>();
}
#region ObjectPool
private ItemPrefab itemPrefabs_OnCreate()
{
return Instantiate<ItemPrefab>(item, results);
}
private void itemPrefabs_OnGet(ItemPrefab itemPrefab)
{
itemPrefabs.Add(itemPrefab);
itemPrefab.gameObject.SetActive(true);
}
private void itemPrefabs_OnRelease(ItemPrefab itemPrefab)
{
itemPrefab.gameObject.SetActive(false);
itemPrefabs.Remove(itemPrefab);
}
#endregion
private void OnEnable()
{
hasMore = false;
model.gameObject.SetActive(false);
searchUI.SetTrigger("reset");
ResetButton();
ObjectClear();
}
private void ObjectClear()
{
//TODO <20><>Ȱ<EFBFBD><C8B0> <20><> <20><> <20>ְ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
results.gameObject.SetActive(false);
listTop.SetActive(false);
bar.SetActive(false);
librarys.Clear();
while(itemPrefabPool.CountActive > 0)
{
var item = itemPrefabs[itemPrefabs.Count-1];
itemPrefabPool.Release(item);
}
}
public void OpsionButton()
{
//<2F>ɼ<EFBFBD>â<EFBFBD><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD> 250,100
//<2F>ɼ<EFBFBD>â<EFBFBD><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 60 ,290
bool isSelf = !opsion.activeSelf;
searchMenuButtonImage.sprite = searchMenuButton[(isSelf ? 1 : 0)];
searchMenuButtonImage.pixelsPerUnitMultiplier = (isSelf ? 3.5f : 1.75f);
searchMenuButtonText.color = (isSelf ? Color.white : Color.black);
searchUI.SetBool("isSelf", isSelf);
ResetButton();
}
public void SearchButton()
{
ObjectClear();
request = new SearchRequest();
request.fursuitName = name.text;
if (suitStyle.value != 0)
request.suitStyle = GameManager.Instance.suitStyle[suitStyle.value - 1].code_id;
if (suitType.value != 0)
request.suitType = GameManager.Instance.suitType[suitType.value - 1].code_id;
if (region.value != 0)
request.suitRegion = GameManager.Instance.region[region.value - 1].code_id;
if (animalTypes.value != 0)
request.suitAnimalType = GameManager.Instance.animalTypes[animalTypes.value - 1].code_id;
_ = SearchSuiters();
results.gameObject.SetActive(true);
listTop.SetActive(true);
bar.SetActive(true);
//NetworkManager.Instance.CreateRequest<SearchResponse>("library/select/suiters", request, (data) =>
//{
// librarys = data.data;
// results.gameObject.SetActive(true);
// listTop.SetActive(true);
// bar.SetActive(true);
// ItemPrefab[] items = new ItemPrefab[data.data.Count];
// for (int n = 0; n < data.data.Count; n++)
// {
// var prefab = Instantiate<ItemPrefab>(item, results);
// itemPrefabs.Add(prefab);
// items[n] = prefab;
// }
// for (int n = 0; n < data.data.Count; n++)
// {
// items[n].Set(data.data[n]);
// }
// hasMore = data.hasMore;
// //LayoutRebuilder.ForceRebuildLayoutImmediate(content);
//});
}
private bool isSearching = false;
public async UniTask SearchSuiters()
{
if (isSearching) return;
isSearching = true;
var tcs = new TaskCompletionSource<bool>();
var searchRequest = NetworkManager.Instance.CreateRequest<SearchResponse>(
"library/select/suiters",
request,
(data) =>
{
for (int n = 0; n < data.data.Count; n++)
{
searchResults.Enqueue(data.data[n]);
}
hasMore = data.hasMore;
tcs.SetResult(true); // 응답 완료 신호
}
);
await searchRequest.Send();
await tcs.Task; // 응답이 완료될 때까지 대기
await RefreshScroll();
isSearching = false;
}
bool isRefreshing = false;
public async UniTask RefreshScroll()
{
if (isRefreshing) return;
isRefreshing = true;
if (searchResults.Count > 0)
{
while (searchResults.TryDequeue(out var result))
{
librarys.Add(result);
}
// librarys.Sort((a,b) => a.owner_id.CompareTo(b.owner_id));
}
int n = 0;
for (; n < itemPrefabs.Count; n++)
{
var item = itemPrefabs[n];
item.Set(librarys[n]);
await UniTask.Yield();
}
for(; n < librarys.Count; n++)
{
var item = itemPrefabPool.Get();
item.Set(librarys[n]);
await UniTask.Yield();
}
for(; n > librarys.Count; n--)
{
var item = itemPrefabs.Last();
itemPrefabPool.Release(item);
await UniTask.Yield();
}
await ApplayImages();
// LayoutRebuilder.ForceRebuildLayoutImmediate(content);
isRefreshing = false;
}
private async UniTask ApplayImages()
{
for (int i = 0; itemPrefabs.Count > i; i++)
{
await GetImage(itemPrefabs[i].Library);
itemPrefabs[i].ImageSet();
}
}
public void NextSearch()
{
if (isSearching == false) {
hasMore = false;
request.page++;
_ = SearchSuiters();
}
}
public async UniTask<Texture2D> GetImage(Library library)
{
if (library._suit_image != null)
{
return library._suit_image;
}
var tcs = new TaskCompletionSource<Texture2D>();
var request = NetworkManager.Instance.CreateImageRequest(
library.imageBase64.Substring(1),
new object(),
(data) =>
{
library._suit_image = data;
tcs.SetResult(data);
},
(fail) =>
{
tcs.SetResult(null);
},
BestHTTP.HTTPMethods.Get
);
await request.Send();
await tcs.Task;
return library._suit_image;
}
public void ResetButton()
{
suitStyle.value = 0;
suitType.value = 0;
region.value = 0;
animalTypes.value = 0;
for(int n = 0; n < colors.Length; n++)
{
colors[n].isOn = false;
colors[n].image.sprite = isOnSprite[0];
}
}
public void OnToggle(int velue)
{
colors[velue].image.sprite = isOnSprite[(colors[velue].isOn ? 1 : 0)];
}
public void ModelSet(Library library)
{
model.Set(library);
}
public void ScrollValue(RectTransform Content) {
if(Content.anchoredPosition.y < 0.0f)
{
Content.anchoredPosition = Vector2.zero;
}
else if(hasMore && Content.sizeDelta.y != Screen.height && Content.sizeDelta.y - Screen.height < Content.anchoredPosition.y)
{
NextSearch();
}
}
}
public class SearchRequest
{
public int xid;
public string fursuitName = ""; /*<2A><><EFBFBD><EFBFBD>,<2C><>Ʈ <20≯<EFBFBD>*/
public string suitMaker; /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
public string suitRegion = ""; /*Ȱ<><C8B0> <20><><EFBFBD><EFBFBD>*/
public string suitStyle = ""; /*<2A><>Ʈ <20><>Ÿ<EFBFBD><C5B8>*/
public string suitAnimalType = ""; /*<2A><>Ʈ <20><><EFBFBD><EFBFBD> <20><>*/
public string suitType = ""; /*<2A><>Ʈ <20><><EFBFBD><EFBFBD>*/
public List<string> colorList = new List<string>(); /*<2A><>Ʈ <20><><EFBFBD><EFBFBD>*/
public int page = 1;
public int size = 5;
public int offset = 0;
}
public class SearchResponse
{
public List<Library> data;
public bool hasMore;
}
public class ImageResponse
{
public byte[] imageBytes;
}
public class Library : IEquatable<Library>
{
public string imageBase64;
public string suit_name;
public string owner_id;
public string owner_name;
public string production_date;
public string suit_image;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
public Texture2D _suit_image = null;
public string maker;
public string region;
public string animal_type;
public string suit_style;
public string suit_type;
public List<string> suit_color;
public bool Equals(Library other)
{
return this.imageBase64 == other.imageBase64 && this.owner_id == other.owner_id && this.maker == other.maker && this.region == other.region && this.animal_type == other.animal_type && this.suit_type == other.suit_type && this.suit_style == other.suit_style;
}
}