Advertisement
dimmpixeye

Untitled

Oct 30th, 2018
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.65 KB | None | 0 0
  1. using System.Collections.Generic;
  2. using DG.Tweening;
  3. using MEC;
  4. using TMPro;
  5. using UnityEngine;
  6. using UnityEngine.UI;
  7.  
  8. namespace Homebrew
  9. {
  10.     public class ProcessingInteract : ProcessingBase, ITick
  11.     {
  12.         [GroupExclude(Tag.ComponentInAir)]
  13.         public Group<ComponentPointer> groupPointer;
  14.         [GroupExclude(Tag.ComponentInAir)]
  15.         public Group<ComponentInteractable> groupInteractables;
  16.         public Group<ComponentPlayer> groupPlayers;
  17.  
  18.  
  19.         public ProcessingInteract()
  20.         {
  21.             groupPointer.Added += PointerOnAdd;
  22.             groupPointer.Removed += PointerOnRemove;
  23.             groupInteractables.Added += entity => { entity.ComponentInteractable().inAction = false; };
  24.         }
  25.  
  26.         public void Tick()
  27.         {
  28.             var frame = UnityEngine.Time.frameCount;
  29.  
  30.  
  31.             foreach (var entityPlayer in groupPlayers)
  32.             {
  33.                 var cPlayer = entityPlayer.ComponentPlayer();
  34.                 var cObject = entityPlayer.ComponentObject();
  35.  
  36.                 float distancePossible;
  37.                 var   nearestPossible = ReturnNearest(entityPlayer, cPlayer.distance, out distancePossible);
  38.  
  39.                 if (cPlayer.source.GetButtonDown(DataInputActions.Default.Use) && cPlayer.interactable != -1)
  40.                 {
  41.                     var cInteract = cPlayer.interactable.ComponentInteractable();
  42.                     if (cInteract.inAction) continue;
  43.                     cInteract.inAction = true;
  44.                     PointerRemove(cPlayer.interactable);
  45.                     foreach (var action in cInteract.actions)
  46.                     {
  47.                         action.Handle(entityPlayer);
  48.                     }
  49.                 }
  50.                 else if (cPlayer.interactable != -1)
  51.                 {
  52.                     if (!cPlayer.interactable.HasComponentObject() && nearestPossible != -1)
  53.                     {
  54.                         cPlayer.interactable = nearestPossible;
  55.                         cPlayer.interactable.Add<ComponentPointer>();
  56.                         continue;
  57.                     }
  58.  
  59.                     if (!cPlayer.interactable.HasComponentObject()) continue;
  60.  
  61.                     var entityPosition = cPlayer.interactable.ComponentObject().transform.position;
  62.                     var positionPlayer = cObject.transform.position;
  63.                     var dir            = positionPlayer - entityPosition;
  64.                     dir.z = 0;
  65.  
  66.                     var distance = dir.sqrMagnitude;
  67.                     if (distance > distancePossible)
  68.                     {
  69.                         PointerRemove(cPlayer.interactable);
  70.                         cPlayer.interactable = nearestPossible;
  71.                         cPlayer.interactable.Add<ComponentPointer>();
  72.                     }
  73.                     else if (distance > cPlayer.distance * 2)
  74.                     {
  75.                         PointerRemove(cPlayer.interactable);
  76.  
  77.                         cPlayer.interactable = -1;
  78.                     }
  79.                 }
  80.                 else if (nearestPossible != -1)
  81.                 {
  82.                     cPlayer.interactable = nearestPossible;
  83.                     cPlayer.interactable.Add<ComponentPointer>();
  84.                 }
  85.             }
  86.         }
  87.  
  88.  
  89.         int ReturnNearest(int entityPlayer, float maxDistance, out float minDistance)
  90.         {
  91.            
  92.             var len      = groupInteractables.length;
  93.             minDistance = Mathf.Infinity;
  94.  
  95.             if (len == 0) return -1;
  96.  
  97.             var cObject = entityPlayer.ComponentObject();
  98.  
  99.             var entityNearest  = -1;
  100.             var positionPlayer = cObject.transform.position;
  101.             var index          = 0;
  102.  
  103.             foreach (var entity in groupInteractables)
  104.             {
  105.                 if (index++ == len) break;
  106.  
  107.                 var entityPosition = entity.ComponentObject().transform.position;
  108.                 var dir            = positionPlayer - entityPosition;
  109.                 dir.z = 0;
  110.                 var distance = dir.sqrMagnitude;
  111.                 if (minDistance < distance) continue;
  112.                 if (distance > maxDistance) continue;
  113.                 // TODO
  114.                 if (entity.ComponentInteractable().inAction) continue;
  115.                 minDistance = distance;
  116.                 entityNearest = entity;
  117.             }
  118.  
  119.             //if (minDistance > maxDistance) entityNearest = -1;
  120.             return entityNearest;
  121.         }
  122.  
  123.  
  124.         void PointerOnAdd(int entity)
  125.         {
  126.             var cPointer = entity.ComponentPointer();
  127.             var cObject  = entity.ComponentObject();
  128.             var position = cObject.transform.position;
  129.             var obj      = this.Populate("Obj Pointer", position, Quaternion.identity);
  130.             cPointer.transform = obj;
  131.             cPointer.groupCanvas = cPointer.transform.GetComponentInChildren<CanvasGroup>();
  132.             cPointer.images = obj.Find("Canvas+1/View").GetComponentsInChildren<Image>();
  133.             cPointer.groupCanvas.alpha = 1;
  134.             var index = 0;
  135.             foreach (var image in cPointer.images)
  136.             {
  137.                 cPointer.rects[index++] = image.GetComponent<RectTransform>();
  138.                 image.color = new Color(0, 205 / 255f, 100 / 255f, 0);
  139.             }
  140.  
  141.             cPointer.groupCanvas = obj.GetComponentInChildren<CanvasGroup>();
  142.             cPointer.label = obj.GetComponentInChildren<TextMeshProUGUI>();
  143.             Timing.RunCoroutine(_Show(entity), entity, "PointerOnAdd");
  144.         }
  145.  
  146.  
  147.         static void PointerRemove(int entity)
  148.         {
  149.             var cPointer = entity.ComponentPointer();
  150.             Timing.KillCoroutines(entity, "PointerOnAdd");
  151.             var list = DOTween.TweensById(entity + "PointerOnAdd");
  152.             if (list != null)
  153.             {
  154.                 var count = list.Count;
  155.                 for (int i = 0; i < count; i++)
  156.                 {
  157.                     list[i].Kill();
  158.                 }
  159.             }
  160.        
  161.             cPointer.groupCanvas.DOFade(0.0f, 0.1f).OnComplete(() =>
  162.             {
  163.                 cPointer.transform.gameObject.Release();
  164.                 entity.Remove<ComponentPointer>();
  165.                
  166.             }).SetDelay(0.1f);
  167.         }
  168.  
  169.  
  170.         void PointerOnRemove(int entity)
  171.         {
  172.         }
  173.  
  174.  
  175.         IEnumerator<float> _Show(int entity)
  176.         {
  177.             var cPointer = entity.ComponentPointer();
  178.  
  179.             var index = 0;
  180.  
  181.             for (int i = 0; i < 4; i++)
  182.             {
  183.                 var cRect  = cPointer.rects[i];
  184.                 var cImage = cPointer.images[i];
  185.                 cRect.sizeDelta = new Vector2(360, 360);
  186.                 cRect.DOSizeDelta(new Vector2(128f, 128f), 0.3f).SetDelay(i * 0.1f);
  187.                 if (i != 0)
  188.                     cImage.DOFade(0.5f, 0.4f).SetDelay(i * 0.1f).OnComplete(() => cImage.DOFade(0, 0.1f));
  189.                 else cImage.DOFade(0.5f, 0.4f).SetDelay(i * 0.1f);
  190.                 cRect.DOLocalRotate(new Vector3(0, 0, 45 * 7), 0.4f).SetDelay(i * 0.1f);
  191.             }
  192.  
  193.             cPointer.label.DOFade(0.8f, 0.2f).SetDelay(0.3f);
  194.             cPointer.label.DOFade(0.6f, 0.1f).SetLoops(-1, LoopType.Yoyo).SetDelay(0.5f).SetId(entity + "PointerOnAdd");
  195.  
  196.             var rect = cPointer.rects[0];
  197.             var t    = 0f;
  198.             while (true)
  199.             {
  200.                 var size = rect.sizeDelta;
  201.                 t += Time.DeltaTime * 30;
  202.                 var amplityde = Mathf.Sin(t);
  203.                 size.x += amplityde * 0.5f;
  204.                 size.y += amplityde * 0.5f;
  205.                 rect.sizeDelta = size;
  206.                 yield return 0;
  207.             }
  208.         }
  209.     }
  210. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement