public static void DetachWorm(WormMain worm) { playerInfo.DetachWorm(worm); }
//Worm public static void AttachWorm(WormMain worm) { playerInfo.AttachWorm(worm); }
void FixedUpdate() { //////////// //AI LOGIC// //////////// if (hitstunTimer <= 0.0f) { if (state == State.idle || state == State.spotted || state == State.attached || state == State.running) { //////////// //MOVEMENT// //////////// if (state == State.idle || state == State.running) { head.transform.Translate(head.transform.forward * Time.fixedDeltaTime * moveSpeed, Space.World); } else if (state == State.spotted || state == State.attached) { //Navigate towards target Quaternion temp = head.transform.rotation; head.transform.LookAt(target); head.transform.rotation = Quaternion.Lerp(temp, head.transform.rotation, spottedRotateSpeed * Time.fixedDeltaTime); head.transform.Translate(head.transform.forward * Time.fixedDeltaTime * spottedMoveSpeed, Space.World); //If target is far enough away, break pursuit if (target && Vector2.Distance(head.transform.position, target.position) > maxChaseDistance) { if (spotDelayTimer > 0.0f) { spotDelayTimer -= Time.fixedDeltaTime; } else { SetIdle(); } } } HandleWallDetection(); //Handle snake sections Transform lastT = null; foreach (Transform t in body.transform) { if (!lastT) { t.position = Vector3.Lerp(t.position, head.transform.position - head.transform.forward, Time.fixedDeltaTime * snakeSpeed); t.rotation = Quaternion.Lerp(t.rotation, head.transform.rotation, Time.fixedDeltaTime * snakeRotateSpeed); } else { t.position = Vector3.Lerp(t.position, lastT.position - lastT.transform.forward, Time.fixedDeltaTime * snakeSpeed); t.rotation = Quaternion.Lerp(t.rotation, lastT.rotation, Time.fixedDeltaTime * snakeRotateSpeed); } lastT = t; } if (GameManager.IsDebugEnabled()) { if (Input.GetKey(KeyCode.LeftArrow)) { head.transform.Rotate(Time.fixedDeltaTime * rotateSpeed, 0.0f, 0.0f); } else if (Input.GetKey(KeyCode.RightArrow)) { head.transform.Rotate(Time.fixedDeltaTime * -rotateSpeed, 0.0f, 0.0f); } } ////////// //DAMAGE// ////////// if (state == State.attached) { if (stealTimer > 0.0f) { stealTimer -= Time.fixedDeltaTime; spottedRotateSpeed += Time.fixedDeltaTime; } else { Transform temp = null; WormMain newHead = null; WormPacket packet = null; Vector3 tempPosition = Vector3.zero; bool packetAvailable = false; PlayerManager.Damage(10.0f, true); for (int i = 0; i <= numOfSections; i++) { packetAvailable = PlayerManager.DecrementNumOfLoosePackets(); //Make the fleeing worm head temp = target; newHead = ((GameObject)Instantiate(Resources.Load(ResourcePaths.SnakeHeadOnlyPrefab), temp.position, temp.rotation)).GetComponent <WormMain>(); tempPosition = newHead.transform.position + new Vector3(Random.Range(-1.0f, 1.0f), Random.Range(-1.0f, 1.0f), 0.0f); newHead.GetHead().transform.LookAt(tempPosition); newHead.GetHead().transform.position = tempPosition; newHead.SetRunning(); //Make a packet follow it if one was available if (packetAvailable) { temp = newHead.transform; packet = ((GameObject)Instantiate(Resources.Load(ResourcePaths.SnakePacketPrefab), target.position, target.rotation)).GetComponent <WormPacket>(); newHead.SetPacket(packet.gameObject); packet.SetTarget(newHead.GetHead().transform); } } PlayerManager.DetachWorm(this); Destroy(gameObject); } } } } else { hitstunTimer -= Time.fixedDeltaTime; } //flips transform in Y direction if passes extreme angles on X rotation if (Vector3.Dot(head.transform.forward, Vector3.left) > 0) { head.transform.localScale = new Vector3(head.transform.localScale.x, 1.0f, head.transform.localScale.z); } else { head.transform.localScale = new Vector3(head.transform.localScale.x, -1.0f, head.transform.localScale.z); } }
public void DetachWorm(WormMain worm) { worms.Remove(worm); }
//Worms public void AttachWorm(WormMain worm) { worms.Add(worm); }
void Awake() { worm = transform.parent.parent.gameObject.GetComponent <WormMain>(); }