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; float _stunTime = 0f; public enum AttackType { FIREBALL, CONE } [SerializeField] AttackType _attackType = AttackType.FIREBALL; private void OnTriggerEnter2D(Collider2D collision) { Debug.Log("ontriggerenter"); _inCloud = true; if (collision.CompareTag("Fireball")) { Fireball fireball = collision.GetComponent(); if (fireball.AttackType == AttackType.CONE) { _stunTime = .6666f; } else { _stunTime = .3333f; } _animator.Play("fall"); } } private void OnTriggerExit2D(Collider2D collision) { _inCloud = false; } void Start() { _rigidbody = this.GetComponent(); _animator = this.GetComponent(); } 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.GetComponent().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; float horizontalSpeed = .4f; float verticalSpeed = 0f; const float GLIDE_TIME = 2f; if (_flapTime < - GLIDE_TIME) { _animator.Play("speedup"); horizontalSpeed += (_flapTime + GLIDE_TIME) * -1f; } if (_inCloud) { if (_flapTime < 0) _flapTime = 0; if (_animator.GetCurrentAnimatorStateInfo(0).IsName("speedup")) { _animator.Play("glide"); } horizontalSpeed = -2f; if (_rigidbody.velocity.y > 0) verticalSpeed = -2f; else if (_rigidbody.velocity.y < 0) verticalSpeed = 2f; } if (_stunTime > 0f) { horizontalSpeed = -2f; } float x = transform.position.x + horizontalSpeed; x = Mathf.Max(x, 32); transform.position = new Vector3(x, transform.position.y+ verticalSpeed, transform.position.z); } }