//Mechanics// /// <summary> /// Starts blocking, and prevents other movements /// </summary> protected void startBlocking() { state = Utilities.state.Blocking; rbd.velocity = new Vector2(0, 0); anim.Play("Block"); anim.SetBool("holdAnimation", true); }
/// <summary> /// Full process of getting hit. /// </summary> /// <param name="hitDamage"></param> /// <param name="knockBack"></param> /// <param name="hit"></param> /// <returns></returns> public IEnumerator receiveHit(float hitDamage, float knockBack, Hitter hit) { hitEffect(); rbd.gravityScale = gravityAmount; if (attackEffect) { Destroy(attackEffect); } state = Utilities.state.Hit; if (!(hit is Item)) { if (hitlag != null) { StopCoroutine(hitlag); } yield return(hitlag = StartCoroutine(hitLag(hitDamage, true))); } if (hitstun != null) { StopCoroutine(hitstun); } hit.knockBackEntity(this, knockBack); hitstun = StartCoroutine(hitStun(knockBack)); yield return(0); }
/// <summary> /// Makes the entity stop Attacking and changes state. /// </summary> public virtual void stopAttacking() { rbd.gravityScale = gravityAmount; anim.speed = 1; chargeAmount = 0; if (attackEffect) { Destroy(attackEffect); } if (attacks.currentAttack != Utilities.attackType.None) { attacks.attacks[(int)attacks.currentAttack].resetHittedEntities(); } if (state == Utilities.state.Ultimate) { speciality.endUltimate(); } attacks.currentAttack = Utilities.attackType.None; if (isGrounded) { state = Utilities.state.Idle; } else { state = Utilities.state.Air; } }
virtual protected void OnCollisionExit2D(Collision2D collider) { //Platform if (collider.gameObject.layer == 15 && state != Utilities.state.Attacking && state != Utilities.state.Throwing && state != Utilities.state.Ultimate) { isOnPlatform = false; if (state != Utilities.state.Hit) { state = Utilities.state.Air; } } }
/// <summary> /// Throws the grabbed item. /// </summary> /// <param name="dir">direction of throw</param> protected virtual void throwItem() { if (grabbedItem != null) { grabbedItem.transform.parent = null; grabbedItem.getRigidBody().isKinematic = false; grabbedItem.setIsPicked(false); grabbedItem.setIsUsed(true); grabbedItem.GetComponent <ThrowableItem>().onThrow(); float throwForce; if (chargeAmount > 0) { throwForce = grabbedItem.getVelocity() + (chargeAmount * maxThrowForce / 2); chargeAmount = 0; } else { throwForce = grabbedItem.getVelocity(); } switch (throwDirection) { case Utilities.direction.Up: grabbedItem.getRigidBody().AddForce(new Vector2(0, throwForce), ForceMode2D.Impulse); break; case Utilities.direction.Down: grabbedItem.getRigidBody().AddForce(new Vector2(0, -throwForce), ForceMode2D.Impulse); break; case Utilities.direction.Left: grabbedItem.getRigidBody().AddForce(new Vector2(-throwForce, 0), ForceMode2D.Impulse); break; case Utilities.direction.Right: grabbedItem.getRigidBody().AddForce(new Vector2(throwForce, 0), ForceMode2D.Impulse); break; case Utilities.direction.UpLeft: grabbedItem.getRigidBody().AddForce(new Vector2(-throwForce, throwForce), ForceMode2D.Impulse); break; case Utilities.direction.UpRight: grabbedItem.getRigidBody().AddForce(new Vector2(throwForce, throwForce), ForceMode2D.Impulse); break; case Utilities.direction.DownLeft: grabbedItem.getRigidBody().AddForce(new Vector2(-throwForce, -throwForce), ForceMode2D.Impulse); break; case Utilities.direction.DownRight: grabbedItem.getRigidBody().AddForce(new Vector2(throwForce, -throwForce), ForceMode2D.Impulse); break; } grabbedItem.GetComponent <ThrowableItem>().setDirection(throwDirection); grabbedItem = null; hasItem = false; } if (isGrounded) { state = Utilities.state.Idle; } else { state = Utilities.state.Air; } }
/// <summary> /// Checks the item type, and does action according to it. /// </summary> /// <param name="dir"></param> protected virtual void useItem() { if (isGrounded) { rbd.velocity = new Vector2(0, 0); } if (grabbedItem is ThrowableItem) { state = Utilities.state.Throwing; anim.Play("Throw"); anim.SetBool("holdAnimation", true); } if (grabbedItem is OnUseItem) { grabbedItem.setIsUsed(true); grabbedItem.setIsPicked(false); grabbedItem.itemAction(this); } }
//Coroutines /// <summary> /// Stuns Entity for duration of knockback. /// </summary> /// <param name="knockBack"></param> /// <returns></returns> virtual public IEnumerator hitStun(float knockBack) { if (attackEffect) { Destroy(attackEffect); } int frames = Mathf.FloorToInt(knockBack * 1.2f); int passedFrames = 0; int passedeffectFrames = 0; while (frames != passedFrames) { if (passedeffectFrames > 5) { if (!isGrounded && rbd.velocity.magnitude > 25) { Instantiate(effects[3], groundChecker.position, Quaternion.identity); passedeffectFrames = 0; } } yield return(0); passedFrames++; passedeffectFrames++; } if (isGrounded) { anim.Play("Ground_Movement"); state = Utilities.state.Idle; } else { anim.Play("Falling"); state = Utilities.state.Air; } }
//Start// /// <summary> /// gives value to the different components. /// </summary> protected virtual void initializeComponents() { audioSource = GetComponent <AudioSource>(); rbd = GetComponent <Rigidbody2D>(); anim = GetComponent <Animator>(); boxCollider = GetComponent <BoxCollider2D>(); hurtBox = transform.GetChild(2).GetComponent <BoxCollider2D>(); hitbox = transform.GetChild(3).GetComponent <BoxCollider2D>(); statusSpot = transform.GetChild(5).transform; sprite = GetComponent <SpriteRenderer>(); gravityAmount = rbd.gravityScale; totalJumps = maxJumps; hasItem = false; charging = false; maxThrowForce = 10f; isOnPlatform = false; isIgnoringPlatforms = false; state = Utilities.state.Idle; hittedBy = -1; cam = Camera.main; groundChecker = transform.GetChild(0).transform; pickUpSpot = transform.GetChild(1).transform; }
/// <summary> /// Stops blocking, allowing other movements /// </summary> protected void stopBlocking() { state = Utilities.state.Idle; anim.SetBool("holdAnimation", false); }
///////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////Collisions/////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////// //Collision// /// <summary> /// Check different possible collision with the Character body. /// </summary> /// <param name="collider">the external collider</param> virtual protected void OnCollisionEnter2D(Collision2D collider) { // Touch floor. if (collider.gameObject.layer == 8) { if (collider.transform.position.y < transform.position.y && state != Utilities.state.Ultimate) { if (rbd.velocity.y <= 0) { totalJumps = maxJumps; } if (state == Utilities.state.Hit) { rbd.velocity = new Vector2(rbd.velocity.x, -lastVelocityY * 0.85f); } if (state == Utilities.state.Throwing) { rbd.velocity = new Vector2(0, 0); } if (state == Utilities.state.Air) { if (rbd.velocity.x != 0) { state = Utilities.state.Moving; } else { state = Utilities.state.Idle; } } } } //Platform if (collider.gameObject.layer == 15) { if (rbd.velocity.y <= 0 && state != Utilities.state.Ultimate) { isOnPlatform = true; totalJumps = maxJumps; if (state == Utilities.state.Hit) { rbd.velocity = new Vector2(rbd.velocity.x, -lastVelocityY * 0.85f); } if (state == Utilities.state.Throwing) { rbd.velocity = new Vector2(0, 0); } if (state == Utilities.state.Air) { if (rbd.velocity.x != 0) { state = Utilities.state.Moving; } else { state = Utilities.state.Idle; } } } } }