From 74dd3727f62603f64958790f9e588d47c8f000ff Mon Sep 17 00:00:00 2001 From: miepzerino <o.skotnik@gmail.com> Date: Sat, 23 Dec 2023 03:14:14 +0000 Subject: [PATCH] Added player movement while drilling --- Assets/Scripts/PlayerController.cs | 208 ++++++++++++++++++++++++++++++++++++++++----------- 1 files changed, 162 insertions(+), 46 deletions(-) diff --git a/Assets/Scripts/PlayerController.cs b/Assets/Scripts/PlayerController.cs index dc4a8ac..5f0246c 100644 --- a/Assets/Scripts/PlayerController.cs +++ b/Assets/Scripts/PlayerController.cs @@ -1,8 +1,12 @@ +using Assets.Scripts.Enums; using Assets.Scripts.Helpers; using System; +using System.Collections; using System.ComponentModel.Design; +using Unity.VisualScripting; using UnityEngine; using UnityEngine.InputSystem; +using UnityEngine.Tilemaps; [RequireComponent(typeof(Rigidbody2D))] public class PlayerController : MonoBehaviour @@ -13,13 +17,24 @@ private float maxFallSpeedCurrent = 0f; Vector2 moveInput; + [NonSerialized] public Rigidbody2D rb; + [NonSerialized] + public Damageable health; + + BoxCollider2D boxCollider; Animator animator; Animator animator_rotor; public GameObject rotorGO; TouchingDirections touchingDirections; - public Damageable health; + // Time it takes to drill + public float drillingTime = 1f; + private float timeSinceDrill = 0f; + private bool drillToPosition; + private Vector3 drillTilePosition; + private Vector3 drillOriginalPosition; + [SerializeField] private bool _isMoving; public bool IsMoving @@ -44,6 +59,17 @@ animator_rotor.SetBool(AnimationStrings.Player.isFlying, value); } } + [SerializeField] + private bool _isDrilling; + public bool IsDrilling + { + get { return _isDrilling; } + set + { + _isDrilling = value; + //animator.SetBool(AnimationStrings.Player.isDrilling, value); + } + } private bool _isFacingRight = true; @@ -64,11 +90,19 @@ { get { - return animator.GetBool(AnimationStrings.canMove) && !PauseMenu.GameIsPaused; + return animator.GetBool(AnimationStrings.canMove) && !PauseMenu.GameIsPaused && !IsDrilling; } } + private void OnEnable() + { + CharacterEvents.characterDrillingToPosition += (DrillingToPosition); + } + private void OnDisable() + { + CharacterEvents.characterDrillingToPosition -= (DrillingToPosition); + } private void Awake() { @@ -77,10 +111,11 @@ animator_rotor = rotorGO.GetComponent<Animator>(); touchingDirections = GetComponent<TouchingDirections>(); health = GetComponent<Damageable>(); + boxCollider = GetComponent<BoxCollider2D>(); if (SaveSystem.isGameLoaded) { - GameObject uiManager = GameObject.Find("UIManager"); - uiManager.GetComponent<UIManager>().GameLoaded(); + GameObject uiManager = GameObject.Find("GameManager"); + uiManager.GetComponent<GameManager>().GameLoaded(); SaveData save = SaveSystem.LoadPlayer(); health.MaxHealth = save.maxHealth; health.Health = save.health; @@ -92,73 +127,154 @@ private void FixedUpdate() { - if (moveInput.y == 0) + if (CanMove) { - if (rb.velocity.y <= maxFallSpeed) + if (moveInput.y == 0) { - // max fall speed, dont accelerate more - rb.velocity = new Vector2(moveInput.x * moveSpeed, maxFallSpeed); + if (rb.velocity.y <= maxFallSpeed) + { + // max fall speed, dont accelerate more + rb.velocity = new Vector2(moveInput.x * moveSpeed, maxFallSpeed); + } + else + { + // normal fall + rb.velocity = new Vector2(moveInput.x * moveSpeed, rb.velocity.y); + } } else { - // normal fall - rb.velocity = new Vector2(moveInput.x * moveSpeed, rb.velocity.y); + if (rb.velocity.y < 0 && moveInput.y > 0) + { + // falling but moving upwards + rb.velocity = new Vector2(moveInput.x * moveSpeed, (moveInput.y * moveSpeed) + rb.velocity.y); + } + else + { + // moving upwards no falling + rb.velocity = new Vector2(moveInput.x * moveSpeed, (moveInput.y * moveSpeed)); + } } - } - else - { - if (rb.velocity.y < 0 && moveInput.y > 0) + if (touchingDirections.IsGrounded) { - // falling but moving upwards - rb.velocity = new Vector2(moveInput.x * moveSpeed, (moveInput.y * moveSpeed) + rb.velocity.y); + if (maxFallSpeedCurrent < maxFallSpeedDamge) + { + TakeFallDamage(Math.Abs((int)maxFallSpeedCurrent)); + maxFallSpeedCurrent = 0; + } } - else - { - // moving upwards no falling - rb.velocity = new Vector2(moveInput.x * moveSpeed, (moveInput.y * moveSpeed)); - } - } - if (touchingDirections.IsGrounded) - { - if (maxFallSpeedCurrent < maxFallSpeedDamge) - { - TakeFallDamage(Math.Abs((int)maxFallSpeedCurrent)); - maxFallSpeedCurrent = 0; - } - } - else if (IsFlying) - { - maxFallSpeedCurrent = rb.velocity.y; - } - else - { - if (maxFallSpeedCurrent > rb.velocity.y) + else if (IsFlying) { maxFallSpeedCurrent = rb.velocity.y; + } + else + { + if (maxFallSpeedCurrent > rb.velocity.y) + { + maxFallSpeedCurrent = rb.velocity.y; + } + } + if (touchingDirections.IsGrounded && moveInput.y < 0 && !IsDrilling) + { + //IsDrilling = true; + Drill(DrillDirection.Down); + } + + if (touchingDirections.IsGrounded && moveInput.x != 0 && !IsDrilling) + { + if (touchingDirections.IsAtWallLeft && moveInput.x < 0) + { + Drill(DrillDirection.Left); + } + else if (touchingDirections.IsAtWallRight && moveInput.x > 0) + { + Drill(DrillDirection.Right); + } + } + } + if (IsDrilling) + { + rb.velocity = Vector2.zero; + if (drillToPosition) + { + if (timeSinceDrill < drillingTime) + { + gameObject.transform.position = Vector3.Lerp(drillOriginalPosition, drillTilePosition, timeSinceDrill / drillingTime); + //Debug.Log("drillTilePosition: " + drillTilePosition); + //Debug.Log("timeSinceDrill: " + timeSinceDrill); + timeSinceDrill += Time.deltaTime; + } + else + { + boxCollider.enabled = true; + IsDrilling = false; + drillToPosition = false; + timeSinceDrill = 0; + } } } } public void OnMove(InputAction.CallbackContext context) { - if (CanMove) - { - moveInput = context.ReadValue<Vector2>(); + moveInput = context.ReadValue<Vector2>(); - IsMoving = moveInput.x != 0; + IsMoving = moveInput.x != 0; - IsFlying = (moveInput.y != 0); + IsFlying = (moveInput.y != 0); - SetFacingDirection(moveInput); - } - else + SetFacingDirection(moveInput); + if (IsDrilling) { IsMoving = false; IsFlying = false; - moveInput = Vector2.zero; + //moveInput = Vector2.zero; } } + private void Drill(DrillDirection drillDirection) + { + ContactPoint2D[] contactPoints = new ContactPoint2D[1]; + //rb.GetContacts(contactPoints); + switch (drillDirection) + { + case DrillDirection.Left: + touchingDirections.wallHitsLeft[0].collider.GetContacts(contactPoints); + break; + case DrillDirection.Right: + touchingDirections.wallHitsRight[0].collider.GetContacts(contactPoints); + break; + case DrillDirection.Down: + touchingDirections.groundHits[0].collider.GetContacts(contactPoints); + break; + } + //Debug.Log(contactPoints[0].otherRigidbody?.gameObject.name); + if (contactPoints[0].otherRigidbody?.name == "Tilemap") + { + boxCollider.enabled = false; + IsDrilling = true; + CharacterEvents.characterDrill.Invoke(contactPoints[0], drillDirection); + } + } + + private void DrillingToPosition(Vector3 tilePosition) + { + //Debug.Log("DrillingToPosition() called"); + //Debug.Log(gameObject.transform.position); + drillToPosition = true; + drillTilePosition = tilePosition; + //Debug.Log("drillTilePosition: " + drillTilePosition); + drillOriginalPosition = gameObject.transform.position; + //Debug.Log("drillOriginalPosition: " + drillOriginalPosition); + } + + //private void DrillLeftOrRight() + //{ + // ContactPoint2D[] contactPoints = new ContactPoint2D[1]; + // touchingDirections.wallHits[0].collider.GetContacts(contactPoints); + // CharacterEvents.characterDrillLeftOrRight.Invoke(contactPoints[0]); + //} + private void SetFacingDirection(Vector2 moveInput) { if (moveInput.x > 0 && !IsFacingRight) -- Gitblit v1.9.3