This repository has been archived on 2026-01-20. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
SH-INT/Assets/Scripts/UI_Topbar.cs
정영민 f4cf556cde update
2025-02-20 10:30:18 +09:00

434 lines
15 KiB
C#

using DG.Tweening;
using SHINT.WebRTC;
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.UI;
using WI;
namespace SHINT.UI
{
public enum Status
{
assembly,
injection,
cooperation,
home,
}
public class UI_Topbar : MonoBehaviour, ISingle
{
public Status status;
UI_ScrollViewButton buttonPrefab;
OrbitalController orbitalController;
NameTagManager nameTagManager;
RectTransform currentRightMiddleUI;
UI_Button currentClick_TopButton;
UI_ScrollViewButton currentClick_ScrollButton;
UI_FacilityInfo currentActiveFacilityInfo;
FacilityManager facilityManager;
ProductionStatusManager psManager;
public RectTransform currentProductionStatus;
Button Button_Injection;
Button Button_Assembly;
Button Button_Home;
Button Button_Refresh;
Button Button_Coop;
RectTransform PRF_UI_ScrollView_Injection;
RectTransform PRF_UI_ScrollView_Assembly;
//RectTransform panel_userIconContainer;
UnityEngine.UI.Image RenewalIcon;
RectTransform Panel_Fade;
InteractionManager im;
Vector3 assemblyBuildingPos;
Vector3 injectionBuildingPos;
Vector3 fadePaneloriginPos;
float scrollActivePosX;
float scrollDeactivePosX;
float scrollPosY;
int facilityIndex;
float timer;
float delayTimer;
public List<Facility> facilities = new List<Facility>();
public float animationDuration = 0.2f;
public float injectionDistance;
public float assemblyDistance;
public Vector3 injectionTargetMove;
public Vector3 assemblyTargetMove;
public Vector3 fadePanelEndPos;
public float renewallIconRotateZ;
public float dotweenAnimationDuration;
public float refreshTimer;
public float refreshDelay;
public bool isCircuit;
//public event Action onClickHome;
public override void AfterAwake()
{
buttonPrefab = Resources.Load<UI_ScrollViewButton>("Prefabs/PRF_UI_ScrollViewButton");
assemblyBuildingPos = GameObject.FindGameObjectWithTag("AssemblyBuilding").transform.localPosition;
injectionBuildingPos = GameObject.FindGameObjectWithTag("InjectionBuilding").transform.localPosition;
orbitalController = FindSingle<OrbitalController>();
nameTagManager = FindSingle<NameTagManager>();
facilityManager = FindSingle<FacilityManager>();
psManager = FindSingle<ProductionStatusManager>();
im = FindSingle<InteractionManager>();
DOTween.Init();
Button_Assembly.onClick.AddListener(OnClickAssembly);
Button_Injection.onClick.AddListener(OnClickInjection);
Button_Coop.onClick.AddListener(OnClickCooperation);
//Button_Cooperation.onClick.AddListener(OnClickCooperation);
Button_Home.onClick.AddListener(OnClickHome);
Button_Refresh.onClick.AddListener(OnClickRefresh);
scrollActivePosX = PRF_UI_ScrollView_Assembly.anchoredPosition.x;
scrollDeactivePosX = Math.Abs(scrollActivePosX);
scrollPosY = PRF_UI_ScrollView_Assembly.anchoredPosition.y;
PRF_UI_ScrollView_Injection.GetComponent<ScrollRect>().scrollSensitivity = 20f;
PRF_UI_ScrollView_Assembly.GetComponent<ScrollRect>().scrollSensitivity = 20f;
PRF_UI_ScrollView_Assembly.gameObject.SetActive(false);
PRF_UI_ScrollView_Injection.gameObject.SetActive(false);
fadePaneloriginPos = Panel_Fade.transform.position;
//var c = Button_Coop.image.color;
//c.a = 1;
//Button_Coop.image.color = c;
status = Status.home;
}
void Update()
{
CircuitFacility();
}
#region ButtonEvents
void OnClickInjection()
{
MoveCameraTopView(injectionBuildingPos, injectionDistance, false);
StateChange(Status.injection);
}
void OnClickAssembly()
{
MoveCameraTopView(assemblyBuildingPos, assemblyDistance, true);
StateChange(Status.assembly);
}
void OnClickCooperation()
{
var caller = FindSingle<WRTCManager>().caller;
var state = caller.InCallPanel.gameObject.activeSelf;
caller.InCallPanel.gameObject.SetActive(!state);
if(!state)
{
//code to Color
var c = Button_Coop.image.color;
c.a = 1;
Button_Coop.image.color = c;
}
else
{
var c = Button_Coop.image.color;
c.a = 0f;
Button_Coop.image.color = c;
}
StateChange(Status.cooperation);
}
void OnClickHome()
{
FadeAnimation();
StateChange(Status.home);
}
void OnClickRefresh()
{
timer = refreshTimer;
delayTimer = refreshDelay;
}
void OnClickScrollButton(Facility facility)
{
ResetCircult();
FacilityListChange(facility);
}
#endregion
public void GenerateFacilityScroll(FacilityManager fm)
{
SortFacilities();
Transform injectionContent = PRF_UI_ScrollView_Injection.GetComponentInChildren<ScrollRect>().content;
foreach (Facility facility in fm.injectionFacilities)
{
CreateFacilityButton(injectionContent, facility);
}
Transform assemblyContent = PRF_UI_ScrollView_Assembly.GetComponentInChildren<ScrollRect>().content;
foreach (Facility facility in fm.assemblyFacilities)
{
CreateFacilityButton(assemblyContent, facility);
}
}
UI_ScrollViewButton CreateFacilityButton(Transform parent, Facility f)
{
UI_ScrollViewButton newButton = Instantiate(buttonPrefab, parent);
newButton.Initialize();
newButton.SetFacility(f);
newButton.onClickButton += OnClickScrollButton;
return newButton;
}
public void FacilityListChange(Facility facility)
{
var topButton = facility.info.buildingType.Equals(BuildingType.Assembly) ? Button_Assembly : Button_Injection;
var middleUI = facility.info.buildingType.Equals(BuildingType.Assembly) ? PRF_UI_ScrollView_Assembly : PRF_UI_ScrollView_Injection;
var statusUI = facility.info.buildingType.Equals(BuildingType.Assembly) ? psManager.AssemblyProductionStatus : psManager.InjectionProductionStatus;
status = facility.info.buildingType.Equals(BuildingType.Assembly) ? Status.assembly : Status.injection;
TopButtonClickAnimation(topButton);
FacilityListActive(middleUI);
ChangeFacilityListButton(facility);
ActiveFacilityInfo(facility);
ChangeProductionStatus(statusUI);
}
void ActiveFacilityInfo(Facility facility)
{
foreach (var f in facilityManager.facilities)
{
f.ui.DeactiveFacilityInfo();
}
currentActiveFacilityInfo = facility.ui;
currentActiveFacilityInfo.ActiveFacilityInfo();
}
void ResetFacilityListStatus()
{
currentActiveFacilityInfo?.DeactiveFacilityInfo();
currentClick_ScrollButton?.ButtonDeactiveAnimation();
}
void StateChange(Status newStatus)
{
ResetCircult();
if (status == newStatus)
return;
status = newStatus;
switch (newStatus)
{
case Status.assembly:
TopButtonClickAnimation(Button_Assembly);
FacilityListActive(PRF_UI_ScrollView_Assembly);
ChangeProductionStatus(psManager.AssemblyProductionStatus);
break;
case Status.injection:
TopButtonClickAnimation(Button_Injection);
FacilityListActive(PRF_UI_ScrollView_Injection);
ChangeProductionStatus(psManager.InjectionProductionStatus);
break;
case Status.cooperation:
//TopButtonClickAnimation(Button_Coop);
//CurrentFacilityListDeative();
//currentRightMiddleUI = null;
break;
case Status.home:
CurrentFacilityListDeative();
currentClick_TopButton?.ButtonColorChange_Deactive();
currentClick_ScrollButton?.ButtonDeactiveAnimation();
if (currentActiveFacilityInfo != null)
{
currentActiveFacilityInfo.DeactiveFacilityInfo();
}
currentRightMiddleUI = null;
break;
}
ResetFacilityListStatus();
}
List<Facility> injections = new();
List<Facility> assems = new();
void SortFacilities()
{
facilityManager.injectionFacilities = facilityManager.injectionFacilities.OrderBy(f => InjectionFacilityNum(f.info.name)).ToList();
injections.AddRange(facilityManager.injectionFacilities);
assems.AddRange(facilityManager.assemblyFacilities);
facilities.AddRange(injections);
facilities.AddRange(assems);
}
int InjectionFacilityNum(string name)
{
int index = name.IndexOf("호기");
return int.Parse(name.Substring(0, index));
}
void CircuitFacility()
{
if (orbitalController.onControl)
{
timer = 0;
delayTimer = 0f;
isCircuit = false;
}
timer += Time.deltaTime;
if (timer >= refreshTimer)
{
isCircuit = true;
}
if (!isCircuit)
return;
switch (status)
{
case Status.assembly:
if (facilityIndex >= assems.Count())
{
facilityIndex = 0;
}
break;
case Status.injection:
if (facilityIndex >= injections.Count())
{
facilityIndex = 0;
}
break;
}
delayTimer += Time.deltaTime;
if (delayTimer >= refreshDelay)
{
CircultButtonAnimation();
var current = status == Status.injection ? injections[facilityIndex] : assems[facilityIndex];
im.FacilityFocusing(current);
//FacilityListChange(current);
delayTimer = 0f;
facilityIndex++;
}
}
void ResetCircult()
{
isCircuit = false;
timer = 0;
facilityIndex = 0;
delayTimer = 0f;
ResetFacilityListStatus();
}
#region Animations
void FacilityListActive(RectTransform rect)
{
if (currentRightMiddleUI != null && currentRightMiddleUI.Equals(rect))
return;
CurrentFacilityListDeative();
currentRightMiddleUI = rect;
var seq = DOTween.Sequence();
rect.gameObject.SetActive(true);
rect.anchoredPosition = new Vector2(scrollActivePosX, scrollPosY);
float movePosx = rect.transform.position.x;
rect.anchoredPosition = new Vector2(scrollDeactivePosX, scrollPosY);
seq.Append(rect.transform.DOMoveX(movePosx, animationDuration).SetEase(Ease.OutBack));
}
void CurrentFacilityListDeative()
{
if (currentRightMiddleUI == null)
return;
RectTransform deactiveUI = currentRightMiddleUI;
var seq = DOTween.Sequence();
Vector2 originPos = deactiveUI.transform.position;
deactiveUI.anchoredPosition = new Vector2(scrollDeactivePosX, scrollPosY);
float movePosx = deactiveUI.transform.position.x;
deactiveUI.transform.position = originPos;
seq.Append(deactiveUI.transform.DOMoveX(movePosx, animationDuration).SetEase(Ease.OutBack));
seq.Play().OnComplete(() =>
{
deactiveUI.gameObject.SetActive(false);
});
}
void TopButtonClickAnimation(Button clickButton)
{
if (currentClick_TopButton != null)
{
currentClick_TopButton.ButtonColorChange_Deactive();
}
currentClick_TopButton = clickButton.GetComponent<UI_Button>();
currentClick_TopButton.ButtonColorChange_Active();
}
void FadeAnimation()
{
Panel_Fade.transform.position = fadePaneloriginPos;
var seq = DOTween.Sequence();
seq.Append(Panel_Fade.DOMove(fadePanelEndPos, dotweenAnimationDuration))
.InsertCallback(dotweenAnimationDuration * 0.25f, () => orbitalController.Rewind())
.InsertCallback(dotweenAnimationDuration * 0.12f, () => nameTagManager.ActiveNameTags_NonAnimation());
}
void CircultButtonAnimation()
{
var imageOriginRotate = RenewalIcon.transform.rotation.eulerAngles;
var imageRotate = new Vector3(0f, 0f, renewallIconRotateZ);
var imageNextRotate = imageOriginRotate + imageRotate;
var seq = DOTween.Sequence();
seq.Append(RenewalIcon.transform.DORotate(imageNextRotate, dotweenAnimationDuration, RotateMode.FastBeyond360));
}
void ChangeFacilityListButton(Facility facility)
{
if (currentClick_ScrollButton != null)
{
currentClick_ScrollButton.ButtonDeactiveAnimation();
}
currentClick_ScrollButton = facility.facilityButton;
currentClick_ScrollButton.ButtonActiveAnimation();
}
public void ChangeProductionStatus(RectTransform productionStatus)
{
if (currentProductionStatus != null)
{
currentProductionStatus?.gameObject.SetActive(false);
}
currentProductionStatus = productionStatus;
currentProductionStatus?.gameObject.SetActive(true);
}
void MoveCameraTopView(Vector3 target, float distance, bool isAssembly)
{
var targetPos = new Vector3(target.x, 0, target.z);
var pos = isAssembly ? targetPos + assemblyTargetMove : targetPos + injectionTargetMove;
var elevation = isAssembly ? 50f : 50f;
var azimuth = isAssembly ? 325f : 60f;
orbitalController.SmoothMove(pos, distance, elevation, azimuth);
nameTagManager.ActiveNameTags_Animation();
}
#endregion
}
}