- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- using UnityEngine.SceneManagement;
-
- public class Character : MonoBehaviour
- {
- public string nextScene;
-
- #region Inspector Fields
-
- [SerializeField]
- [Tooltip ("Will move to this block at start, else will try and find a block below")]
- private Block CurrentBlock;
-
- [SerializeField]
- [Tooltip ("Layers to ignore when checking for blocks")]
- private LayerMask Ignore;
-
- #endregion Inspector Fields
-
- #region Unity Functions
-
- private void Awake ()
- {
- //If no starting block find one below it
- if (CurrentBlock == null)
- Block.isBlockAtPosition (transform.position + Vector3.down / 2, 1, ~Ignore, out CurrentBlock);
-
- //move to starting block
- transform.position = CurrentBlock.VisualPosition;
- }
-
- #endregion Unity Functions
-
- #region Class Implementation
-
- /// <summary>
- /// Moves one block in specefied direction, Can walk off obstacles
- /// </summary>
- /// <param name="direction">direction to walk</param>
- /// <remarks>Technically is same as JumpLong(1) but kept seperate to avoid confusion</remarks>
- public void Move (Direction direction)
- {
- //setting up variables
- Vector3 position = CurrentBlock.position + direction.ToVector (transform); // position wanted
- Block hit; //output of block detection
- Block moveTo = CurrentBlock; //block we'll actually move to
-
- //if move is obstucted no where to move
- if (Block.isBlockAtPosition (position + Vector3.up, 1, ~Ignore))
- return;
-
-
- //If block at Position is walkable set it to moveTo
- if (Block.isBlockAtPosition (position, 1, ~Ignore, out hit) && hit.isWalkable (~Ignore))
- moveTo = hit;
- //else if block down one is walkable
- else if (Block.isBlockAtPosition (position + Vector3.down, 1, ~Ignore, out hit) && hit.isWalkable (~Ignore))
- moveTo = hit;
-
- //set current block && move
- CurrentBlock = moveTo;
- transform.position = CurrentBlock.VisualPosition;
- }
-
- /// <summary>
- /// Upon collision with a floating block, collect its
- /// Upon collision with the end portal, end of level
- /// </summary>
- /// <param name="other">name of collided object</param>
- void OnTriggerEnter (Collider other)
- {
- if (other.gameObject.tag == "New Block") {
- other.gameObject.SetActive (false);
- Debug.Log ("You picked up the new coding block " + other.gameObject.name + "!");
- }
- if (other.gameObject.name == "End Portal") {
- other.GetComponent<Collider>().enabled = false;
- Debug.Log ("You finished this level!");
- SceneManager.LoadScene(nextScene);
- }
- }
-
- /// <summary>
- /// Rotates to point in specific direction based on current direction
- /// </summary>
- /// <param name="direction">Local direction to point</param>
- public void Rotate (Direction direction)
- {
- transform.forward = direction.ToVector (transform);
- }
-
- /// <summary>
- /// Jumps in specefied direction, picks between Long Jump and Jumping up
- /// </summary>
- /// <param name="direction">Direction to Jump</param>
- public void Jump (Direction direction)
- {
- //if there is a block infront JumpUp else LongJump
- if (Block.isBlockAtPosition (CurrentBlock.position + direction.ToVector (transform) + Vector3.up, 1, ~Ignore))
- JumpUp (direction);
- else
- JumpLong (direction);
- }
-
- #endregion Class Implementation
-
- #region Private Functions
-
- /// <summary>
- /// Jumps up obstacle of specific height. Jumps as high as possible
- /// </summary>
- /// <param name="direction">Direction of obstacle</param>
- /// <param name="height">max height</param>
- private void JumpUp (Direction direction, int height = 1)
- {
- //setting up variables
- Vector3 position; // position wanted
- Block hit; //output of block detection
- Block moveTo = CurrentBlock; //block we'll actually move to
-
- //Check blocks in going up then move to the heighest walkable one
- for (int i = 0; i <= height; i++) {
- //next position up the tower
- position = CurrentBlock.position + direction.ToVector (transform) + (Vector3.up * i);
-
- //if block is walkable set it to last known position
- if (Block.isBlockAtPosition (position, 1, ~Ignore, out hit) && hit.isWalkable (~Ignore))
- moveTo = hit;
- }
-
- //set current block && move
- CurrentBlock = moveTo;
- transform.position = CurrentBlock.VisualPosition;
- }
-
- /// <summary>
- /// Long jumps forward a specified distance. Can Jump gaps. Stops at obstruction
- /// </summary>
- /// <param name="direction">Direction to Jump</param>
- /// <param name="Distance">Max distance</param>
- private void JumpLong (Direction direction, int Distance = 2)
- {
- //setting up variables
- Vector3 position; // position wanted
- Block hit; //output of block detection
- Block moveTo = CurrentBlock; //block we'll actually move to
-
- //Check blocks in front until we hit an obstruction or went the distance
- for (int i = 1; i <= Distance; i++) {
- //Next position to MoveTo
- position = CurrentBlock.position + (direction.ToVector (transform) * i);
-
- //if jump is obstructed, stop and go to last known block
- if (Block.isBlockAtPosition (position + Vector3.up, 1, ~Ignore))
- break;
-
-
- //If block at Position is walkable set it to last known position
- if (Block.isBlockAtPosition (position, 1, ~Ignore, out hit) && hit.isWalkable (~Ignore))
- moveTo = hit;
- //else if block down one is walkable
- else if (Block.isBlockAtPosition (position + Vector3.down, 1, ~Ignore, out hit) && hit.isWalkable (~Ignore))
- moveTo = hit;
-
- }//end for
-
- //Set Current Block and move
- CurrentBlock = moveTo;
- transform.position = CurrentBlock.VisualPosition;
- }
-
- #endregion Private Functions
-
- }
|