示例#1
0
    void Update()
    {
        if (_alive && chasing)
        {
            //if very far away zombie speed = 0: idle animation
            //if somewhat close zombie speed = walking speed: walking animation
            //if near zombie speed = 8.0*walking speed:running animation
            Quaternion initial = playerObject.transform.rotation;

            Vector3 diff  = playerObject.transform.position - transform.position;
            float   range = diff.magnitude;
            if (range > maxDistance && !waiting)               //very far away and we want to redirect toward player
            //anim.SetInteger("zombieToState", 0);
            {
                transform.rotation = Quaternion.LookRotation(Vector3.forward, diff);
                _multiplier        = 0.1f;
                //playerCaught = false;
            }
            else if (range > closeToPlayer && range <= maxDistance && !waiting)  //off screen so can just stay still
            {
                _multiplier  = 0f;
                playerCaught = false;
                if (siren != null)
                {
                    siren.TurnOff();
                }
            }
            else if (range <= closeToPlayer && !waiting) //on screen so have wander
            {
                _multiplier = 4f;
                if (range <= visibility && (playerObject.GetComponent <PlayerMovement>().isBoost() || playerCaught || playerObject.GetComponent <PlayerMovement>().isLooting() || isPirate))
                {
                    if (!playerCaught)
                    {
                        playerCaught = true;
                    }

                    transform.rotation = Quaternion.LookRotation(Vector3.forward, diff);
                    if (running)
                    {
                        transform.Rotate(new Vector3(0, 0, 180));
                    }

                    if (range <= tooClose)
                    {
                        _multiplier = 0.0f;
                    }
                    else
                    {
                        _multiplier = 7.0f;
                    }
                }
                else
                {
                    playerCaught = false;
                    if (siren != null)
                    {
                        siren.TurnOff();
                    }
                    if (shouldTurn >= 4)
                    {
                        shouldTurn = 0;
                        //float angle = Random.Range(0, 360);
                        //Debug.Log("randomTurn");
                        transform.Rotate(new Vector3(0, 0, Random.Range(0, 360)));
                    }
                    else
                    {
                        shouldTurn += Time.deltaTime;
                    }
                }
            }
            else
            {
                //normal distance away, let wander
                if (range <= visibility && !running && !isPirate && (playerObject.GetComponent <PlayerMovement>().isBoost() || playerCaught || playerObject.GetComponent <PlayerMovement>().isLooting()))
                {
                    if (siren != null)
                    {
                        siren.TurnOn();
                    }
                    playerCaught = true;
                }
                _multiplier = 4.0f;                 //dont move if not close to player
            }

            //cargoship is within range and player has not yet looted it
            if (running && !playerObject.GetComponent <PlayerMovement>().isLooting())
            {
                if (!canLoot && range <= tooClose)
                {
                    canLoot = true;
                    gameObject.GetComponent <CargoShip>().CanLoot();
                }
                else if (canLoot && range > tooClose)
                {
                    canLoot = false;
                    gameObject.GetComponent <CargoShip>().ClearLootState();
                }
            }

            //cargoship was being looted, but player stopped, so reset progress
            if (canLoot && !(playerObject.GetComponent <PlayerMovement>().isLooting()) && beingLooted > 0)
            {
                Debug.Log("Resetloot timer");
                beingLooted = 0;
                gameObject.GetComponent <CargoShip>().StartLooting();
            }

            //Looting cargo ship
            if (running && range <= tooClose && playerObject.GetComponent <PlayerMovement>().isLooting())
            {
                //playerObject.transform.rotation = initial;
                Debug.Log("Cargoship being looted");
                playerCaught = true;
                _multiplier  = 0.0f;

                if (beingLooted < Time.deltaTime)
                {
                    GetComponent <CargoShip>().StartLooting();
                }

                if (beingLooted > 2)
                {
                    GetComponent <ReactiveTarget>().ReactToHit();
                    _scoreController.AddScore(1000);
                    RunStats.Current.CargoShipsLooted++;
                }
                else
                {
                    beingLooted += Time.deltaTime;
                    GetComponent <CargoShip>().SetLootProgress(beingLooted / 2f);
                }
                //add different particle effect?
            }

            _leftThrust.SetIntensity(_multiplier / 7f);
            _rightThrust.SetIntensity(_multiplier / 7f);

            transform.Translate(0, 0.5f * Time.deltaTime * _multiplier * speed, 0);

            //Debug.DrawRay(transform.position + transform.up*0.57f , transform.up * 10f, Color.red);
            // If it hits something...
            int grnd = 1 << LayerMask.NameToLayer("Default");
            int fly  = 1 << LayerMask.NameToLayer("Player");
            int mask = grnd | fly;

            RaycastHit2D hit = Physics2D.Raycast(transform.position + transform.up * 0.57f, transform.up, 8f, mask);


            if (hit.collider != null)
            {
                GameObject hitObject = hit.transform.gameObject;
                if (hitObject.GetComponent <PlayerMovement>())
                {
                    if (!running && hitObject.GetComponent <PlayerMovement>().alive&& playerCaught)
                    {
                        if (siren != null && !isPirate)
                        {
                            siren.TurnOn();
                        }
                        // if(hit.distance < 0.05f){
                        //     hitObject.GetComponent<PlayerHealth>().Die();
                        //     Debug.Log("caught charcter");
                        //     chasing = false;
                        // }
                        //else{ //shoot at player
                        if (reloadTime >= timeBetweenshot)
                        {
                            reloadTime = 0;
                            AudioSource.PlayClipAtPoint(lazerShot, Camera.main.transform.position);
                            Instantiate(lazer,
                                        new Vector3(transform.position.x, transform.position.y, 0),
                                        transform.rotation);
                        }
                        else
                        {
                            reloadTime += Time.deltaTime * 50;
                        }
                        //}
                    }
                }
                else if (hitObject.GetComponent <EnemyLazer>() || hitObject.GetComponent <RepairStation>() || hitObject.GetComponent <FuelStation>())
                {
                    Debug.Log("saw collier that should be ignored");
                }
                else
                {
                    if (hit.distance < 0.2)
                    {
                        GetComponent <ReactiveTarget>().ReactToHit();
                    }
                    else if (hit.distance < obstacleRange)
                    {
                        if (goLeft(hit))
                        {
                            transform.Rotate(0, 0, 10);
                        }
                        else
                        {
                            transform.Rotate(0, 0, -10);
                        }
                        waitFor = 300f * Time.deltaTime;
                        waiting = true;
                        //extraTurn = true;
                    }
                }
            }
            else
            {
                _leftThrust.SetIntensity(0f);
                _rightThrust.SetIntensity(0f);

                if (waitFor > 0)
                {
                    // if(extraTurn){
                    //     transform.Rotate(0,0,10);
                    //     extraTurn = false;
                    // }
                    waitFor -= 1f * Time.deltaTime;
                }
                else if (waiting)
                {
                    waiting = false;
                }
            }
        }
    }