You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
204 lines
4.9 KiB
204 lines
4.9 KiB
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
public class DragonMovement : MonoBehaviour
|
|
{
|
|
[SerializeField] KeyCode FlapKey;
|
|
Rigidbody2D _rigidbody;
|
|
float _flapTime = 0f;
|
|
[SerializeField] float FlapForce = 300f;
|
|
[SerializeField] float FlapLength = .25f;
|
|
Animator _animator;
|
|
bool _inCloud;
|
|
[SerializeField] GameObject _fireballPrefab;
|
|
[SerializeField] GameObject _fireballSpawnPoint;
|
|
[SerializeField] GameObject _coneSpawnPoint;
|
|
[SerializeField] GameObject _flash;
|
|
float _stunTime = 0f;
|
|
float _debugCurSpeed;
|
|
|
|
public enum AttackType
|
|
{
|
|
FIREBALL,
|
|
CONE
|
|
}
|
|
|
|
[SerializeField] AttackType _attackType = AttackType.FIREBALL;
|
|
|
|
const string CONE_NAME = "cone";
|
|
private void OnTriggerEnter2D(Collider2D collision)
|
|
{
|
|
|
|
GameObject cone = transform.Find(CONE_NAME)?.gameObject;
|
|
if (cone)
|
|
{
|
|
GameObject.Destroy(cone);
|
|
}
|
|
|
|
CheckCloudCollision(collision);
|
|
|
|
if (collision.CompareTag("Lightning"))
|
|
{
|
|
Stun(.2f);
|
|
}
|
|
|
|
if (collision.CompareTag("Fireball"))
|
|
{
|
|
Fireball fireball = collision.GetComponent<Fireball>();
|
|
|
|
if (fireball.AttackType == AttackType.CONE)
|
|
{
|
|
Stun(.4f);
|
|
}
|
|
else
|
|
{
|
|
Stun(.2f);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void OnTriggerStay2D(Collider2D collision)
|
|
{
|
|
CheckCloudCollision(collision);
|
|
}
|
|
|
|
private void CheckCloudCollision(Collider2D collision)
|
|
{
|
|
if (collision.CompareTag("Cloud"))
|
|
{
|
|
Cloud cloud = collision.GetComponent<Cloud>();
|
|
cloud.TriggerLighting(transform.position.x);
|
|
}
|
|
}
|
|
|
|
void Stun(float length)
|
|
{
|
|
_stunTime = length;
|
|
_animator.Play("fall");
|
|
}
|
|
|
|
private void OnTriggerExit2D(Collider2D collision)
|
|
{
|
|
_inCloud = false;
|
|
}
|
|
void Start()
|
|
{
|
|
_rigidbody = this.GetComponent<Rigidbody2D>();
|
|
_animator = this.GetComponent<Animator>();
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
if (Input.GetKeyDown(FlapKey) && _stunTime <0f)
|
|
{
|
|
Flap();
|
|
Shoot();
|
|
}
|
|
}
|
|
|
|
void Flap()
|
|
{
|
|
_flapTime = FlapLength;
|
|
_animator.Play("fly");
|
|
}
|
|
|
|
void Shoot()
|
|
{
|
|
if (_attackType == AttackType.FIREBALL)
|
|
{
|
|
GameObject.Instantiate(_fireballPrefab, _fireballSpawnPoint.transform.position, Quaternion.identity);
|
|
}
|
|
else if (_attackType == AttackType.CONE)
|
|
{
|
|
GameObject fireball = GameObject.Instantiate(_fireballPrefab, _coneSpawnPoint.transform.position, Quaternion.identity);
|
|
fireball.name = CONE_NAME;
|
|
fireball.GetComponent<Fireball>().AttackType = AttackType.CONE;
|
|
fireball.transform.parent = this.transform;
|
|
}
|
|
}
|
|
|
|
void FixedUpdate()
|
|
{
|
|
if (_flapTime > 0f && _stunTime < 0f)
|
|
{
|
|
_rigidbody.AddForce(new Vector2(0f, FlapForce));
|
|
}
|
|
if (_stunTime > 0f)
|
|
{
|
|
_rigidbody.AddForce(new Vector2(FlapForce * -.05f, FlapForce * -.05f));
|
|
transform.Rotate(Vector3.forward, Time.deltaTime * 1000f);
|
|
if (_flapTime < 0f)
|
|
{
|
|
_flapTime = 0f;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
transform.rotation = Quaternion.identity;
|
|
}
|
|
_flapTime -= Time.deltaTime;
|
|
_stunTime -= Time.deltaTime;
|
|
|
|
const float SPEED = .6f;
|
|
float horizontalSpeed = SPEED;
|
|
float verticalSpeed = 0f;
|
|
|
|
const float GLIDE_TIME = 0.6f;
|
|
if (_flapTime < - GLIDE_TIME)
|
|
{
|
|
_animator.Play("speedup");
|
|
horizontalSpeed += (_flapTime + GLIDE_TIME) * -2f;
|
|
}
|
|
|
|
|
|
/* //old cloud behavior
|
|
if (_inCloud)
|
|
{
|
|
if (_flapTime < 0)
|
|
_flapTime = 0;
|
|
|
|
if (_animator.GetCurrentAnimatorStateInfo(0).IsName("speedup"))
|
|
{
|
|
_animator.Play("glide");
|
|
}
|
|
|
|
horizontalSpeed = -3f;
|
|
|
|
if (_rigidbody.velocity.y > 0)
|
|
verticalSpeed = -2f;
|
|
else if (_rigidbody.velocity.y < 0)
|
|
verticalSpeed = 2f;
|
|
}
|
|
*/
|
|
|
|
|
|
if (_stunTime > 0f)
|
|
{
|
|
horizontalSpeed = -5f;
|
|
}
|
|
|
|
const float MAX_SPEED = SPEED * 2.2f;
|
|
if (horizontalSpeed > MAX_SPEED)
|
|
{
|
|
horizontalSpeed = MAX_SPEED;
|
|
}
|
|
|
|
_debugCurSpeed = horizontalSpeed;
|
|
float x = transform.position.x + horizontalSpeed;
|
|
x = Mathf.Max(x, 32);
|
|
transform.position = new Vector3(x, transform.position.y+ verticalSpeed, transform.position.z);
|
|
|
|
}
|
|
|
|
public void Flash()
|
|
{
|
|
_flash.SetActive(true);
|
|
Invoke("Unflash", .2f);
|
|
}
|
|
|
|
public void Unflash()
|
|
{
|
|
_flash.SetActive(false);
|
|
}
|
|
}
|
|
|