|
|
@ -6,182 +6,187 @@ using UnityEngine.SceneManagement; |
|
|
|
|
|
|
|
public class Character : MonoBehaviour |
|
|
|
{ |
|
|
|
public string nextScene; |
|
|
|
public string nextScene; |
|
|
|
|
|
|
|
#region Inspector Fields
|
|
|
|
|
|
|
|
[SerializeField] |
|
|
|
private Inventory startingInventory; |
|
|
|
|
|
|
|
[SerializeField] |
|
|
|
[Tooltip ("Will move to this block at start, else will try and find a block below")] |
|
|
|
private Block CurrentBlock; |
|
|
|
[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; |
|
|
|
[SerializeField] |
|
|
|
[Tooltip("Layers to ignore when checking for blocks")] |
|
|
|
private LayerMask Ignore; |
|
|
|
|
|
|
|
[Tooltip("Current Inventory of the player")] |
|
|
|
public Inventory Inventory; |
|
|
|
|
|
|
|
#endregion Inspector Fields
|
|
|
|
#endregion Inspector Fields
|
|
|
|
|
|
|
|
#region Unity Functions
|
|
|
|
#region Unity Functions
|
|
|
|
|
|
|
|
private void Awake () |
|
|
|
{ |
|
|
|
Inventory.Clone(startingInventory); |
|
|
|
private void Awake() |
|
|
|
{ |
|
|
|
if (Inventory != null || startingInventory != null) |
|
|
|
Inventory.Clone(startingInventory); |
|
|
|
|
|
|
|
//If no starting block find one below it
|
|
|
|
if (CurrentBlock == null) |
|
|
|
Block.isBlockAtPosition (transform.position + Vector3.down / 2, 1, ~Ignore, out CurrentBlock); |
|
|
|
//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; |
|
|
|
} |
|
|
|
//move to starting block
|
|
|
|
transform.position = CurrentBlock.VisualPosition; |
|
|
|
} |
|
|
|
|
|
|
|
#endregion Unity Functions
|
|
|
|
#endregion Unity Functions
|
|
|
|
|
|
|
|
#region Class Implementation
|
|
|
|
#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
|
|
|
|
/// <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 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; |
|
|
|
//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) |
|
|
|
{ |
|
|
|
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) |
|
|
|
{ |
|
|
|
Collectable collectable = other.GetComponentInChildren<Collectable>(); |
|
|
|
|
|
|
|
if (other != null) { |
|
|
|
if (collectable != null) |
|
|
|
{ |
|
|
|
collectable.OnCollect(this); |
|
|
|
} |
|
|
|
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; |
|
|
|
} |
|
|
|
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; |
|
|
|
else if (Block.isBlockAtPosition(position + Vector3.down, 1, ~Ignore, out hit) && hit.isWalkable(~Ignore)) |
|
|
|
moveTo = hit; |
|
|
|
|
|
|
|
}//end for
|
|
|
|
}//end for
|
|
|
|
|
|
|
|
//Set Current Block and move
|
|
|
|
CurrentBlock = moveTo; |
|
|
|
transform.position = CurrentBlock.VisualPosition; |
|
|
|
} |
|
|
|
//Set Current Block and move
|
|
|
|
CurrentBlock = moveTo; |
|
|
|
transform.position = CurrentBlock.VisualPosition; |
|
|
|
} |
|
|
|
|
|
|
|
#endregion Private Functions
|
|
|
|
#endregion Private Functions
|
|
|
|
|
|
|
|
} |