Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void FixedUpdate()
- {
- percent = ((percent + 1) + percentSpeed) % 1;
- bool reloaded = ReloadPanels();
- PlacePanels(!reloaded);
- }
- private void PlacePanels(bool useForce = true)
- {
- Vector3[] positions = Loop(percent, conveyorHeight, panelCount, conveyorLength);
- for (int i = 0; i < panelCount; i++)
- {
- Rigidbody currentPanel = beltPanels[i];
- // Vector3 panelPos = transform.position + ((Vector3)((Vector2)positions[i]));
- Vector3 panelPos = transform.position + new Vector3(0, positions[i].y, positions[i].x) - Vector3.up * conveyorHeight / 2;
- Quaternion panelRot = Quaternion.Euler(new Vector3(positions[i].z, 0, 0));
- if (useForce)
- {
- currentPanel.AddForce(currentPanel.CalculateRequiredForceForPosition(panelPos));
- currentPanel.AddTorque(currentPanel.CalculateRequiredTorqueForRotation(panelRot));
- }
- else
- {
- currentPanel.MovePosition(panelPos);
- currentPanel.MoveRotation(panelRot);
- }
- }
- }
- private bool ReloadPanels()
- {
- 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);
- prevConveyorLength = conveyorLength;
- prevBeltGap = conveyorHeight;
- prevPanelGap = panelGap;
- prevPanelWidth = panelWidth;
- prevPanelDepth = panelDepth;
- if (needsRefresh)
- {
- DestroyObjs();
- InitObjs();
- }
- return needsRefresh;
- }
- private void InitObjs()
- {
- if (panelsParent == null)
- panelsParent = new GameObject("Panels");
- float beltLength = GetTotalBeltLength(conveyorHeight, conveyorLength);
- float panelLength = (beltLength - (panelGap * (panelCount - 1))) / panelCount;
- beltPanels = new Rigidbody[panelCount];
- for (int i = 0; i < panelCount; i++)
- {
- GameObject panel = GameObject.CreatePrimitive(PrimitiveType.Cube);
- panel.name = "Panel " + i;
- panel.layer = LayerMask.NameToLayer("Panel");
- panel.transform.localScale = new Vector3(panelWidth, panelDepth, panelLength);
- panel.GetComponent<BoxCollider>().size = new Vector3(1, 1.1f, 1); //Set the y to 1.1 so that thin items don't z-fight
- // Destroy(panel.GetComponent<BoxCollider>());
- var obiCollider = panel.AddComponent<Obi.ObiCollider>();
- obiCollider.CollisionMaterial = friction;
- panel.transform.SetParent(panelsParent.transform);
- if (beltMaterial != null)
- {
- Renderer panelRender = panel.GetComponent<Renderer>();
- float ratio = Mathf.Max(panelLength, panelWidth) / Mathf.Min(panelLength, panelWidth);
- beltMaterial.SetTextureScale("_MainTex", new Vector2(2 * ratio, 2));
- panelRender.sharedMaterial = beltMaterial;
- }
- Rigidbody panelBody = panel.AddComponent<Rigidbody>();
- panelBody.useGravity = false;
- panelBody.collisionDetectionMode = CollisionDetectionMode.ContinuousDynamic;
- beltPanels[i] = panelBody;
- panel.AddComponent<Obi.ObiRigidbody>();
- }
- }
- private void DestroyObjs()
- {
- if (beltPanels != null)
- for (int i = 0; i < beltPanels.Length; i++)
- GameObject.Destroy(beltPanels[i].gameObject);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement