190 lines
6.0 KiB
C#
190 lines
6.0 KiB
C#
using UnityEngine;
|
|
using System.Collections;
|
|
|
|
public class HeroKnight : MonoBehaviour {
|
|
|
|
[SerializeField] float m_speed = 4.0f;
|
|
[SerializeField] float m_jumpForce = 7.5f;
|
|
[SerializeField] float m_rollForce = 6.0f;
|
|
[SerializeField] bool m_noBlood = false;
|
|
[SerializeField] GameObject m_slideDust;
|
|
|
|
private Animator m_animator;
|
|
private Rigidbody2D m_body2d;
|
|
private Sensor_HeroKnight m_groundSensor;
|
|
private Sensor_HeroKnight m_wallSensorR1;
|
|
private Sensor_HeroKnight m_wallSensorR2;
|
|
private Sensor_HeroKnight m_wallSensorL1;
|
|
private Sensor_HeroKnight m_wallSensorL2;
|
|
private bool m_grounded = false;
|
|
private bool m_rolling = false;
|
|
private int m_facingDirection = 1;
|
|
private int m_currentAttack = 0;
|
|
private float m_timeSinceAttack = 0.0f;
|
|
private float m_delayToIdle = 0.0f;
|
|
|
|
|
|
// Use this for initialization
|
|
void Start ()
|
|
{
|
|
m_animator = GetComponent<Animator>();
|
|
m_body2d = GetComponent<Rigidbody2D>();
|
|
m_groundSensor = transform.Find("GroundSensor").GetComponent<Sensor_HeroKnight>();
|
|
m_wallSensorR1 = transform.Find("WallSensor_R1").GetComponent<Sensor_HeroKnight>();
|
|
m_wallSensorR2 = transform.Find("WallSensor_R2").GetComponent<Sensor_HeroKnight>();
|
|
m_wallSensorL1 = transform.Find("WallSensor_L1").GetComponent<Sensor_HeroKnight>();
|
|
m_wallSensorL2 = transform.Find("WallSensor_L2").GetComponent<Sensor_HeroKnight>();
|
|
}
|
|
|
|
// Update is called once per frame
|
|
void Update ()
|
|
{
|
|
// Increase timer that controls attack combo
|
|
m_timeSinceAttack += Time.deltaTime;
|
|
|
|
//Check if character just landed on the ground
|
|
if (!m_grounded && m_groundSensor.State())
|
|
{
|
|
m_grounded = true;
|
|
m_animator.SetBool("Grounded", m_grounded);
|
|
}
|
|
|
|
//Check if character just started falling
|
|
if (m_grounded && !m_groundSensor.State())
|
|
{
|
|
m_grounded = false;
|
|
m_animator.SetBool("Grounded", m_grounded);
|
|
}
|
|
|
|
// -- Handle input and movement --
|
|
float inputX = Input.GetAxis("Horizontal");
|
|
|
|
// Swap direction of sprite depending on walk direction
|
|
if (inputX > 0)
|
|
{
|
|
GetComponent<SpriteRenderer>().flipX = false;
|
|
m_facingDirection = 1;
|
|
}
|
|
|
|
else if (inputX < 0)
|
|
{
|
|
GetComponent<SpriteRenderer>().flipX = true;
|
|
m_facingDirection = -1;
|
|
}
|
|
|
|
// Move
|
|
if (!m_rolling )
|
|
m_body2d.velocity = new Vector2(inputX * m_speed, m_body2d.velocity.y);
|
|
|
|
//Set AirSpeed in animator
|
|
m_animator.SetFloat("AirSpeedY", m_body2d.velocity.y);
|
|
|
|
// -- Handle Animations --
|
|
//Wall Slide
|
|
m_animator.SetBool("WallSlide", (m_wallSensorR1.State() && m_wallSensorR2.State()) || (m_wallSensorL1.State() && m_wallSensorL2.State()));
|
|
|
|
//Death
|
|
if (Input.GetKeyDown("e"))
|
|
{
|
|
m_animator.SetBool("noBlood", m_noBlood);
|
|
m_animator.SetTrigger("Death");
|
|
}
|
|
|
|
//Hurt
|
|
else if (Input.GetKeyDown("q"))
|
|
m_animator.SetTrigger("Hurt");
|
|
|
|
//Attack
|
|
else if(Input.GetMouseButtonDown(0) && m_timeSinceAttack > 0.25f)
|
|
{
|
|
m_currentAttack++;
|
|
|
|
// Loop back to one after third attack
|
|
if (m_currentAttack > 3)
|
|
m_currentAttack = 1;
|
|
|
|
// Reset Attack combo if time since last attack is too large
|
|
if (m_timeSinceAttack > 1.0f)
|
|
m_currentAttack = 1;
|
|
|
|
// Call one of three attack animations "Attack1", "Attack2", "Attack3"
|
|
m_animator.SetTrigger("Attack" + m_currentAttack);
|
|
|
|
// Reset timer
|
|
m_timeSinceAttack = 0.0f;
|
|
}
|
|
|
|
// Block
|
|
else if (Input.GetMouseButtonDown(1))
|
|
{
|
|
m_animator.SetTrigger("Block");
|
|
m_animator.SetBool("IdleBlock", true);
|
|
}
|
|
|
|
else if (Input.GetMouseButtonUp(1))
|
|
m_animator.SetBool("IdleBlock", false);
|
|
|
|
// Roll
|
|
else if (Input.GetKeyDown("left shift") && !m_rolling)
|
|
{
|
|
m_rolling = true;
|
|
m_animator.SetTrigger("Roll");
|
|
m_body2d.velocity = new Vector2(m_facingDirection * m_rollForce, m_body2d.velocity.y);
|
|
}
|
|
|
|
|
|
//Jump
|
|
else if (Input.GetKeyDown("space") && m_grounded)
|
|
{
|
|
m_animator.SetTrigger("Jump");
|
|
m_grounded = false;
|
|
m_animator.SetBool("Grounded", m_grounded);
|
|
m_body2d.velocity = new Vector2(m_body2d.velocity.x, m_jumpForce);
|
|
m_groundSensor.Disable(0.2f);
|
|
}
|
|
|
|
//Run
|
|
else if (Mathf.Abs(inputX) > Mathf.Epsilon)
|
|
{
|
|
// Reset timer
|
|
m_delayToIdle = 0.05f;
|
|
m_animator.SetInteger("AnimState", 1);
|
|
}
|
|
|
|
//Idle
|
|
else
|
|
{
|
|
// Prevents flickering transitions to idle
|
|
m_delayToIdle -= Time.deltaTime;
|
|
if(m_delayToIdle < 0)
|
|
m_animator.SetInteger("AnimState", 0);
|
|
}
|
|
}
|
|
|
|
// Animation Events
|
|
// Called in end of roll animation.
|
|
void AE_ResetRoll()
|
|
{
|
|
m_rolling = false;
|
|
}
|
|
|
|
// Called in slide animation.
|
|
void AE_SlideDust()
|
|
{
|
|
Vector3 spawnPosition;
|
|
|
|
if (m_facingDirection == 1)
|
|
spawnPosition = m_wallSensorR2.transform.position;
|
|
else
|
|
spawnPosition = m_wallSensorL2.transform.position;
|
|
|
|
if (m_slideDust != null)
|
|
{
|
|
// Set correct arrow spawn position
|
|
GameObject dust = Instantiate(m_slideDust, spawnPosition, gameObject.transform.localRotation) as GameObject;
|
|
// Turn arrow in correct direction
|
|
dust.transform.localScale = new Vector3(m_facingDirection, 1, 1);
|
|
}
|
|
}
|
|
}
|