// 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; //} }