Beispiel #1
0
    void Update()
    {
        wherePlayerAt = new Vector3(player.position.x, transform.position.y, player.position.z);
        distanceToPlayer = Vector3.Distance(transform.position, wherePlayerAt);
        pointToPlayer = wherePlayerAt - transform.position;
        pointToPlayer.Normalize();

        // Important information gathering!
        CheckBeingLit();
        CheckSeePlayer();

        /* ============================
         *  MORDERENs STATE-MACHINE!!!
         * ============================
         */
        // PATROL STATE
        // Morderen wanders randomly, hoping to bump into the player.
        if(myState == MorderState.PATROL_STATE)
        {
            if(enterState || arrivedAtPathEnd || pathIsImpossible || amStuck || distanceToPlayer > maximumDistanceFromPlayer * 1.5F)
            {
                if(arrivedAtPathEnd)
                {
                    waitToMove = shortWait;
                }
                while(true)
                {
                    int randomIndex = Random.Range(0, nodeList.Count - 1);
                    if((nodeList[randomIndex].position - player.position).magnitude < maximumDistanceFromPlayer)
                    {
                        FindPathTo(nodeList[randomIndex].gameobject.transform);
                        break;
                    }
                }
            }
            FollowPath();
            WalkForward();

            enterState = false;
            // Transitions
            if(beingLit && distanceToPlayer < flashlightFreezeRange)
            {
                myState = MorderState.BACK_OFF_STATE;
                enterState = true;
            }
            else if(seePlayer)
            {
                myState = MorderState.SEE_PLAYER_STATE;
                enterState = true;
            }
            else if(sawOrHeardPlayer)
            {
                myState = MorderState.SEARCH_FOR_PLAYER_STATE;
                enterState = true;
            }
        }

        // SEE PLAYER STATE
        // Morderen can see the player, and walks towards them.
        else if(myState == MorderState.SEE_PLAYER_STATE)
        {
            sawOrHeardPlayer = true;
            waitToMove = 0;
            movementDestination = wherePlayerAt;

            if(beingLit && distanceToPlayer < flashlightKillRange && flashlightKills && Flashlight.batteryLife > 0)
            {
                Flashlight.batteryLife -= flashlightKillDrain;
            //	TeleportToSafety();
            }
            if(distanceToPlayer<=killRange && seePlayer)
            {
                rigidbody.velocity = Vector3.zero;
                // MURDER DEATH KILL!!!!!!!
                //if(canKill)
                    //PlayerScript.LoadLastCheckpoint();
            }else{
                WalkForward();
            }

            enterState = false;
            // Transitions
            if(beingLit && distanceToPlayer < flashlightFreezeRange)
            {
                myState = MorderState.BACK_OFF_STATE;
                enterState = true;
            }
            else if(!seePlayer)
            {
                myState = MorderState.SEARCH_FOR_PLAYER_STATE;
                enterState = true;
            }
        }

        // SEARCH FOR PLAYER STATE
        // Morderen has some idea of where the player is, and proceeds to search for them.
        else if(myState == MorderState.SEARCH_FOR_PLAYER_STATE)
        {
            if(enterState)
            {
                FindPathTo(player);
                //ExtendCurrentPathTowards(player.position);
                // No no, write a function that logically guess a path extension! Take number of extensions as param.
            }

            // If Morderen couldn't find player.
            if(arrivedAtPathEnd || pathIsImpossible || amStuck)
                sawOrHeardPlayer = false;

            FollowPath();
            WalkForward();

            enterState = false;
            // Transitions
            if(beingLit && distanceToPlayer < flashlightFreezeRange)
            {
                myState = MorderState.BACK_OFF_STATE;
                enterState = true;
                sawOrHeardPlayer = false;
            }
            else if(seePlayer)
            {
                myState = MorderState.SEE_PLAYER_STATE;
                enterState = true;
            }
            else if(!sawOrHeardPlayer)
            {
                myState = MorderState.PATROL_STATE;
                enterState = true;
                waitToMove = shortWait * 2;
            }
        }

        // BACK OFF STATE
        // Morderen is sad and scared, and backs away from the player.
        else if(myState == MorderState.BACK_OFF_STATE)
        {
            // walk away from player...
            Flashlight.batteryLife -= Time.deltaTime * flashlightFreezeDrain;

            enterState = false;
            // Transitions
            if(!beingLit && distanceToPlayer < flashlightFreezeRange)
            {
                myState = MorderState.SEE_PLAYER_STATE;
                enterState = true;
            }
        }

        /* =============
         *  OTHER STUFF
         * =============
         */

        // Mute / play walking sound and animation if standing still / walking
        AnimateMurderer();
        PlaySounds();
        rigidbody.AddForce(0, extraGravity, 0);

        // Update wait time
        if(waitToMove > 0)
        {
            waitToMove -= (int)(Time.deltaTime * 1000);
            if(waitToMove < 0)
                waitToMove = 0;
        }
        // Update the timer that checks if morderen is stuck
        if(beingStuckTimer > 2000 && waitToMove == 0)
        {
            if((stuckCheckPosition - transform.position).sqrMagnitude < 0.5F)
            {
                amStuck = true;
            }
            stuckCheckPosition = transform.position;
            beingStuckTimer = 0;
        }
        else
        {
            amStuck = false;
            beingStuckTimer += (int)(Time.deltaTime * 1000);
        }

        // ****** DEBUG STUFF ******
        for(int i = 0; i < currentPath.Count; i++)
        {
            //Debug.DrawLine(currentPath[i].position, currentPath[i].position + Vector3.up * 20, Color.green);
            if(!(i >= currentPath.Count - 1))
                Debug.DrawLine(currentPath[i].position, currentPath[i+1].position, Color.red);
        }
        // Draws ALL connections between nodes.
        for(int i = 0; i < nodeList.Count; i++)
        {
            for(int j = 0; j < nodeList[i].neighbours.Count; j++)
            {
                Debug.DrawLine(nodeList[i].position, nodeList[i].neighbours[j].position, Color.blue);
            }
        }
        // *** END OF DEBUG STUFF ***
    }
Beispiel #2
0
    void Update()
    {
        wherePlayerAt    = new Vector3(player.position.x, transform.position.y, player.position.z);
        distanceToPlayer = Vector3.Distance(transform.position, wherePlayerAt);
        pointToPlayer    = wherePlayerAt - transform.position;
        pointToPlayer.Normalize();

        // Important information gathering!
        CheckBeingLit();
        CheckSeePlayer();


        /* ============================
         *  MORDERENs STATE-MACHINE!!!
         * ============================
         */
        // PATROL STATE
        // Morderen wanders randomly, hoping to bump into the player.
        if (myState == MorderState.PATROL_STATE)
        {
            if (enterState || arrivedAtPathEnd || pathIsImpossible || amStuck || distanceToPlayer > maximumDistanceFromPlayer * 1.5F)
            {
                if (arrivedAtPathEnd)
                {
                    waitToMove = shortWait;
                }
                while (true)
                {
                    int randomIndex = Random.Range(0, nodeList.Count - 1);
                    if ((nodeList[randomIndex].position - player.position).magnitude < maximumDistanceFromPlayer)
                    {
                        FindPathTo(nodeList[randomIndex].gameobject.transform);
                        break;
                    }
                }
            }
            FollowPath();
            WalkForward();

            enterState = false;
            // Transitions
            if (beingLit && distanceToPlayer < flashlightFreezeRange)
            {
                myState    = MorderState.BACK_OFF_STATE;
                enterState = true;
            }
            else if (seePlayer)
            {
                myState    = MorderState.SEE_PLAYER_STATE;
                enterState = true;
            }
            else if (sawOrHeardPlayer)
            {
                myState    = MorderState.SEARCH_FOR_PLAYER_STATE;
                enterState = true;
            }
        }

        // SEE PLAYER STATE
        // Morderen can see the player, and walks towards them.
        else if (myState == MorderState.SEE_PLAYER_STATE)
        {
            sawOrHeardPlayer    = true;
            waitToMove          = 0;
            movementDestination = wherePlayerAt;

            if (beingLit && distanceToPlayer < flashlightKillRange && flashlightKills && Flashlight.batteryLife > 0)
            {
                Flashlight.batteryLife -= flashlightKillDrain;
                //	TeleportToSafety();
            }
            if (distanceToPlayer <= killRange && seePlayer)
            {
                rigidbody.velocity = Vector3.zero;
                // MURDER DEATH KILL!!!!!!!
                //if(canKill)
                //PlayerScript.LoadLastCheckpoint();
            }
            else
            {
                WalkForward();
            }

            enterState = false;
            // Transitions
            if (beingLit && distanceToPlayer < flashlightFreezeRange)
            {
                myState    = MorderState.BACK_OFF_STATE;
                enterState = true;
            }
            else if (!seePlayer)
            {
                myState    = MorderState.SEARCH_FOR_PLAYER_STATE;
                enterState = true;
            }
        }

        // SEARCH FOR PLAYER STATE
        // Morderen has some idea of where the player is, and proceeds to search for them.
        else if (myState == MorderState.SEARCH_FOR_PLAYER_STATE)
        {
            if (enterState)
            {
                FindPathTo(player);
                //ExtendCurrentPathTowards(player.position);
                // No no, write a function that logically guess a path extension! Take number of extensions as param.
            }

            // If Morderen couldn't find player.
            if (arrivedAtPathEnd || pathIsImpossible || amStuck)
            {
                sawOrHeardPlayer = false;
            }

            FollowPath();
            WalkForward();

            enterState = false;
            // Transitions
            if (beingLit && distanceToPlayer < flashlightFreezeRange)
            {
                myState          = MorderState.BACK_OFF_STATE;
                enterState       = true;
                sawOrHeardPlayer = false;
            }
            else if (seePlayer)
            {
                myState    = MorderState.SEE_PLAYER_STATE;
                enterState = true;
            }
            else if (!sawOrHeardPlayer)
            {
                myState    = MorderState.PATROL_STATE;
                enterState = true;
                waitToMove = shortWait * 2;
            }
        }

        // BACK OFF STATE
        // Morderen is sad and scared, and backs away from the player.
        else if (myState == MorderState.BACK_OFF_STATE)
        {
            // walk away from player...
            Flashlight.batteryLife -= Time.deltaTime * flashlightFreezeDrain;

            enterState = false;
            // Transitions
            if (!beingLit && distanceToPlayer < flashlightFreezeRange)
            {
                myState    = MorderState.SEE_PLAYER_STATE;
                enterState = true;
            }
        }

        /* =============
         *  OTHER STUFF
         * =============
         */

        // Mute / play walking sound and animation if standing still / walking
        AnimateMurderer();
        PlaySounds();
        rigidbody.AddForce(0, extraGravity, 0);

        // Update wait time
        if (waitToMove > 0)
        {
            waitToMove -= (int)(Time.deltaTime * 1000);
            if (waitToMove < 0)
            {
                waitToMove = 0;
            }
        }
        // Update the timer that checks if morderen is stuck
        if (beingStuckTimer > 2000 && waitToMove == 0)
        {
            if ((stuckCheckPosition - transform.position).sqrMagnitude < 0.5F)
            {
                amStuck = true;
            }
            stuckCheckPosition = transform.position;
            beingStuckTimer    = 0;
        }
        else
        {
            amStuck          = false;
            beingStuckTimer += (int)(Time.deltaTime * 1000);
        }

        // ****** DEBUG STUFF ******
        for (int i = 0; i < currentPath.Count; i++)
        {
            //Debug.DrawLine(currentPath[i].position, currentPath[i].position + Vector3.up * 20, Color.green);
            if (!(i >= currentPath.Count - 1))
            {
                Debug.DrawLine(currentPath[i].position, currentPath[i + 1].position, Color.red);
            }
        }
        // Draws ALL connections between nodes.
        for (int i = 0; i < nodeList.Count; i++)
        {
            for (int j = 0; j < nodeList[i].neighbours.Count; j++)
            {
                Debug.DrawLine(nodeList[i].position, nodeList[i].neighbours[j].position, Color.blue);
            }
        }
        // *** END OF DEBUG STUFF ***
    }