示例#1
0
 public void die()
 {
     dead     = true;
     health   = 0;
     sluggish = false;
     FindObjectOfType <Platforms.Floor>().Reset();
     gameObject.transform.localScale = new Vector3(.001f, .001f, .001f);
     if (!ragdollIsActive)
     {
         ragdollIsActive            = true;
         tempRag                    = GameObject.Instantiate <ragdollBody>(ragdoll);
         tempRag.transform.position = this.transform.position;
         tempRag.destructionTimer   = respawnTimer; //We set this so the ragdoll only exists as long as we're dead
     }
 }
        void Update()
        {
            if (Util.GameState.state == Util.GameState.State.Playing)
            {
                if (paused)
                {
                    paused = false;
                    anim.speed = animSpeed;
                    GetComponent<Rigidbody>().useGravity = true;
                    GetComponent<Rigidbody>().velocity = vel;
                }
                if (state != prevState)
                {
                    doOnce = false;
                    prevState = state;
                    anim.SetInteger("state", state);
                    if (attackInstance != null)
                        Destroy(attackInstance.gameObject);
                }
                Vector3 dirTowardsPlayer = player.transform.position - transform.position;
                float angle = Vector3.Angle(dirTowardsPlayer, transform.forward);
                angle = angle > 180f ? angle - 360f : angle;
                float distance = Vector3.Distance(player.transform.position, transform.position);
                RaycastHit[] obstacles = Physics.RaycastAll(transform.position, dirTowardsPlayer, distance, navObjectMask);
                bool canSeePlayer = (obstacles.Length == 0) && (distance < sightDistance) && (angle > -(fov / 2)) && (angle < fov / 2);
                bool infrontOfPlayer = (obstacles.Length == 0) && (distance < Vector3.Distance(attackPos.position, transform.position)) && (angle > -(fov / 4)) && (angle < fov / 4);

                state = machine.Run(animDone, canSeePlayer, player.dead, health < 2, infrontOfPlayer, distance, hit, anim.GetCurrentAnimatorClipInfo(0));

                switch (state)
                {
                    case (int)EnemyStateMachine.State.Wait: Wait(); break;
                    case (int)EnemyStateMachine.State.Patrol: Patrol(); break;
                    case (int)EnemyStateMachine.State.Flee: Flee(); break;
                    case (int)EnemyStateMachine.State.Chase: Chase(); break;
                    case (int)EnemyStateMachine.State.Tired: Tired(); break;
                    case (int)EnemyStateMachine.State.Attack: Attack(); break;
                    case (int)EnemyStateMachine.State.Hit: Hit(); break;
                }
                if (hit)
                {
                    hit = false;
                    health--;
                }
                if (health <= 0)
                {
                    tempRag = GameObject.Instantiate<ragdollBody>(ragdoll);
                    tempRag.transform.position = this.transform.position;
                    tempRag.shouldDisappear = false;
                    Destroy(this.gameObject);
                }
            }
            else
            {
                if (!paused)
                {
                    animSpeed = anim.speed;
                    anim.speed = 0;
                    GetComponent<Rigidbody>().useGravity = false;
                    vel = GetComponent<Rigidbody>().velocity;
                    GetComponent<Rigidbody>().velocity = new Vector3();
                    paused = true;
                }
            }
        }