Пример #1
0
    //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);
    }
Пример #2
0
    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;
                }
            }
        }
    }
Пример #4
0
 //reset all state of enemy
 public void ResetState()
 {
     target              = null;
     chaseTarget         = false;
     destinationPosition = this.transform.position;
     ctrlAnimState       = ControlAnimationState.Idle;
 }
Пример #5
0
    //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;
        }
    }
Пример #6
0
    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;
     }
 }
Пример #8
0
    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;
     }
 }
Пример #10
0
 //ResetState Method
 public void ResetState()
 {
     destinationDistance = 0;
     destinationPosition = this.transform.position;
     target           = null;
     ctrlAnimState    = ControlAnimationState.Idle;
     alreadyLockSkill = false;
     Invoke("resetCheckAttack", 0.1f);
 }
Пример #11
0
 //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;
     }
 }
Пример #13
0
    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);
    }
Пример #14
0
 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;
        }
    }
Пример #17
0
    //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);
    }
Пример #18
0
    //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;
                }
            }
        }
    }
Пример #19
0
    //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);
                }
            }
        }
    }
Пример #20
0
    //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);
    }