434 lines
15 KiB
C#
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
|
|
|
|
}
|
|
} |