Ejemplo n.º 1
0
    // updates Animator parameters
    void UpdateAnimatorParameters()
    {
        if (isAir)
        {
            return;
        }

        float speedFactor = inputDir.magnitude;
        bool  isMoving    = speedFactor > 0.1 && inputMove;
        float angleDiff   = GetSignedAngleTo(inputDir);

        if (Mathf.Abs(angleDiff) > 2 && isMoving)
        {
            anSmoothDir.smoothTime = 0.5f;
            anSmoothDir.target     = Mathf.Sign(angleDiff);
        }
        else
        {
            anSmoothDir.smoothTime = 0.2f;
            anSmoothDir.target     = 0;
        }

        anSmoothDir.Eval(Time.deltaTime);
        speedFactor = inputMove ? speedFactor : 0;

        animator.SetFloat("Speed", inputAnimateLocomotion?speedFactor:0);
        animator.SetFloat("Direction", inputAnimateLocomotion?anSmoothDir.current:0);
        animator.SetBool("Moving", inputAnimateLocomotion?isMoving:false);
        animator.SetBool("Turning", false);
        //animator.SetBool("Punching", inputPunch);
        //if(inputPunch) animator.SetTrigger("Punching");
        if (inputPunch && hitCounter == 0)
        {
            animator.SetTrigger("Punching");
        }
        if (inputPunch && hitCounter == 1)
        {
            animator.SetTrigger("Punching1");
        }
        if (inputPunch && hitCounter == 2)
        {
            animator.SetTrigger("Punching2");
        }

        if (inputRoll)
        {
            animator.SetTrigger("Roll");
        }
        //else {
        //	animator.ResetTrigger("Roll");
        //}
    }
    // has two purposes
    // first: setups entity Spine bone towards tracking target (if set)
    // second: samples current NavMesh position to be used in OnAnimatorMove  function
    private void LateUpdate()
    {
        if (unitHealth && unitHealth.IsDead())
        {
            return;
        }

        lookSmooth.smoothTime = 0.2f;
        lookSmooth.target     = shouldAim && !aimRotate? 1f : 0f;

        lookSmooth.Eval(Time.deltaTime);

        if (!isMoving && !isRotating)
        {
            Transform  tr = animator.GetBoneTransform(HumanBodyBones.Spine);
            Quaternion q  = Quaternion.FromToRotation(transform.forward, tr.position.DirTo(lookTarget));
            tr.rotation = Quaternion.Slerp(tr.rotation, q * tr.rotation, lookSmooth);
        }

        NavMeshHit hit;

        NavMesh.SamplePosition(transform.position, out hit, agent.radius, NavMesh.AllAreas);

        if (Vector3.Distance(transform.position, hit.position) < 0.001)
        {
            lastPosOnNavMesh = transform.position;
        }
        else
        {
            if (hit.hit)
            {
                transform.position = hit.position;
            }
        }

        //NavMesh.FindClosestEdge(transform.position, out hit, NavMesh.AllAreas);

        //if (hit.distance < capsule.radius) {
        //	transform.position -= (hit.position - transform.position) * (capsule.radius - hit.distance) / capsule.radius;
        //}
    }