public void ShowUpdate(StatusUpdateType type, string stat, Color color) { toMove.gameObject.SetActive(true); time = 0; DragonStatus ds = toMove.gameObject.GetComponent <DragonStatus>(); if (ds != null) { ds.UpdateStatus(stat); ds.UpdateStatus(color); } if (type == StatusUpdateType.HEALTH) { toMove.Find("HeartUpdate")?.gameObject.SetActive(true); toMove.Find("StarUpdate")?.gameObject.SetActive(false); toMove.Find("SwordUpdate")?.gameObject.SetActive(false); } else if (type == StatusUpdateType.STAR) { toMove.Find("HeartUpdate")?.gameObject.SetActive(false); toMove.Find("StarUpdate")?.gameObject.SetActive(true); toMove.Find("SwordUpdate")?.gameObject.SetActive(false); } else if (type == StatusUpdateType.ATTACK) { toMove.Find("HeartUpdate")?.gameObject.SetActive(false); toMove.Find("StarUpdate")?.gameObject.SetActive(false); toMove.Find("SwordUpdate")?.gameObject.SetActive(true); } }
public void headHurt() { if (dragonStatus == DragonStatus.DOWN || dragonStatus == DragonStatus.FLY_UP || dragonStatus == DragonStatus.SLEEP) { return; } hp--; startStatusTime = System.DateTime.Now; dragonAnimator.SetBool("Die", true); dragonAnimator.SetBool("Run", false); dragonAnimator.SetBool("Fly", false); dragonAnimator.SetBool("Attack1", false); dragonAnimator.SetBool("Attack2", false); dragonController.m_headLook.weight = 0f; dragonStatus = DragonStatus.DOWN; if (hp == 2) { firstBroken(); } else if (hp == 1) { secondBroken(); } else if (hp <= 0) { dragonSound.playDie(); player.win(); dragonStatus = DragonStatus.DIE; } }
void handleAttack() { switch (dragonStatus) { case DragonStatus.ATTACK_FIRE: { moveCircle(); player.attackByFire(); if ((System.DateTime.Now - startStatusTime).TotalSeconds < 5) { break; } dragonController.m_headLook.weight = 0.6f; dragonController.m_fireIntensity = 0; dragonSound.stopFire(); dragonStatus = DragonStatus.FLY_CIRCLE; } break; case DragonStatus.ATTACK_NEAR: { Vector3 targetDirection = (playerTransform.position - transform.position).normalized; Quaternion direction = Quaternion.identity; targetRotation = -Mathf.Atan2(targetDirection.z, targetDirection.x) * Mathf.Rad2Deg + 90; moveRotationToTarget(); switch (attackStatus) { case AttackStatus.FLY_DOWN: { movePositionToTarget(); if (transform.position.y < 0.2f) { nearAttackCount = 0; dragonAnimator.SetBool("Fly", false); dragonController.m_headLook.weight = 0.6f; attackStatus = AttackStatus.READY; } } break; case AttackStatus.READY: { if (nearAttackCount >= 3) { if (nearAttackCount >= 5 || Random.Range(0, 2) == 0) { dragonAnimator.SetBool("Fly", true); updateStartCirclePoint(); moveSpeedFactor = 0.5f; dragonAnimator.SetBool("Attack1", false); dragonAnimator.SetBool("Attack2", false); dragonController.m_headLook.weight = 0f; dragonStatus = DragonStatus.FLY_UP; return; } } int attackWay = Random.Range(0, 2); switch (attackWay) { case 0: dragonAnimator.SetBool("Attack1", true); break; case 1: dragonAnimator.SetBool("Attack2", true); break; } nearAttackCount++; animationStart = false; attackStatus = AttackStatus.ATTACKING; } break; case AttackStatus.ATTACKING: { if (dragonAnimator.GetNextAnimatorStateInfo(0).IsName("Attack_1")) { animationStart = true; dragonAnimator.SetBool("Attack1", false); } else if (dragonAnimator.GetNextAnimatorStateInfo(0).IsName("Attack_2")) { animationStart = true; dragonAnimator.SetBool("Attack2", false); } else if (animationStart && dragonAnimator.GetNextAnimatorStateInfo(0).IsName("Idle_1")) { animationStart = false; attackStatus = AttackStatus.READY; } } break; } } break; case DragonStatus.ATTACK_TRAIN: { switch (attackStatus) { case AttackStatus.FLY_DOWN: { bool stillMoving = false; if (transform.position.y > 0) { movePositionToTarget(); stillMoving = true; } if (!checkRotateFinish()) { moveRotationToTarget(); stillMoving = true; } if (!stillMoving) { animationStart = false; dragonAnimator.SetBool("Fly", false); dragonAnimator.SetBool("Taunt", true); dragonController.m_headLook.weight = 1f; attackStatus = AttackStatus.TAUNT; } } break; case AttackStatus.TAUNT: { if (dragonAnimator.GetNextAnimatorStateInfo(0).IsName("Taunt1")) { animationStart = true; dragonAnimator.SetBool("Taunt", false); } else if (animationStart && dragonAnimator.GetNextAnimatorStateInfo(0).IsName("Idle_1")) { animationStart = false; dragonAnimator.SetBool("Run", true); attackStatus = AttackStatus.ATTACKING; } } break; case AttackStatus.ATTACKING: { if (Vector3.Distance(transform.position, playerTransform.position) < 35 || Vector3.Distance(transform.position, playerTransform.position) > 100) { dragonController.m_headLook.weight = 0f; attackStatus = AttackStatus.ATTACK_FINISH; } } break; case AttackStatus.ATTACK_FINISH: { // fly up when the overshot distance is larger than the fly radius float distance = Vector3.Distance(transform.position, playerTransform.position); if (distance > flyRadius) { dragonAnimator.SetBool("Run", false); dragonAnimator.SetBool("Fly", true); updateStartCirclePoint(); dragonController.m_headLook.weight = 0f; moveSpeedFactor = 0.5f; dragonStatus = DragonStatus.FLY_UP; } } break; } break; } case DragonStatus.ATTACK_FLY: { switch (attackStatus) { case AttackStatus.FLY_DOWN: { targetPosition = playerTransform.position; targetPosition.y = 3; moveRotationToTarget(); if (checkRotateFinish()) { moveSpeedFactor = 2.2f; dragonAnimator.SetBool("Fly_plane", true); attackStatus = AttackStatus.ATTACKING; } } break; case AttackStatus.ATTACKING: { movePositionToTarget(); if (transform.position.y < 6) { moveSpeedFactor = 1f; dragonAnimator.SetBool("Fly_plane", false); updateStartCirclePoint(); dragonController.m_headLook.weight = 0f; dragonStatus = DragonStatus.FLY_UP; player.attackByFly(); } } break; } } break; } }
void Update() { // Scale the size of dragon depends on distance between Dragon and player. float distance = Vector3.Distance(playerTransform.position, transform.position); float factor = 1f + 0.5f * distance / flyRadius; transform.localScale = factor * defaultScaled; if (dragonStatus == DragonStatus.SLEEP || dragonStatus == DragonStatus.DIE) { dustStorm.enableEmission = false; } else { // play dust storm effect when dragon is near to the ground. dustStorm.enableEmission = transform.position.y <= 50 ? true : false; } switch (dragonStatus) { case DragonStatus.SLEEP: { //TODO: tune sleep time if ((System.DateTime.Now - startStatusTime).TotalSeconds < 1) { Debug.Log("Exepction: time is less than start status"); break; } if ((System.DateTime.Now - startStatusTime).TotalSeconds > 5) { dragonAnimator.SetBool("Sleep", false); } if (dragonAnimator.GetCurrentAnimatorStateInfo(0).IsName("Idle_1")) { dragonAnimator.SetBool("Taunt", true); dragonController.m_headLook.weight = 1f; dragonStatus = DragonStatus.TAUNT; } } break; case DragonStatus.TAUNT: { if (dragonAnimator.GetCurrentAnimatorStateInfo(0).IsName("Taunt1")) { animationStart = true; dragonAnimator.SetBool("Taunt", false); } else if (animationStart && dragonAnimator.GetCurrentAnimatorStateInfo(0).IsName("Idle_1")) { animationStart = false; moveSpeedFactor = 0.5f; updateStartCirclePoint(); dragonAnimator.SetBool("Fly", true); dragonController.m_headLook.weight = 0.0f; dragonStatus = DragonStatus.FLY_UP; } } break; case DragonStatus.FLY_UP: { if (dragonAnimator.GetCurrentAnimatorStateInfo(0).IsName("Fly_1") || dragonAnimator.GetCurrentAnimatorStateInfo(0).IsName("Fly_3")) { movePositionToTarget(); } if (checkRotateFinish() && Mathf.Abs(transform.position.y - targetPosition.y) < 0.5f) { moveSpeedFactor = 0.25f; startStatusTime = System.DateTime.Now; dragonController.m_headLook.weight = 0.6f; dragonStatus = DragonStatus.FLY_CIRCLE; } else if (Mathf.Abs(transform.position.y - targetPosition.y) < 1f) { moveRotationToTarget(); } } break; case DragonStatus.FLY_CIRCLE: { moveCircle(); int circleSec = (int)(System.DateTime.Now - startStatusTime).TotalSeconds; if (circleSec <= 5) { return; } int startAttackRandom = Random.Range(0, circleSec - 5); if (startAttackRandom == 0) { return; } startAttack(); } break; case DragonStatus.ATTACK_FIRE: case DragonStatus.ATTACK_NEAR: case DragonStatus.ATTACK_FLY: case DragonStatus.ATTACK_TRAIN: { handleAttack(); } break; case DragonStatus.DOWN: { if (hp <= 0) { return; } if ((System.DateTime.Now - startStatusTime).TotalSeconds > 5) { dragonAnimator.SetBool("Die", false); moveSpeedFactor = 0.5f; updateStartCirclePoint(); dragonAnimator.SetBool("Fly", true); dragonController.m_headLook.weight = 0f; dragonStatus = DragonStatus.FLY_UP; } } break; case DragonStatus.DIE: { // TODO play wining BGM and do some wining animation. dragonController.m_closeEyes = eyesClosePercent; dragonController.m_blinkRate = 0f; if (eyesClosePercent < 1f) { eyesClosePercent += 0.008f; } } break; } }
void startAttack() { int nextAttackWay = Random.Range(0, 4); if (nextAttack >= 0 && nextAttack < 4) { nextAttackWay = nextAttack; } switch (nextAttackWay) { case 0: { //Fire startStatusTime = System.DateTime.Now; dragonController.m_headLook.weight = 1; dragonController.m_fireIntensity = 1; dragonSound.startFire(); dragonStatus = DragonStatus.ATTACK_FIRE; } break; case 1: { // near moveSpeedFactor = 1f; Vector3 diff = playerTransform.position - transform.position; diff.Normalize(); targetPosition = playerTransform.position - diff * 55; targetPosition.y = 0; Vector3 targetDirection = (playerTransform.position - transform.position).normalized; Quaternion direction = Quaternion.identity; targetRotation = -Mathf.Atan2(targetDirection.z, targetDirection.x) * Mathf.Rad2Deg + 90; dragonController.m_headLook.weight = 1f; dragonStatus = DragonStatus.ATTACK_NEAR; attackStatus = AttackStatus.FLY_DOWN; } break; case 2: { // Fly attack targetPosition = playerTransform.position; Vector3 targetDirection = (playerTransform.position - transform.position).normalized; Quaternion direction = Quaternion.identity; targetRotation = -Mathf.Atan2(targetDirection.z, targetDirection.x) * Mathf.Rad2Deg + 90; dragonStatus = DragonStatus.ATTACK_FLY; attackStatus = AttackStatus.FLY_DOWN; } break; case 3: { // train targetPosition = transform.position; targetPosition.y = 0; Vector3 targetDirection = (playerTransform.position - transform.position).normalized; Quaternion direction = Quaternion.identity; targetRotation = -Mathf.Atan2(targetDirection.z, targetDirection.x) * Mathf.Rad2Deg + 90; dragonController.m_headLook.weight = 0.2f; dragonStatus = DragonStatus.ATTACK_TRAIN; attackStatus = AttackStatus.FLY_DOWN; } break; } }