0
votes

Record of the problem

https://youtu.be/BpzHQkVQz5A

Explaining my problem

I'm programming a mobile game using Unity3D Engine. For my player movement, I'm using NavMeshAgent because it's for me the easiest and most efficient way to do it. But when I hit the play button and ask my player to move, the movements are jerky and it's not pleasant to see at all.

Do you have any idea to fix this problem ?! Thank you in advance for your answers ! ^^

My code

This is my code :

Player.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

public class Player : MonoBehaviour
{
    NavMeshAgent agent;
    Touch touch;
    RaycastHit hit;
    Ray ray;

    // START FUNCTION
    private void Start()
    {
        agent = GetComponent<NavMeshAgent>();
    }

    // UPDATE FUNCTION
    private void Update()
    {
        // TOUCH DETECTION
        if (Input.touchCount > 0)
        {
            touch = Input.GetTouch(0);

            // A FINGER TOUCHED THE SCREEN
            if (touch.phase == TouchPhase.Began)
            {
                // RETURN X, Y AND Z WORLD POS OF THE TOUCH SCREEN POS
                ray = Camera.main.ScreenPointToRay(touch.position);

                if (Physics.Raycast(ray, out hit))
                {
                    if (hit.collider != null)
                    {
                        // MOVING PLAYER TO THE HIT POS
                        Vector3 hitVec = new Vector3(hit.point.x, hit.point.y + (GetComponent<Collider>().bounds.size.y / 2), hit.point.z);
                        agent.SetDestination(hitVec);
                    }
                }
            }
        }

        // SAME CODE USING MOUSE BUTTON
#if UNITY_EDITOR

        if (Input.GetMouseButton(0))
        {
            ray = Camera.main.ScreenPointToRay(Input.mousePosition);

            if (Physics.Raycast(ray, out hit))
            {
                if (hit.collider != null)
                {
                    Vector3 hitVec = new Vector3(hit.point.x, hit.point.y + (GetComponent<Collider>().bounds.size.y / 2), hit.point.z);
                    agent.SetDestination(hitVec);
                }
            }
        }

#endif
    }
}

CameraFollow.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// BRACKEYS CAMERA FOLLOW SCRIPT WITHOUT THE LOOKAT METHODE
public class CameraFollow : MonoBehaviour
{
    public Transform target;

    public float smoothSpeed = 0.2f;
    public Vector3 offset;

    void FixedUpdate()
    {
        Vector3 desiredPosition = target.position + offset;
        Vector3 smoothedPosition = Vector3.Lerp(transform.position, desiredPosition, smoothSpeed);
        transform.position = smoothedPosition;
    }
}
1

1 Answers

1
votes

The problem isn't the navmesh controller but the camera follow script.

One thing you could try is to move the camera position using only the desiredPosition or use Vector3.SmoothDamp:

private Vector3 velocity;

void LateUpdate(){

...

        Vector3 desiredPosition = target.position + offset;
        Vector3 smoothedPosition = Vector3.SmoothDamp(transform.position, desiredPosition, ref velocity, smoothSpeed);
        transform.position = smoothedPosition;
}

Also this is explained in a pinned comment on the Brackeys video