// set clone flags to match cyclic flags void CopyFlags(CyclicMoveable cyclic, CyclicMoveable clone) { clone.collisionRight = cyclic.collisionRight; clone.collisionLeft = cyclic.collisionLeft; clone.collisionTop = cyclic.collisionTop; clone.collisionBottom = cyclic.collisionBottom; }
// Instantiate new CyclicMoveable object at the exact opposite position to create the cyclic effect public void HandleEnterCyclic(CyclicMoveable cyclic, Vector3 pos) { CyclicMoveable clone; if (cyclic.GetComponent <SpaceShip>()) { clone = Instantiate(spaceshipPrefab, pos, cyclic.transform.rotation); if (cyclic.isShooting) { clone.isShootingAndCyclic = true; // this allows the "clone"(new) spaceship to continue shooting if "cyclic"(old) spaceShip is in shutting state when collide // if "space" is pressed } } else if (cyclic.CompareTag("blue")) { clone = Instantiate(asteroidBluePrefab, pos, cyclic.transform.rotation); } else if (cyclic.CompareTag("red")) { clone = Instantiate(asteroidRedPrefab, pos, cyclic.transform.rotation); } else { Debug.Log("unexpected tag: " + tag); return; } CopyFlags(cyclic, clone); // clone needs cyclic flags to ignore coliisions with other colliders (corners) TurnFlagOn(cyclic, clone); // cyclic needs to "ignore" this collider and clone needs to ignore the opposite collider }
// OnTriggerEnter: Moveable objects will be instantiated at the exact opposite position on the scrren (cyclic effect) public void OnTriggerEnter(Collider other) { cyclicObj = other.gameObject.GetComponent <CyclicMoveable>(); // CyclicMoveable: spaceship or asteroid if (cyclicObj && !CollideFlag(cyclicObj)) { // CollideFlag == false : when CyclicMoveable object moved thourds this collider and hit it // CollideFlag == true : when CyclicMoveable object instantiated inside this collider (we want to ignore) Vector3 pos = CyclicPosition(cyclicObj.transform.position); HandleEnterCyclic(cyclicObj, pos); } }
// Destroy CyclicMoveable object it it had left the play area public void HandleExitCyclic(CyclicMoveable cyclic) { TurnFlagOff(cyclic); if (IsFlagsFalse(cyclic)) // if cyclic object has all flags off (exit all colliders) { if (IsPosOutsideScreen(cyclic.transform.position)) // spaceship can rotate while colliding // so on exit it will still be inside the frame // for asteroids IsPosOutsideScreen will be true { cyclic.SelfDestruct(disableRedChainReaction); // disableRedChainReaction = false; // when red asteroid destoy becouse its outdie screen are we dont need chain reaction explosion } } }
// OnTriggerExit: Asteroids, Bullets and PickableItems will be destroid. // SpaceShip will be destroid if it's ouside (means that there is another spaceship inside) // Spaceship will not be destroid if it's inside play area (SpaceShip can rotate while colliding) public void OnTriggerExit(Collider other) { cyclicObj = other.gameObject.GetComponent <CyclicMoveable>(); if (cyclicObj) { HandleExitCyclic(cyclicObj); return; } bullet = other.gameObject.GetComponent <Bullet>(); if (bullet && IsPosOutsideScreen(bullet.transform.position)) { bullet.Selfdestruct(); return; } pickable = other.gameObject.GetComponent <PickableItem>(); if (pickable && IsPosOutsideScreen(pickable.transform.position)) { pickable.Selfdestruct(); } }
// Set true at cyclic flag matching to this collider // Set true at clone opposite flag (right - left) (top - bottom) public abstract void TurnFlagOn(CyclicMoveable cyclic, CyclicMoveable clone);
// return collide flag (collisionRight / collisionLeft / collisionTop / collisionBottom) public abstract bool CollideFlag(CyclicMoveable cyclic);
// Set false at cyclic flag matching to the collider (Right / Left / Top / Bottom) public abstract void TurnFlagOff(CyclicMoveable cyclic);
// return true if all 4 flags false bool IsFlagsFalse(CyclicMoveable cyclic) { return(!(cyclic.collisionRight || cyclic.collisionLeft || cyclic.collisionTop || cyclic.collisionBottom)); }
public override bool CollideFlag(CyclicMoveable cyclic) { return(cyclic.collisionRight); }
// Set true at cyclic flag matching to this collider // Set true at clone opposite flag (right - left) (top - bottom) public override void TurnFlagOn(CyclicMoveable cyclic, CyclicMoveable clone) { cyclic.collisionRight = true; clone.collisionLeft = true; }
public override void TurnFlagOff(CyclicMoveable cyclic) { cyclic.collisionRight = false; }
// Set true at cyclic flag matching to this collider // Set true at clone opposite flag (right - left) (top - bottom) public override void TurnFlagOn(CyclicMoveable cyclic, CyclicMoveable clone) { cyclic.collisionBottom = true; clone.collisionTop = true; }