public bool CanConnectToBeltElement(IBeltElement prevElement) { OutputOrientation orientationPrev = prevElement.GetOutputOrientation(); if (orientationPrev == OutputOrientation.East) { return(outputOrientation != OutputOrientation.West); } else if (orientationPrev == OutputOrientation.North) { return(outputOrientation != OutputOrientation.South); } else if (orientationPrev == OutputOrientation.West) { return(outputOrientation != OutputOrientation.East); } else if (orientationPrev == OutputOrientation.South) { return(outputOrientation != OutputOrientation.North); } return(false); }
public void InitializeRotated(int rotation) { rotation = rotation % 4; Collider2D[] resultsX = new Collider2D[3]; Collider2D[] resultsY = new Collider2D[3]; ContactFilter2D filter = new ContactFilter2D(); filter.useLayerMask = true; filter.layerMask = 1 << LayerMask.NameToLayer("ConveyorBelt"); int countX = Physics2D.OverlapBox(this.transform.position, new Vector2(2, 0.25f), 0, filter, resultsX); int countY = Physics2D.OverlapBox(this.transform.position, new Vector2(0.25f, 2), 0, filter, resultsY); items = new ItemEntity[maxBeltCapacity]; switch (rotation) { case 0: #region Horizontal ouput east rotationState = Rotation.Horizontal; outputOrientation = OutputOrientation.East; for (int i = 0; i < countX; i++) { if (resultsX[i].gameObject == this.gameObject) { continue; } if (resultsX[i].transform.position.x < this.transform.position.x) { IBeltElement temp = resultsX[i].GetComponent <IBeltElement>(); if (temp.GetOutputOrientation() == OutputOrientation.East) { prevBelt = temp; prevBelt.SetNextBeltElement(this); } } else if (resultsX[i].transform.position.x > this.transform.position.x) { IBeltElement temp = resultsX[i].GetComponent <IBeltElement>(); if (temp.CanConnectToBeltElement(this)) { nextBelt = temp; nextBelt.SetPrevBeltElement(this); } } } for (int i = 0; i < countY; i++) { if (resultsY[i].gameObject == this.gameObject) { continue; } if (resultsY[i].transform.position.y > this.transform.position.y) { IBeltElement temp = resultsY[i].GetComponent <IBeltElement>(); if (temp.GetOutputOrientation() == OutputOrientation.South) { prevBeltNorthOrEast = temp; prevBeltNorthOrEast.SetNextBeltElement(this); } } else if (resultsY[i].transform.position.y < this.transform.position.y) { IBeltElement temp = resultsY[i].GetComponent <IBeltElement>(); if (temp.GetOutputOrientation() == OutputOrientation.North) { prevBeltSouthOrWest = temp; prevBeltSouthOrWest.SetNextBeltElement(this); } } } #endregion break; case 1: #region Vertical output north rotationState = Rotation.Vertical; outputOrientation = OutputOrientation.North; for (int i = 0; i < countY; i++) { if (resultsY[i].gameObject == this.gameObject) { continue; } if (resultsY[i].transform.position.y < this.transform.position.y) { IBeltElement temp = resultsY[i].GetComponent <IBeltElement>(); if (temp.GetOutputOrientation() == OutputOrientation.North) { prevBelt = temp; prevBelt.SetNextBeltElement(this); } } else if (resultsY[i].transform.position.y > this.transform.position.y) { IBeltElement temp = resultsY[i].GetComponent <IBeltElement>(); if (temp.CanConnectToBeltElement(this)) { nextBelt = resultsY[i].GetComponent <IBeltElement>(); nextBelt.SetPrevBeltElement(this); } } } for (int i = 0; i < countX; i++) { if (resultsX[i].gameObject == this.gameObject) { continue; } if (resultsX[i].transform.position.x > this.transform.position.x) { IBeltElement temp = resultsX[i].GetComponent <IBeltElement>(); if (temp.GetOutputOrientation() == OutputOrientation.West) { prevBeltNorthOrEast = temp; prevBeltNorthOrEast.SetNextBeltElement(this); } } else if (resultsX[i].transform.position.x < this.transform.position.x) { IBeltElement temp = resultsX[i].GetComponent <IBeltElement>(); if (temp.GetOutputOrientation() == OutputOrientation.East) { prevBeltSouthOrWest = temp; prevBeltSouthOrWest.SetNextBeltElement(this); } } } #endregion break; case 2: #region Horizontal output west rotationState = Rotation.Horizontal; outputOrientation = OutputOrientation.West; velocityMultiplier = -1; for (int i = 0; i < countX; i++) { if (resultsX[i].gameObject == this.gameObject) { continue; } if (resultsX[i].transform.position.x > this.transform.position.x) { IBeltElement temp = resultsX[i].GetComponent <IBeltElement>(); if (temp.GetOutputOrientation() == OutputOrientation.West) { prevBelt = temp; prevBelt.SetNextBeltElement(this); } } else if (resultsX[i].transform.position.x < this.transform.position.x) { IBeltElement temp = resultsX[i].GetComponent <IBeltElement>(); if (temp.CanConnectToBeltElement(this)) { nextBelt = temp; nextBelt.SetPrevBeltElement(this); } } } for (int i = 0; i < countY; i++) { if (resultsY[i].gameObject == this.gameObject) { continue; } if (resultsY[i].transform.position.y > this.transform.position.y) { IBeltElement temp = resultsY[i].GetComponent <IBeltElement>(); if (temp.GetOutputOrientation() == OutputOrientation.South) { prevBeltNorthOrEast = temp; prevBeltNorthOrEast.SetNextBeltElement(this); } } else if (resultsY[i].transform.position.y < this.transform.position.y) { IBeltElement temp = resultsY[i].GetComponent <IBeltElement>(); if (temp.GetOutputOrientation() == OutputOrientation.North) { prevBeltSouthOrWest = temp; prevBeltSouthOrWest.SetNextBeltElement(this); } } } #endregion break; case 3: default: #region Vertical output south velocityMultiplier = -1; rotationState = Rotation.Vertical; outputOrientation = OutputOrientation.South; for (int i = 0; i < countY; i++) { if (resultsY[i].gameObject == this.gameObject) { continue; } if (resultsY[i].transform.position.y > this.transform.position.y) { IBeltElement temp = resultsY[i].GetComponent <IBeltElement>(); if (temp.GetOutputOrientation() == OutputOrientation.South) { prevBelt = temp; prevBelt.SetNextBeltElement(this); } } else if (resultsY[i].transform.position.y < this.transform.position.y) { IBeltElement temp = resultsY[i].GetComponent <IBeltElement>(); if (temp.CanConnectToBeltElement(this)) { nextBelt = temp; nextBelt.SetPrevBeltElement(this); } } } for (int i = 0; i < countX; i++) { if (resultsX[i].gameObject == this.gameObject) { continue; } if (resultsX[i].transform.position.x > this.transform.position.x) { IBeltElement temp = resultsX[i].GetComponent <IBeltElement>(); if (temp.GetOutputOrientation() == OutputOrientation.West) { prevBeltNorthOrEast = temp; prevBeltNorthOrEast.SetNextBeltElement(this); } } else if (resultsX[i].transform.position.x < this.transform.position.x) { IBeltElement temp = resultsX[i].GetComponent <IBeltElement>(); if (temp.GetOutputOrientation() == OutputOrientation.East) { prevBeltSouthOrWest = temp; prevBeltSouthOrWest.SetNextBeltElement(this); } } } #endregion break; } this.GetComponent <SpriteRenderer>().sprite = AnimationPropertiesPool.Instance.rotatedSpriteProperties[rotatedSpritePropertyId].sprites[rotation]; }