// Use this for initialization void Start() { if (!Ground) { Ground = GameObject.FindGameObjectWithTag("Ground"); } if (!Player) { Player = GameObject.FindGameObjectWithTag("Player"); } if (Stones.Count == 0) { for (int i = 0; i < transform.childCount; ++i) { Stones.Add(transform.GetChild(i).gameObject); StoneIndiBehaviour stone = transform.GetChild(i).GetComponent <StoneIndiBehaviour>(); stone.InitializeStone(); stone.Player = Player; stone.AttackRangeLimit = AttackLimit; } } transform.DetachChildren(); }
// Update is called once per frame void Update() { if (GeneralCooldown > 0) { GeneralCooldown -= Time.deltaTime; return; } int state = Random.Range(0, 5); if (DropCooldown > 0) { DropCooldown -= Time.deltaTime; } if (SpinCooldown > 0) { SpinCooldown -= Time.deltaTime; } if (state == 3 && !DropMode && !Dropping && DropCooldown <= 0 && !SpinMode) { DropMode = true; } if (state == 4 && !SpinMode && !Spinning && SpinCooldown <= 0 && !DropMode) { transform.position = Stones[0].transform.position; transform.Translate(0, Stones[0].transform.localScale.y, 0, Ground.transform); SpinMode = true; } foreach (GameObject GO in Stones) { if (GO.GetComponent <StoneIndiBehaviour>().State == 0) { if (DropMode || SpinMode) { break; } else { StoneIndiBehaviour SB = GO.GetComponent <StoneIndiBehaviour>(); switch (state) { case 0: SB.State = 1; SB.IdleLimit = IdleLimit; SB.AttackCooldown = AttackCooldown; break; default: SB.State = 2; SB.AttackMovementSpeed = AttackMovementSpeed; break; } } } } if (SpinMode && !SpinPrep) { int count = 0; foreach (GameObject GO in Stones) { if (GO.GetComponent <StoneIndiBehaviour>().State == 0) { ++count; } } if (count == 5) { transform.position = Stones[0].transform.position; transform.Translate(0, Stones[0].transform.localScale.y, 0, Ground.transform); SpinPrep = true; StoneIndex = 0; transform.LookAt(Player.transform.position); Vector3 relativePos = Player.transform.position - transform.position; Quaternion rotation = Quaternion.LookRotation(relativePos); float StoneInterver = 72.0f / 180.0f * Mathf.PI; foreach (GameObject GO in Stones) { float dist = GO.transform.localScale.y / 2; GO.GetComponent <StoneIndiBehaviour>().AttackMovementSpeed = AttackMovementSpeed; GO.GetComponent <StoneIndiBehaviour>().State = 5; Vector3 targetPos = transform.position + new Vector3(Mathf.Cos(StoneInterver * StoneIndex) * dist * Mathf.Sin(rotation.eulerAngles.y / 180.0f * Mathf.PI), Mathf.Sin(StoneInterver * StoneIndex) * dist, Mathf.Cos(StoneInterver * StoneIndex) * Mathf.Cos(rotation.eulerAngles.y / 180.0f * Mathf.PI) * dist); //print(new Vector3(Mathf.Cos(rotation.eulerAngles.y * 72.0f / 180.0f * Mathf.PI * StoneIndex), Mathf.Sin(rotation.eulerAngles.y * 72.0f / 180.0f * Mathf.PI * StoneIndex))); //print(rotation.eulerAngles.y); GO.GetComponent <StoneIndiBehaviour>().Target = targetPos; float rotationAngle = StoneIndex * -72.0f + 90.0f; if (rotationAngle >= 360.0f) { rotationAngle -= 360.0f; } GO.GetComponent <StoneIndiBehaviour>().TargetEuler = new Vector3(rotationAngle, rotation.eulerAngles.y, 0); GO.GetComponent <BoxCollider>().enabled = false; GO.GetComponent <Rigidbody>().velocity = Vector3.zero; GO.GetComponent <Rigidbody>().angularVelocity = Vector3.zero; GO.GetComponent <Rigidbody>().useGravity = false; GO.GetComponent <Rigidbody>().freezeRotation = true; ++StoneIndex; } } } if (SpinPrep && !Spinning) { int count = 0; foreach (GameObject GO in Stones) { if (GO.GetComponent <StoneIndiBehaviour>().State == 6) { ++count; } } if (count == 5) { Spinning = true; GetComponent <Rigidbody>().useGravity = true; GetComponent <SphereCollider>().enabled = true; SpinStart = transform.position; //SpinStart.y = 0; Vector3 playerPos = Player.transform.position; playerPos.y = transform.position.y; Vector3 SpinDir = playerPos - SpinStart; SpinEnd = SpinStart + SpinDir * 2; //SpinEnd.y = 0; foreach (GameObject GO in Stones) { GO.transform.parent = transform; } Timer = 0; transform.LookAt(Player.transform); } } if (Spinning) { transform.Rotate(new Vector3(1.0f, 0.0f, 0.0f), SpinSpeed); if (Timer >= SpinDelayTime) { transform.position += (SpinEnd - SpinStart) * Time.deltaTime; Vector3 SpinDir = SpinEnd - SpinStart; SpinDir.Normalize(); if (Vector3.Dot(SpinEnd - transform.position, SpinDir) < 0) { SpinBreak(); } } else { //print(transform.eulerAngles.y); Timer += Time.deltaTime; //transform.LookAt(Player.transform.position); } } if (DropMode && !DropCharge) { int count = 0; foreach (GameObject GO in Stones) { if (GO.GetComponent <StoneIndiBehaviour>().State == 0) { ++count; } } if (count == 5) { DropCharge = true; foreach (GameObject GO in Stones) { //GO.GetComponent<StoneIndiBehaviour>().AttackMovementSpeed = AttackMovementSpeed; GO.GetComponent <StoneIndiBehaviour>().State = 7; } Timer = 0; StoneIndex = 0; } } if (DropCharge && !Dropping) { Timer += Time.deltaTime; if (Timer >= DropChargeTime) { Dropping = true; foreach (GameObject GO in Stones) { GO.GetComponent <StoneIndiBehaviour>().AttackMovementSpeed = AttackMovementSpeed; GO.GetComponent <StoneIndiBehaviour>().State = 3; } Timer = -1; } } if (Dropping) { if (StoneIndex != 5) { if (Timer >= DropTimer) { Timer = 0; Stones[StoneIndex].GetComponent <StoneIndiBehaviour>().State = 4; Stones[StoneIndex].GetComponent <StoneIndiBehaviour>().Target = Player.transform.position; Stones[StoneIndex].transform.position = new Vector3(Stones[StoneIndex].GetComponent <StoneIndiBehaviour>().Target.x, DropdownHeight, Stones[StoneIndex].GetComponent <StoneIndiBehaviour>().Target.z); Stones[StoneIndex].GetComponent <StoneIndiBehaviour>().ShowDropZone(); ++StoneIndex; } else { Timer += Time.deltaTime; } } else { DropCooldown = DropBaseCooldown; Dropping = DropMode = DropCharge = false; GeneralCooldown = 6; } } }