fixed player bugs

This commit is contained in:
2020-02-01 21:09:12 -05:00
parent 0ff71d5942
commit 5ada160f60
4 changed files with 147 additions and 145 deletions

View File

@@ -7,22 +7,21 @@ using UnityEngine.Tilemaps;
public class EventControls : MonoBehaviour
{
[SerializeField] private Player player;
[SerializeField] private Camera camera;
[SerializeField] private Tile tile;
[SerializeField] private List<Tile> tiles;
[SerializeField] private List<Tile> successTiles;
[SerializeField] private Tile successTile;
[SerializeField] private Tile plusTile;
[SerializeField] private float framesPerControlTile = 15;
[SerializeField] private int nextControlYOffset = 0;
[SerializeField] private int nextControlXOffset = 0;
private int nextControlXOffset => 0 - maxNumberOfControlTiles + 1;
[SerializeField] private float tileMapClearDelayInSeconds = 0.5f;
[SerializeField] private int maxNumberOfControlTiles = 2;
private Tilemap tilemap;
/* For drawing event control tiles */
private Vector3Int? initialCameraPosition;
private int maxNumberOfControlTiles = 3;
private int numberOfControlTilesSet = 0;
private int nextControlAccumalator = 0;
@@ -47,6 +46,8 @@ public class EventControls : MonoBehaviour
{
currentPlayerCollider = playerCollider;
currentEnemyCollider = enemyCollider;
player.DisablePlayerMovement();
Physics2D.IgnoreCollision(playerCollider, enemyCollider, true);
eventTriggered = true;
@@ -54,7 +55,6 @@ public class EventControls : MonoBehaviour
public bool IsEventTriggered()
{
return eventTriggered;
}
@@ -69,7 +69,7 @@ public class EventControls : MonoBehaviour
if (eventTriggered)
{
SetTile();
//SetTileMapPosition();
// SetTileMapPosition();
}
if (eventDrawn && eventTriggered)
@@ -94,19 +94,13 @@ public class EventControls : MonoBehaviour
EventControlTile eventControlTile = null;
if (isControlTile == null || isControlTile.GetValueOrDefault())
{
eventControlTile = new EventControlTile(KeyCode.Q,
tile,
successTile,
GetNextTilePosition() + nextControlOffSetAsVector); /* TODO: Hard code */
eventControlTile = GenerateEventControlTile(GetNextTilePosition() + nextControlOffSetAsVector);
isControlTile = false;
numberOfControlTilesSet++;
}
else
{
eventControlTile = new EventControlTile(KeyCode.Escape,
plusTile,
null,
GetNextTilePosition() + nextControlOffSetAsVector,
true); /* TODO: Hard code */
eventControlTile = GenerateEventControlPlusTile(GetNextPlusTilePosition() + nextControlOffSetAsVector);
isControlTile = true;
}
@@ -115,7 +109,6 @@ public class EventControls : MonoBehaviour
tilemap.SetTile(eventControlTile.position, eventControlTile.tile);
nextControlAccumalator = 0;
numberOfControlTilesSet++;
}
else if (numberOfControlTilesSet == maxNumberOfControlTiles)
{
@@ -138,11 +131,17 @@ public class EventControls : MonoBehaviour
private Vector3Int GetNextTilePosition()
{
return (initialCameraPosition + new Vector3Int(numberOfControlTilesSet, 0, 0))
return (initialCameraPosition + new Vector3Int(numberOfControlTilesSet*2, 0, 0))
.GetValueOrDefault();
}
private void PerformControlEvent()
private Vector3Int GetNextPlusTilePosition()
{
return (initialCameraPosition + new Vector3Int(numberOfControlTilesSet*2-1, 0, 0))
.GetValueOrDefault();
}
private bool PerformControlEvent()
{
nextControlAccumalator = 0;
@@ -163,24 +162,33 @@ public class EventControls : MonoBehaviour
}
else if (eventCycleAccumalator >= eventCycleInSeconds * framesPerSecond)
{
eventTriggered = false;
eventCycleAccumalator = 0;
Destroy(currentEnemyCollider.gameObject);
currentEnemyCollider = null;
}
else
{
eventCycleAccumalator++;
}
return false;
}
private void Reset()
{
if (tileMapClearDelayAccumalator >= tileMapClearDelayInSeconds * framesPerSecond)
{
eventControlTilesInCycle.Clear();
tilemap.ClearAllTiles();
tileMapClearDelayAccumalator = 0;
eventDrawn = false;
numberOfControlTilesSet = 0;
Physics2D.IgnoreCollision(currentPlayerCollider, currentEnemyCollider, false);
if (currentEnemyCollider != null)
Physics2D.IgnoreCollision(currentPlayerCollider, currentEnemyCollider, false);
player.EnablePlayerMovement();
currentPlayerCollider = null;
currentEnemyCollider = null;
}
@@ -190,9 +198,28 @@ public class EventControls : MonoBehaviour
}
}
private void SetTileMapPosition()
//private void SetTileMapPosition()
//{
// var offset = camera.transform.position.x - (int)camera.transform.position.x;
// transform.position = new Vector3(transform.position.x + offset, transform.position.y, 0);
//}
private EventControlTile GenerateEventControlTile(Vector3Int position)
{
transform.position = camera.transform.position +
new Vector3Int(nextControlXOffset, nextControlYOffset, 0); // offset
var randomNumber = Random.Range(0, TileToKeyMappings.TileToKey.Count);
return new EventControlTile(TileToKeyMappings.TileToKey[randomNumber],
tiles[randomNumber],
successTiles[randomNumber],
position);
}
private EventControlTile GenerateEventControlPlusTile(Vector3Int position)
{
return new EventControlTile(KeyCode.Escape,
plusTile,
null,
position,
true);
}
}

View File

@@ -6,17 +6,18 @@ using UnityEngine;
public class Player : MonoBehaviour
{
[SerializeField] private float runSpeed = 10f;
[SerializeField] private float jumpSpeed = 10f;
[SerializeField] private float jumpSpeed = 35f;
[SerializeField] private float runFasterFactor = 1.5f;
[SerializeField] private float groundErrorThreshold = 0.05f;
[SerializeField] private float groundErrorThreshold = 1.5f;
[SerializeField] private float wallErrorThreshold = 1.5f;
[SerializeField] private float wallLineCaseDistance = 0.5f;
[SerializeField] private float runErrorThreshold = 0.05f;
private Rigidbody2D rigidBody;
new private BoxCollider2D collider;
private Animator animator;
private Vector2 wallLineCaseDistanceVector => new Vector2(wallLineCaseDistance, 0);
private bool isMovementEnabled = true;
private void Start()
{
@@ -28,13 +29,39 @@ public class Player : MonoBehaviour
private void Update()
{
MovePlayer();
//if (IsPlayerOnWall(true))
//{
// if (collider.sharedMaterial == null || collider.sharedMaterial.friction != 0f)
// {
// collider.sharedMaterial = new PhysicsMaterial2D();
// collider.sharedMaterial.friction = 0f;
// collider.enabled = false;
// collider.enabled = true;
// }
//}
//else
//{
// if (collider.sharedMaterial == null || collider.sharedMaterial.friction == 0f)
// {
// collider.sharedMaterial = new PhysicsMaterial2D();
// collider.sharedMaterial.friction = 0.5f;
// collider.enabled = false;
// collider.enabled = true;
// }
//}
}
private void MovePlayer()
{
Jump();
Run();
FlipSprite();
if (isMovementEnabled)
{
Jump();
Run();
FlipSprite();
}
HandleAnimations();
}
@@ -51,9 +78,6 @@ public class Player : MonoBehaviour
private void Run()
{
if (IsPlayerOnWall())
return;
var actualRunSpeed = runSpeed;
// Speed Run Increase
@@ -61,6 +85,10 @@ public class Player : MonoBehaviour
{
actualRunSpeed *= runFasterFactor;
}
if (IsPlayerOnWall())
{
actualRunSpeed = 0;
}
// Run
if (Input.GetKey(KeyCode.RightArrow))
@@ -75,38 +103,45 @@ public class Player : MonoBehaviour
private bool IsPlayerOnGround()
{
return IsPointOnGround(transform.position + new Vector3(0.3f, 0, 0)) ||
IsPointOnGround(transform.position + new Vector3(-0.3f, 0, 0));
return IsPointOnGround(transform.position + new Vector3(collider.bounds.extents.x * 0.97f, 0, 0)) ||
IsPointOnGround(transform.position) ||
IsPointOnGround(transform.position - new Vector3(collider.bounds.extents.x, 0, 0));
}
private bool IsPointOnGround(Vector2 position)
{
Debug.DrawLine(position, position - new Vector2(0, collider.bounds.extents.y * groundErrorThreshold));
RaycastHit2D hit = Physics2D.Raycast(position,
-Vector2.up,
groundErrorThreshold,
collider.bounds.extents.y * groundErrorThreshold,
LayerMask.GetMask(LayerNames.Ground));
return hit.collider != null && hit.collider.IsTouching(collider);
}
private bool IsPlayerOnWall()
private bool IsPlayerOnWall(bool ignoreGround = false)
{
return IsPointOnWall(transform.position + new Vector3(0, 1, 0)) ||
IsPointOnWall(transform.position + new Vector3(0, -1, 0)) ||
IsPointOnWall(transform.position + new Vector3(0, -2, 0));
return IsPointOnWall(transform.position + new Vector3(0, collider.bounds.extents.y * 0.6f, 0), ignoreGround) ||
IsPointOnWall(transform.position - new Vector3(0, collider.bounds.extents.y * 0.25f, 0), ignoreGround) ||
IsPointOnWall(transform.position - new Vector3(0, collider.bounds.extents.y * 0.8f, 0), ignoreGround) ||
IsPointOnWall(transform.position - new Vector3(0, collider.bounds.extents.y * 1.5f, 0), ignoreGround);
}
private bool IsPointOnWall(Vector2 position)
private bool IsPointOnWall(Vector2 position, bool ignoreGround = false)
{
Debug.DrawLine(position, position + new Vector2(collider.bounds.extents.x * wallErrorThreshold, 0), Color.green);
Debug.DrawLine(position, position - new Vector2(collider.bounds.extents.x * wallErrorThreshold, 0), Color.green);
var rightHit = Physics2D.Linecast(position,
position + wallLineCaseDistanceVector,
position + new Vector2(collider.bounds.extents.x * wallErrorThreshold, 0),
LayerMask.GetMask(LayerNames.Ground));
var leftHit = Physics2D.Linecast(position,
position - wallLineCaseDistanceVector,
position - new Vector2(collider.bounds.extents.x * wallErrorThreshold, 0),
LayerMask.GetMask(LayerNames.Ground));
return ((rightHit.collider != null && rightHit.collider.IsTouching(collider)) ||
(leftHit.collider != null && leftHit.collider.IsTouching(collider))) && !IsPlayerOnGround();
(leftHit.collider != null && leftHit.collider.IsTouching(collider))) && (!IsPlayerOnGround() || ignoreGround);
}
private bool HasEncounteredEnemy()
@@ -128,4 +163,14 @@ public class Player : MonoBehaviour
animator.SetBool("IsGround", IsPlayerOnGround());
animator.SetFloat("YVelocity", rigidBody.velocity.y);
}
public void DisablePlayerMovement()
{
isMovementEnabled = false;
}
public void EnablePlayerMovement()
{
isMovementEnabled = true;
}
}