//move to next target void UpdateMovingToNextPatrolPoint() { destinationDistance = Vector3.Distance(destinationPosition, this.transform.position); //Check Distance Spawnpoint to Enemy if (destinationDistance < 1f) { timeToWaitBeforeNextMove = Random.Range(delayNextTargetMin, delayNextTargetMax); moveBehavior = MoveAroundBehavior.Waiting; ctrlAnimState = ControlAnimationState.Idle; moveSpeed = 0; } // Move to destination if (ctrlAnimState == ControlAnimationState.Move) { this.transform.rotation = Quaternion.Lerp(this.transform.rotation, targetRotation, Time.deltaTime * 25); if (controller.isGrounded) { movedir = Vector3.zero; movedir = transform.TransformDirection(Vector3.forward * moveSpeed); } } else { movedir = Vector3.Lerp(movedir, Vector3.zero, Time.deltaTime * 10); } movedir.y -= 20 * Time.deltaTime; controller.Move(movedir * Time.deltaTime); }
public void Reborn() { //Refil HP playerStatus.statusCal.hp = playerStatus.hpMax / 2; playerStatus.statusCal.mp = playerStatus.mpMax / 2; playerStatus.status.exp -= (playerStatus.status.exp / GameSetting.Instance.deadExpPenalty); if (playerStatus.status.exp < 0) { playerStatus.status.exp = 0; } playerStatus.StartRegen(); transform.position = DeadSpawnPoint.transform.position; moveSpeed = 0; movedir = Vector3.zero; destinationDistance = 0; destinationPosition = this.transform.position; target = null; ctrlAnimState = ControlAnimationState.Idle; alreadyLockSkill = false; Invoke("resetCheckAttack", 0.1f); oneShotOpenDeadWindow = false; }
void WaitAttack() { if (delayAttack > 0) { delayAttack -= Time.deltaTime * playerStatus.statusCal.atkSpd; } else if (delayAttack <= 0) { checkCritical = CriticalCal(playerStatus.statusCal.criticalRate); if (checkCritical) { typeAttack = Random.Range(0, animationManager.criticalAttack.Count); animationManager.checkAttack = false; } else if (!checkCritical) { typeAttack = Random.Range(0, animationManager.normalAttack.Count); animationManager.checkAttack = false; } if (autoAttack) { ctrlAnimState = ControlAnimationState.Attack; } else { if (onceAttack) { ctrlAnimState = ControlAnimationState.Attack; } } } }
//reset all state of enemy public void ResetState() { target = null; chaseTarget = false; destinationPosition = this.transform.position; ctrlAnimState = ControlAnimationState.Idle; }
//Wait before attack void WaitAttack() { PlayerStatus playerStatus; playerStatus = target.GetComponent <PlayerStatus>(); if (playerStatus.statusCal.hp <= 0) { ResetState(); } if (delayAttack > 0) { delayAttack -= Time.deltaTime * enemyStatus.status.atkSpd; } else if (delayAttack <= 0) { checkCritical = CriticalCal(enemyStatus.status.criticalRate); if (checkCritical) { typeAttack = Random.Range(0, animationManager.criticalAttack.Count); animationManager.checkAttack = false; } else if (!checkCritical) { typeAttack = Random.Range(0, animationManager.normalAttack.Count); animationManager.checkAttack = false; } ctrlAnimState = ControlAnimationState.Attack; } }
public void GetDamage(float targetAttack, float targetHit, float flinchRate, GameObject atkEffect, AudioClip atksfx) { //Calculate Hit targetHit += UnityEngine.Random.Range(-10, 30); if (playerStatus.statusCal.spd - targetHit > 0) //Attack Miss { InitTextDamage(Color.white, "Miss"); SoundManager.instance.PlayingSound("Attack_Miss"); } else { int damage = Mathf.FloorToInt((targetAttack - playerStatus.statusCal.def) * UnityEngine.Random.Range(0.8f, 1.2f)); if (damage <= 5) { damage = UnityEngine.Random.Range(1, 11); // if def < enemy attack } //Play SFX if (atksfx) { AudioSource.PlayClipAtPoint(atksfx, transform.position); } //Spawn Effect if (atkEffect) { Instantiate(atkEffect, transform.position, Quaternion.identity); } InitTextDamage(Color.red, damage.ToString()); playerStatus.statusCal.hp -= damage; GetDamageColorReset(); if (playerStatus.statusCal.hp <= 0) { playerSkill.CastBreak(); playerStatus.statusCal.hp = 0; ctrlAnimState = ControlAnimationState.Death; } else { flinchValue -= flinchRate; if (flinchValue <= 0) { if (ctrlAnimState == ControlAnimationState.Cast || ctrlAnimState == ControlAnimationState.ActiveSkill) { playerSkill.CastBreak(); } ctrlAnimState = ControlAnimationState.TakeAtk; flinchValue = 100; playerSkill.oneShotResetTarget = false; } } } }
void OnControllerColliderHit(ControllerColliderHit hit) { if (hit.gameObject.tag == "Collider" && behavior == EnemyBehavior.MoveAround && !chaseTarget && !target) { ctrlAnimState = ControlAnimationState.Idle; moveBehavior = MoveAroundBehavior.Waiting; } }
public void GetDamage(float targetAttack, float targetHit, float flinchRate, GameObject atkEffect, AudioClip atksfx) { //Calculate Hit targetHit += Random.Range(-10, 30); if (playerStatus.status.spd - targetHit > 0) //Attack Miss { InitTextDamage(Color.white, "Miss"); SoundManager.instance.PlayingSound("Attack_Miss"); } else { int damage = Mathf.FloorToInt((targetAttack - playerStatus.status.def) * Random.Range(0.8f, 1.2f)); if (damage <= 5) { damage = Random.Range(1, 11); // if def < enemy attack } //Play SFX if (atksfx) { AudioSource.PlayClipAtPoint(atksfx, transform.position); } //Spawn Effect if (atkEffect) { Instantiate(atkEffect, transform.position, Quaternion.identity); } InitTextDamage(Color.red, damage.ToString()); playerStatus.status.hp -= damage; PlayerDataMgr.Instance.dispatcher.SendEvent <HeroController>(PlayerDataEvent.PLAYER_HP_CHANGE, this); GetDamageColorReset(); if (playerStatus.status.hp <= 0) { playerStatus.status.hp = 0; ctrlAnimState = ControlAnimationState.Death; UIManager.Instance.Alert("复活", "您已阵亡,是否花费10钻石复活?", AlertMode.OkCancel, OnAlert); } else { flinchValue -= flinchRate; if (flinchValue <= 0) { //if(ctrlAnimState == ControlAnimationState.Cast || ctrlAnimState == ControlAnimationState.ActiveSkill) // playerSkill.CastBreak(); ctrlAnimState = ControlAnimationState.TakeAtk; flinchValue = 100; //playerSkill.oneShotResetTarget = false; } } } }
public void GetCastID(int caseID) { if (ctrlAnimState != ControlAnimationState.Cast && ctrlAnimState != ControlAnimationState.ActiveSkill && ctrlAnimState != ControlAnimationState.Death && ctrlAnimState != ControlAnimationState.Attack) { castid = caseID; ctrlAnimState = ControlAnimationState.Cast; } }
//ResetState Method public void ResetState() { destinationDistance = 0; destinationPosition = this.transform.position; target = null; ctrlAnimState = ControlAnimationState.Idle; alreadyLockSkill = false; Invoke("resetCheckAttack", 0.1f); }
//wait for next move void UpdateWaitingForNextMove() { timeToWaitBeforeNextMove -= Time.deltaTime; if (timeToWaitBeforeNextMove < 0.0f) { RandomPostion(); moveBehavior = MoveAroundBehavior.MoveToNext; ctrlAnimState = ControlAnimationState.Move; moveSpeed = enemyStatus.status.movespd; } }
// Update is called once per frame void Update() { TargetLock(); HeroAnimationState(); if (ctrlAnimState != ControlAnimationState.Death && ctrlAnimState != ControlAnimationState.Cast && ctrlAnimState != ControlAnimationState.ActiveSkill && dontMove == false) { ClickToMove(); CancelSkill(); } else if (dontMove == true) { ctrlAnimState = ControlAnimationState.Idle; } }
public void Reborn() { //Refil HP playerStatus.status.hp = playerStatus.hpMax / 2; playerStatus.status.mp = playerStatus.mpMax / 2; //playerStatus.status.exp -= (playerStatus.status.exp / GameSetting.Instance.deadExpPenalty); if (playerStatus.status.exp < 0) { playerStatus.status.exp = 0; } transform.position = DeadSpawnPoint.transform.position; destinationDistance = 0; destinationPosition = this.transform.position; target = null; ctrlAnimState = ControlAnimationState.Idle; alreadyLockSkill = false; Invoke("resetCheckAttack", 0.1f); oneShotOpenDeadWindow = false; PlayerDataMgr.Instance.dispatcher.SendEvent <HeroController>(PlayerDataEvent.PLAYER_HP_CHANGE, this); }
public void Attack(short evtId) { Debug.Log("attack"); ctrlAnimState = ControlAnimationState.Attack; Overlap.OverlapSphere(this, transform.position, 1, 1 << layerActiveEnemy); }
void ClickToMove() { if (useFreeSkill && useSkill && getSkillTarget) { destinationDistance = Vector3.Distance(destinationPosition, this.transform.position); if (destinationDistance < skillRange) { if (ctrlAnimState == ControlAnimationState.Move || ctrlAnimState == ControlAnimationState.Idle) { ctrlAnimState = ControlAnimationState.Cast; playerSkill.canCast = true; getSkillTarget = false; } LookAtTarget(freePosSkill); moveSpeed = 0; } else if (destinationDistance > skillRange) { if (ctrlAnimState == ControlAnimationState.Move || ctrlAnimState == ControlAnimationState.Idle) { ctrlAnimState = ControlAnimationState.Move; } moveSpeed = playerStatus.statusCal.movespd; } } else { if (target != null && !useSkill) { destinationDistance = Vector3.Distance(target.transform.position, this.transform.position); if (destinationDistance <= playerStatus.statusCal.atkRange) { if (ctrlAnimState == ControlAnimationState.Move || ctrlAnimState == ControlAnimationState.Idle) { ctrlAnimState = ControlAnimationState.WaitAttack; } moveSpeed = 0; LookAtTarget(target.transform.position); } else if (destinationDistance > playerStatus.statusCal.atkRange) { LookAtTarget(target.transform.position); if (ctrlAnimState == ControlAnimationState.Move || ctrlAnimState == ControlAnimationState.Idle || ctrlAnimState == ControlAnimationState.WaitAttack) { ctrlAnimState = ControlAnimationState.Move; } moveSpeed = playerStatus.statusCal.movespd; } } else if (target != null && useSkill) { destinationDistance = Vector3.Distance(target.transform.position, this.transform.position); if (destinationDistance <= skillRange) { if (ctrlAnimState == ControlAnimationState.Move || ctrlAnimState == ControlAnimationState.Idle) { ctrlAnimState = ControlAnimationState.Cast; playerSkill.canCast = true; } LookAtTarget(target.transform.position); moveSpeed = 0; } else if (destinationDistance > skillRange) { LookAtTarget(target.transform.position); if (ctrlAnimState == ControlAnimationState.Move || ctrlAnimState == ControlAnimationState.Idle || ctrlAnimState == ControlAnimationState.WaitAttack) { ctrlAnimState = ControlAnimationState.Move; } moveSpeed = playerStatus.statusCal.movespd; } } else if (target == null && targetMoveTo != null) { destinationDistance = Vector3.Distance(targetMoveTo.transform.position, this.transform.position); if (destinationDistance <= 2f) { if (ctrlAnimState == ControlAnimationState.Move || ctrlAnimState == ControlAnimationState.Idle) { ctrlAnimState = ControlAnimationState.Idle; } moveSpeed = 0; InteractObject(); } else if (destinationDistance > 2f) { LookAtTarget(targetMoveTo.transform.position); //if(ctrlAnimState == ControlAnimationState.Move || ctrlAnimState == ControlAnimationState.Idle) ctrlAnimState = ControlAnimationState.Move; moveSpeed = playerStatus.statusCal.movespd; } } else if (target == null && targetMoveTo == null) { destinationDistance = Vector3.Distance(destinationPosition, this.transform.position); if (destinationDistance < .5f) { if (ctrlAnimState == ControlAnimationState.Move || ctrlAnimState == ControlAnimationState.Idle) { ctrlAnimState = ControlAnimationState.Idle; } moveSpeed = 0; } else if (destinationDistance > .5f) { if (ctrlAnimState == ControlAnimationState.Move || ctrlAnimState == ControlAnimationState.Idle) { ctrlAnimState = ControlAnimationState.Move; } moveSpeed = playerStatus.statusCal.movespd; } } } destinationDistance = Vector3.Distance(destinationPosition, this.transform.position); if (Input.GetMouseButtonDown(0) && GUIUtility.hotControl == 0 && dontClick == false) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hitdist; if (!autoAttack) { onceAttack = true; } if (Physics.Raycast(ray, out hitdist, 100, 1 << layerActiveEnemy | 1 << layerActiveGround | 1 << layerActiveItem | 1 << layerActiveNpc)) { if (hitdist.collider.tag != "Player") { Vector3 targetPoint = Vector3.zero; targetPoint.x = hitdist.point.x; targetPoint.y = transform.position.y; targetPoint.z = hitdist.point.z; destinationPosition = hitdist.point; targetRotation = Quaternion.LookRotation(targetPoint - transform.position); if (alreadyLockSkill) { playerSkill.oneShotResetTarget = false; ResetOldCast(); useFreeSkill = false; useSkill = false; getSkillTarget = false; alreadyLockSkill = false; } if (useFreeSkill && !alreadyLockSkill) { freePosSkill = destinationPosition; getSkillTarget = true; alreadyLockSkill = true; } } } Ray r = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit h; if (Physics.Raycast(r, out h, 100, 1 << layerActiveEnemy | 1 << layerActiveGround | 1 << layerActiveItem | 1 << layerActiveNpc)) { if (h.collider.tag == "Ground") { if (ctrlAnimState != ControlAnimationState.Attack) { target = null; targetMoveTo = null; } Instantiate(GameSetting.Instance.mousefxNormal, new Vector3(h.point.x, h.point.y + 0.02f, h.point.z), h.collider.transform.rotation); } else if (h.collider.tag == "Enemy") { if (ctrlAnimState != ControlAnimationState.Attack) { target = h.collider.gameObject; targetMoveTo = null; } GameObject go = (GameObject)Instantiate(GameSetting.Instance.mousefxAttack, new Vector3(h.collider.transform.position.x, h.collider.transform.position.y + 0.02f, h.collider.transform.position.z), Quaternion.identity); go.transform.parent = target.transform; } else if (h.collider.tag == "Npc" || h.collider.tag == "Item") { if (ctrlAnimState != ControlAnimationState.Attack) { target = null; targetMoveTo = h.collider.gameObject; } GameObject go = (GameObject)Instantiate(GameSetting.Instance.mousefxInteract, new Vector3(h.collider.transform.position.x, h.collider.transform.position.y + 0.02f, h.collider.transform.position.z), Quaternion.identity); //go.transform.parent = targetMoveTo.transform; } } } else if (Input.GetMouseButton(0) && GUIUtility.hotControl == 0 && dontClick == false) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hitdist; if (Physics.Raycast(ray, out hitdist, 1 << layerActiveEnemy | 1 << layerActiveGround | 1 << layerActiveItem | 1 << layerActiveNpc)) { if (hitdist.collider.tag != "Player") { Vector3 targetPoint = Vector3.zero; //hitdist.point; targetPoint.x = hitdist.point.x; targetPoint.y = transform.position.y; targetPoint.z = hitdist.point.z; destinationPosition = hitdist.point; targetRotation = Quaternion.LookRotation(targetPoint - transform.position); } } } if (Input.GetMouseButtonUp(0)) { if (ctrlAnimState != ControlAnimationState.Attack) { ctrlAnimState = ControlAnimationState.Idle; } moveSpeed = 0; } if (Input.GetMouseButton(0) && target && dontClick == false) { if (!autoAttack) { onceAttack = true; } } if (ctrlAnimState == ControlAnimationState.Move) { this.transform.rotation = Quaternion.Lerp(this.transform.rotation, targetRotation, Time.deltaTime * 25); if (controller.isGrounded) { movedir = Vector3.zero; movedir = transform.TransformDirection(Vector3.forward * moveSpeed); } } else { movedir = Vector3.Lerp(movedir, Vector3.zero, Time.deltaTime * 10); } movedir.y -= 20 * Time.deltaTime; controller.Move(movedir * Time.deltaTime); }
void HeroAnimationState() { if (ctrlAnimState == ControlAnimationState.Idle) { animationManager.animationState = animationManager.Idle; } if (ctrlAnimState == ControlAnimationState.Move) { animationManager.animationState = animationManager.Move; } if (ctrlAnimState == ControlAnimationState.WaitAttack) { animationManager.animationState = animationManager.Idle; WaitAttack(); } if (ctrlAnimState == ControlAnimationState.Attack) { if (target) { LookAtTarget(target.transform.position); if (checkCritical) { animationManager.animationState = animationManager.CriticalAttack; delayAttack = 100; onceAttack = false; } else if (!checkCritical) { animationManager.animationState = animationManager.Attack; delayAttack = 100; onceAttack = false; } } else { ctrlAnimState = ControlAnimationState.Idle; } } if (ctrlAnimState == ControlAnimationState.TakeAtk) { animationManager.animationState = animationManager.TakeAttack; } if (ctrlAnimState == ControlAnimationState.Cast) { playerSkill.CastSkill(playerSkill.FindSkillType(castid), playerSkill.FindSkillIndex(castid)); animationManager.animationState = animationManager.Cast; } if (ctrlAnimState == ControlAnimationState.ActiveSkill) { animationManager.animationState = animationManager.ActiveSkill; } if (ctrlAnimState == ControlAnimationState.Death) { animationManager.animationState = animationManager.Death; } }
//Movement Method void ClickToMove() { if (useFreeSkill && useSkill && getSkillTarget) { destinationDistance = Vector3.Distance(destinationPosition, this.transform.position); //Check Distance Player to Destination Point if (destinationDistance < skillRange) // Reset speed to 0 //Change to state Cast { if (ctrlAnimState == ControlAnimationState.Move || ctrlAnimState == ControlAnimationState.Idle) { ctrlAnimState = ControlAnimationState.Cast; playerSkill.canCast = true; getSkillTarget = false; } LookAtTarget(freePosSkill); moveSpeed = 0; } else if (destinationDistance > skillRange) //Reset Speed to default //Change to state move { if (ctrlAnimState == ControlAnimationState.Move || ctrlAnimState == ControlAnimationState.Idle) { ctrlAnimState = ControlAnimationState.Move; } moveSpeed = playerStatus.statusCal.movespd; } } else { if (target != null && !useSkill) //Click Enemy { destinationDistance = Vector3.Distance(target.transform.position, this.transform.position); //Check Distance Player to Destination Point if (destinationDistance <= playerStatus.statusCal.atkRange) // Reset speed to 0 //Change to state Idle { if (ctrlAnimState == ControlAnimationState.Move || ctrlAnimState == ControlAnimationState.Idle) { ctrlAnimState = ControlAnimationState.WaitAttack; } moveSpeed = 0; LookAtTarget(target.transform.position); } else if (destinationDistance > playerStatus.statusCal.atkRange) //Reset Speed to default //Change to state move { LookAtTarget(target.transform.position); if (ctrlAnimState == ControlAnimationState.Move || ctrlAnimState == ControlAnimationState.Idle || ctrlAnimState == ControlAnimationState.WaitAttack) { ctrlAnimState = ControlAnimationState.Move; } moveSpeed = playerStatus.statusCal.movespd; } } else if (target != null && useSkill) //Click Enemy { destinationDistance = Vector3.Distance(target.transform.position, this.transform.position); //Check Distance Player to Destination Point if (destinationDistance <= skillRange) // Reset speed to 0 //Change to state Cast { if (ctrlAnimState == ControlAnimationState.Move || ctrlAnimState == ControlAnimationState.Idle) { ctrlAnimState = ControlAnimationState.Cast; playerSkill.canCast = true; } LookAtTarget(target.transform.position); moveSpeed = 0; } else if (destinationDistance > skillRange) //Reset Speed to default //Change to state move { LookAtTarget(target.transform.position); if (ctrlAnimState == ControlAnimationState.Move || ctrlAnimState == ControlAnimationState.Idle || ctrlAnimState == ControlAnimationState.WaitAttack) { ctrlAnimState = ControlAnimationState.Move; } moveSpeed = playerStatus.statusCal.movespd; } } else if (target == null) // Click Ground { destinationDistance = Vector3.Distance(destinationPosition, this.transform.position); //Check Distance Player to Destination Point if (destinationDistance < .5f) // Reset speed to 0 //Change to state Idle { if (ctrlAnimState == ControlAnimationState.Move || ctrlAnimState == ControlAnimationState.Idle) { ctrlAnimState = ControlAnimationState.Idle; } moveSpeed = 0; } else if (destinationDistance > .5f) //Reset Speed to default //Change to state move { if (ctrlAnimState == ControlAnimationState.Move || ctrlAnimState == ControlAnimationState.Idle) { ctrlAnimState = ControlAnimationState.Move; } moveSpeed = playerStatus.statusCal.movespd; } } } destinationDistance = Vector3.Distance(destinationPosition, this.transform.position); // Moves the Player if the Left Mouse Button was clicked if (Input.GetMouseButtonDown(0) && GUIUtility.hotControl == 0 && dontClick == false) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hitdist; //if disable auto attack it can attack 1 time if (!autoAttack) { onceAttack = true; } if (Physics.Raycast(ray, out hitdist, 100, 1 << layerActiveEnemy | 1 << layerActiveGround | 1 << layerActiveItem)) { if (hitdist.collider.tag != "Player") { Vector3 targetPoint = Vector3.zero; targetPoint.x = hitdist.point.x; targetPoint.y = transform.position.y; targetPoint.z = hitdist.point.z; destinationPosition = hitdist.point; targetRotation = Quaternion.LookRotation(targetPoint - transform.position); if (alreadyLockSkill) { playerSkill.oneShotResetTarget = false; ResetOldCast(); useFreeSkill = false; useSkill = false; getSkillTarget = false; alreadyLockSkill = false; } if (useFreeSkill && !alreadyLockSkill) { freePosSkill = destinationPosition; getSkillTarget = true; alreadyLockSkill = true; } } } Ray r = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit h; if (Physics.Raycast(r, out h, 100, 1 << layerActiveEnemy | 1 << layerActiveGround | 1 << layerActiveItem)) { if (h.collider.tag == "Ground") { //Reset Lock Target if (ctrlAnimState != ControlAnimationState.Attack) { target = null; } //Spawn Mouse Effect Instantiate(GameSetting.Instance.mousefxNormal, new Vector3(h.point.x, h.point.y + 0.02f, h.point.z), h.collider.transform.rotation); } else if (h.collider.tag == "Enemy") { if (ctrlAnimState != ControlAnimationState.Attack) { target = h.collider.gameObject; } //Spawn Mouse Effect GameObject go = (GameObject)Instantiate(GameSetting.Instance.mousefxAttack, new Vector3(h.collider.transform.position.x, h.collider.transform.position.y + 0.02f, h.collider.transform.position.z), Quaternion.identity); go.transform.parent = target.transform; } } } // Moves the player if the mouse button is hold down else if (Input.GetMouseButton(0) && GUIUtility.hotControl == 0 && dontClick == false) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hitdist; if (Physics.Raycast(ray, out hitdist, 1 << layerActiveEnemy | 1 << layerActiveGround | 1 << layerActiveItem)) { if (hitdist.collider.tag != "Player") { Vector3 targetPoint = Vector3.zero; //hitdist.point; targetPoint.x = hitdist.point.x; targetPoint.y = transform.position.y; targetPoint.z = hitdist.point.z; destinationPosition = hitdist.point; targetRotation = Quaternion.LookRotation(targetPoint - transform.position); } } } //Reset State when release left-click if (Input.GetMouseButtonUp(0)) { if (ctrlAnimState != ControlAnimationState.Attack) { ctrlAnimState = ControlAnimationState.Idle; } moveSpeed = 0; } //Disable Auto Attack Command if (Input.GetMouseButton(0) && target && dontClick == false) { //if disable auto attack it can attack 1 time if (!autoAttack) { onceAttack = true; } } if (ctrlAnimState == ControlAnimationState.Move) { this.transform.rotation = Quaternion.Lerp(this.transform.rotation, targetRotation, Time.deltaTime * 25); if (controller.isGrounded) { movedir = Vector3.zero; movedir = transform.TransformDirection(Vector3.forward * moveSpeed); } } else { movedir = Vector3.Lerp(movedir, Vector3.zero, Time.deltaTime * 10); } movedir.y -= 20 * Time.deltaTime; controller.Move(movedir * Time.deltaTime); }
//Get damage method public void GetDamage(float targetAttack, float targetHit, float flichRate, GameObject atkEffect, AudioClip atksfx) { //Calculate Hit targetHit += Random.Range(-10, 30); //Random take damage animation typeTakeAttack = Random.Range(0, animationManager.takeAttack.Count); if (enemyStatus.status.spd - targetHit > 0) //Attack Miss { SoundManager.instance.PlayingSound("Attack_Miss"); InitTextDamage(Color.white, "Miss"); //Lock Target if (!chaseTarget) { chaseTarget = true; } if (ctrlAnimState == ControlAnimationState.Idle || ctrlAnimState == ControlAnimationState.Move) { ctrlAnimState = ControlAnimationState.WaitAttack; } } else { int damage = Mathf.FloorToInt((targetAttack - enemyStatus.status.def) * Random.Range(0.8f, 1.2f)); if (damage <= 5) { damage = Random.Range(1, 11); // if def < enemy attack } //Play SFX if (atksfx) { AudioSource.PlayClipAtPoint(atksfx, transform.position); } //Spawn Effect if (atkEffect) { Instantiate(atkEffect, transform.position, Quaternion.identity); } InitTextDamage(Color.white, damage.ToString()); enemyStatus.status.hp -= damage; GetDamageColorReset(); if (enemyStatus.status.hp <= 0) { enemyStatus.status.hp = 0; //Reset State Hero when kill this enemy if (target) { HeroController enemy; enemy = target.GetComponent <HeroController>(); enemy.ResetState(); PlayerStatus pStatus; pStatus = target.GetComponent <PlayerStatus>(); pStatus.status.exp += enemyStatus.expGive; AddKillCountQuest(); } Destroy(this.gameObject, deadTimer); ctrlAnimState = ControlAnimationState.Death; } else { if (!chaseTarget) { chaseTarget = true; } flinchValue -= flichRate; if (flinchValue <= 0) { ctrlAnimState = ControlAnimationState.TakeAtk; flinchValue = 100; } else { ctrlAnimState = ControlAnimationState.WaitAttack; } } } }
//Movement Method void ClickToMove() { if (useFreeSkill && useSkill && getSkillTarget) { destinationDistance = Vector3.Distance(destinationPosition, this.transform.position); //Check Distance Player to Destination Point if (destinationDistance < skillRange) // Reset speed to 0 //Change to state Cast { if (ctrlAnimState == ControlAnimationState.Move || ctrlAnimState == ControlAnimationState.Idle) { ctrlAnimState = ControlAnimationState.Cast; //playerSkill.canCast = true; getSkillTarget = false; } LookAtTarget(freePosSkill); } else if (destinationDistance > skillRange) //Reset Speed to default //Change to state move { if (ctrlAnimState == ControlAnimationState.Move || ctrlAnimState == ControlAnimationState.Idle) { ctrlAnimState = ControlAnimationState.Move; } } } else { if (target != null && !useSkill) //Click Enemy { destinationDistance = Vector3.Distance(target.transform.position, this.transform.position); //Check Distance Player to Destination Point if (destinationDistance <= playerStatus.status.atkRange) // Reset speed to 0 //Change to state Idle { if (ctrlAnimState == ControlAnimationState.Move || ctrlAnimState == ControlAnimationState.Idle) { ctrlAnimState = ControlAnimationState.WaitAttack; } LookAtTarget(target.transform.position); } else if (destinationDistance > playerStatus.status.atkRange) //Reset Speed to default //Change to state move { LookAtTarget(target.transform.position); if (ctrlAnimState == ControlAnimationState.Move || ctrlAnimState == ControlAnimationState.Idle || ctrlAnimState == ControlAnimationState.WaitAttack) { ctrlAnimState = ControlAnimationState.Move; } } } else if (target != null && useSkill) //Click Enemy { destinationDistance = Vector3.Distance(target.transform.position, this.transform.position); //Check Distance Player to Destination Point if (destinationDistance <= skillRange) // Reset speed to 0 //Change to state Cast { if (ctrlAnimState == ControlAnimationState.Move || ctrlAnimState == ControlAnimationState.Idle) { ctrlAnimState = ControlAnimationState.Cast; //playerSkill.canCast = true; } LookAtTarget(target.transform.position); } else if (destinationDistance > skillRange) //Reset Speed to default //Change to state move { LookAtTarget(target.transform.position); if (ctrlAnimState == ControlAnimationState.Move || ctrlAnimState == ControlAnimationState.Idle || ctrlAnimState == ControlAnimationState.WaitAttack) { ctrlAnimState = ControlAnimationState.Move; } } } } destinationDistance = Vector3.Distance(destinationPosition, this.transform.position); // 鼠标左键被单击时移动人物 if (Input.GetMouseButtonDown(0) && GUIUtility.hotControl == 0 && dontClick == false) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hitdist; if (Physics.Raycast(ray, out hitdist, 100, 1 << layerActiveEnemy | 1 << layerActiveGround | 1 << layerActiveItem)) { if (hitdist.collider.tag != "Player") { Vector3 targetPoint = Vector3.zero; targetPoint.x = hitdist.point.x; targetPoint.y = transform.position.y; targetPoint.z = hitdist.point.z; destinationPosition = hitdist.point; targetRotation = Quaternion.LookRotation(targetPoint - transform.position); if (alreadyLockSkill) { //playerSkill.oneShotResetTarget = false; ResetOldCast(); useFreeSkill = false; useSkill = false; getSkillTarget = false; alreadyLockSkill = false; } if (useFreeSkill && !alreadyLockSkill) { freePosSkill = destinationPosition; getSkillTarget = true; alreadyLockSkill = true; } } } Ray r = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit h; if (Physics.Raycast(r, out h, 100, 1 << layerActiveEnemy | 1 << layerActiveGround | 1 << layerActiveItem)) { if (h.collider.tag == "Ground") { //Reset Lock Target if (ctrlAnimState != ControlAnimationState.Attack) { target = null; } //Spawn Mouse Effect //Instantiate(GameSetting.Instance.mousefxNormal,new Vector3(h.point.x,h.point.y+0.02f,h.point.z),h.collider.transform.rotation); } else if (h.collider.tag == "Enemy") { if (ctrlAnimState != ControlAnimationState.Attack) { target = h.collider.gameObject; } //Spawn Mouse Effect } } } // 如果鼠标被按住则移动 else if (Input.GetMouseButton(0) && GUIUtility.hotControl == 0 && dontClick == false) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hitdist; if (Physics.Raycast(ray, out hitdist, 1 << layerActiveEnemy | 1 << layerActiveGround | 1 << layerActiveItem)) { if (hitdist.collider.tag != "Player") { Vector3 targetPoint = Vector3.zero; //hitdist.point; targetPoint.x = hitdist.point.x; targetPoint.y = transform.position.y; targetPoint.z = hitdist.point.z; destinationPosition = hitdist.point; targetRotation = Quaternion.LookRotation(targetPoint - transform.position); } } } }
//Enemy movement when enemy found target void EnemyMovementBattle() { if (chaseTarget == true) { LookAtTarget(target.transform.position); destinationDistance = Vector3.Distance(target.transform.position, this.transform.position); //Check Distance Enemy to Hero if (destinationDistance <= enemyStatus.status.atkRange) // Reset speed to 0 { if (ctrlAnimState == ControlAnimationState.Move || ctrlAnimState == ControlAnimationState.Idle) { ctrlAnimState = ControlAnimationState.WaitAttack; } moveSpeed = 0; } else if (destinationDistance > enemyStatus.status.atkRange) // To Reset Speed to default { if (ctrlAnimState == ControlAnimationState.Move || ctrlAnimState == ControlAnimationState.Idle || ctrlAnimState == ControlAnimationState.WaitAttack) { ctrlAnimState = ControlAnimationState.Move; } moveSpeed = enemyStatus.status.movespd; } } else if (chaseTarget == false) { LookAtTarget(spawnPoint); destinationDistance = Vector3.Distance(spawnPoint, this.transform.position); //Check Distance Enemy to Hero if (destinationDistance <= enemyStatus.status.atkRange) // Reset speed to 0 { if (ctrlAnimState == ControlAnimationState.Move || ctrlAnimState == ControlAnimationState.Idle) { ctrlAnimState = ControlAnimationState.Idle; } moveSpeed = 0; returnPhase = defaultReturnPhase; if (enableRegen) { if (regenHP) { enemyStatus.status.hp = Mathf.FloorToInt(defaultHP); } if (regenMP) { enemyStatus.status.mp = Mathf.FloorToInt(defaultMP); } destinationPosition = this.transform.position; target = null; } } else if (destinationDistance > enemyStatus.status.atkRange) // To Reset Speed to default { if (ctrlAnimState == ControlAnimationState.Move || ctrlAnimState == ControlAnimationState.Idle || ctrlAnimState == ControlAnimationState.WaitAttack) { ctrlAnimState = ControlAnimationState.Move; } moveSpeed = enemyStatus.status.movespd; } } //Check distance spawn float distanceSpawn = Vector3.Distance(spawnPoint, this.transform.position); if (distanceSpawn > returnPhase) { if (regenHP || regenMP) { enableRegen = true; } chaseTarget = false; returnPhase += 3; } // Move to destination if (ctrlAnimState == ControlAnimationState.Move) { if (controller.isGrounded) { movedir = Vector3.zero; movedir = transform.TransformDirection(Vector3.forward * moveSpeed); } } else { movedir = Vector3.Lerp(movedir, Vector3.zero, Time.deltaTime * 10); } movedir.y -= 20 * Time.deltaTime; controller.Move(movedir * Time.deltaTime); }