// Event trigger when hit something may be wall or obstacles or entity,.... protected virtual void OnHitEvent(Collider2D collision) { if (bulletStat.exceptionTag.Contains(collision.tag)) { return; } var entity = collision.GetComponent <Entity>(); entity?.OnTakeDamage(this); isCrit = false; if (bulletStat.pfExplosion) { if (!selfExplosion) { selfExplosion = Instantiate(bulletStat.pfExplosion.gameObject); } selfExplosion.transform.position = transform.position; selfExplosion.transform.rotation = transform.rotation; selfExplosion.SetActive(true); TimeManipulator.GetInstance().InvokeActionAfterSeconds(1f, () => selfExplosion.SetActive(false)); ObjectPool.ReturnObject(bulletStat.bulletCode, gameObject); gameObject.SetActive(false); } else { ObjectPool.ReturnObject(bulletStat.bulletCode, gameObject); gameObject.SetActive(false); } }
private void EndLevel() { Time.timeScale = 0.05f; Time.fixedDeltaTime = Time.timeScale / 0.02f; audioSource.clip = null; // Slow motion action slowMotionEndLevelAction = () => { Time.timeScale = Mathf.Clamp(Time.timeScale + (1f / 3f) * Time.unscaledDeltaTime, 0f, 1f); Time.fixedDeltaTime = Time.unscaledDeltaTime; }; // Victory pop up TimeManipulator.GetInstance().InvokeActionAfterSeconds(3f, () => { slowMotionEndLevelAction = null; var spawnPosition = Camera.main.ScreenToWorldPoint(new Vector3(Screen.width / 2, Screen.height / 2)); spawnPosition.z = 0f; // Victory pop up pfWinPopup = Instantiate(pfWinPopup, spawnPosition, Quaternion.identity); pfWinPopup.transform.DOScale(0f, 0f); pfWinPopup.transform.DOScale(1f, 0.5f); }); // Open result panel TimeManipulator.GetInstance().InvokeActionAfterSeconds(6f, () => { uiHandler.showResult(true); }); }
// Event trigger when hit something may be wall or obstacles or entity,.... protected override void OnHitEvent(Collider2D collision) { if (bulletStat.exceptionTag.Contains(collision.tag)) { return; } var collisionObjects = Physics2D.OverlapCircleAll(transform.position, radiusDamageArea); foreach (var item in collisionObjects) { if (bulletStat.exceptionTag.Contains(item.tag)) { continue; } item.GetComponent <Entity>()?.OnTakeDamage(this); } if (!selfExplosion) { selfExplosion = Instantiate(bulletStat.pfExplosion.gameObject); } selfExplosion.transform.position = transform.position; selfExplosion.transform.rotation = transform.rotation; selfExplosion.SetActive(true); TimeManipulator.GetInstance().InvokeActionAfterSeconds(0.5f, () => selfExplosion.SetActive(false)); ObjectPool.ReturnObject(bulletStat.bulletCode, gameObject); gameObject.SetActive(false); }
private void LoseGame() { // Open result panel TimeManipulator.GetInstance().InvokeActionAfterSeconds(2f, () => { uiHandler.showResult(false); }); }
public virtual Enemy Instantiate(Vector3 spawnPosition) { if (spawnSign == null) { return(Instantiate(gameObject, spawnPosition, Quaternion.identity)?.GetComponent <Enemy>()); } var spawnSignTmp = Instantiate(spawnSign, spawnPosition, spawnSign.transform.rotation); var enemySpawnTmp = Instantiate(gameObject, spawnPosition, Quaternion.identity)?.GetComponent <Enemy>(); enemySpawnTmp.GetComponent <Collider2D>().enabled = false; if (enemySpawnTmp.animator != null) { enemySpawnTmp.animator.enabled = false; } enemySpawnTmp.enabled = false; enemySpawnTmp.transform.DOMoveY(spawnPosition.y + 1f, spawnLifeTime); TimeManipulator.GetInstance().InvokeActionAfterSeconds(spawnLifeTime, () => { Destroy(spawnSignTmp); enemySpawnTmp.enabled = true; if (enemySpawnTmp.animator != null) { enemySpawnTmp.animator.enabled = true; } enemySpawnTmp.GetComponent <Collider2D>().enabled = true; }); return(enemySpawnTmp); }
/// <summary> /// Event trigger when treasure open and item drop out /// </summary> public virtual void DropOut() { isOnAction = true; Vector3 velocity = new Vector3(Random.Range(-2, 2), Random.Range(-2, 2)); if (dropDownItem == null) { dropDownItem = () => { // apply speed transform.position += velocity * Time.deltaTime; // find speed vector length: var len = Mathf.Sqrt(velocity.x * velocity.x + velocity.y * velocity.y); if (len > 0) { // find the multiplier (new speed divided by current): var mul = Mathf.Max(len - friction, 0) / len; // apply the multiplier: velocity *= mul; } }; } TimeManipulator.GetInstance().InvokeActionAfterSeconds(2f, () => { isOnAction = false; dropDownItem = null; }); }
public override void Consume() { TimeManipulator.GetInstance().InvokeRepeatAction(0.25f, 5, () => { ActionEventHandler.Invoke(PlayerCombatEvent.HealEvent, new object[] { healthAmount / 5 }, null); }, null); Destroy(gameObject); }
/// <summary> /// Attack diagonal shape, boss call randomly in phase 1. /// </summary> private void DiagonalAttack() { isOnAction = true; TimeManipulator.GetInstance().InvokeRepeatAction(0.3f, 6, () => { Shoot((Vector2.right + Vector2.up).normalized, pfSimpleBullet); Shoot((Vector2.right - Vector2.up).normalized, pfSimpleBullet); Shoot((-Vector2.right + Vector2.up).normalized, pfSimpleBullet); Shoot((-Vector2.right - Vector2.up).normalized, pfSimpleBullet); }, () => TimeManipulator.GetInstance().InvokeActionAfterSeconds(phaseFireRate[0], () => isOnAction = false)); }
public void Trigger(bool isCrit = false) { this.isCrit = isCrit; aiPath.canMove = true; isActive = true; TimeManipulator.GetInstance().InvokeActionAfterSeconds(lifetime, () => { isActive = false; aiPath.canMove = false; Setup(targetDirection, isCrit); }); }
public void Trigger(bool isCrit = false) { this.isCrit = isCrit; transform.position += offset; isActive = true; TimeManipulator.GetInstance().InvokeActionAfterSeconds(1.3f, () => { ObjectPool.ReturnObject(bulletStat.bulletCode, gameObject); isActive = false; gameObject.SetActive(false); }); }
private void SwapBulletEvent(object[] param) { if (param == null) { return; } currentBulletItem.DOFade(0f, 0.2f); TimeManipulator.GetInstance().InvokeActionAfterSeconds(0.2f, () => { currentBulletItem.sprite = bulletItemSprite[(int)param[0]]; currentBulletItem.DOFade(1f, 0.2f); }); }
private void PrepareDungeon() { var spawnPosition = Camera.main.ScreenToWorldPoint(new Vector3(Screen.width / 2, Screen.height / 2)); spawnPosition.z = 0f; pfGoPopup = Instantiate(pfGoPopup, spawnPosition, Quaternion.identity); pfGoPopupParticle = Instantiate(pfGoPopupParticle, spawnPosition, Quaternion.identity); AstarPath.active.Scan(AstarPath.active.data.gridGraph); TimeManipulator.GetInstance().InvokeActionAfterSeconds(2f, () => { ActionEventHandler.Invoke(GameDungeonEvent.StartDungeon); }); }
/// <summary> /// Attack circle shape, boss call randomly in phase 1. /// </summary> private void CircleWaveAttack() { isOnAction = true; TimeManipulator.GetInstance().InvokeRepeatAction(0.3f, 6, () => { var targetPosition = aiDestinationSetter.target.position; var shootDirection = (targetPosition - (transform.position + offset)).normalized; Shoot(shootDirection, pfSimpleBullet); for (int i = 1; i <= bulletPerClip / 2; i++) { shootDirection = CalculateDirectionFromAngle(transform.position, targetPosition, i * bulletAngle); Shoot(shootDirection, pfSimpleBullet); shootDirection = CalculateDirectionFromAngle(transform.position, targetPosition, -i * bulletAngle); Shoot(shootDirection, pfSimpleBullet); } }, () => TimeManipulator.GetInstance().InvokeActionAfterSeconds(phaseFireRate[0], () => isOnAction = false)); }
public void OnPauseClick() { if (!pausePanel.activeSelf) { pausePanel.SetActive(true); dim.DOFade(1f, 0.5f).SetEase(Ease.OutCubic); textPause.DOFade(1f, 0.2f).SetEase(Ease.OutCubic).SetDelay(0.2f); TimeManipulator.GetInstance().InvokeActionAfterSeconds(0.25f, () => { exitButton.transform.DOScale(Vector3.one, 0.25f).SetEase(Ease.OutBack); resumeButton.transform.DOScale(Vector3.one, 0.25f).SetEase(Ease.OutBack).SetDelay(0.15f); restartButton.transform.DOScale(Vector3.one, 0.25f).SetEase(Ease.OutBack).SetDelay(0.3f); exitText.DOFade(1f, 0.2f).SetEase(Ease.OutCubic).SetDelay(0.15f); resumeText.DOFade(1f, 0.2f).SetEase(Ease.OutCubic).SetDelay(0.3f); restartText.DOFade(1f, 0.2f).SetEase(Ease.OutCubic).SetDelay(0.45f); TimeManipulator.GetInstance().InvokeActionAfterSeconds(0.5f, () => { Time.timeScale = 0f; Time.fixedDeltaTime = 0f; }); }); } else { Time.timeScale = 1f; Time.fixedDeltaTime = Time.unscaledDeltaTime; dim.DOFade(0f, 0.5f).SetEase(Ease.OutCubic); textPause.DOFade(0f, 0.2f).SetEase(Ease.OutCubic).SetDelay(0.2f); TimeManipulator.GetInstance().InvokeActionAfterSeconds(0.25f, () => { restartButton.transform.DOScale(Vector3.zero, 0.25f).SetEase(Ease.OutBack); resumeButton.transform.DOScale(Vector3.zero, 0.25f).SetEase(Ease.OutBack).SetDelay(0.15f); exitButton.transform.DOScale(Vector3.zero, 0.25f).SetEase(Ease.OutBack).SetDelay(0.3f); restartText.DOFade(0f, 0.2f).SetEase(Ease.OutCubic).SetDelay(0.15f); resumeText.DOFade(0f, 0.2f).SetEase(Ease.OutCubic).SetDelay(0.3f); exitText.DOFade(0f, 0.2f).SetEase(Ease.OutCubic).SetDelay(0.45f); TimeManipulator.GetInstance().InvokeActionAfterSeconds(0.5f, () => { pausePanel.SetActive(false); }); }); } }
private void BecomeIntangible(object[] param) { if (param == null) { return; } Debug.Log("Invoke visible"); isIntangible = true; animator.SetBool("isInvisible", true); TimeManipulator.GetInstance().InvokeActionAfterSeconds((float)param[0], () => { isIntangible = false; animator.SetBool("isInvisible", false); ActionEventHandler.Invoke(SkillCastEvent.UIChangeEvent, param, null); TimeManipulator.GetInstance().InvokeActionAfterSeconds((float)param[1], () => isOnCastSkill[(int)param[2]] = false); }); // Play effect here }
public override Enemy Instantiate(Vector3 spawnPosition) { if (spawnSign == null) { return(Instantiate(gameObject, spawnPosition, Quaternion.identity)?.GetComponent <Enemy>()); } Instantiate(spawnSign, spawnPosition + offset + Vector3.right * 0.25f - Vector3.up * 0.25f, spawnSign.transform.rotation); var enemySpawnTmp = Instantiate(gameObject, spawnPosition, Quaternion.identity)?.GetComponent <Enemy>(); enemySpawnTmp.GetComponent <Animator>().enabled = false; enemySpawnTmp.enabled = false; enemySpawnTmp.transform.DOMoveY(enemySpawnTmp.transform.position.y + 1f, spawnLifeTime); TimeManipulator.GetInstance().InvokeActionAfterSeconds(spawnLifeTime, () => { enemySpawnTmp.enabled = true; enemySpawnTmp.GetComponent <Animator>().enabled = true; }); return(enemySpawnTmp); }
private void OnPauseClick() { if (!pausePanel.activeSelf) { pausePanel.SetActive(true); skillPanel.SetActive(false); playerEXPPanel.SetActive(false); playerRubyPanel.SetActive(false); dim.DOFade(1f, 0.5f).SetEase(Ease.OutCubic); textPause.DOFade(1f, 0.2f).SetEase(Ease.OutCubic).SetDelay(0.2f); TimeManipulator.GetInstance().InvokeActionAfterSeconds(0.25f, () => { exitButton.transform.DOScale(Vector3.one, 0.25f).SetEase(Ease.OutBack); resumeButton.transform.DOScale(Vector3.one, 0.25f).SetEase(Ease.OutBack).SetDelay(0.15f); settingButton.transform.DOScale(Vector3.one, 0.25f).SetEase(Ease.OutBack).SetDelay(0.3f); exitText.DOFade(1f, 0.2f).SetEase(Ease.OutCubic).SetDelay(0.15f); resumeText.DOFade(1f, 0.2f).SetEase(Ease.OutCubic).SetDelay(0.3f); restartText.DOFade(1f, 0.2f).SetEase(Ease.OutCubic).SetDelay(0.45f); }); } else { playerEXPPanel.SetActive(true); playerRubyPanel.SetActive(true); dim.DOFade(0f, 0.5f).SetEase(Ease.OutCubic); textPause.DOFade(0f, 0.2f).SetEase(Ease.OutCubic).SetDelay(0.2f); TimeManipulator.GetInstance().InvokeActionAfterSeconds(0.25f, () => { settingButton.transform.DOScale(Vector3.zero, 0.25f).SetEase(Ease.OutBack); resumeButton.transform.DOScale(Vector3.zero, 0.25f).SetEase(Ease.OutBack).SetDelay(0.15f); exitButton.transform.DOScale(Vector3.zero, 0.25f).SetEase(Ease.OutBack).SetDelay(0.3f); restartText.DOFade(0f, 0.2f).SetEase(Ease.OutCubic).SetDelay(0.15f); resumeText.DOFade(0f, 0.2f).SetEase(Ease.OutCubic).SetDelay(0.3f); exitText.DOFade(0f, 0.2f).SetEase(Ease.OutCubic).SetDelay(0.45f); TimeManipulator.GetInstance().InvokeActionAfterSeconds(0.5f, () => pausePanel.SetActive(false)); }); } }
// Update is called once per frame private void Update() { HandleAiming(); weapon?.CatchFireEvent(); if (Input.GetKeyDown(KeyCode.Q)) { SwapBullet(); } if (Input.GetKeyDown(KeyCode.E) && !isOnCastSkill[0]) { isOnCastSkill[0] = true; listSkills[0]?.Cast(0); TimeManipulator.GetInstance().InvokeActionAfterSeconds(listSkills[0].cooldowns, () => isOnCastSkill[0] = false); } if (Input.GetKeyDown(KeyCode.R) && !isOnCastSkill[1]) { isOnCastSkill[1] = true; listSkills[1]?.Cast(1); } }
/// <summary> /// Spawn minions method, boss call randomly in phase 2. /// </summary> private void SpawnMinions() { isOnAction = true; TimeManipulator.GetInstance().InvokeActionWithPromise(phaseFireRate[nextAttackPhase] + spawnSignLiveTime, () => { // Random number of bomb int minionCount = Random.Range(1, 6); var spawnPositions = GenerateSpawnPosition(minionCount, minSpawnDistance); foreach (var item in spawnPositions) { var spawnPositionSign = ObjectPool.GetObject(spawnPositionSignCode); spawnPositionSign.transform.position = item; spawnPositionSign.SetActive(true); TimeManipulator.GetInstance().InvokeActionAfterSeconds(spawnSignLiveTime, () => { spawnPositionSign.SetActive(false); Instantiate(listMinionSpawn[Random.Range(0, listMinionSpawn.Count)], item, Quaternion.identity); }); } }, () => isOnAction = false); }
public void Trigger(bool isCrit = false) { this.isCrit = isCrit; explosionAnimator?.Play("explosion"); Vector2 position = transform.position + Vector3.right * offsetX + Vector3.up * offsetY; var collisionObjects = Physics2D.OverlapCircleAll(position, radiusDamageArea); foreach (var item in collisionObjects) { if (bulletStat.exceptionTag.Contains(item.tag)) { continue; } item.GetComponent <Entity>()?.OnTakeDamage(this); } TimeManipulator.GetInstance().InvokeActionAfterSeconds(1.2f, () => { ObjectPool.ReturnObject(bulletStat.bulletCode, gameObject); gameObject.SetActive(false); }); }
// Update is called once per frame void Update() { if (isActive) { isActive = false; TimeManipulator.GetInstance().InvokeActionWithPromise(damageRate, () => { List <Collider2D> objectCollisions = new List <Collider2D>(); if (collider.OverlapCollider(contactFilter2D, objectCollisions) == 0) { return; } foreach (var item in objectCollisions) { if (bulletStat.exceptionTag.Contains(item.tag)) { continue; } item.GetComponent <Entity>()?.OnTakeDamage(this); } }, () => isActive = true); } }
/// <summary> /// Attack with laser, boss call randomly in phase 1. /// </summary> private void LaserBeamWipeAttack() { isOnAction = true; TimeManipulator.GetInstance().InvokeRepeatAction(0.5f, 3, () => { // Random number of laser beam int laserCount = Random.Range(2, 6); var spawnPositions = GenerateSpawnPosition(laserCount, minSpawnDistance); foreach (var item in spawnPositions) { var spawnPositionSign = ObjectPool.GetObject(spawnPositionSignCode); spawnPositionSign.transform.position = item; spawnPositionSign.SetActive(true); TimeManipulator.GetInstance().InvokeActionAfterSeconds(spawnSignLiveTime, () => { spawnPositionSign.SetActive(false); ObjectPool.ReturnObject(spawnPositionSignCode, spawnPositionSign); LaserBeam laserBeam = ObjectPool.GetObject(pfLaserBeam.GetBulletCode())?.GetComponent <LaserBeam>(); laserBeam.gameObject.SetActive(true); laserBeam.transform.position = item; laserBeam.Trigger(); }); } }, () => TimeManipulator.GetInstance().InvokeActionAfterSeconds(phaseFireRate[0], () => isOnAction = false)); }
/// <summary> /// Attack with exploded objecy, boss call randomly in phase 2. /// </summary> private void DestructiveAttack() { isOnAction = true; TimeManipulator.GetInstance().InvokeRepeatAction(0.5f, 3, () => { // Random number of bomb int bombCount = Random.Range(1, 5); var spawnPositions = GenerateSpawnPosition(bombCount, minSpawnDistance); foreach (var item in spawnPositions) { var spawnPositionSign = ObjectPool.GetObject(spawnPositionSignCode); spawnPositionSign.transform.position = item; spawnPositionSign.SetActive(true); TimeManipulator.GetInstance().InvokeActionAfterSeconds(spawnSignLiveTime, () => { spawnPositionSign.SetActive(false); ObjectPool.ReturnObject(spawnPositionSignCode, spawnPositionSign); Bomb destruction = ObjectPool.GetObject(pfBomb.GetBulletCode())?.GetComponent <Bomb>(); destruction.gameObject.SetActive(true); destruction.transform.position = item; destruction.Trigger(); }); } }, () => TimeManipulator.GetInstance().InvokeActionAfterSeconds(phaseFireRate[1], () => isOnAction = false)); }
// Callback function when player died protected virtual void OnDied() { isDeath = true; TimeManipulator.GetInstance().InvokeActionAfterSeconds(1f, () => Destroy(gameObject)); }