diff options
author | Toby Vincent <tobyv13@gmail.com> | 2022-04-12 22:41:11 -0500 |
---|---|---|
committer | Toby Vincent <tobyv13@gmail.com> | 2022-04-12 22:41:11 -0500 |
commit | a820d2892f7c44ef4e5ddd76a6973adb38e9bfa4 (patch) | |
tree | 5abe8294eb4cb32efb54b5c619eabd971241bb0a /Assets/Scripts/Actors/Actor.cs | |
parent | 51f2bf4415d0c1441d9c72fbb5f2b5895fd24456 (diff) |
feat: add actor/item prototypes
Diffstat (limited to 'Assets/Scripts/Actors/Actor.cs')
-rw-r--r-- | Assets/Scripts/Actors/Actor.cs | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/Assets/Scripts/Actors/Actor.cs b/Assets/Scripts/Actors/Actor.cs new file mode 100644 index 0000000..52a67d3 --- /dev/null +++ b/Assets/Scripts/Actors/Actor.cs @@ -0,0 +1,121 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using MontanaJohns.Core; +using MontanaJohns.Items; +using UnityEngine; + +namespace MontanaJohns.Actors +{ + [RequireComponent(typeof(Rigidbody2D))] + [RequireComponent(typeof(CapsuleCollider2D))] + public abstract class Actor : MonoBehaviour + { + [SerializeField] protected float gravityScale = 1.5f; + [SerializeField] protected Stats baseStats = Stats.DefaultBaseStats(); + [SerializeField] protected LayerMask groundLayer; + [SerializeField] protected Transform groundCheckPoint; + + protected CapsuleCollider2D _collider; + protected Rigidbody2D _rigidBody; + protected SpriteRenderer _renderer; + protected Animator _animator; + protected Transform _transform; + + protected Stats stats; + protected Active activeItem; + Collection<Item> items; + bool isFalling; + + protected int jumpCount; + protected Vector2 acceleration; + + protected virtual void Awake() + { + _collider = GetComponent<CapsuleCollider2D>(); + _rigidBody = GetComponent<Rigidbody2D>(); + _transform = GetComponent<Transform>(); + _renderer = GetComponent<SpriteRenderer>(); + _animator = GetComponent<Animator>(); + } + + protected virtual void Start() + { + _rigidBody.freezeRotation = true; + _rigidBody.collisionDetectionMode = CollisionDetectionMode2D.Continuous; + _rigidBody.gravityScale = gravityScale; + + items = new(); + stats = baseStats; + jumpCount = stats.maxJumps; + } + + protected virtual void FixedUpdate() + { + if (!_animator.GetBool("airborn") && !Physics2D.OverlapCircle(groundCheckPoint.position, 0.2f, groundLayer)) + { + _animator.SetTrigger("fall"); + StartCoroutine(Falling()); + } + } + + public virtual void Move(float input) + { + var target = new Vector2(input * stats.speedMultiplier * 10, _rigidBody.velocity.y); + _rigidBody.velocity = Vector2.SmoothDamp(_rigidBody.velocity, target, ref acceleration, .05f); + _animator.SetBool("moving", Mathf.Abs(_rigidBody.velocity.x) > 0.001); + + if (_rigidBody.velocity.x < -0.001) + _renderer.flipX = true; + else if (_rigidBody.velocity.x > 0.001) + _renderer.flipX = false; + } + + public virtual void Jump() + { + if (jumpCount++ <= stats.maxJumps) + { + Debug.Log($"Jumping! Force: {stats.jumpForce}"); + _rigidBody.AddForce(Vector2.up * stats.jumpForce); + _animator.SetTrigger("jump"); + _animator.SetBool("airborn", true); + StartCoroutine(Falling()); + } + } + + public virtual void Use() + { + Debug.Log("Using!"); + if (activeItem != null) + activeItem.Use(); + } + + public virtual void AddItem(Item item) + { + Debug.Log($"Adding item: {item}!"); + items.Add(item); + stats = baseStats + items.Select(i => i.stats).Sum(); + } + + IEnumerator Falling() + { + Debug.Log("Falling!"); + + _animator.SetBool("airborn", true); + + while (_rigidBody.velocity.y > 0 || !Physics2D.OverlapCircle(groundCheckPoint.position, 0.2f, groundLayer)) + { + yield return new WaitForFixedUpdate(); + } + + jumpCount = 0; + _animator.SetBool("airborn", false); + + Debug.Log("Fell!"); + + yield break; + } + } +}
\ No newline at end of file |