Exemple #1
0
    // 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();
    }
Exemple #2
0
    // 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;
            }
        }
    }