From 318d2ec9f6a64d45ef44ae5dcfa6de04d2e710fe Mon Sep 17 00:00:00 2001 From: miepzerino <o.skotnik@gmail.com> Date: Wed, 27 Dec 2023 20:21:18 +0000 Subject: [PATCH] Fix stop rotate while drilling --- Assets/Scripts/PlayerController.cs | 182 +++++++++++++++++++++++++++++++++++++-------- 1 files changed, 150 insertions(+), 32 deletions(-) diff --git a/Assets/Scripts/PlayerController.cs b/Assets/Scripts/PlayerController.cs index ed9f0d7..d31b599 100644 --- a/Assets/Scripts/PlayerController.cs +++ b/Assets/Scripts/PlayerController.cs @@ -1,12 +1,9 @@ using Assets.Scripts.Enums; using Assets.Scripts.Helpers; using System; -using System.Collections; -using System.ComponentModel.Design; -using Unity.VisualScripting; +using System.Linq; using UnityEngine; using UnityEngine.InputSystem; -using UnityEngine.Tilemaps; [RequireComponent(typeof(Rigidbody2D))] public class PlayerController : MonoBehaviour @@ -19,16 +16,22 @@ [NonSerialized] public Rigidbody2D rb; + [NonSerialized] + public Damageable health; + + BoxCollider2D boxCollider; Animator animator; Animator animator_rotor; public GameObject rotorGO; TouchingDirections touchingDirections; - [NonSerialized] - public Damageable health; // Time it takes to drill - public float drillingTime = 1f; + [SerializeField] + private float drillingTime = 1f; private float timeSinceDrill = 0f; + private bool drillToPosition; + private Vector3 drillTilePosition; + private Vector3 drillOriginalPosition; [SerializeField] private bool _isMoving; @@ -54,15 +57,63 @@ animator_rotor.SetBool(AnimationStrings.Player.isFlying, value); } } - [SerializeField] - private bool _isDrilling; public bool IsDrilling { - get { return _isDrilling; } + get { return IsDrillingDown || IsDrillingLeftRight; } set { - _isDrilling = value; - //animator.SetBool(AnimationStrings.Player.isDrilling, value); + if (value) + { + Debug.Assert(false, "Can't set IsDrilling this way, use IsDrillingLeftRight or IsDrillingDown!"); + } + if (IsDrillingDown) + { + IsDrillingDown = false; + } + if (IsDrillingLeftRight) + { + IsDrillingLeftRight = false; + } + } + } + [SerializeField] + private bool _isDrillingLeftRight; + public bool IsDrillingLeftRight + { + get { return _isDrillingLeftRight; } + set + { + _isDrillingLeftRight = value; + animator.SetBool(AnimationStrings.Player.isDrillingLeftRight, value); + animator_rotor.SetBool(AnimationStrings.Player.isFlying, false); + if (value) + { + animator.speed = 1 / drillingTime; + } + else + { + animator.speed = 1f; + } + } + } + [SerializeField] + private bool _isDrillingDown; + public bool IsDrillingDown + { + get { return _isDrillingDown; } + set + { + _isDrillingDown = value; + animator.SetBool(AnimationStrings.Player.isDrillingDown, value); + animator_rotor.SetBool(AnimationStrings.Player.isFlying, false); + if (value) + { + animator.speed = 1 / drillingTime; + } + else + { + animator.speed = 1f; + } } } @@ -89,7 +140,17 @@ } } + private void OnEnable() + { + CharacterEvents.characterDrillingToPosition += (DrillingToPosition); + //CharacterEvents.characterDrillingToPositionAbort += (DrillingToPositionAbort); + } + private void OnDisable() + { + CharacterEvents.characterDrillingToPosition -= (DrillingToPosition); + //CharacterEvents.characterDrillingToPositionAbort -= (DrillingToPositionAbort); + } private void Awake() { @@ -98,17 +159,20 @@ animator_rotor = rotorGO.GetComponent<Animator>(); touchingDirections = GetComponent<TouchingDirections>(); health = GetComponent<Damageable>(); + boxCollider = GetComponent<BoxCollider2D>(); if (SaveSystem.isGameLoaded) { - GameObject uiManager = GameObject.Find("GameManager"); - uiManager.GetComponent<GameManager>().GameLoaded(); - SaveData save = SaveSystem.LoadPlayer(); - health.MaxHealth = save.maxHealth; - health.Health = save.health; - transform.position = VectorHelper.ConvertToVector3(save.position); - rb.velocity = VectorHelper.ConvertToVector2(save.velocity); - SaveSystem.isGameLoaded = false; + LoadPlayer(); } + } + + private void LoadPlayer() + { + SaveDataPlayer save = SaveSystem.LoadPlayer(); + health.MaxHealth = save.maxHealth; + health.Health = save.health; + transform.position = VectorHelper.ConvertToVector3(save.position); + rb.velocity = VectorHelper.ConvertToVector2(save.velocity); } private void FixedUpdate() @@ -181,14 +245,22 @@ if (IsDrilling) { rb.velocity = Vector2.zero; - if (timeSinceDrill > drillingTime) + if (drillToPosition) { - IsDrilling = false; - timeSinceDrill = 0; - } - else - { - timeSinceDrill += Time.deltaTime; + 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; + } } } } @@ -201,37 +273,83 @@ IsFlying = (moveInput.y != 0); - SetFacingDirection(moveInput); + if (IsDrilling) { IsMoving = false; IsFlying = false; //moveInput = Vector2.zero; - + } + else + { + SetFacingDirection(moveInput); } } private void Drill(DrillDirection drillDirection) { - IsDrilling = true; ContactPoint2D[] contactPoints = new ContactPoint2D[1]; - Debug.Log("drillDirection: " + drillDirection.ToString()); //rb.GetContacts(contactPoints); switch (drillDirection) { case DrillDirection.Left: + SetFacingDirection(Vector2.left); touchingDirections.wallHitsLeft[0].collider.GetContacts(contactPoints); break; case DrillDirection.Right: + SetFacingDirection(Vector2.right); touchingDirections.wallHitsRight[0].collider.GetContacts(contactPoints); break; case DrillDirection.Down: touchingDirections.groundHits[0].collider.GetContacts(contactPoints); break; + default: + Debug.Assert(false, "Add DrillDirection here!"); + break; } - CharacterEvents.characterDrill.Invoke(contactPoints[0], drillDirection); + //Debug.Log(contactPoints[0].otherRigidbody?.gameObject.name); + if (contactPoints.Any(x => x.otherRigidbody?.name == "Tilemap")) + { + CharacterEvents.characterDrill.Invoke(contactPoints.Single(x => x.otherRigidbody?.name == "Tilemap"), drillDirection); + } } + private void DrillingToPosition(Vector3 tilePosition, DrillDirection drillDirection) + { + boxCollider.enabled = false; + switch (drillDirection) + { + case DrillDirection.Left: + case DrillDirection.Right: + IsDrillingLeftRight = true; + break; + case DrillDirection.Down: + IsDrillingDown = true; + break; + default: + Debug.Assert(false, "Add DrillDirection here!"); + break; + } + //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 DrillingToPositionAbort() + //{ + // IsDrilling = false; + // //Debug.Log("DrillingToPosition() called"); + // //Debug.Log(gameObject.transform.position); + // drillToPosition = false; + // //drillTilePosition = null; + // //Debug.Log("drillTilePosition: " + drillTilePosition); + // drillOriginalPosition = gameObject.transform.position; + // //Debug.Log("drillOriginalPosition: " + drillOriginalPosition); + //} + //private void DrillLeftOrRight() //{ // ContactPoint2D[] contactPoints = new ContactPoint2D[1]; -- Gitblit v1.9.3