Advertisement
Guest User

Conveyor_Code

a guest
Mar 31st, 2022
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.77 KB | None | 0 0
  1.     void FixedUpdate()
  2.     {
  3.         percent = ((percent + 1) + percentSpeed) % 1;
  4.         bool reloaded = ReloadPanels();
  5.         PlacePanels(!reloaded);
  6.     }
  7.  
  8.     private void PlacePanels(bool useForce = true)
  9.     {
  10.         Vector3[] positions = Loop(percent, conveyorHeight, panelCount, conveyorLength);
  11.         for (int i = 0; i < panelCount; i++)
  12.         {
  13.             Rigidbody currentPanel = beltPanels[i];
  14.             // Vector3 panelPos = transform.position + ((Vector3)((Vector2)positions[i]));
  15.             Vector3 panelPos = transform.position + new Vector3(0, positions[i].y, positions[i].x) - Vector3.up * conveyorHeight / 2;
  16.             Quaternion panelRot = Quaternion.Euler(new Vector3(positions[i].z, 0, 0));
  17.             if (useForce)
  18.             {
  19.                 currentPanel.AddForce(currentPanel.CalculateRequiredForceForPosition(panelPos));
  20.                 currentPanel.AddTorque(currentPanel.CalculateRequiredTorqueForRotation(panelRot));
  21.             }
  22.             else
  23.             {
  24.                 currentPanel.MovePosition(panelPos);
  25.                 currentPanel.MoveRotation(panelRot);
  26.             }
  27.         }
  28.     }
  29.  
  30.     private bool ReloadPanels()
  31.     {
  32.         bool needsRefresh = panelCount != beltPanels.Length || !Mathf.Approximately(conveyorLength, prevConveyorLength) || !Mathf.Approximately(conveyorHeight, prevBeltGap) || !Mathf.Approximately(panelGap, prevPanelGap) || !Mathf.Approximately(panelWidth, prevPanelWidth) || !Mathf.Approximately(panelDepth, prevPanelDepth);
  33.         prevConveyorLength = conveyorLength;
  34.         prevBeltGap = conveyorHeight;
  35.         prevPanelGap = panelGap;
  36.         prevPanelWidth = panelWidth;
  37.         prevPanelDepth = panelDepth;
  38.         if (needsRefresh)
  39.         {
  40.             DestroyObjs();
  41.             InitObjs();
  42.         }
  43.         return needsRefresh;
  44.     }
  45.     private void InitObjs()
  46.     {
  47.         if (panelsParent == null)
  48.             panelsParent = new GameObject("Panels");
  49.            
  50.         float beltLength = GetTotalBeltLength(conveyorHeight, conveyorLength);
  51.         float panelLength = (beltLength - (panelGap * (panelCount - 1))) / panelCount;
  52.  
  53.         beltPanels = new Rigidbody[panelCount];
  54.         for (int i = 0; i < panelCount; i++)
  55.         {
  56.             GameObject panel = GameObject.CreatePrimitive(PrimitiveType.Cube);
  57.             panel.name = "Panel " + i;
  58.             panel.layer = LayerMask.NameToLayer("Panel");
  59.             panel.transform.localScale = new Vector3(panelWidth, panelDepth, panelLength);
  60.             panel.GetComponent<BoxCollider>().size = new Vector3(1, 1.1f, 1); //Set the y to 1.1 so that thin items don't z-fight
  61.             // Destroy(panel.GetComponent<BoxCollider>());
  62.             var obiCollider = panel.AddComponent<Obi.ObiCollider>();
  63.             obiCollider.CollisionMaterial = friction;
  64.             panel.transform.SetParent(panelsParent.transform);
  65.  
  66.             if (beltMaterial != null)
  67.             {
  68.                 Renderer panelRender = panel.GetComponent<Renderer>();
  69.                 float ratio = Mathf.Max(panelLength, panelWidth) / Mathf.Min(panelLength, panelWidth);
  70.                 beltMaterial.SetTextureScale("_MainTex", new Vector2(2 * ratio, 2));
  71.                 panelRender.sharedMaterial = beltMaterial;
  72.             }
  73.            
  74.             Rigidbody panelBody = panel.AddComponent<Rigidbody>();
  75.             panelBody.useGravity = false;
  76.             panelBody.collisionDetectionMode = CollisionDetectionMode.ContinuousDynamic;
  77.             beltPanels[i] = panelBody;
  78.             panel.AddComponent<Obi.ObiRigidbody>();
  79.         }
  80.     }
  81.     private void DestroyObjs()
  82.     {
  83.         if (beltPanels != null)
  84.             for (int i = 0; i < beltPanels.Length; i++)
  85.                 GameObject.Destroy(beltPanels[i].gameObject);
  86.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement