Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System.Collections.Generic;
- using DG.Tweening;
- using MEC;
- using TMPro;
- using UnityEngine;
- using UnityEngine.UI;
- namespace Homebrew
- {
- public class ProcessingInteract : ProcessingBase, ITick
- {
- [GroupExclude(Tag.ComponentInAir)]
- public Group<ComponentPointer> groupPointer;
- [GroupExclude(Tag.ComponentInAir)]
- public Group<ComponentInteractable> groupInteractables;
- public Group<ComponentPlayer> groupPlayers;
- public ProcessingInteract()
- {
- groupPointer.Added += PointerOnAdd;
- groupPointer.Removed += PointerOnRemove;
- groupInteractables.Added += entity => { entity.ComponentInteractable().inAction = false; };
- }
- public void Tick()
- {
- var frame = UnityEngine.Time.frameCount;
- foreach (var entityPlayer in groupPlayers)
- {
- var cPlayer = entityPlayer.ComponentPlayer();
- var cObject = entityPlayer.ComponentObject();
- float distancePossible;
- var nearestPossible = ReturnNearest(entityPlayer, cPlayer.distance, out distancePossible);
- if (cPlayer.source.GetButtonDown(DataInputActions.Default.Use) && cPlayer.interactable != -1)
- {
- var cInteract = cPlayer.interactable.ComponentInteractable();
- if (cInteract.inAction) continue;
- cInteract.inAction = true;
- PointerRemove(cPlayer.interactable);
- foreach (var action in cInteract.actions)
- {
- action.Handle(entityPlayer);
- }
- }
- else if (cPlayer.interactable != -1)
- {
- if (!cPlayer.interactable.HasComponentObject() && nearestPossible != -1)
- {
- cPlayer.interactable = nearestPossible;
- cPlayer.interactable.Add<ComponentPointer>();
- continue;
- }
- if (!cPlayer.interactable.HasComponentObject()) continue;
- var entityPosition = cPlayer.interactable.ComponentObject().transform.position;
- var positionPlayer = cObject.transform.position;
- var dir = positionPlayer - entityPosition;
- dir.z = 0;
- var distance = dir.sqrMagnitude;
- if (distance > distancePossible)
- {
- PointerRemove(cPlayer.interactable);
- cPlayer.interactable = nearestPossible;
- cPlayer.interactable.Add<ComponentPointer>();
- }
- else if (distance > cPlayer.distance * 2)
- {
- PointerRemove(cPlayer.interactable);
- cPlayer.interactable = -1;
- }
- }
- else if (nearestPossible != -1)
- {
- cPlayer.interactable = nearestPossible;
- cPlayer.interactable.Add<ComponentPointer>();
- }
- }
- }
- int ReturnNearest(int entityPlayer, float maxDistance, out float minDistance)
- {
- var len = groupInteractables.length;
- minDistance = Mathf.Infinity;
- if (len == 0) return -1;
- var cObject = entityPlayer.ComponentObject();
- var entityNearest = -1;
- var positionPlayer = cObject.transform.position;
- var index = 0;
- foreach (var entity in groupInteractables)
- {
- if (index++ == len) break;
- var entityPosition = entity.ComponentObject().transform.position;
- var dir = positionPlayer - entityPosition;
- dir.z = 0;
- var distance = dir.sqrMagnitude;
- if (minDistance < distance) continue;
- if (distance > maxDistance) continue;
- // TODO
- if (entity.ComponentInteractable().inAction) continue;
- minDistance = distance;
- entityNearest = entity;
- }
- //if (minDistance > maxDistance) entityNearest = -1;
- return entityNearest;
- }
- void PointerOnAdd(int entity)
- {
- var cPointer = entity.ComponentPointer();
- var cObject = entity.ComponentObject();
- var position = cObject.transform.position;
- var obj = this.Populate("Obj Pointer", position, Quaternion.identity);
- cPointer.transform = obj;
- cPointer.groupCanvas = cPointer.transform.GetComponentInChildren<CanvasGroup>();
- cPointer.images = obj.Find("Canvas+1/View").GetComponentsInChildren<Image>();
- cPointer.groupCanvas.alpha = 1;
- var index = 0;
- foreach (var image in cPointer.images)
- {
- cPointer.rects[index++] = image.GetComponent<RectTransform>();
- image.color = new Color(0, 205 / 255f, 100 / 255f, 0);
- }
- cPointer.groupCanvas = obj.GetComponentInChildren<CanvasGroup>();
- cPointer.label = obj.GetComponentInChildren<TextMeshProUGUI>();
- Timing.RunCoroutine(_Show(entity), entity, "PointerOnAdd");
- }
- static void PointerRemove(int entity)
- {
- var cPointer = entity.ComponentPointer();
- Timing.KillCoroutines(entity, "PointerOnAdd");
- var list = DOTween.TweensById(entity + "PointerOnAdd");
- if (list != null)
- {
- var count = list.Count;
- for (int i = 0; i < count; i++)
- {
- list[i].Kill();
- }
- }
- cPointer.groupCanvas.DOFade(0.0f, 0.1f).OnComplete(() =>
- {
- cPointer.transform.gameObject.Release();
- entity.Remove<ComponentPointer>();
- }).SetDelay(0.1f);
- }
- void PointerOnRemove(int entity)
- {
- }
- IEnumerator<float> _Show(int entity)
- {
- var cPointer = entity.ComponentPointer();
- var index = 0;
- for (int i = 0; i < 4; i++)
- {
- var cRect = cPointer.rects[i];
- var cImage = cPointer.images[i];
- cRect.sizeDelta = new Vector2(360, 360);
- cRect.DOSizeDelta(new Vector2(128f, 128f), 0.3f).SetDelay(i * 0.1f);
- if (i != 0)
- cImage.DOFade(0.5f, 0.4f).SetDelay(i * 0.1f).OnComplete(() => cImage.DOFade(0, 0.1f));
- else cImage.DOFade(0.5f, 0.4f).SetDelay(i * 0.1f);
- cRect.DOLocalRotate(new Vector3(0, 0, 45 * 7), 0.4f).SetDelay(i * 0.1f);
- }
- cPointer.label.DOFade(0.8f, 0.2f).SetDelay(0.3f);
- cPointer.label.DOFade(0.6f, 0.1f).SetLoops(-1, LoopType.Yoyo).SetDelay(0.5f).SetId(entity + "PointerOnAdd");
- var rect = cPointer.rects[0];
- var t = 0f;
- while (true)
- {
- var size = rect.sizeDelta;
- t += Time.DeltaTime * 30;
- var amplityde = Mathf.Sin(t);
- size.x += amplityde * 0.5f;
- size.y += amplityde * 0.5f;
- rect.sizeDelta = size;
- yield return 0;
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement