Advertisement
Guest User

actor.cs

a guest
Mar 5th, 2024
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.01 KB | None | 0 0
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4.  
  5. public class Actor : MonoBehaviour
  6. {
  7.  
  8. public Animator baseAnim;
  9. public Rigidbody body;
  10. public SpriteRenderer shadowSprite;
  11.  
  12. public float speed = 2;
  13.  
  14. protected Vector3 frontVector;
  15. public bool isGrounded;
  16.  
  17. public SpriteRenderer baseSprite;
  18.  
  19. public bool isAlive = true;
  20.  
  21. public float maxLife = 100.0f;
  22. public float currentLife = 100.0f;
  23.  
  24. public AttackData normalAttack;
  25.  
  26. protected Coroutine knockdownRoutine;
  27. public bool isKnockedOut;
  28.  
  29. protected virtual void Start()
  30. {
  31. currentLife = maxLife;
  32. isAlive = true;
  33. baseAnim.SetBool("IsAlive", isAlive);
  34. }
  35.  
  36. public virtual void Update()
  37. {
  38. Vector3 shadowSpritePosition = shadowSprite.transform.position;
  39. shadowSpritePosition.y = 0;
  40. shadowSprite.transform.position = shadowSpritePosition;
  41. }
  42.  
  43. protected virtual void OnCollisionEnter(Collision collision)
  44. {
  45. if (collision.collider.name == "Floor")
  46. {
  47. isGrounded = true;
  48. baseAnim.SetBool("IsGrounded", isGrounded);
  49. DidLand();
  50. }
  51. }
  52.  
  53. protected virtual void OnCollisionExit(Collision collision)
  54. {
  55. if (collision.collider.name == "Floor")
  56. {
  57. isGrounded = false;
  58. baseAnim.SetBool("IsGrounded", isGrounded);
  59. }
  60. }
  61.  
  62. protected virtual void DidLand()
  63. {
  64. }
  65.  
  66.  
  67. public void FlipSprite(bool isFacingLeft)
  68. {
  69. if (isFacingLeft)
  70. {
  71. frontVector = new Vector3(-1, 0, 0);
  72. transform.localScale = new Vector3(-1, 1, 1);
  73. }
  74. else
  75. {
  76. frontVector = new Vector3(1, 0, 0);
  77. transform.localScale = new Vector3(1, 1, 1);
  78. }
  79. }
  80.  
  81. public virtual void Attack()
  82. {
  83. baseAnim.SetTrigger("Attack");
  84. }
  85.  
  86. public virtual void DidHitObject(Collider collider, Vector3 hitPoint, Vector3 hitVector)
  87. {
  88. Actor actor = collider.GetComponent<Actor>();
  89. if (actor != null && actor.CanBeHit() && collider.tag != gameObject.tag)
  90. {
  91. if (collider.attachedRigidbody != null)
  92. {
  93. HitActor(actor, hitPoint, hitVector);
  94. }
  95. }
  96. }
  97.  
  98. protected virtual void HitActor(Actor actor, Vector3 hitPoint, Vector3 hitVector)
  99. {
  100. actor.EvaluateAttackData(normalAttack, hitVector, hitPoint);
  101. }
  102.  
  103. protected virtual void Die()
  104. {
  105. if (knockdownRoutine != null)
  106. {
  107. StopCoroutine(knockdownRoutine);
  108. }
  109. isAlive = false;
  110. baseAnim.SetBool("IsAlive", isAlive);
  111. StartCoroutine(DeathFlicker());
  112. }
  113.  
  114. protected virtual void SetOpacity(float value)
  115. {
  116. Color color = baseSprite.color;
  117. color.a = value;
  118. baseSprite.color = color;
  119. }
  120.  
  121. private IEnumerator DeathFlicker()
  122. {
  123. int i = 5;
  124. while (i > 0)
  125. {
  126. SetOpacity(0.5f);
  127. yield return new WaitForSeconds(0.1f);
  128. SetOpacity(1.0f);
  129. yield return new WaitForSeconds(0.1f);
  130. i--;
  131. }
  132. }
  133.  
  134. public virtual void TakeDamage(float value, Vector3 hitVector, bool knockdown = false)
  135. {
  136. body.velocity = Vector3.zero;
  137. body.angularVelocity = Vector3.zero;
  138. FlipSprite(hitVector.x > 0);
  139. currentLife -= value;
  140. if (isAlive && currentLife <= 0)
  141. {
  142. Die();
  143. }
  144. else if (knockdown)
  145. {
  146. if (knockdownRoutine == null)
  147. {
  148. Vector3 pushbackVector = (hitVector).normalized;
  149. body.AddForce(pushbackVector * 250);
  150. knockdownRoutine = StartCoroutine(KnockdownRoutine());
  151. }
  152. }
  153. else
  154. {
  155. baseAnim.SetTrigger("IsHurt");
  156. }
  157. }
  158.  
  159. public bool CanBeHit()
  160. {
  161. return isAlive && !isKnockedOut;
  162. }
  163.  
  164. public virtual bool CanWalk()
  165. {
  166. return true;
  167. }
  168.  
  169. public virtual void FaceTarget(Vector3 targetPoint)
  170. {
  171. FlipSprite(transform.position.x - targetPoint.x > 0);
  172. }
  173.  
  174. public virtual void EvaluateAttackData(AttackData data, Vector3 hitVector, Vector3 hitPoint)
  175. {
  176. body.AddForce(data.force * hitVector);
  177. TakeDamage(data.attackDamage, hitVector, data.knockdown);
  178. }
  179.  
  180. public void DidGetUp()
  181. {
  182. isKnockedOut = false;
  183. }
  184.  
  185. protected virtual IEnumerator KnockdownRoutine()
  186. {
  187. isKnockedOut = true;
  188. baseAnim.SetTrigger("Knockdown");
  189. yield return new WaitForSeconds(1.0f);
  190. baseAnim.SetTrigger("GetUp");
  191. yield return new WaitForSeconds(0.2f);
  192. knockdownRoutine = null;
  193. }
  194. }
  195.  
  196. [System.Serializable]
  197. public class AttackData
  198. {
  199. public float attackDamage = 10;
  200. public float force = 50;
  201. public bool knockdown = false;
  202. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement